/*
 * Draeger Address Selector 
 * created by Christian Beyer (e7)
 * updated 091001
 */

// LH URL (Proxy zum lokalen Testen)
var proxy=false;
var actHost=draeger.SEND_PATH;

// globale Variablen
//var historyLimit=true;
var historyAction=false;
var historykeys=new Array();
var ajaxLocationFinished=true;
var ajaxSellerFinished=true;
var lastQuery='';
var selectHtml=new Array("","","");
var selectSelected=new Array("","","");
var reqType="";
var size="6";

// Servlet URLs von LH
var urlLocation="";
var urlSeller="";
var urlResults="";
var urlSearchResults="";

// Servlet URLS werden gesetzt    
if (proxy){
  urlLocation="../../Proxy?mimeType=text/plain&url="+actHost+"as/getCityFilterJSON.action";
  urlSeller="../../Proxy?mimeType=text/plain&url="+actHost+"as/getContactTypeFilterJSON.action";
  urlResults="../../Proxy?mimeType=text/plain&url="+actHost+"as/getAddressesJSON.action";
  urlSearchResults="../../Proxy?mimeType=text/plain&url="+actHost+"as/getAddressesJSON.action";
} else {
  urlLocation=actHost+"as/getCityFilterJSON.action";
  urlSeller=actHost+"as/getContactTypeFilterJSON.action";
  urlResults=actHost+"as/getAddressesJSON.action";
  urlSearchResults=actHost+"as/getAddressesJSON.action";
}

/*
 *  Ajax Eventhandler (mit Requesturl und Callbackfunktion als Parameter)
 */  
function ajaxEventHandler(url,params,callbackFunc) {
    $.ajax({
           type: "GET",
           url: encodeURI(url+params),
           dataType: "json",
           timeout: 20000,
           error: function (XMLHttpRequest, textStatus, errorThrown) {noResult("The Webservice is temporarily not available.","Error");hideOverlay();},
           success: function(data,textStatus){
                if (textStatus!="error"){
                      // Bei fehlerhafter Suche
                      if (data.Message && data.Message.Type =="Error"){
                          noResult(data.Message.Value,lastQuery);
                          hideOverlay();
                      } else {   
                         $(".addressControls div").attr("style","display:block;"); 
                         callbackFunc(data);            
                      }
                            
                   }
           },
           complete: function (XMLHttpRequest, textStatus) { }
     });
}


/*
 * URL für Ajax Request wird anhand von Parametern gesetzt und zurückgegeben
 * 
 */
function getParams(qType){
    var params='';  
    switch (qType) {
       case "location"  : params="?country="+country+"&lang="+draeger.LANGUAGE+"&"+Math.random(9999);
                          break;
       case "seller"    : params="?country="+country+"&city="+loc+"&lang="+draeger.LANGUAGE+"&"+Math.random(9999);
                          break;
       case "results"   : params="?country="+country+"&city="+loc+"&contactType="+seller+"&page="+page+"&size="+size+"&lang="+draeger.LANGUAGE+"&"+Math.random(9999);
                          break;
       case "search"    : lastQuery=query;
                          params="?query="+query+"&country="+country+"&city="+loc+"&contactType="+seller+"&page="+page+"&size="+size+"&lang="+draeger.LANGUAGE+"&"+Math.random(9999);
                          break;
    }
    return params;   
}
          
/*
 * Vorstufe vor dem Ajaxcall
 * 
 * Per Parameter werden Aufrufe und Callbackfunktionen gesetzt 
 */
