//
// Created by KSI ( www.xksi.pl )
//

function obiekt_bazowy() {
  this.AddItem = function(obiekt_id, kontroler, tab_wartosci) {
    // dodaje do kontrolki wartosci wg tablicy wskazanej w parametrze
  };
  this.RemoveItem = function(obiekt_id, kontroler, tab_wartosci) {
    // usuwa z kontrolki wartosci wg tablicy wskazanej w parametrze
    return null;
  };
  this.ClearItem = function(obiekt_id, kontroler) {
    // usuwa z kontrolki i kontenera items i values
    return null;
  };  
  this.GetValues = function(obiekt_id, kontroler) {
    // pobiera wybrane wartosci
  };
  this.UnSetValues = function(obiekt_id, kontroler, tab_wartosci) {
    // ususwa zaznaczenie ze wskazane w tablicy wartosci 
  };
  this.SetValues = function(obiekt_id, kontroler, tab_wartosci) {
    // ustawia wskazane w tablicy wartosci , jesli sa w items
  };
  this.ClearValues = function(obiekt_id, kontroler) {
    // usuwa z kontrolki i kontenera values
    return null;
  };  
  this.Refresh = function(obiekt_id, kontroler) { 
    // ustawia kontrolke tak jak ma w JSON poczatkowym, bez podpinania zdarzen 
    // // console.debug(' baza Refresh'); 
  };
  this.Init = function(obiekt_id, kontroler) {};
}

