 /**
 * LookUp Input
 *
 * @author Egor Stremousov
 * @version 2.0
 */


 /** Global variables **/

 var lookupKeyPressHandled = false;
 var lookupKeyDownHandled = false;
 var lookupCurrentSelectedItem = 0;
 var lookupDefaultValue = "";

 /** Utils **/
 function getTag(id){
   return document.getElementById(id);
 }
 function getrandom(min,max) {
   var min_random = min;
   var max_random = max;
   max_random++;
   var range = max_random - min_random;
   var n 	 = Math.floor(Math.random()*range) + min_random;
   return n;
 }

 /** HTML-Constructor **/

function createLookUp(id, sForm, eValue, eTitle, url, css, autoSelect, autoSearch)
{
	var content = new Array();

	content.push("		<div id='"+id+"' count='0' hideNow='1' class='lookup"+css+"' sForm='"+sForm+"' eValue='"+eValue+"' eTitle='"+eTitle+"' url='"+url+"' css='"+css+"' autoSelect='"+autoSelect+"' autoSearch='"+autoSearch+"' lastRequestId=''> ");
	content.push("	      <div id='loading-"+id+"' class='lookup-hidden' ><img src='controls/lookup/lookupwait.gif'></div> ");
	content.push("		      <input id='input-"+id+"' ");
	content.push("		             class='lookup-input"+css+"'  ");

	content.push("   	             onchange    = \"return _onLookupChange('"+id+"')\" ");
	content.push("		             onfocus     = \"return _onLookupFocus('"+id+"')\" ");
	content.push("		             onblur      = \"return _onLookupBlur('"+id+"')\" ");
	content.push("		             onkeyup     = \"return _onLookupKeyUp(this,'"+id+"', event, false ); \" ");
	content.push("		             onkeypress  = \"return _onLookupKeyPress(this,'"+id+"', event, false)\" ");
	content.push("		             onkeydown   = \"return _onLookupKeyDown(this,'"+id+"', event, true)\" ");

	content.push("		             value='"+lookupDefaultValue+"' ");
	content.push("		             autocomplete='off' ");
	content.push("		             type='text' ");
	content.push("		             ><br> ");

	content.push("		      <div id='container-"+id+"' class='lookup-hidden' onscroll=\"return _onLookupScroll('"+id+"');\"> ");
	content.push("		      </div> ");
	content.push("		</div> ");
	
	getTag(id + '-container').innerHTML = content.join('');
}

 /* Properties */
 function lookupForm(id){
   return getTag( getTag(id).getAttribute("sForm") );
 }
 function lookupEValue(id){
   return getTag( getTag(id).getAttribute("eValue") );
 }
 function lookupETitle(id){
   return getTag( getTag(id).getAttribute("eTitle") );
 }
 function lookupURL(id){
   return getTag(id).getAttribute("url");
 }
 function lookupCSS(id){
   return getTag(id).getAttribute("css");
 }
 function lookupCount(id){
   return getTag(id).getAttribute("count");
 }
 function lookupAutoSelect(id){
   if (getTag(id).getAttribute("autoSelect") == 1) { return true; } else { return false; }
 }
 function lookupAutoSearch(id){
   return getTag(id).getAttribute("autoSearch") != '';
 }
 function lookupInput(id){
 	return getTag("input-"+id);
 }
 function lookupContainer(id){
 	return getTag("container-"+id);
 }
 function lookupItem(id, Index){
 	var obj = getTag("lookup-element-"+id+"-"+Index);
 	if (obj){ return obj; }else{ alert("Item("+Index+") from "+id+" not found."); }
 }
 function lookupLoader(id){
 	return getTag("loading-"+id);
 }
 function lookupHideNow(id){    if (getTag(id).getAttribute("hideNow") == 1){ return true; } else{ lookupSetHideNow(id,1); return false; 	} }
 function lookupLastRequestId(id){
    return getTag(id).getAttribute("lastRequestId");
 }
 function lookupLastRequestQuery(id){
    return getTag(id).getAttribute("lastRequestQuery");
 }


 /** Events **/

 // on scroll
 function _onLookupScroll(id){
   lookupSetHideNow(id,0);
   lookupInput(id).focus();
   setTimeout("lookupHideNow('"+id+"');",200);
   return true;
 }

 // focus obtain
 function _onLookupFocus(id){
	  if (lookupInput(id).value==lookupDefaultValue) {
	    lookupInput(id).value=""; 
	    lookupInput(id).style.color="black"; 
	    lookupInput(id).focus(); 
    }
 }
 // focus release
 function _onLookupBlur(id){
 
   if ( lookupInput(id).value=="" ) { 
     lookupInput(id).value=lookupDefaultValue; 
     lookupInput(id).style.color="#d1d1d1"; 
   }
 
  lookupSetHiddenValues( id );
  
  setTimeout("lookupHideOrNot('"+id+"');",200);
  return true;
 }
 // change event
 function _onLookupChange(id) {
   lookupBeforeUpdateList(id);
 }
 // on key up
 function _onLookupKeyUp(self, id, event, isKeyDown){

   lookupBeforeUpdateList(id);

   if (!lookupKeyPressHandled) { var res = lookupKeyPress(self, id, event, false); }
   lookupKeyPressHandled = false;

   var keyIgnore = false;
   switch(event.keyCode)
   {
           case 13:
           case 38:
           case 40:
           case 27:
           case 9:
           case 16:
           case 17:
           case 18:
           case 33:
           case 34:
           case 35:
           case 36:
           //case 45: // shift+ins
           //case 46: // del
           //case 86: // ctrl+V
           case 37:
           case 39:
           keyIgnore = true;
           break;
   }

   if (!keyIgnore) {

     // set hidden fields
     var v = self.value;
     lookupSetForm(id, v, '', lookupETitle(id), lookupEValue(id));
     //if (self.value.length == 0) {  return;  }

     // go search
     lookupGoSearch(id);

   }

   return res;

 }
 // on key press
 function _onLookupKeyPress(self, id, event, isKeyDown){
   return lookupKeyPress(self, id, event, isKeyDown);
 }
 // on key down
 function _onLookupKeyDown(self, id, event, isKeyDown){
   return lookupKeyPress(self, id, event, isKeyDown);
 }


 /** Inner methods **/

 // hide or not
 function lookupHideOrNot(id){   if (lookupHideNow(id)){ lookupHideList(id); }
 	return false; }
 // return state of visibility
 function lookupIsVisibleList(id){
	if (lookupContainer(id).className == "lookup-hidden") { return false; } else { return true; }
 }
 // show list
 function lookupShowList(id){
         var cont = lookupContainer(id);
         if (cont) {
            lookupContainer(id).className = "lookup-container"+lookupCSS(id);
            lookupContainer(id).scrollTop = lookupItem(id, 1).offsetTop;
         }
 }
 
 
 /**
  * Hide list
  * 
  * @param {Number} id
  */ 
 function lookupHideList(id)
 {
     var cont = lookupContainer(id);
     if (cont)
     {
        cont.className = "lookup-hidden";
     }
 }
 
 
 // set content in list
 function lookupSetList(id, content){
        lookupContainer(id).innerHTML = content;
        if(lookupAutoSelect(id)){ lookupSelectListItem(id, 1); }
        else { lookupSelectListItem(id, 0); }
 }
 // set data to attribute
 function lookupSetHideNow(id, value){
 	getTag(id).setAttribute("hideNow", value);
 }
 