function updateAddressSelector(params){
    // Overlay wird angezeigt
    showOverlay();
    //for history last Request Typ
    reqType=params;
    // Wenn Suchfeld befüllt, wird Suchwort eingelesen
    if (params=="search" || (params=="results" && $("#search input").attr("value")!="") ){
        params="search";
        query= $("#search input").attr("value");
        //neues Suchwort
        if ((query!=lastQuery)&& !historyAction ){
            page=1;
        }
    }
    ajaxLocationFinished=true;
    ajaxSellerFinished=true;
    // Parameter regelt den Aufruf
     switch (params) {
       case "location" :    ajaxLocationFinished=false;ajaxSellerFinished=false;
                            ajaxEventHandler(urlLocation,getParams("location"),updateLocation);
                            ajaxEventHandler(urlSeller,getParams("seller"),updateSeller);
                            ajaxEventHandler(urlResults,getParams("results"),updateResults);
                            break;
       case "seller" :      ajaxSellerFinished=false;
                            ajaxEventHandler(urlSeller,getParams("seller"),updateSeller);
                            ajaxEventHandler(urlResults,getParams("results"),updateResults);
                            break;                            
       case "results"   :   ajaxEventHandler(urlResults,getParams("results"),updateResults);
                            break;
       case "search"   :    lastQuery=query;
                            country="all";
                            loc="all";
                            seller="all";
                            ajaxSellerFinished=false;
                            ajaxEventHandler(urlSeller,getParams("seller"),updateSeller);
                            ajaxEventHandler(urlSearchResults,getParams("search"),updateResults);
                            setStateSearchSelector();
                            break;    
     }                             
} 

                
/*
 * Country gewählt, Locationdropdown wird gesetzt
 */
function updateLocation(jsonObj){
     //Dropdownfeld Location wird gesetzt
     $("#cat2 .selectCat").remove();
     //Location enabled
     $("#cat2 div").html('<select class="cat2" name="cat2"><option id="allLocation">'+draeger.LABEL_ALL_CITYOPTION+'</option></select>'); 
     var actSelect= $(".cat2");
     // Daten aus JSON Objekt eingesetzt
     $.each(jsonObj.Cities, function(j,value){
             //bei History Back/Forward  wird select gesetzt
              if (historyAction && (selectSelected[1]==value.id)){
                actSelect.append("<option selected='selected' id='"+value.id+"'>"+value.name+"</option>");
              } else {
                  actSelect.append("<option id='"+value.id+"'>"+value.name+"</option>");
              }
     });
     // abschliesend wieder neuinitialisiert     
     actSelect.selectBox({css:'selectCat'});  
     $("#cat2 .selectCat ul").click(function(){whichDropdown($(this));return false;});
     
     ajaxLocationFinished=true;
}     

/*
 * Location gewählt, Sellerdropdown wird gesetzt
 */
function updateSeller(jsonObj){
     //Dropdownfeld Location wird gesetzt
     $("#cat3 .selectCat").remove();
     //Location enabled
     $("#cat3 div").html('<select class="cat3" name="cat3"><option id="allSeller">'+draeger.LABEL_ALL_CONTACTTYPEOPTION+'</option></select>'); 
     var actSelect= $(".cat3");
     // Daten aus JSON Objekt eingesetzt
     $.each(jsonObj.contactTypes, function(j,value){ 
              //bei History Back/Forward  wird select gesetzt
              if (historyAction && (selectSelected[2]==value.id)){
                  actSelect.append("<option selected='selected' id='"+value.id+"'>"+value.name+"</option>");
              } else {
                actSelect.append("<option id='"+value.id+"'>"+value.name+"</option>");
              }
     });
     // abschliesend wieder neuinitialisiert     
     actSelect.selectBox({css:'selectCat'});  
     $("#cat3 .selectCat ul").click(function(){whichDropdown($(this));return false;});
    
     ajaxSellerFinished=true;
}  

 /*
 * Gelieferte Händler Results vom Ajax Request werden ausgegeben
 */
