// Copyright Jobanova GmbH, 2005-2007. All rights reserved.
// Author: Evgeni Krasnopolski

// Version
var js_suggest_ver = 1.60;

//var cache_bbg_swh      = 0;

var debug               = false;	// switches to debug mode

var inputForm 			= null;
var inputField1         = null;     // input field element 1
var inputField2         = null;     // input field element 2

var backupValue			= new Array();

var suggBox 			= null;     // suggestion box (DIV)
var suggVisible 		= false;
var QueryBoxContainer	= null;		// last queries and other aids
var xmlhttp 			= null;
var lastHighlightedId  	= -1;
var suggCount 			= -1;
var searchDelay 		= 250;      // ms until search is started
var fixedwidth 			= -1;       // if -1, width is calculated automatically; can be set in the setup function
var ElementCSS			= new Array();

var requestURL 			= "";       // URL to be called for the request. The input field value is escaped and appended
var firstInField		= null;		
var callcounter 		=  0;
var lastkeyevent 		= -1;		// code of the first pressed key - important for key combinations(f.Ex. Ctrl+C)
//var fieldupdate 		= "";

var cache_on			= true;			// cache switch
var request_cache 		= new Object();	// cache object

//var request_var			= "";

var qstartime 			= 0;			// point of time of the start request sending
//var lastquery		= "";

var submited			= false;



function doBlur(event){
    if (!event && window.event) {
       event = window.event;
    }
    lastkeyevent = "";
    // hide suggestion box
    hideSuggBox();
}

function doFieldKeyDown(event) {

   if (!event && window.event) {
           event = window.event;
   }
    if ( lastkeyevent == 17 &&  (event.keyCode == 86 || event.keyCode == 88)){}
    else if ( lastkeyevent == 17 ||   lastkeyevent == 18){
    		lastkeyevent = event.keyCode;
    	return;
    }

    if (!xmlhttp) return;

    if(     (event.keyCode >111 && event.keyCode <124)
        ||  (event.keyCode >143 && event.keyCode <146)
        ||  (event.keyCode >15  && event.keyCode <21 ) )
    {
            lastkeyevent = event.keyCode;
        return;
    }
    //alert( "Key-Event" );

    switch (event.keyCode) {

            case 17: // Ctrl
            case 18: // Alt
            case 37: // left
            case 39: // right
            case 45: // Insert
            case 93: // Context Key
            case 91: // Windows Key
            {
             break;
            }
            case 40: {
                    // down

                    if (!suggVisible) {
                    		setTimeout( "showResults( )", 50 );
                            //setTimeout("doSearch()", 10);
                    } else if (suggCount > 0) {
                        if (lastHighlightedId < suggCount - 1) {
                            selectRow(lastHighlightedId + 1);
                            showSuggBox();
                        }
                        cancelEvent(event);
					}
			     break;
            }
            case 38: {
                    // up
                    if (suggCount > 0) {
                        if (lastHighlightedId > 0) {
                            selectRow(lastHighlightedId - 1);
                            showSuggBox();
                        }
                        cancelEvent(event);
                    }
                 break;
            }
            case 33: {
                    // PgUp
                    if (suggVisible && (suggCount > 0)) {
                        selectRow(0);
                        cancelEvent(event);
                    }
                break;
            }
            case 34: {
                    // PgDn
                    if (suggVisible && (suggCount > 0)) {
                        selectRow(suggCount - 1);
                        cancelEvent(event);
                    }
                 break;
            }
            case 35: {
                    // End
                    if (suggVisible && (suggCount > 0)) {
                        selectRow(suggCount - 1);
                        cancelEvent(event);
                    }
                 break;
            }
            case 36: {
                    // Home
                    if (suggVisible && (suggCount > 0)) {
                        selectRow(0);
                        cancelEvent(event);
                    }
                 break;
            }
            case 13: {
            		// Enter
                 	if (suggVisible && (lastHighlightedId >= 0)) {
                        var row = document.getElementById("suggRow" + lastHighlightedId);
                        cancelEvent(event);
                        if (row) {
                            var fx = row.onmousedown;
                            fx();
                        }
                    }
            	break;
            }
            case 27: {
                    // Escape
                    if (suggVisible) {
                        selectRow(-1);
                        hideSuggBox();
                        cancelEvent(event);

                        // restore input value after a short time
                        backupValue[0] = inputField1.value;
                        backupValue[1] = inputField2.value;

                        setTimeout("inputField1.value = backupValue[0]", 10);
                        setTimeout("inputField2.value = backupValue[1]", 10);
                    }
                 break;
            }
            default: {
//----------------------------------------------------------------
				if( document.getElementById("T1") != null	&& 	debug )
                {
            		document.getElementById("T1").innerHTML = " | submited: " + submited;
          		}

                if( !submited ) setTimeout( "showResults()", 50 );
                else{
                	submited = false;
                	cancelEvent(event);
                	return;
                }
                //submited = false;
//----------------------------------------------------------------
            }


    }
//    lastkeyevent = event.keyCode;
}