/**
 * Set last request id
 * 
 * @param {Number} id
 * @param {String} requestId
 * @param {String} query
 */
function lookupSetLastRequestId(id, requestId, query)
{
	getTag(id).setAttribute("lastRequestId", requestId);
	getTag(id).setAttribute("lastRequestQuery", query);
}
 
 
/**
  * Set last request value
  * 
  * @param {Number} id
  * @param {String} query
  */
function lookupSetLastRequestQuery(id, query)
{
	getTag(id).setAttribute("lastRequestQuery", query);
}
 

/**
  * Clear last request id
  * 
  * @param {Number} id
  * @param {Number} requestId
  */
function clearSetLastRequestId(id)
{
	getTag(id).setAttribute("lastRequestId", 0);
}


 // set selected Item
 function lookupSelectListItem(id, Index){ 	     lookupCurrentSelectedItem = Index;
		 for(var i=1; i<= lookupCount(id); i++){
             lookupItem(id, i).className = "element"+lookupCSS(id);
   		 }
 	     if (Index==0){ return false; }
         if (lookupItem(id,Index)) { lookupItem(id,Index).className = "element-selected"+lookupCSS(id); }
 }
 
 
 /**
  * Set values into form elements
  * 
  * @param {Number} id
  * @param {String} value
  * @param {Number} idvalue
  * @param {DOMElement} e1
  * @param {DOMElement} e2
  */