function updateResults(jsonObj){
   // Adressliste wird geleert
   $(".addressList").html("");  
   // Html für die einzelnen Angebote(aus JSON) wird erstellt und an die Ergebnisliste angehängt
   var actResult='';
   $.each(jsonObj.Addresses, function(i,seller){
       if (((i+1)==1)||((i)%3==0)){
           actResult+='<div class="address tables m-tablocation m-tablocationwide clearfix"><div class="left">'; 
       } else {
           actResult+='<div class="right">';
       }
       // Check Belegung Rückgabewerte
       if(seller.addressLine1==null)seller.addressLine1="";else seller.addressLine1+='<br/>';
       if(seller.addressLine2==null)seller.addressLine2="";else seller.addressLine2+='<br/>';
       if(seller.city==null)seller.city="";else seller.city+='<br/>';
       if(seller.region==null)seller.region="";else seller.region+='<br/>';
       if(seller.postalCode==null)seller.postalCode="";else seller.postalCode+='<br/>';
       if(seller.country==null)seller.country="";else seller.country+='<br/>';
       if(seller.phone==null)seller.phone="";else seller.phone='<span class="phone">'+seller.phone+'</span>';
       if(seller.fax==null)seller.fax="";else seller.fax='<span class="fax">'+seller.fax+'</span>';
       if(seller.email==null)seller.email="";else seller.email='<a  href="mailto:'+seller.email+'" class="lnkinternal mail">'+seller.email+'</a>';
       if(seller.pdfLink==null){
           seller.pdfLink="";
       } else {
           //if (seller.pdfLink.substr(0,4)=="www."){
                    seller.pdfLink='<a target="_blank" href="http://'+seller.pdfLink+'" class="lnkinternal anfahrt">'+draeger.LABEL_DIRECTION+'</a>';
                //} else {
                  //  seller.pdfLink='<a target="_blank" href="'+draeger.DOCROOT+'/media/addressSelector/'+seller.pdfLink+'" class="lnkinternal anfahrt">'+draeger.LABEL_DIRECTION+'</a>';
                //}
       }
       if(seller.businessActivities1==null)seller.businessActivities1="";else seller.businessActivities1+='<br/>';
       if(seller.businessActivities2==null)seller.businessActivities2="";else seller.businessActivities2+='<br/>';
       if(seller.businessActivities3==null)seller.businessActivities3="";else seller.businessActivities3+='<br/>';
       if(seller.businessActivities4==null)seller.businessActivities4="";else seller.businessActivities4+='<br/>';
       if(seller.businessActivities5==null)seller.businessActivities5="";else seller.businessActivities5+='<br/>';
       //Adress HTML mit Daten aus JSON versehen 
       actResult+='  <div>\n\
                        <h5>'+seller.contactType+'</h5>\n\
                        <h3>'+seller.fullname+'</h3>\n\
                        <p class="txsmall anschrift">'+seller.addressLine1+seller.addressLine2+seller.city+seller.region+seller.postalCode+seller.country+'</p>\n\
                        <p class="txsmall">'+seller.phone+seller.fax+'</p>\n\
                        <p class="txsmall">'+seller.email+seller.pdfLink+'</p>\n\
                        <div class="specs">\n\
                          <h3>'+draeger.LABEL_BUSINESS_ACTIVITIES+'</h3>\n\
                          <p class="txsmall">'+seller.businessActivities1+seller.businessActivities2+seller.businessActivities3+seller.businessActivities4+seller.businessActivities5+'</p>\n\
                        </div>\n\
                      </div>\n\
                   </div>';            
       if ((i+1)%3==0||(i+1)==jsonObj.Addresses.length){
           actResult+='</div>'; 
       }  
   });
   //Result an Liste angehängt
   $(".addressList").append(actResult);        
   //Eventanzahl aus JSON Objekt übernommen
   addressCounter=jsonObj.Total;
   //Produktanzahl ins HTML geschrieben
   $(".prodCounter").html(addressCounter);
   // Anzahl Ergebniseiten ermittelt
   pageCounter=Math.ceil((parseInt(addressCounter)/parseInt(size)));
   
   // Pagecontrol aktualisieren
   pageControl();
    // wait finishing all Ajax Events to go further
   var time=0;
   var ajaxInterval=window.setInterval(function(){
                                         if (ajaxLocationFinished&&ajaxSellerFinished){
                                               // Historypunkt gesetzt, wenn Browser Back/Forwardbutton nicht gerade gedrückt wurde
                                               if (!historyAction){
                                                    saveHistory();
                                               } else {
                                                    historyAction=false;
                                               }
                                               // Ajax Overlay verstecken
                                               hideOverlay();
                                               window.clearInterval(ajaxInterval);
                                         }
                                         time+=100;
                                         //timeout 30 sec
                                         if (time>=20000){
                                                window.clearInterval(calInterval);
                                         }
                                     }, 100);
  
}

/*
 * Pagingmechanismus für die Seitenauswahl
 */