function showResults()
{
	// var val = new Array( inputField1.value, inputField2.value);

    if( inputField1.value.length > 1  ||  inputField2.value.length > 1 ){
//------
		// inputField.value.replace( /[\ ]*([^\ ]*)[\ ]*/, '$1')
        var CacheVar = "request_cache[new Array(\"" + inputField1.value +"\", \""+ inputField2.value +
        							 "\", \""+ takeRadioChoice().value +"\" )]";

		if( document.getElementById("T4") != null   && debug ){
                  document.getElementById("T4").innerHTML += "<div style='color: #aaaaaa;'>show in cache: "+ CacheVar +"</div>";
        }


        if( typeof eval(CacheVar) == "undefined" || !cache_on ){

          if( document.getElementById("T4") != null		&& 	debug ){
            // document.getElementById("T4").innerHTML = "cache: " + cache_on + " | ";
          }
        	// not found in the cache - send request
          callSearch();
        }else{
        	// take results from the cache
        	var ResultsArr = eval(CacheVar);
          fillDiv( ResultsArr[0], ResultsArr[1], ResultsArr[2], ResultsArr[3], ResultsArr[4], ResultsArr[5], ResultsArr[6] );

            if( document.getElementById("T4") != null   && debug ){
            	// document.getElementById( "T4" ).innerHTML = CacheVar.replace(/.*\((.+),.*/, '$1') +" taken from cache";
            }

          // -----------------------

            if( ResultsArr[0].length > 0 || ResultsArr[6].length > 0) 	showSuggBox();	// show suggest if something found
            else 	hideSuggBox();
        }
//------
    }
    else hideSuggBox();
}


function cancelEvent( event ){
    if( event.cancelBubble ) event.cancelBubble();
    if( event.returnValue  ) event.returnValue = false;
}