function lookupSetForm(id, value, idvalue, e1, e2)
{
	if (idvalue == '') 
	{
		e1.value = value;
  		e2.value = '';
	}
	else 
	{
		e1.value = '';
		e2.value = idvalue;
	};
}

 
 /**
  * Insert selected data in input field
  * 
  * @param {Number} id
  * @param {Number} Index
  */
 function lookupInsertListItemToInput(id, Index)
 {
 	// Hide list of variants
    lookupHideList(id);
    
    // Set values into elemnts of form
    var item  = lookupItem(id,Index);
    var value = decodeURIComponent(item.getAttribute("contTitle"));
	lookupSetForm( 
		id, 
		value, 
		decodeURIComponent(item.getAttribute("contid")), 
		lookupETitle(id), 
		lookupEValue(id) 
	);
		
	// Set new value into search field
	lookupInput(id).value = value;
	
	// Remember
    lookupSetLastRequestQuery(id, value ); 
		
    // Hide list 
    lookupHideList(id);    
 }
 
 
 // before update list;
 function lookupBeforeUpdateList(id){
   if (lookupInput(id).value.length == 0) { lookupHideList(id); }
 }
 
 
 /**
  * Set hidden values
  * 
  * @param {Number} id
  */
 function lookupSetHiddenValues(id) 
 {
 	// Use our real value in form if it's not the same velue used in last lookup query...
    var lastquery = lookupLastRequestQuery(id);
    var curval = lookupInput(id).value;
    
	if (lastquery != curval) 
	{ 
		lookupSetForm( id, curval, '', lookupETitle(id), lookupEValue(id));  
	}
 }
 
 
 /**
  * Go search by entered value
  * 
  * @param {Number} id
  */
 function lookupApply(id)
 {
 	// Use our real value in form if it's not the same value used in last lookup query...
    lookupSetHiddenValues( id );
   
    if (lookupInput(id).onPressEnter)
    {
       lookupInput(id).onPressEnter();
    }
 }
 
 
 // key press
 function lookupKeyPress(self, id, event, isKeyDown) {

        if (isKeyDown) {
                lookupKeyDownHandled = true;
        } else {
                if (lookupKeyDownHandled) {
                        lookupKeyDownHandled = false;
                        if (event.keyCode != 13)
                                return true;
                        else {
                                return false;
                        }
                }
        }
        var keyIgnore = false;
        lookupKeyPressHandled = true;

        switch(event.keyCode)
        {
                case 13:
                	
                	if ((!lookupIsVisibleList(id))&&(lookupForm(id))) 
                	{
                		// Cancel current search request
                		clearSetLastRequestId(id);
                		
                		// Go Search
                        lookupApply(id);
                     }
                     else
                     {
                     	 if (lookupCurrentSelectedItem > 0) 
	                     {
	                        lookupInsertListItemToInput(id, lookupCurrentSelectedItem);
	                     } 
	                     else 
	                     {
	                        lookupHideList(id);
	                     }
	                     
	                     // Search immediately
	                     if (lookupAutoSearch(id))
	                     {	            
	                     	// Cancel current search request
                			clearSetLastRequestId(id);
                			
	                        // Go Search
                        	lookupApply(id);
	                     }   
                     }                    				 
                     
                     return true;
                case 9:
                		lookupHideList(id);
                		lookupInput(id).focus();
                    keyIgnore = true;
                    return true;
                case 27:
                    lookupInput(id).focus();
                    setTimeout("lookupInput('"+id+"').focus();", 300 );
                    lookupHideList(id);
                    return false;
                case 38:
                    if (lookupCount(id) == 0) { break; }

                    lookupCurrentSelectedItem -= 1;
                    if (lookupCurrentSelectedItem <= 0) { lookupCurrentSelectedItem = lookupCount(id); }

                    lookupSelectListItem(id, lookupCurrentSelectedItem);
                    lookupUpdateScrollUp(id, lookupCurrentSelectedItem);

                    keyIgnore = true;
                    break;
                case 40:
                    if (lookupCount(id) == 0) { break; }

                    lookupCurrentSelectedItem += 1;
                    if (lookupCurrentSelectedItem > lookupCount(id)){ lookupCurrentSelectedItem = 1; }

                    lookupSelectListItem(id, lookupCurrentSelectedItem);
                    lookupUpdateScrollDown(id, lookupCurrentSelectedItem);

                    keyIgnore = true;
                    break;
        }
        if (keyIgnore) {
                return false;
        }
        return true;
 }
 // update scroll position up
 function lookupUpdateScrollUp(id, Index){
    lookupContainer(id).scrollTop = lookupItem(id, Index).offsetTop;
 }
 // update scroll position down
 function lookupUpdateScrollDown(id, Index){
    lookupContainer(id).scrollTop = lookupItem(id, Index).offsetTop  + lookupItem(id, Index).scrollHeight - lookupContainer(id).clientHeight;
 }


 /** Element of List **/

 // show background as "selected"
 function _lookupItemOver(self, id){
		self.className = "element-selected"+lookupCSS(id);
		for(var i=1; i<= lookupCount(id); i++){
			if (lookupItem(id,i)!=self){
				lookupItem(id,i).className = "element"+lookupCSS(id);
			}
			else{
				lookupCurrentSelectedItem = i;
			}
		}
 }
 // hide background as "no selected"
 function _lookupItemOut(self, id){
    self.className = "element"+lookupCSS(id);
 }
 // insert data to input
 function _lookupSelectItem(id, Index){
    lookupInsertListItemToInput(id, Index);
 }
 // set count
 function lookupSetCount(id, n){ 	  getTag(id).setAttribute("count",n); }



 /** Ajax-request **/

 // go Search
 function lookupGoSearch(id){
		// this method from ICAjax.js
		getDataFor(id);
 }