function pageControl(){
   $(".addressControls .disabled").removeClass("disabled");
   // aktuelle Seitenzahl wird ausgelesen
   page=parseInt(page);
   pageCounter=parseInt(pageCounter);
   // HTML Seitenzahlen werden aktualisiert
   $(".minus2Page").html(page-2);
   $(".minus1Page").html(page-1);
   $(".actPage").html(page);
   $(".plus1Page").html(page+1);
   $(".plus2Page").html(page+2);
   // Wenn man sich auf der letzten Seite befindet, werden Forwardbutton, nächste Seite usw. disabled
   if (page==pageCounter){
       $(".plus1Page").addClass('disabled');
       $(".plus2Page").addClass('disabled');
       $(".plus1Page").html('');
       $(".plus2Page").html('');
       $(".lastPage").addClass('disabled');
       $(".nextPage").addClass('disabled');
   }
    // Wenn man sich auf der vorletzten Seite befindet,... 
   if (page+1==pageCounter){      
       $(".plus2Page").addClass('disabled');
       $(".plus2Page").html('');     
   }   
   // Wenn man sich auf Seite 1 befindet,... 
   if (page==1){
       $(".firstPage").addClass('disabled');
       $(".prevPage").addClass('disabled');
       $(".minus2Page").addClass('disabled');
       $(".minus2Page").html('');
       $(".minus1Page").addClass('disabled');
       $(".minus1Page").html('');
   } 
   // Wenn man sich auf Seite 2 befindet,...
   if (page==2){
       $(".minus2Page").addClass('disabled');
       $(".minus2Page").html('');
   } 
}   


/*
 *  "Ajax" Overlay wird angezeigt
 */
function showOverlay(){
  var height=$("#contentContainer").innerHeight();
  $("#wait").children().css({ display:"block"});
  $("#wait").css({ opacity: "0.5",left:"0px",height:height});
}

/*
 *  "Ajax" Overlay wird wieder versteckt
 */
function hideOverlay(){
    $("#wait").css({ left:"-2000px",height:"1px"});
    $("#wait").children().css({ display:"none"});
}

/*
 * Callback bei Klick auf Selektor Dropdowns
 */
function whichDropdown(elem){
    page=1;
    // Suchfeld wird geleert bei Selektorclick
    $("#search input").attr("value","");
    query="";
    lastQuery="";
    // gewünschte ID der Kategorie wird ermittelt
    var actCat= elem.parent().prev("div").children("p").attr("class");
    var actSelect=elem.parent().prevAll("select");
   // welches Dropdown wurde geklickt?
        switch (actSelect.attr("class")){
                     case "cat1"    : country=actCat;
                                      loc="all";
                                      seller="all";
                                      if (country=="allCountry"){
                                          country="all";                                   
                                          // Selektor wird aktualisiert (Ajax)
                                          updateAddressSelector("seller");
                                          disableSelector("2");
                                          //disableSelector("3");
                                      } else {
                                          // Selektor wird aktualisiert (Ajax)
                                          updateAddressSelector("location"); 
                                      }               
                                      break;
                     case "cat2"    : loc=actCat;
                                      seller="all";
                                      if (loc=="allLocation"){
                                          loc="all";
                                      }
                                      updateAddressSelector("seller");
                                      break;
                     case "cat3"    : seller=actCat;
                                      if (seller=="allSeller"){
                                          seller="all";
                                      }
                                      // Jobselektor wird aktualisiert (Ajax)
                                      updateAddressSelector("results");
                                      break;
            }                       
}


/*
 * Callback für Pagingbuttons
 */
function whichControl(elem){    
  if (!elem.hasClass("disabled")){
      var pageType=elem.attr("class");
      page=parseInt(page);
      // Je nach Auswahl wird Page neugesetzt
      switch (pageType) {
       case "firstPage" : page=1;
                          break;
       case "prevPage"  : page=page-1;
                          break;
       case "minus2Page": page=page-2; 
                          break;
       case "minus1Page": page=page-1; 
                          break;
       case "plus1Page" : page=page+1; 
                          break;
       case "plus2Page" : page=page+2;  
                          break;
       case "nextPage"  : page=page+1; 
                          break; 
       case "lastPage"  : page=pageCounter;
                         break;
    }
    // Selektor wird aktualisiert (Ajax)
    updateAddressSelector('results');
  }
}

/*
 * Inhalte der Dropdowns werden gespeichert und ins Historyobjekt eingetragen
 */
