/*  
 *  jQuery Combobox with autocomplete plugin 1.0.1
 *  www.frebsite.nl
 *  Copyright (c) 2009 Fred Heusschen
 *  Licensed under the MIT license.
 *  http://www.opensource.org/licenses/mit-license.php
 */

(function($) {
  $.fn.clearButton = function() {
    var el = this;
    //var initClick = true;
    var v = null;
    var btnClear ='<span class="btnClear" title="Wyczyść tekst [ctrl + d]">x</span>';
    var btnEmpty ='<span class="btnEmpty">&nbsp;</span>';
    if ( $(el).val() != '') {
        $(el).next().replaceWith(btnClear);
        $(el).next().click(function() {
          $(this).prev().val('').focus();
          $(this).replaceWith(btnEmpty);
        });  
    }
    $(el).keydown(function(e) {
        if(e.keyCode == 68 && e.ctrlKey) {
          //e.preventDefault();
          $(this).val('').focus();
          $(this).next().replaceWith(btnEmpty);
          return false;
        }
    });
    $(el).keyup(function() {  
      if ( $(this).val() != '') {
        $(this).next().replaceWith(btnClear);
        //if(initClick) {  
          $(this).next().click(function() {
            $(this).prev().val('').focus();
            $(this).replaceWith(btnEmpty);
          });        
        //initClick = false;
        //}
      }else{
        $(this).next().replaceWith(btnEmpty);
      } 
    });
  };
  $.fn.combobox = function(settings) {
    var opts = $.extend({}, $.fn.combobox.defaults, settings);
    
    var mThis = this;
    var mForm = mThis.parents('form:first');
    var hardSpace = "&nbsp;"; 
    if( $.browser.opera) {hardSpace = "\u00a0";}
    if( $.browser.safari ) {hardSpace = "\u00a0";}
    if ($.browser.msie && $.browser.version > 6) {}
    if ($.browser.msie && $.browser.version <= 6 ) {}
    if ($.browser.mozilla && $.browser.version >= "1.8" ) {}
    if( navigator.userAgent.toLowerCase().indexOf('chrome') != -1) {hardSpace = "&nbsp;";}

    if (!$('#combobox_overlay').length) {
      $('body').append('<div id="combobox_overlay"></div>');
      $('#combobox_overlay').unbind('click').click($.fn.combobox.sluitSelect);
    }
    
    return this.each(function() {
      var el = $(this);

      var id = el.attr('id');
      var attrClass = el.attr('class') || '';
      //var style = el.attr('style');
      var styleWidth = el.css('width').replace('px','')-12;
      var _id = '#combobox_container_'+id+' ';
      var ic = (id.length > 0) ? ' id="combobox_container_'+id+'"':'';
          id = (id.length > 0) ? ' id="'+id+'"':'';
      var na = (el.attr('name').length) ? ' name="'+el.attr('name')+'"':'';
      var ti = (el.attr('tabindex').length) ? ' tabindex="'+el.attr('tabindex')+'"':'';
      
      var text = $(':selected', el).html().replace(hardSpace+'-- ','').replace(' --','').replace(hardSpace+'- ','').replace(hardSpace,'');
      var cb = '<input class="combobox_hidden" type="hidden"'+na+''+id+' value="'+el.val()+'" />';
          // trim for ie7 > .replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, '');
          if (opts.trim != 0 && opts.trim < text.length) { text = text.substr(0,opts.trim).trim();text+="...";}
          cb += '<input class="combobox_input '+attrClass+'" type="text" value="'+text+'"'+ti+' readonly="readonly" style="width:'+styleWidth+'px" />';
          //cb += '<div class="combobox_button"></div>';
          cb += '<div class="combobox_bg"><div class="combobox_summary">';
          cb += '<div class="combobox_summary_arrow"></div>';
      
      if (opts.style == "default") {
        var cat = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class="selected"';} else { var c = '';}
          t = $(this).html().replace(hardSpace,'');
          cat += '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
        });
        cb += '<table><tr><td><span class="btnClose">x</span></td></tr>';
        if (opts.txtCategory!='') { cb += '<tr class="head"><td>'+opts.txtCategory+':</td></tr>'; }
        cb += '<tr><td><ul>'+cat+'</ul></td></tr></table>';
      } else if (opts.style == "typeDefault") {
        var cat = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class="selected"';} else { var c = '';}
          if(e==0){
            t = t.replace(hardSpace+'-- ','').replace('--','');
            showAll = '<li class="tAll">- <a'+c+' href="'+v+'">'+t+'</a> -</li>';
          }else {
            t = $(this).html().replace(hardSpace,'');
            cat += '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          }
        });
        cb += '<table><tr><td><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr>';
        cb += '<tr><td colspan="2"><ul>'+cat+'</ul></td></tr></table>';
      } else if (opts.style == "view") {
        var countyMainCat = 0;
        var countyMainCatPrev = 0;
        var onlyManiCat = null;
        $('option', el).each(function() {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class=\\"selected\\"';} else { var c = '';}
          if (t.indexOf('Rejony poza')!=-1||v==""){ // to co niepotrzebne
          }else if(t.indexOf('Dowolny rejon')!=-1){ // napis: 'wszystkie kategorie'
            t = t.replace(hardSpace+'-- ','').replace('--','');
            eval('zmienna'+countyMainCat+' = "<ul><li class=\\"tAll\\">- <a'+c+' href=\\"'+v+'\\">'+t+'</a> -</li></ul>";');
          }else if(t.indexOf(hardSpace)!=-1 && t.indexOf(hardSpace+'-')==-1){ // glowna kategoria
            if (onlyManiCat) countyMainCatPrev = countyMainCat;
            countyMainCat = v;
            if (countyMainCatPrev!=countyMainCat) {
              eval('zmienna'+countyMainCatPrev+' += "</ul>";');
            }
            t = $(this).html().replace(hardSpace,'');
            eval('zmienna'+countyMainCat+' = "<ul><li class=\\"first\\"><a'+c+' href=\\"'+v+'\\">'+t+'</a></li>";');
            onlyManiCat = true;
          }else if(t.indexOf(hardSpace+'-')!=-1){ // pod kategoria
            t = $(this).html().replace(hardSpace+'- ','');
            eval('zmienna'+countyMainCat+' += "<li><a'+c+' href=\\"'+v+'\\">'+t+'</a></li>";');
            countyMainCatPrev = countyMainCat;
            onlyManiCat = false;
          }
        });
        //console.log('zmienna'+countyMainCat);
        eval('zmienna'+countyMainCat+' += "</ul>";');

        cb += '<table><tr><td colspan="6">'+zmienna0+'</td><td><span class="btnClose">x</span></td></tr><tr><td>'+zmienna72+'</td><td>'+zmienna1+'</td><td>'+zmienna27+'</td><td>'+zmienna48+'</td><td>'+zmienna42+'</td><td>'+zmienna59+'</td><td>'+zmienna86+zmienna87+'</td></tr><tr><td>'+zmienna20+'</td><td>'+zmienna10+'</td><td>'+zmienna35+'</td><td>'+zmienna54+'</td><td>'+zmienna61+'</td><td>'+zmienna60+'</td><td>&nbsp;</td></tr></table>';
        //cb += '<table><tr><td colspan="3">'+zmienna0+'</td><td><span class="btnClose">x</span></td></tr><tr><td>'+zmienna72+'</td><td>'+zmienna1+'</td><td>'+zmienna27+'</td><td>'+zmienna48+'</td></tr><tr><td>'+zmienna20+'</td><td>'+zmienna10+'</td><td>'+zmienna35+'</td><td>'+zmienna54+'</td><td>&nbsp;</td></tr><tr><td>'+zmienna59+'</td><td>'+zmienna61+'</td><td>'+zmienna60+'</td><td>'+zmienna42+'</td></tr><tr><td>'+zmienna86+'</td><td>'+zmienna87+'</td><td>&nbsp;</td><td>&nbsp;</td></tr></table>';
        
      } else if (opts.style == "typeA") {
      
        var cat1 = cat2 = cat3 = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          //console.log(t+" > "+v+' >'+countyMainCat);
          if (s) { var c = ' class="selected"';} else { var c = '';}
          if(e==0){
            t = t.replace(hardSpace+'-- ','').replace('--','');
            showAll = '<li class="tAll">- <a'+c+' href="'+v+'">'+t+'</a> -</li>';
          }else if(e>=1 && e<7){ // kategoria 1
            t = $(this).html().replace(hardSpace,'');
            cat1 += '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          }else if(e>=7 && e<12){ // kategoria 2
            t = $(this).html().replace(hardSpace,'');
            cat2 += '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          }else if(e>=12){ // kategoria 3
            t = $(this).html().replace(hardSpace,'');
            cat3 += '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          }
        });
        
        //cb += '<table><tr><td colspan="2"><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr class="head"><td>Dom/Mieszkanie:</td><td>Pokój lub miejsce w pokoju (roomshare):</td><td>Lokale użytkowe:</td></tr><tr><td><ul>'+cat1+'</ul></td><td><ul>'+cat2+'</ul></td><td><ul>'+cat3+'</ul></td></tr></table>';
        //cb += '<table><tr><td colspan="2"><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td><ul>'+cat1+'</ul></td><td><ul>'+cat2+'</ul></td><td><ul>'+cat3+'</ul></td></tr></table>';
        cb += '<table><tr><td><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td colspan="2"><ul>'+cat2+'</ul><ul>'+cat1+'</ul><ul>'+cat3+'</ul></td></tr></table>';
        
      } else if (opts.style == "sectorJ") {
      
        var group1 = group2 = group3 = group4 = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class="selected"';} else { var c = '';}
          if(e==0){
            t = t.replace(hardSpace+'-- ','').replace('--','');
          }else{
            t = $(this).html().replace(hardSpace,'');
          }
          var li = '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          if(e==0){ showAll = '<li class="tAll">- <a'+c+' href="'+v+'">'+t+'</a> -</li>';
          }else if(v==1 || v==5 || v==6 || v==8){ 
            group1 += li;
          }else if(v==4 || v==7 || v==13 || v==16 || v==17){ 
            group2 += li;
          }else if(v==2 || v==10 || v==11 || v==15){ 
            group3 += li;
          }else{
            group4 += li;
          }
        });
        
        //cb += '<table><tr><td colspan="3"><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td><ul>'+group2+'</ul></td><td><ul>'+group1+'</ul></td></tr><tr><td><ul>'+group3+'</ul></td><td><ul>'+group4+'</ul></td></tr></table>';
        cb += '<table><tr><td><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td colspan="2"><ul>'+group2+'</ul><ul>'+group1+'</ul><ul>'+group3+'</ul><ul>'+group4+'</ul></td></tr></table>';
        
      } else if (opts.style == "typeB") {
      
        var group1 = group2 = group3 = group4 = group5 = group6 = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class="selected"';} else { var c = '';}
          if(e==0){
            t = t.replace(hardSpace+'-- ','').replace('--','');
          }else{
            t = $(this).html().replace(hardSpace,'');
          }
          var li = '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          if(e==0){ showAll = '<li class="tAll">- <a'+c+' href="'+v+'">'+t+'</a> -</li>';
          }else if(v==2 || v==4 || v==8 || v==10 || v==20 || v==23){ 
            group1 += li;
          }else if(v==5 || v==6 || v==7 || v==9 || v==17 || v==21){ 
            group2 += li;
          }else if(v==1 || v==13 || v==16 || v==18){ 
            group3 += li;
          }else if(v==3 || v==11 || v==15 || v==19 || v==22){ 
            group4 += li;
          }else if(v==14){
            group5 += li;
          }else{ 
            group6 += li;
          }
        });
        
        //cb += '<table><tr><td colspan="3"><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td><ul>'+group1+'</ul></td><td><ul>'+group2+'</ul></td></tr><tr><td><ul>'+group3+'</ul></td><td><ul>'+group4+'</ul></td></tr><tr><td><ul>'+group5+'</ul></td><td><ul>'+group6+'</ul></td></tr></table>';
        cb += '<table><tr><td><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td colspan="2"><ul>'+group1+'</ul><ul>'+group2+'</ul><ul>'+group3+'</ul><ul>'+group4+'</ul><ul>'+group5+'</ul><ul>'+group6+'</ul></td></tr></table>';
        
      } else if (opts.style == "typeBS") {
      
        var group1 = group2 = group3 = group4 = group5 = group6 = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class="selected"';} else { var c = '';}
          if(e==0){
            t = t.replace(hardSpace+'-- ','').replace('--','');
          }else{
            t = $(this).html().replace(hardSpace,'');
          }
          var li = '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          if(e==0){ showAll = '<li class="tAll">- <a'+c+' href="'+v+'">'+t+'</a> -</li>';
          }else if(v==5 || v==6 || v==8 || v==11){ 
            group1 += li;
          }else if(v==2 || v==3 || v==4 || v==7 || v==14){ 
            group2 += li;
          }else if(v==1 || v==10 || v==13){ 
            group3 += li;
          }else if(v==9 || v==15 || v==16){  
            group4 += li;
          }else if(v==12){  
            group5 += li;
          }else{ 
            group6 += li; 
          }
        });
        
        cb += '<table><tr><td colspan="3"><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td><ul>'+group2+'</ul></td><td><ul>'+group1+'</ul></td></tr><tr><td><ul>'+group3+'</ul></td><td><ul>'+group4+'</ul></td></tr><tr><td><ul>'+group5+'</ul></td><td><ul>'+group6+'</ul></td></tr></table>';
        
      } else if (opts.style == "typeP") {
      
        var group1 = group2 = '';
        $('option', el).each(function(e) {
          var t = $(this).html();
          var v = $(this).attr('value');
          var s = $(this).attr('selected');
          if (s) { var c = ' class="selected"';} else { var c = '';}
          if(e==0){
            t = t.replace(hardSpace+'-- ','').replace('--','');
          }else{
            t = $(this).html().replace(hardSpace,'');
          }
          var li = '<li><a'+c+' href="'+v+'">'+t+'</a></li>';
          if(e==0){ showAll = '<li class="tAll">- <a'+c+' href="'+v+'">'+t+'</a> -</li>';
          }else if(v==3 || v==6 || v==8 || v==9 || v==16 || v==17 ||v==18){ 
            group1 += li;
          }else{ 
            group2 += li; 
          }
        });

        cb += '<table><tr><td colspan="3"><ul>'+showAll+'</ul></td><td><span class="btnClose">x</span></td></tr><tr><td><ul>'+group1+'</ul></td><td><ul>'+group2+'</ul></td></tr></table>';

      }
      
      
      
      cb += '</div></div>';
      
      
      el.wrap('<div class="combobox_container"'+ic+'></div>');
      var di = el.parent();  
        di.append(cb);
        el.remove();
        


      //  selectie openen via button
      if (opts.showOnMouseOver) {
        $(di).mouseover(function() {
          $.fn.combobox.openSelectFromButton($(this), opts);
        }).click(function() {
          return false;
        });
      } else {
        $(document).click(function(e) {
          $.fn.combobox.sluitSelect();
        });
        $('.combobox_summary').click(function(e){
          e.stopPropagation();
        });
        $('.combobox_summary span.btnClose', di).click(function() {
          $.fn.combobox.sluitSelect();
        });
        $('.combobox_input', di).mouseover(function() {
          $('.combobox_input', di).addClass('hover');
        })
        $('.combobox_input', di).mouseout(function() {
          $('.combobox_input', di).removeClass('hover');
        });
        //$('.combobox_input', di).add($('.combobox_button', di)).click(function() { //}
        $('.combobox_input', di).click(function() {
          if (opts.buttonToggle && $('#combobox_overlay:visible').length) {
              $.fn.combobox.sluitSelect();
          } else  $.fn.combobox.openSelectFromButton($(this), opts);
          return false;
        });
      }
      // using keys up&down
      $('.combobox_input', di).keydown(function(e) {
        var prevSelected = $('.combobox_summary li a.selected',di);
        if (e.keyCode == '40' && opts.useArrowKey) {
          e.preventDefault();
          if (prevSelected) prevSelected.removeClass('selected');
          
          var newIndex = $('option', el).index($('option:selected', el));
          var countOptions = $('option', el).size();
          
          //console.log(newIndex+" "+countOptions)
          if(newIndex < countOptions-1) {
          //console.log(newIndex);
            var nextSelected = $('option:selected', el).next();
            var count_opt=1;
            while (nextSelected.val()=='' && count_opt<=3){
              nextSelected = $('option:selected', el).next().attr('selected', true);
              count_opt++
            }
            
            
            
            
            //console.log(prevSelected);
            //console.log($('.combobox_summary li a[href='+nextSelected.val()+']', di));
            
            $('.combobox_summary li a[href='+nextSelected.val()+']', di).addClass('selected');
            
            
            
            prevSelected = nextSelected;
            nextSelected.attr('selected', true);
        $(this).val(nextSelected.text());
        $('input.combobox_hidden', di).attr('value', nextSelected.val());
          }
        }
        if (e.keyCode == '38' && opts.useArrowKey) {
          e.preventDefault();
          if (prevSelected) prevSelected.removeClass('selected');
          
          var newIndex = $('option', el).index($('option:selected', el));
          if(newIndex > 0) {
          //console.log("i"+newIndex);
            var prevSelected = $('option:selected', el).prev();
            var count_opt=1;
            while (prevSelected.val()=='' && count_opt<=3){
              prevSelected = $('option:selected', el).prev().attr('selected', true);
              count_opt++
            }
            
            $('.combobox_summary li a[href='+prevSelected.val()+']', di).addClass('selected');
            
            nextSelected = prevSelected;
            prevSelected.attr('selected', true);
        $(this).val(nextSelected.text());
        $('input.combobox_hidden', di).attr('value', nextSelected.val());
          }
        }
      });
      
      //  selectie sluiten na mouse-out
      if (opts.hideOnMouseOut) {
        $(di).mouseout(function() {
          $.fn.combobox.sluitSelect();
        });
      }
      
      //  gekozen selectie toepassen
      $('.combobox_summary li a', di).click(function() {
        var v = $(this).attr('href');
        var text = $(this).html();
        var prevSelected = $('.combobox_summary li a.selected',di);
        if (prevSelected) prevSelected.removeClass('selected');
        
        // trim for ie7 > .replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, '');
        if (opts.trim != 0 && opts.trim < text.length) { text = text.substr(0,opts.trim).trim();text+="...";}

        //console.log(prevSelected);
        $(this).addClass('selected');
        prevSelected = $(this);
        $('input.combobox_input', di).val(text);
        $('input.combobox_hidden', di).attr('value', v);
        

        $.fn.combobox.sluitSelect();
        opts.callbackSelectOption(v);
        if (opts.reloadOnChange) mForm.submit();
        return false;
      });
      $.fn.combobox.sluitSelect();
    });
  };
  $.fn.combobox.openSelectFromButton = function(btn, o) {
    var ul = btn.parent().find('div'); 
    $('li', ul).show();
    $.fn.combobox.sluitSelect();
    $.fn.combobox.openSelect(ul, ul.children('li').size(), o);

    var ar = new Array();
    $('li a', ul).each(function() {
      ar.push($(this).attr('href'));
    });
    o.callbackShowOptions(ar);
  };
  $.fn.combobox.openSelect = function(el, aa, o) {
    el.show();
    //var nh = (aa > o.maxVisibleOptions) ? (o.maxVisibleOptions * $('li:visible', el).height())+'px' : '';
    //el.css('height', nh);
    //el.scrollTop(0);
    $(el).parent().css('z-index', '1000');
    $('#combobox_overlay').show();
  };
  $.fn.combobox.sluitSelect = function() { 
    $('.combobox_bg').hide();
    $('#combobox_overlay').hide();
    $('.combobox_bg').parent().css('z-index', '0');
  };
  $.fn.combobox.defaults = {
    style: 'default',
    reloadOnChange: false,
    useArrowKey: true,
    trim: 0,
    txtCategory: '',
    showOnMouseOver:    false,
    hideOnMouseOut:     false,
    //maxVisibleOptions:    1000000,
    buttonToggle:      true,
    callbackShowOptions:  function(arr) {},
    callbackSelectOption:  function(arr) {}
  };
  
})(jQuery);