/*jQuery mightySelect plugin
@author Dimedia - http://www.dimedia.hr
@version 1.2
@date 18.08.2009

HOW TO INITIALIZE
$(selector).mightySelect("advanced","dependable","150px",true);
1. var is for advanced selects
2. var is for dependable selects
3. var is for fixed width
*/

(function($) {
	$.fn.mightySelect = function(type,version,width,className) {      
      function _initialize() {
  			openDropdown($(this));
  			return false;
  		}
      
      function openDropdown(spanEl){
          if (spanEl.is(".off")){ return false; }    
          var selectEl = spanEl.prev("select");
          var offset = spanEl.offset();
          var offsetTop = offset.top+spanEl.height()+5;
          var offsetLeft = offset.left;
          var elWidth;
          if(!width||width==""){
              elWidth = spanEl.width()+parseFloat(spanEl.css("padding-left"))+parseFloat(spanEl.css("padding-right"))+3;
          } else {
              elWidth = width;
          }
          
          elWidth = elWidth - 11;

          var addOne;
          
          if($("#select-drop").is(":visible")){
              if(spanEl.is(".open")){ closeSelectDrop(spanEl); return false; }
              closeSelectDrop($("span.sel-replaced.open"));
          }
          
          spanEl.addClass("open");          
          $(document).click(function(e){ if(!$(e.target).is(".sel-replaced")&&$(e.target).parents("#select-drop").attr("id")!="select-drop"){ closeSelectDrop(spanEl); } });
          $(document).keypress(function (e) {
              var key = String.fromCharCode(e.which).toLowerCase();
              var keyData = "asdfghjklčćžqwertzuiopšđyxcvbnm1234567890";
              if(keyData.search(key)!=-1){
                  $("#select-drop li").each(function(i){
                      if(!$(this).is(".selected")){
                          var firstLetter=$(this).text().slice(0,1).toLowerCase();
                          if(i+1==$("#select-drop li").length){ $("#select-drop li").removeClass("visited"); }
                          if(firstLetter.search(key)!=-1&&!$(this).is(".visited")){
                              $("#select-drop ul").get(0).scrollTop=$(this).eq(0).position().top+$("#select-drop ul").get(0).scrollTop;
                              $(this).addClass("highlight").addClass("visited").siblings("li").removeClass("highlight");
                              return false;
                          }
                      }
                  });
              }
          });
          
          if(type=="advanced"){
              if(selectEl.is("[multiple]")){
                  $("body").append('<div id="select-drop" class="'+className+'"><div class="inner"><div class="col2"><img class="close" src="'+phrasebook.URL_ROOT+'/images/ICONclose.gif" title="'+phrasebook.close_dropdown_title+'" /><div class="titleWrapp"><h2 title="'+phrasebook.deselect_dropdown_title+'">'+selectEl.find("option:first").text()+'</h2></div><ul></ul></div></div></div>');
                  populateSelectDrop(selectEl);
              }
              else {
                  $("body").append('<div id="select-drop" class="'+className+'"><div class="inner"><div class="col1"><div class="titleWrapp"><h2 title="'+phrasebook.deselect_dropdown_title+'">'+selectEl.find("option:first").text()+'</h2></div><ul></ul></div></div></div>');
                  populateSelectDrop(selectEl);
                  if(spanEl.next(".multi").find("option").length>1){
                      offsetLeft = offset.left-elWidth;
                      elWidth=elWidth+elWidth;
                      $("#select-drop .inner").append('<div class="col2"><img class="close" src="'+phrasebook.URL_ROOT+'/images/ICONclose.gif" title="'+phrasebook.close_dropdown_title+'" /><div class="titleWrapp"><h2 title="'+phrasebook.deselect_dropdown_title+'">'+phrasebook.inner_loc_text+'</h2></div><ul></ul></div>')
                      populateSelectDrop(spanEl.next(".multi"));
                      $("#select-drop .col1,#select-drop .col2").css({width: (elWidth/2)-17, float: "left"});
                      $("#select-drop .col2").css({marginRight: "0px"});
                  }
              }
              $("#select-drop .col1 h2").click(function(){
                  $(this).parent("div").next("ul").find("li").removeClass("on");                 
                  spanEl.find('span').text($(this).text()); //modified for nowrap
                  selectEl.find("option").removeAttr("selected");
                  selectEl[0].selectedIndex=-1;
                  if(version=="dependable"){
                      selectEl.nextAll("select").each(function(){
                          if($(this).is("[multiple]")){ $(this).find("option").not(":first").remove(); }
                          else {
                              $(this).addClass("off").css("opacity","0.4").find("option:first").attr("selected","selected").siblings("option").remove();
                              $(this).next("span").addClass("off").css("opacity","0.4").text($(this).find("option:selected").text());
                          }
                      });
                  }
                  closeSelectDrop(spanEl);
              });
              $("#select-drop .col2 h2").click(function(){
                  $(this).parent("div").next("ul").find("input").removeAttr("checked");
                  if(spanEl.next("select").is(".multi")){
                      spanEl.next("select").find("option").removeAttr("selected");
                  } else {
                      spanEl.find('span').text($(this).text()); //modified for nowrap
                      selectEl.find("option").removeAttr("selected");
                  }
                  closeSelectDrop(spanEl);
              });
              addOne = 1;
          } else {
              $("body").append('<div id="select-drop" class="'+className+'"><div class="inner"><div class="col1"><ul></ul></div></div></div>');
              populateSelectDrop(selectEl);
              addOne = 0;
          }
      
          $("#select-drop .col1 li").click(function(){
              if(version=="dependable"){
                  selectEl.nextAll("select").each(function(){
                      $(this).addClass("off").css("opacity","0.4").find("option:first").attr("selected","selected").siblings("option").remove();
                      $(this).next("span").addClass("off").css("opacity","0.4").find('span').text($(this).find("option:selected").text()); //modified for nowrap
                  });
              }          
              $(this).addClass("on").siblings("li").removeClass("on");
              spanEl.find('span').text($(this).text()); //modified for nowrap
              if(version=="dependable"){
                  var nextType=spanEl.next("select").attr("name").split("_");
                  var thisType=selectEl.attr("name").split("_");
                  $.get(phrasebook.URL_ROOT+"/index.php?page=getOptionSearch&table="+nextType[0]+"_"+nextType[1]+"&table2="+thisType[0]+"_"+thisType[1]+"&id="+$(this).find("a").attr("rel")+"&sort="+nextType[0]+"_"+nextType[1]+"_name", function(data){
                      spanEl.next("select").html(data).next(".sel-replaced").removeClass("off").css("opacity","1").find('span').text(spanEl.next("select").find("option:first").text()).nextAll(".sel-replaced").addClass("off").css("opacity","0.4"); //modified for nowrap
                      if(spanEl.next("select").is(".multi")&&data!=""){
                          if ( $("#select-drop .col2 ul").html()==null) {
                              offsetLeft = offset.left-elWidth;
                              elWidth=elWidth+elWidth;
                              $("#select-drop .inner").append('<div class="col2"><img class="close" src="'+phrasebook.URL_ROOT+'/images/ICONclose.gif" title="'+phrasebook.close_dropdown_title+'" /><div class="titleWrapp"><h2 title="'+phrasebook.deselect_dropdown_title+'">'+phrasebook.inner_loc_text+'</h2></div><ul></ul></div>')
                              $("#select-drop .col1,#select-drop .col2").css({width: (elWidth/2)-17, float: "left"});
                              $("#select-drop .col2").css({marginRight: "0px"});
                              
                              $("#select-drop").css({top: offsetTop, left: offsetLeft, width: elWidth});
                              $("#select-drop .close").click(function(){ closeSelectDrop(spanEl); });
                          } else{
                              $("#select-drop .col2 ul").empty();
                          }
                          populateSelectDrop(spanEl.next(".multi"));
                          saveNormalSelect(spanEl,false);
                          return false;
                      } else {
                          saveNormalSelect(spanEl,true);
                      }
                  });
              } else {
                  saveNormalSelect(spanEl,true);
              }          
          });
          
          $("#select-drop .close").click(function(){ closeSelectDrop(spanEl); });          
          $("#select-drop").css({top: offsetTop, left: offsetLeft, width: elWidth}).show();
                 
          if($("#select-drop .col1 li.on").length!=0){
              $("#select-drop .col1 ul").get(0).scrollTop=$("#select-drop .col1 li.on").eq(0).position().top;
          }
      }
      
      function populateSelectDrop(selectEl){          
          var selType="normal";
          if (selectEl.is("[multiple]")){ selType="multi"; }
          var attr="";
          switch(selType){
              case "normal":
                  attr=' class="on"';
                  break;
              case "multi":
                  attr=' checked="checked"';
                  break;
          }
          selectEl.find("option").not(".hidden").each(function(i){
              if(i!=0||type=="basic"){
                  var selected="";
                  if($(this).is(":selected")){ selected=attr; }
                  switch(selType){
                      case "normal":
                          $("#select-drop .col1 ul").append('<li'+selected+'><a rel="'+$(this).val()+'">'+$(this).text()+'</a></li>');
                          break;
                      case "multi":
                          if($(this).val()=="selectAll"){
                              if((selectEl.find("option:selected").length+2)==selectEl.find("option").length){ selected = attr; }
                          }
                          $("#select-drop .col2 ul").append('<li><input type="checkbox" value="'+$(this).val()+'" id="drop-check'+i+'"'+selected+'/><label for="drop-check'+i+'">'+$(this).text()+'</label></li>');
                          break;
                  }
              }
              
              $("#select-drop .col1 ul a").hover(function () {
                  $(this).addClass("over");
              }, 
              function () {
                  $(this).removeClass("over");
              });
			  $("#select-drop .col1 ul li:nth-child(odd)").addClass('odd');
			  $("#select-drop .col1 ul li:nth-child(even)").addClass('even');
              
          });
          
          $("#select-drop .col2 ul input").click(function(){
              if($(this).val()=="selectAll"){
                  if ($(this).is("[checked]")) {
                      $("#select-drop .col2 ul input").not(":first").attr("checked","checked");
                      selectEl.find("option").not(":eq(0),:eq(1)").attr("selected","selected");
                  } 
                  else { 
                      $("#select-drop .col2 ul input").not(":first").removeAttr("checked");
                      selectEl.find("option").not(":eq(0),:eq(1)").removeAttr("selected");
                  }
              } else {
                  if ($(this).is("[checked]")) { selectEl.find("option[value='"+$(this).val()+"']").attr("selected","selected"); } 
                  else { selectEl.find("option[value='"+$(this).val()+"']").removeAttr("selected"); }
                  
              }
              
              if(selectEl.next().is(".sel-replaced")){
                  var spanText = new Array();
                  selectEl.find("option:selected").each(function(i){
                      spanText[i] = $(this).text();
                  });
                  if(spanText.length!=0){                      
                      if(spanText.join(",").length<25){
                          selectEl.next(".sel-replaced").find('span').text(spanText.join(", ")); //modified for nowrap
                      } else {
                          selectEl.next(".sel-replaced").find('span').text(spanText.join(", ").substr(0,25)+"..."); //modified for nowrap
                      }
                      
                  } else {
                      selectEl.next(".sel-replaced").find('span').text(selectEl.find("option:first").text()); //modified for nowrap
                  }
              }
          });
          
      }
      
      function saveNormalSelect(spanEl,goOn){      
          var selectEl=spanEl.prev("select");
          selectEl.find("option:selected").removeAttr("selected");
          selectEl.find("option[value='"+$("#select-drop .col1 li.on a").attr("rel")+"']").attr("selected","selected");
          if($("#select-drop").is(":has(.col2)")){
              spanEl.next("select").find("option:selected").removeAttr("selected");
              $("#select-drop .col2 input:checked").each(function(){
                  spanEl.next("select").find("option[value='"+$(this).val()+"']").attr("selected","selected");
				  spanEl.next("select").trigger('change');
              });
          }
          if (selectEl.is(".dependSelect")){              
            spanEl.next(".dependSelect").find("option").removeClass("hidden").not(".parent_"+selectEl.val()).addClass("hidden");
            spanEl.next(".dependSelect").find("option:not(.hidden):first").attr("selected","selected");
            spanEl.next(".dependSelect").next("span").text( spanEl.next(".dependSelect").find("option:not(.hidden):first").text() );   
          }
		  selectEl.trigger('change');
          if (goOn==true){ closeSelectDrop(spanEl); }         
      }
      
      function closeSelectDrop(spanEl){
          //$(document).unbind("click");
          $(document).unbind("keypress");
          $("#select-drop").remove();
          spanEl.removeClass("open");
          spanEl.trigger('mightySelectChange');
      }
      
      return this.unbind('click').click(_initialize);
	};
})(jQuery);