function saveHistory(){
       jQuery.each($(".selectCat").children("div").children("p"),function(index){
               selectSelected[index]="";
               selectSelected[index]=$(this).attr("class");
      });

  /*    jQuery.each($(".selectCat").children("select"),function(index){
                 selectHtml[index]="<select class='cat"+(index+1)+"'>";
                 jQuery.each($(this).children("option"),function(){
                    if ($(this).attr("selected")){
                        selectHtml[index]+="<option selected='selected' id='"+$(this).attr("id")+"'>"+$(this).html()+"</option>";
                    } else {
                        selectHtml[index]+="<option id='"+$(this).attr("id")+"'>"+$(this).html()+"</option>";
                    }
                });
                selectHtml[index]+="</select>";
      });*/
      // Historyobjekt mit aktuellen Parametern befüllt
      addHistoryEvent();
}                                

/* 
 * Event Handler für die Historyfunktion
 */
addHistoryEvent = function() {
        // JSON Objekt zuordbar mittels Millisekunden seit 1970 an URL
        var time = new Date();
        var hKey="e"+time.getTime();
        // aktuelle Parameter werden als JSON Objekt im Historyobjekt gespeichert
        var jsonobj={"reqType":reqType,"country":country,"location":loc,"seller":seller,"query":query,"page":page,"size":size,"selectSelected":[selectSelected[0],selectSelected[1],selectSelected[2]]};
        // JSON Objekt zuordbar mittels Millisekunden seit 1970 an URL 
        dhtmlHistory.add(hKey,jsonobj);
}


function historyChange(newLocation, historyData) {
      // Wenn Historyobjekt befüllt...
      if (historyData){
          //JSON Objekt wird ausgelesen und Parameter befüllt
          country=historyData.country;
          loc=historyData.location;
          seller=historyData.seller;
          query=historyData.query;
          lastQuery=query;
          page=historyData.page;
          size=historyData.size;
          selectSelected[0]=historyData.selectSelected[0];
          selectSelected[1]=historyData.selectSelected[1];
          selectSelected[2]=historyData.selectSelected[2];
          // Historyvariable auf true, damit beim Update kein erneuter Historypunkt im Browser gesetzt wird
          historyAction=true;
          // Wenn es sich um eine Suche handelt, wird der Suchbegriff wieder ins Suchfeld eingetragen
          if (query!=""){
              $("#search input").attr("value",query);
                  updateAddressSelector("search");
          } else {
              $("#search input").attr("value","");
              //first dropdown new initialized
              var firstSelect=$(".cat1");
              firstSelect.clone().insertBefore(firstSelect.parent());
              firstSelect.parent().remove();
              firstSelect=$(".cat1");
              if (selectSelected[0]!=""){
                firstSelect.children().each(function (i) {
                    $(this).removeAttr("selected");
                    if ($(this).attr("id")==selectSelected[0]){
                        $(this).attr("selected","selected");
                    }
                });
              }
              firstSelect.selectBox({css:'selectCat'});
              $("#cat1 .selectCat ul").click(function(){whichDropdown($(this));return false;});
              if (country=="all"){
                       // Selektor wird aktualisiert (Ajax)
                       updateAddressSelector("seller");
                       disableSelector("2");
              } else {
                      // Selektor wird aktualisiert (Ajax)
                      updateAddressSelector("location");
              }
          }
 
        }
};
/*
 *   Ausgabe bei keinen gefundenen Händlerresultaten
 */        
function noResult(message,headline){
    // Controls werden ausgeblendet
    $(".addressControls div").attr("style","display:none;");
    // Counter genullt
    $(".prodCounter").html("0");
    // Errortext ausgegeben
    $(".addressList").html("<div class='noresult'><h2>"+headline+"</h2><p class='txtext'>"+message+"</p></div>");
    // Historypunkt gesetzt, wenn Browser Back/Forwardbutton nicht gerade gedrückt wurde
   if (!historyAction){
        saveHistory();
   } else {
        historyAction=false;
   }
}

/*
 * Leeres "Dropdown" wird disabled 
 */