function getXMLHTTP() {
  var result = false;
  if(typeof XMLHttpRequest != "undefined") {
    result = new XMLHttpRequest();
  } else {
        try {
                result = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
                try {
                        result = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (ie) {}
        }
  }
  return result;
}


function getParentProps(elem, prop) {
        // returns the sum of the property "prop" along the offsetParent row of elem
        var result = 0;
        while (elem != null) {
                result += elem[prop];
                elem = elem.offsetParent;
        }
        return result;
}


function selectRow(row) {
        if (lastHighlightedId > -1) {
                rowDiv = document.getElementById("suggRow" + lastHighlightedId);
                rowDiv.className = ElementCSS[lastHighlightedId];
        }
        lastHighlightedId = row;
        rowDiv = document.getElementById("suggRow" + row);
        if (rowDiv) {
			rowDiv.className = ElementCSS[row] + "Sel";
		}
}

function mouseEnter(id) {
        selectRow(id);
}


function submitString(jd, orte, plzs, anz) {

		inputForm.anfrage.value			= inputField1.value +" "	+ inputField2.value;
//		inputForm.original_query.value	= inputField1.value +"{%}"	+ inputField2.value;
        inputField1.value 				= unescape(jd);
        inputField2.value 				= unescape(orte);
        inputForm.jd.value 				= jd;
        inputForm.ort.value 			= orte;
        inputForm.plz.value 			= plzs;
        inputForm.anzahl.value 			= anz;

		init();

		try{
        	inputForm.submit();
        }
        catch(e){
        	inputForm.target = "";
        	inputForm.submit();
        }
}

function setDivSize() {

	var startF = document.getElementById("startF");
    if (suggBox) {
        suggBox.style.top   = getParentProps(inputField1, "offsetTop") 	+ inputField1.offsetHeight + "px";
        suggBox.style.left  = getParentProps(firstInField, "offsetLeft") + "px";

        suggBox.style.width =
        	( fixedwidth < 0 ?
				( ( getParentProps(inputField2, "offsetLeft")+ inputField2.offsetWidth) - getParentProps(inputField1, "offsetLeft") ) : fixedwidth
			);
    }
    if( QueryBoxContainer && document.getElementById("UpBtn") ){
    	UpBtn = document.getElementById("UpBtn");

        QueryBoxContainer.style.top   = getParentProps( startF, "offsetTop") + startF.offsetHeight + "px";
        QueryBoxContainer.style.left  =
        	getParentProps( UpBtn, "offsetLeft") + UpBtn.offsetWidth - QueryBoxContainer.offsetWidth + "px";
    }
/*
    if(document.getElementById("UpBtn")){
		UpBtn = document.getElementById("UpBtn");

		if( getParentProps(inputField1, "offsetTop") != getParentProps( UpBtn, "offsetTop") ){
			UpBtn.style.top = ( getParentProps(inputField1, "offsetTop") - getParentProps( UpBtn, "offsetTop") )+ "px;";
      	}
	}
*/
}

function fillDiv(jd, orte, plzs, anz, type, more_res, sugg_mes) {

    // remove previous elements
    while (suggBox.hasChildNodes()) {
            suggBox.removeChild(suggBox.firstChild);
    }
		if( more_res == 3 && sugg_mes != "" ){
			addSuggestMessage( sugg_mes );
		}
		ElementCSS	= new Array();	// remove previous element settings

        for (i = 0; i < jd.length; i++) {
                iDiv = document.createElement("div");
                iDiv.onmousemove = new Function("omo" + i, "mouseEnter("+ i +")");
                iDiv.onmousedown = new Function("omd" + i,
									"submitString('" + jd[i].replace(/'/g, "\"") + "'," +
												 "'" + orte[i].replace(/'/g, "\"") + "'," +
												 "'" + plzs[i].replace(/'/g, "\"") + "'," +
												 "'" +  anz[i] + "')");
                iDiv.id 			= "suggRow" + i;
                iDiv.style.cursor 	= "pointer";
/*                iDiv.innerHTML = "<span class='suggItem'><nowrap>" +
                        "<div class='suggProduct'>" + astrings[i] + "</div>" +
                        "<div class='suggCat'>" + bstrings[i] +"</div>" +
                        "</nowrap></span>";

		.suggProduct,
		.suggPLZ,
		.suggOrt
*/
				var encoded_jd  = unescape( jd[i] 	);
				var encoded_ort = unescape( orte[i] );
				var jd_cut		= 33;

                    switch( type[i] ){
                         case "S":
                         	ElementCSS[i] = "suggRowSyn";
                         	encoded_jd 	  = "&nbsp;&nbsp;"+encoded_jd;
                         	jd_cut		  = 43;
                           break;
                         case "A":	ElementCSS[i] = "suggRowAprox";		break;
                         case "N":	ElementCSS[i] = "suggRowNothing";	break;
                         case "T":
                         default:	ElementCSS[i] = "suggRow";			break;
                    }
                    iDiv.className = ElementCSS[i];

				iDiv.innerHTML = "<div class='suggItem'>" +
                		 		 "<span class='suggPLZ'><nobr>"  +
                		 				unescape( (!plzs[i])? " &nbsp;&nbsp;" :  plzs[i] ) +
                		 		 "</nobr></span><span class='suggOrt'><nobr>" +
                		 		 (( encoded_ort.length >25 )? (encoded_ort.substr(0, 23) + "...") : encoded_ort) +
                		 		 "</nobr></span>" +
								 "<span class='suggProduct' ><nobr> "
								 + (( encoded_jd.length >jd_cut )? (encoded_jd.substr(0, jd_cut-1) + "...") : encoded_jd) +
                		 		 " (" + unescape( anz[i] ) + ")&nbsp;&nbsp;</nobr></span>" +
                		 		 "</div>";
                suggBox.appendChild(iDiv);
        }
		if(more_res == 1){
			addSuggestMessage( "... tippen Sie einfach weiter um exaktere Ergebnisse zu bekommen ..." );
		}
		else if( more_res == 2 && sugg_mes != "" ){
			addSuggestMessage( sugg_mes );
		}

        lastHighlightedId = -1;
        setDivSize();
}

function displayResults( what, where, jd, orte, plzs, anz, type, more_res, sugg_mes) {

        if( unescape(what)  != unescape(inputField1.value) ||
			unescape(where) != unescape(inputField2.value) 		)
		{
        	showResults();
        }

        if( document.getElementById("T4") != null   && debug ){
        /* später ON

          	document.getElementById( "T4" ).innerHTML +=	new Date().getTime() - qstartime + " msec | " +
                                                        	unescape(what)  + " : " + unescape(inputField1.value) +" "+
                                                        	unescape(where) + " : " + unescape(inputField2.value);
        */
        }
        // add results to cache array ------
        if( cache_on ){

            if( document.getElementById("T4") != null   && debug ){
            /* später ON

                  document.getElementById( "T4" ).innerHTML = new Date().getTime() - qstartime + " msec <br\>" +
                                                              unescape(request1) + " : " + inputField1.value +" | "+
                                                              unescape(request2) + " : " + inputField2.value;
			*/
            }
            var CacheVar = "request_cache[new Array(\"" + unescape(what) + "\", \""+ unescape(where) +"\", \""+ takeRadioChoice().value +"\" )]";
            if( document.getElementById("T4") != null   && debug ){
                  document.getElementById( "T4" ).innerHTML += "<div>put to cache: "+ CacheVar +"</div>";
            }


            if( typeof eval(CacheVar) == "undefined" ){
                eval( CacheVar+" = new Array( jd, orte, plzs, anz, type, more_res, sugg_mes );" );
            }
        }
        // ---------------------------------

		suggCount = jd.length;

        fillDiv(jd, orte, plzs, anz, type, more_res, sugg_mes);

        if (suggCount == 0 && sugg_mes.length < 1) {	// close suggest box if no results
                hideSuggBox();
                return;
        }
        showSuggBox();
}

function callSearch() {
        callcounter++;
        setTimeout("doSearch()", searchDelay );
}

function doSearch() {

		qstartime = new Date().getTime();
        if (callcounter > 0) callcounter--;
        if (callcounter > 0) return;
        if (inputField1.value.length < 2 && inputField2.value.length < 2){
        	hideSuggBox();
           return;
        }
        if (!xmlhttp){ return; }

        if (xmlhttp.readyState != 0) // search running right now?
        {
           xmlhttp.abort();	// cancel current search
        }
				var RadioChoice = takeRadioChoice();
				if( document.getElementById("T3") != null   && debug ){
					document.getElementById( "T3" ).innerHTML = inputField1.value + ": "+ inputField2.value +" | " + new Date().getTime();
				}
/*
				if(lastquery == inputField.value)
				{
        	document.getElementById( "T4" ).innerHTML += inputField.value + " (!) ";
        	return;
        }

				lastquery = inputField.value;
*/
        xmlhttp.open("GET",	requestURL 				+ escape( inputField1.value +" "+ inputField2.value ).replace( /\+/g, "%2B") +
        					"&what=" 				+ escape( inputField1.value ).replace( /\+/g, "%2B") +
        					"&where=" 				+ escape( inputField2.value ).replace( /\+/g, "%2B") +
        					"&" + RadioChoice.name 	+ "=" + RadioChoice.value, true );

        xmlhttp.onreadystatechange = checkRequestResponse;
        xmlhttp.send(null);
}


function checkRequestResponse() {

		if (xmlhttp.readyState == 4){
			if(xmlhttp.responseText)
			{
        		var ajaxText = xmlhttp.responseText; //.replace(/.*(displayResults.*)/gi, "$1" );

                if( document.getElementById("T2") != null   && debug ){
                    document.getElementById("T2").innerHTML +=  "State"+ xmlhttp.readyState +" : "+ xmlhttp.responseText +
                                          "<br><br><br>";
                }
                var ajaxText = xmlhttp.responseText;
                if (ajaxText.charAt(0) != "<"){
                  // The response text gets executed as javascript...
                   try{
                        eval( ajaxText );
                   }
                   catch (e){   // error - probably due to special characters ('), try again after character substitution

                        var txt =  ajaxText.replace(/\'/g, "''");

                        try                 { eval(txt); }
                        catch (ie)  {   // still errors? don't display anything
                                        hideSuggBox();
                      }
                   }
        	}
      }
      else{
      	showResults();
      }
    }
    else if( document.getElementById("T3") != null   && debug ){
      	document.getElementById( "T3" ).innerHTML += 	"<br>State: "+ xmlhttp.readyState +" - '"+
														xmlhttp.responseText +"'";
	}
}


function showLastSuggest(){
	if( !submited && inputForm.query_return.value != ""){
		showPreSuggest(inputForm.query_return.value);
	}
}


function showPreSuggest(query){

		var field = query.split("{%}");

        inputField1.value = field[0];
        inputField2.value = field[1];
        inputField1.focus();
        setTimeout( "showResults()", 50 );
}



function showMess( mess, name ){
	if( document.getElementById( name ) )
        	document.getElementById( name ).innerHTML = mess;
}


function takeRadioChoice(){
	for( i=0; i < inputForm.job_type.length; i++){
		if( inputForm.job_type[i].checked == true )
			return inputForm.job_type[i];
	}
}



function SetupAutoSuggest(request, what, where, width, firstField){
        // request and input are mandatory, rest are optional

        requestURL 	 = request;
        
        inputForm  	 = what.form;
        inputField1  = what;
		inputField2  = where;

		
        if (typeof firstField != "undefined") 	firstInField = firstField;
        else									firstInField = where;
		
        submited = false;

        if (typeof width != "undefined") {
                fixedwidth = width.replace(/\D.*/, "") -1 +"px";
        }

        xmlhttp = getXMLHTTP();
        if (!xmlhttp) {
          return;
        }
        if (typeof netscape != 'undefined' && typeof netscape.security != 'undefined') {
          try {
                  netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
          }
          catch (e) {
//                        alert( e.message  );
          }
        }

        what.autocomplete 	= "off";
        what.onblur       	= doBlur;
        //input.onfocus		= hideQueryBox;
        what.onkeydown    	= doFieldKeyDown;
        what.onmousedown  	= doBlur;

        where.autocomplete 	= "off";
        where.onblur       	= doBlur;
        where.onkeydown    	= doFieldKeyDown;
        where.onmousedown  	= doBlur;


        //input.onselect = doBlur;
		QueryBoxContainer			= document.createElement("div");
		QueryBoxContainer.id 		= "QueryBoxContainer";
		QueryBoxContainer.className = "QueryBoxContainer";
		QueryBox 					= document.createElement("div");
    	QueryBox.name 				= "QueryBox";
		QueryBox.id 				= "QueryBox";
		QueryBox.className 			= "QueryBox";
		QueryFooterBox				= document.createElement("div");

		//  #99aacc;
        QueryFooterBox.innerHTML  =
        "<center> <table width='100%' style='border-top: 1px solid #909090; padding: 0px; color: #efefef; background-color: #e2b892;'>"	+
                  "<tr> <td class='suggItem'> <center> <span style='margin-left:6px;'> Fenster schliessen </span></center>"	+
                  "</td> "	+
                  "<td width='18'>"	+
                    "<img    src='images/close.gif' align='absmiddle' border='0' title='schliessen' "	+
                            "onClick='hideQueryBox();' onMouseOver='this.style.cursor = \"pointer\";'>"		+
                "</td> </tr> </table> </center>";

		QueryBoxContainer.appendChild(QueryBox);
        QueryBoxContainer.appendChild(QueryFooterBox);

		document.body.appendChild(QueryBoxContainer);



        suggBox 			= document.createElement("div");
        suggBox.name 		= "suggBox";
        document.body.appendChild(suggBox);

        suggBox.className 	= "suggBox";
        suggBox.id 			= "suggBox";
        setDivSize();

        window.onresize = setDivSize;
}


function showSuggBox() {
	// hideQueryBox();
	if( !submited && (inputField1.value != "" || inputField2.value != "" ) ){
        document.getElementById("suggBox").style.visibility="visible";
        suggVisible = true;
    }
    submited = false;
}


function hideSuggBox() {
        document.getElementById("suggBox").style.visibility="hidden";
        suggVisible = false;
}


function addSuggestMessage( message ) {
        iDiv = document.createElement("div");
        iDiv.innerHTML =    "<center> " +
                            "<div style = " +
                            "'color: black; background-color: 99aacc;' >" + unescape( message ) +
                            " </div> </center>";
        suggBox.appendChild(iDiv);
}


function clearCache(){
	for( var knote in request_cache){
		request_cache = new Object();
		break;
	}
}


function OnFieldSubmit(){

	submited = true;
	inputField1.blur();
	inputField2.blur();

	inputForm.anfrage.value	= inputField1.value +" "+ inputField2.value;
	inputForm.jd.value 		= "";
    inputForm.ort.value     = "";
    inputForm.plz.value     = "";
    inputForm.anzahl.value  = "";
    
    // Author: oliver Drescher, 11.1.2008
    document.getElementById('jobanova_percyLogo').style.display='none';
    document.getElementById('jobanova_Resultfield2').style.display='none';
    document.getElementById('jobanova_referenzen').style.display='none';
   	document.getElementById('jobanova_button').style.display='inline';
   	document.getElementById('jobanova_Resultfield').style.display='block';
   	
   	document.getElementById('footer2').style.display='none';
   	document.getElementById('jobanova_footer').style.display='none';
   	document.getElementById('jobanova_footer2').style.display='block';
   	
   	document.getElementById("jobanova_hintergrund_result").style.display="none";
   	document.getElementById('jobanova_Resultfield').style.paddingTop='40px';
   	document.getElementById('LadeBalken').style.top="-1375px";
	window.setTimeout("ladeAnzeigeAus()",4000);

  return true;
}




function init(){

    suggVisible         = false;
    lastHighlightedId   = -1;
    suggCount           = -1;
    callcounter         =  0;
    lastkeyevent        = -1;
    request_cache       = new Object();
    qstartime           = 0;
    submited            = false;
}

function putRegionalValue() {
	document.forms["test"].elements["where"].value = document.getElementById('regionalOrt').value;
	document.getElementById('jobanova_referenzen').style.display='none';
	
	document.getElementById('footer2').style.display='none';
   	document.getElementById('jobanova_footer').style.display='none';
   	document.getElementById('jobanova_footer2').style.display='block';
   	
   	document.getElementById('jobanova_button').style.display='inline';
   	document.getElementById('jobanova_Resultfield').style.display='block';
   	document.getElementById('jobanova_Resultfield2').style.display='none';
   	document.getElementById("jobanova_hintergrund_result").style.display="none";
   	document.getElementById('jobanova_percyLogo').style.display='none';
	document.forms["test"].submit();
	document.getElementById('jobanova_Resultfield').style.paddingTop='40px';
   	document.getElementById('LadeBalken').style.top="-1375px";
	window.setTimeout("ladeAnzeigeAus()",4000);
	ladeAnzeigeAn();
	
}