// -----------------------------------------------------------------------------------
// czyta dane z tablicy i dziala tylko po stronie JS klienta
function obiekt_input_div_tablicowy() {
  this.slownik = [];
  
  this.inputChangeValue = 
        // UWAGA wszystko czyta z ittems
      function(obiekt_id, kontroler) {
        // pobierz ajaxem nowa zawartosc
        nowe = '';
        tmp = $('#'+obiekt_id+' > [atid=input]').val();
        tmp = tmp.substr(0, 1).toUpperCase() + tmp.substr(1);
        tmp_reg = tmp;
        var set = false;
        specials = ['/', '.', '*', '+', '?', '|','(', ')', '[', ']', '{', '}', '\\'];
        tmp_reg_pre = new RegExp("(\\" + specials.join("|\\") + ")", "g");
        tmp_reg = tmp.replace(tmp_reg_pre,"\\$1");
//      re = new RegExp("(^"+tmp_reg+"|\\("+tmp_reg+"\\)$|\\s"+tmp_reg+")","gi");
      re = new RegExp("(^"+tmp_reg+"|\\("+tmp_reg+"\\)|\\s"+tmp_reg+")","gi");      
      znalazl_panstwo = new RegExp("\\("+tmp_reg+"\\)$","gi");
        // wyczysc poprzednie ustawienie
        kontroler.element_kontener[obiekt_id].values = {};
        var licznik = 0;
        max = kontroler.element_kontener[obiekt_id].maxitems ;
        for ( indeks in kontroler.element_kontener[obiekt_id].items ) {
          if  ( znalazl_panstwo.test(kontroler.element_kontener[obiekt_id].items[indeks]) ) { max=200; }
          if ( ( licznik < max ) && (re.test(kontroler.element_kontener[obiekt_id].items[indeks]) ) ) {
            opis = kontroler.element_kontener[obiekt_id].items[indeks].replace(re,"<span class='znalezione'>$1</span>");
            //opis = kontroler.element_kontener[obiekt_id].items[indeks];
            nowe += '<a value="'+indeks+'" href="" onclick="'+kontroler.myname+'.SetValues(\''+obiekt_id+'\', [\''+indeks+'\'] );$(\'#'+obiekt_id+' > [atid=div]\').hide().empty();return false;">'+opis+'</a>'; 
            if ( tmp.toLowerCase() == kontroler.element_kontener[obiekt_id].items[indeks].toLowerCase() ) {
              //$('#debuger').append( '<BR> 1. Set = true '+tmp.toLowerCase() );           
              set = true;
            }
            licznik++;               
          }
        }
        
        // jesli beda jakies pozycje
        if ( nowe != '' ) {
            nowe += '<a value="'+indeks+'" href="" class="close" onclick="$(\'#'+obiekt_id+' > [atid=input]\').focus();$(\'#'+obiekt_id+' > [atid=div]\').hide().empty();return false;">zamknij</a>'; 
            $('#'+obiekt_id+' > [atid=div]').html(nowe);
            // dopisz zdarzenia dzieciakom

/*            
              // If IE
              if (!e) {
                event.returnValue = false;
                e.returnValue = false;
              // Firefox, Safari, Opera
              } else {
                e.preventDefault();
              }  


              if ( key == 40 || key == 38 || key == 39 || key == 37 || key == 13 || key == 8 || key == 32) {
                e.returnValue = false;
                e.preventDefault();
              }
              
              if (!e) var e = window.event;
                e.cancelBubble = true;
                if (e.stopPropagation) e.stopPropagation();

*/                          
            $('#'+obiekt_id+' > [atid=div]').children('a').keypress( function(e) { 
              var key = window.event ? e.keyCode : e.which;              
              if ( 'number' == typeof( e.keyCode) ) key = e.keyCode;
              $('#debuger').append('<BR>Key Press ('+key+')');                             
              if ( key == 13 || key == 32 ) {
              //  $('#debuger').append('<HR>Key Press ('+key+')');
              }
              $('#debuger').append(', kPRESS OK');
                  if ('function' == typeof( e.preventDefault) ){
                    e.preventDefault();
                  } else {
                    e.returnValue = false;
                  }
            });
            
/*

 if ( ( 'number' == typeof( e.keyCode) ) && ( (e.keyCode == 40) || (e.keyCode == 38) ) ){
                  console.log(' KeyPress '+key);
                  if ('function' == typeof( e.preventDefault) ){
                    e.preventDefault();
                  } else {
                    e.returnValue = false;
                  }
                }

*/            

            $('#'+obiekt_id+' > [atid=div]').children('a').keyup( function(e) {
              var key = window.event ? e.keyCode : e.which;
              if ( 'number' == typeof( e.keyCode) ) key = e.keyCode;
              $('#debuger').append('<BR>Key Up ('+key+')');                            
              $('#debuger').append(', kUP OK');           
            });
  
            $('#'+obiekt_id+' > [atid=div]').children('a').keydown( function(e) {
              var key = window.event ? e.keyCode : e.which;
              if ( 'number' == typeof( e.keyCode) ) {
               key = e.keyCode;
               e.keyCode = '';
              } 
              if ('function' == typeof( e.preventDefault) ){
                e.preventDefault();
              } else {
                e.returnValue = false;
              }              
              $('#debuger').append('<BR>Key Down ('+key+')');                            
              if ( key == 40 ) {
                if ( $(this).attr('value') == $('#'+obiekt_id+' > [atid=div] a:last-child').attr('value') ) {
                  $('#'+obiekt_id+' > [atid=div] :first-child').focus();
                } else {
                  $(this).next('a').focus();
                }
              } else if ( key == 38 ) {
                if ( $(this).attr('value') == $('#'+obiekt_id+' > [atid=div] :first-child').attr('value') ) {
                   $('#'+obiekt_id+' > [atid=input]').focus(); 
                } else {
                  $(this).prev('a').focus();
                }  
              } else if ( key == 32 || key == 13) {
                $(this).click();
              }
              $('#debuger').append(', kDOWN OK');           
            });

            /*
            $('#'+obiekt_id+' > [atid=div]').keydown( function(e) {
              var key = window.event ? e.keyCode : e.which;
              //console.log(' KeyDownDiv '+key);
              if ( key == 40 || key == 38 || key == 8 || key == 39 || key == 37 || key == 32 || key == 13) {
                e.returnValue = false;
                e.preventDefault();
              }
              if ( key == 9 ) $('#'+obiekt_id+' > [atid=div]').hide().empty(); 
            });         
            
            $('#'+obiekt_id+' > [atid=div]').keypress( function(e) {
              var key = window.event ? e.keyCode : e.which;
              //console.log(' KeyDownDiv '+key);
              if ( key == 40 || key == 38 || key == 8 || key == 39 || key == 37 || key == 32 || key == 13) {
                e.returnValue = false;
                e.preventDefault();
              }
              if ( key == 9 ) $('#'+obiekt_id+' > [atid=div]').hide().empty(); 
            });            
            */
            
            $('#'+obiekt_id+' > [atid=div]').show();
            
            if ( set ) { 
              kontroler.SetValues(obiekt_id,[tmp.toLowerCase()] );
              //$('#debuger').append( '<BR> Set = true '+tmp.toLowerCase() );           
            }        
        } else {
          $('#'+obiekt_id+' > [atid=div]').hide().empty();
        }
        
      }
      
  this.SetValues = function(obiekt_id, kontroler, tab_wartosci) {
      var znalazl = false;  
      if ( typeof(tab_wartosci[0]) != 'undefined') {
        last = tab_wartosci[0];
        $('#debuger').append('<BR>SetValue ('+last+')');            
        if ( typeof( kontroler.tablicaSlownikowa ) != 'undefined') {
          $('#debuger').append('<BR>obiekt kontroler.tablicaSlownikowa  - istnieje ');
          for ( indeks in kontroler.tablicaSlownikowa ) {  
            // jezeli znajdzie identyfikator mapki to go ustawi
            if ( ( znalazl == false ) && ( kontroler.tablicaSlownikowa[indeks]['opismale'] == last.toLowerCase() ) ) {
              znalazl = true;
              // jesli w inpucie juz jest takie wpisane jak wybrane na mapce to nie zmieniaj
              kontroler.element_kontener[obiekt_id].items[indeks] = kontroler.tablicaSlownikowa[indeks]['opis'];
               last = indeks;
            } 
          }
        }
        if ( typeof(kontroler.element_kontener[obiekt_id].items[last]) != 'undefined') {
          kontroler.element_kontener[obiekt_id].values = {};
          kontroler.element_kontener[obiekt_id].values[last] = kontroler.element_kontener[obiekt_id].items[last];
          $('#'+obiekt_id+' > [atid=input]').val(kontroler.element_kontener[obiekt_id].items[last]);          
          $('#'+obiekt_id+' > [atid=input]').focus();
          kontroler.OnChangeTrigger(obiekt_id);
        } else {
          //last = last.toLowerCase();
          $('#debuger').append('<BR> SV: takiego co nie ma w items ('+last+')');
          kontroler.element_kontener[obiekt_id].values = {};
          kontroler.element_kontener[obiekt_id].values[last] = last;
          //kontroler.element_kontener[obiekt_id].items[last] = last;
          $('#debuger').append('<BR> Wpisuje taki co go nie ma w items ('+last+')');
          $('#'+obiekt_id+' > [atid=input]').val(last);          
          $('#'+obiekt_id+' > [atid=input]').focus();
    //          kontroler.OnChangeTrigger(obiekt_id);
        }
      }  
  };
  
  this.Refresh =   
      function(obiekt_id, kontroler) {
/*      
      for (indeks in kontrolser.element_kontener['select_wybor_2'].InitValues) {  
        $('#'+obiekt_id+' > [atid=input]').val(kontroler.element_kontener[obiekt_id].InitValues[indeks]);
        kontroler.element_kontener[obiekt_id].values[indeks] = kontroler.element_kontener[obiekt_id].InitValues[indeks];
      }
        
        kontroler.obiekt_kontener[ kontroler.element_kontener[obiekt_id].type ].inputChangeValue(obiekt_id, kontroler);
*/        
      }
  this.Init =  //  ustawienie w wartosci poczatkowej i podpiecie zdarzen
      function(obiekt_id, kontroler) {
        //this.Refresh(obiekt_id, kontroler);
        // podlacz zdarzenia
        $('#'+obiekt_id+' input:first').attr("atid","input");
        $('#'+obiekt_id+' div:first').attr("atid","div");
        
        $('#'+obiekt_id+' > [atid=input]').attr("autocomplete","off");
        
        $('#'+obiekt_id+' > [atid=input]').keyup( function(e) {
                  // var key = window.event ? e.keyCode : e.which;
                  //var keychar = String.fromCharCode(key);        
                  //console.log(' here  '+key+' -> '+keychar+'   '+$('#'+obiekt_id+' > [atid=input]').val().replace(/^\s+|\s+$/g,"") );

            if ( $('#'+obiekt_id+' > [atid=input]').val().replace(/^\s+|\s+$/g,"") != '' ) { 
              var key = window.event ? e.keyCode : e.which;
              if ( key == 40 ) {
                e.preventDefault();              
                $('#'+obiekt_id+' > [atid=div] > a:first').focus();                            
              } else if ( ( ( key>=49 && key<=90) || ( key>=186 && key<=191 ) || ( key>=219 && key<=222) || ( key == 8) )) {
                  if ( typeof(kontroler.element_kontener[obiekt_id].slownik[$('#'+obiekt_id+' > [atid=input]').val().toLowerCase()]) != 'undefined' ) {
// jesli jest w slowniku                   
                    kontroler.element_kontener[obiekt_id].items = kontroler.element_kontener[obiekt_id].slownik[$('#'+obiekt_id+' > [atid=input]').val().toLowerCase()];
                    kontroler.obiekt_kontener[kontroler.element_kontener[obiekt_id].type].inputChangeValue(obiekt_id, kontroler);
                  } else {
                    kontroler.obiekt_kontener[ kontroler.element_kontener[obiekt_id].type ].inputChangeValue(obiekt_id, kontroler);
                  } 
                }  
            } else {
              $('#'+obiekt_id+' > [atid=div]').hide().empty();        
            }
            return false;
        });
        
        $('#'+obiekt_id+' > [atid=input]').keypress( function(e) {
          key = e.keyCode;
          if ( key == 9 ) $('#'+obiekt_id+' > [atid=div]').hide().empty(); 
          if ( key == 40 ) {
            e.preventDefault();
            $('#'+obiekt_id+' > [atid=div] > a:first').focus();          
          }  
        });        

        $(document).bind('click', function(e) { 
          var target = (e && e.target) || (event && event.srcElement); 
          if ( $(target).parent().attr('id') !== obiekt_id ) {
            $('#'+obiekt_id+' > [atid=div]').hide().empty(); 
          }
        }); 
        $.get( kontroler.element_kontener[obiekt_id].AJAXurl, {fletter : 'test'} , 
          function(data, textStatus) {
            // console.log(textStatus);   
            kontroler.tablicaSlownikowa = data ;
            licznik=0;  
            for( indeks in data) {
              kontroler.element_kontener[obiekt_id].items[indeks] = data[indeks]['opis'];
              licznik++;
            }    
            $('#debuger').append('<BR> Items ustawiony('+licznik+')');               
        },"json");
      }
}
 
obiekt_input_div_tablicowy.prototype = new obiekt_bazowy();