function disableSelector(dropdownNumber){
      //Dropdownfeld wird gelöscht/neuinitialisiert
      $("#cat"+dropdownNumber+" .selectCat").remove();
      $("#cat"+dropdownNumber+" div").html('<select class="cat'+dropdownNumber+'" name="cat'+dropdownNumber+'"></select>');
      $(".cat"+dropdownNumber).selectBox({css:'selectCat'});
      var temp=$(".cat"+dropdownNumber).next('div');
      temp.css({'background-color':'#fff'});
      switch (dropdownNumber) {
          //Location
          case "2" : temp.children('p').html(draeger.LABEL_EMPTY_CITYDROPDOWN);
                     break;
          //Seller           
          case "3" : temp.children('p').html(draeger.LABEL_EMPTY_CONTACTTYPEDROPDOWN);
                     break;                      
      }   
}

/*
 * Selektoren werden bei Suche in Initialisierungszustand gebracht
 */
function setStateSearchSelector(){ 
     // bei Suche werden die ersten beiden Dropdowns in den Ausgangszustand gebracht
      for (var i = 1; i <= 2; i++){
        var delAct= $(".cat"+i);   
        delAct.clone().insertBefore(delAct.parent());
        delAct.parent().remove();
      }
      $("#cat1 div select").children().removeAttr("selected");
      //Dropdownfeld Location und Seller wird geleert
      $("#cat2 div").html('<select class="cat2" name="cat2"></select>');
      //$("#cat3 div").html('<select class="cat3" name="cat3"></select>');
      $(".cat1").selectBox({css:'selectCat'});
      $(".cat2").selectBox({css:'selectCat'});
      $("#cat1 .selectCat ul").click(function(){ whichDropdown($(this));return false;});
      //$("#cat2 .selectCat ul").click(function(){ whichDropdown($(this));return false;});
      var temp=$(".cat2").next('div');
      temp.children('p').html(draeger.LABEL_EMPTY_CITYDROPDOWN);
      temp.css({'background-color':'#fff'});
}

  
/*
 * Selektoren werden per Javascript initialisert und mit Events versehen
 */
function initSelectors(){
    $(".cat1").selectBox({css:'selectCat'});
    $(".cat2").selectBox({css:'selectCat'});
    $(".cat3").selectBox({css:'selectCat'});
    $("#cat1 .selectCat ul").click(function(){ whichDropdown($(this));return false;});
    $("#cat3 .selectCat ul").click(function(){ whichDropdown($(this));return false;});
    var temp="";
    //Nichtaktive Dropdowns disablen
    if (country=="all"){
           //location disabled
           temp=$(".cat2").next('div');
           temp.children('p').html(draeger.LABEL_EMPTY_CITYDROPDOWN);
           temp.css({'background-color':'#fff'});
           //Seller Dropdown disabled
         /*  temp=$(".cat3").next('div');
           temp.children('p').html(draeger.LABEL_EMPTY_CONTACTTYPEDROPDOWN);
           temp.css({'background-color':'#fff'});*/
    } else {
       $("#cat2 .selectCat ul").click(function(){ whichDropdown($(this));return false;}); 
      // $("#cat3 .selectCat ul").click(function(){ whichDropdown($(this));return false;});
    }
    
}

/*
 *   Init Application Address Selector
 */
$().ready(function() {
        $(".cats").removeClass("jsdisplay");
        //Applikation aktiv
        draeger.ADDRESSSELECTOR_ACTIVE=true;
        lastQuery=query;
        // Kategorieselektor wird initialisiert
        initSelectors();
        // Events an Links gehängt   
        // Pagingmechanismus
        $(".pageControl a").click(function(){whichControl($(this));return false;});
        // Suchfeld (Mausklick und Enter)
        $("#search a").click(function(){updateAddressSelector('search');return false;});
        $("#search input").keydown(function(event){if(event.keyCode=="13"){updateAddressSelector('search');/*addHistoryEvent();*/return false;}return true;});    
        // Initialisierung der History Funktion
        dhtmlHistory.initialize();
        //Subscribe Listener für Browser Back/Forward
        dhtmlHistory.addListener(historyChange);
        // erster Historypunkt wird gesetzt (unter Umständen nicht nötig)
        if (location.href.match("#e")==null){
             // erster Historypunkt wird gesetzt (unter Umständen nicht nötig)
            saveHistory();
        }
        //Ausfaden des Sichtschutzes vor dem Selektor
        $(".blocker").fadeOut(1000);
});

    
    
  



jQuery.fn.selectBox = function(o) {
	return this.each(function() {

        var oThis = this;
        var oSelected = null;
        var state = 'closed';
        var actHeight=0;

		

        //wierd
     //   var oSelectOffset = jQuery(this).offset('HTML');

                // Safari gibts keine Tastatursteuerung, deshalb, Selects verstecken
                if(jQuery.browser.safari){
                    jQuery(this).wrap('<div></div>').hide();
                } else {
                    jQuery(this).wrap('<div></div>').css({left:'-1000px',position: 'absolute'});
                }
               
		var oContainer = jQuery(this).parent().addClass(o.css);
                // append html inside the container
		oContainer.append('<div><p></p></div><ul class="scroll-pane"></ul>');

		jQuery("div",oContainer).toggle(function() {

                         if($(this).prev("select").children("option").length>1){

                                  state = 'opened';
                                  reentered=false;
                                  var actElem=jQuery("ul",oContainer);
                                  actHeight=0;
                                  jQuery.each(actElem.children(), function() {

                                         actHeight+=parseInt($(this).height().replace('px',""))+3;//+3;
                                  });
                                  if (actHeight <= 200){
                                      actElem.height(actHeight);
                                  }
                                  actElem.slideDown(5,function(){
                                                                       if (!$(this).parent().hasClass('jScrollPaneContainer')){
                                                                           $(this).jScrollPane({scrollbarWidth : 15,showArrows : true,arrowSize : 15});
                                                                           // ick brauch den drag scroller focus für IE6 !!!
                                                                            jQuery(".jScrollPaneTrack,.jScrollArrowUp,.jScrollArrowDown",oContainer).mouseup(function() {
                                                                                        jQuery(oThis)[0].focus();
                                                                            });

                                                                        } else {
                                                                            $(this).parent().slideDown('fast');
                                                                        }
                                                                        $(this).css({left:"0px"});
                                                                        $(this).css({top:"0px"});
                                                                        if (actHeight <= 200){
                                                                           $(this).parent().css({"height":actHeight});
                                                                        } else {
                                                                            $(this).css({width:"410px"});
                                                                        }
                                                                      });
                                  jQuery("li",oContainer).removeClass('active');
                                  if(oSelected == null) {
                                        jQuery("li:eq(0)",oContainer).addClass('active');
                                        oSelected = jQuery("li:eq(0)",oContainer);
                                  } else {
                                        oSelected.addClass('active');
                                  }
                       }

                 jQuery(oThis)[0].focus();

		},function() {

                       if($(this).prev("select").children("option").length>1){
                                   state = 'closed';
                                   reentered=false;
                                   var ul= $(this).parent().children().children("ul");


                                  var scrollPane= $(this).parent().children(".jScrollPaneContainer");
                                  ul.slideUp('fast',function() {});
                                  scrollPane.slideUp('fast',function() {});
                       }
		});
                
        jQuery("ul",oContainer).parent().bind("mouseleave",function(){
                        reentered=false;
                        window.setTimeout(function(){
                          //console.log("mouseleave: "+reentered+" state: "+state);
                          if(!reentered && state == 'opened') {
                                reentered=false;
                                jQuery("div",oContainer).trigger("click");
                          }
                        }, 1000);

        });

        jQuery("ul",oContainer).parent().bind("mouseenter",function(){
                          reentered=false;
                          if(state == 'opened') {
                                reentered=true;
                          }
        });

                // get values from the option elements and set them in the ul list.
		jQuery(this).keydown(function(e) {
                        var key = e.charCode || e.keyCode || 0;
                        // bei tab oder esc schliessen
                        if(state == 'opened' &&(key=="27"||key=="9")){
                            jQuery("div",oContainer).trigger("click");
                            return false;
                        }
		});

                // ie 6 manuell scroll
               jQuery(this).mousewheel(function(e,delta) {
                            jQuery("ul",oContainer)[0].scrollBy(-(event.wheelDelta /120)*25);//(e.wheelDelta)*((delta<=-1)?-delta:(1+delta))
                            return false;
                        }
		);


		// get values from the option elements and set them in the ul list.
		jQuery(this).keyup(function(e) {
                        var key = e.charCode || e.keyCode || 0;
                        //tab highlighting
                        if(key=="9"){
                            $(this).parent().parent().animate({backgroundColor: "#a2c9f0"}, 500, function(){$(this).animate({backgroundColor: "#D6E7F7"},500);});
                        }
                        // liste öffnen
                        if(state == 'closed' &&(key=="40"||key=="38"||key=="39"||key=="37")){
                             jQuery("div",oContainer).trigger("click");
                              setValue(key=="13",false);
                        } else if(state == 'opened'){
                                    enterButton=(key=="13");
                                    setValue(enterButton,false);
                                }
		});

		jQuery('option',this).each(function(i) {
			var o = this;
			jQuery(this).click(function() {
				this.selected = true;
			});

			jQuery("ul",oContainer).append('<li>' +  jQuery(this).text() + '</li>');

			jQuery("li:eq(" + i + ")",oContainer).click(function() {
				jQuery(o).click();
				jQuery("div",oContainer).trigger("click");
                                jQuery("div p",oContainer).html(jQuery(o).text());
                                jQuery("div p",oContainer).removeClass();
                                jQuery("div p",oContainer).addClass(jQuery(o).attr("id"));
                                oSelected = $(this)
			}).mouseover(function() {
				jQuery(this).addClass('active');
                                // ie 6 ohne focus, dann geht scrolling nicht mehr
                                jQuery(oThis)[0].focus();

			}).mouseout(function() {
				jQuery(this).removeClass('active');
                                //jQuery(oThis)[0].blur();

			});
		});

		// set ul list position
		jQuery("ul",oContainer).hide();
                
		var positionListElement = function() {

                // set ul list position
                jQuery("ul",oContainer).css({
                    //left: (oOffset.left )+ 'px',
                    //top: oOffset.top + parseInt(oOffset.height) + 'px',
                    position: 'absolute',
                    width: '425px'//oOffset.width + 'px'
                });

		};
		var setValue = function(enterPressed,init) {
                        var elem =$(oThis).children("option[selected]");
                        var val = elem.text();
                        oldSelectedPos=0;
                        if (init){
                           jQuery("div p",oContainer).html(val);
                            if (jQuery(oThis)[0].selectedIndex>0){
                              jQuery("div p",oContainer).attr("class",elem.attr("id"));
                            }
                        } else {

                         /*   if(oSelected.html()==null){
                                oldSelectedPos=0;
                            } else {
                                oldSelectedPos=oSelected.offset().top;
                            }*/
                            
                        }


                        oSelected = jQuery("li:eq(" + jQuery(oThis)[0].selectedIndex + ")",oContainer);
                        
                        if(oSelected.html()==null){
                            newSelectedPos=0;
                        } else {
                            newSelectedPos=oSelected.offset().top;
                        }
                        
                        
                        
                        if(actHeight > 200 && jQuery("ul",oContainer).parent().hasClass('jScrollPaneContainer')){
                                 //console.log("aktuelle Höhe: "+actHeight+" selected: ");
                                if(jQuery(oThis)[0].selectedIndex>1){
                                    //jQuery("ul",oContainer)[0].scrollBy(newSelectedPos-oldSelectedPos);
                                   // console.log("selectedElem"+oSelected.html()+" "+newSelectedPos);
                                    jQuery("ul",oContainer)[0].scrollTo(jQuery(oThis)[0].selectedIndex*20);
                                } else {
                                   jQuery("ul",oContainer)[0].scrollTo(0);

                                }
                        }

			jQuery("li",oContainer).removeClass('active');
			oSelected.addClass('active');
                        if (enterPressed){
                            jQuery("div p",oContainer).html(val);
                            if (jQuery(oThis)[0].selectedIndex>=0){ // hier vorher > , wegen tastatursteuerng muss hier auch erster abgecdeckt werden
                                  jQuery("div p",oContainer).attr("class",elem.attr("id"));
                            }
                            //console.log(oSelected);
                            oSelected.parent().click();
                            jQuery("div",oContainer).trigger("click");
                        }

		};
               
		setValue(false,true);
                 
		positionListElement();

		//jQuery(window).resize(positionListElement);

	});
};
