
 /**
 * LookUp Input
 * (C) ICSoft, http://www.icsoft.ru
 *
 * author Egor Stremousov
 * version 1.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){

  document.write("		<div id='"+id+"' count='0' hideNow='1' class='lookup"+css+"' sForm='"+sForm+"' eValue='"+eValue+"' eTitle='"+eTitle+"' url='"+url+"' css='"+css+"' autoSelect='"+autoSelect+"' lastRequestId=''> ");
  document.write("	      <div id='loading-"+id+"' class='lookup-hidden' ><img src='/_lib/lookup/LookUpLoad.gif' /></div> ");
  document.write("		      <input id='input-"+id+"' ");
  document.write("		             class='lookup-input"+css+"'  ");

  document.write("   	             onchange    = \"return _onLookupChange('"+id+"')\" ");
  document.write("		             onfocus     = \"return _onLookupFocus('"+id+"')\" ");
  document.write("		             onblur      = \"return _onLookupBlur('"+id+"')\" ");
  document.write("		             onkeyup     = \"return _onLookupKeyUp(this,'"+id+"', event, false ); \" ");
  document.write("		             onkeypress  = \"return _onLookupKeyPress(this,'"+id+"', event, false); \" ");
  document.write("		             onkeydown   = \"return _onLookupKeyDown(this,'"+id+"', event, true); \" ");

  document.write("		             value='"+lookupDefaultValue+"' ");
  document.write("		             autocomplete='off' ");
  document.write("		             type='text' ");
  document.write("		             /><br/> ");


  document.write("		      <div id='container-"+id+"' class='lookup-hidden' onscroll=\"return _onLookupScroll('"+id+"');\"> ");
  document.write("		      </div> ");
  document.write("		</div> ");

 }

 /* 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 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");
 }


 /** 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 releas
 function _onLookupBlur(id){

  // transfer the text value to the hidden input element for value...
	if (lookupInput(id).value!=lookupETitle(id)) {
     // set hidden fields
     lookupSetForm(id, lookupInput(id).value, '', lookupETitle(id), lookupEValue(id));
	}

  if ( lookupInput(id).value=="" ) { lookupInput(id).value=lookupDefaultValue; lookupInput(id).style.color="#d1d1d1"; }

  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 27:
           case 9:
           case 38:
           case 40:
           case 16:
           case 17:
           case 18:
           case 33:
           case 34:
           case 35:
           case 36:
           case 37:
           case 39:
	           keyIgnore = true;
  	         break;
   }
//           case 45:
//           case 46:

	if ((!keyIgnore) && (self.value!=lookupETitle(id))) {

     // set hidden fields
     lookupSetForm(id, self.value, '', 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){
         lookupContainer(id).className = "lookup-container"+lookupCSS(id);
         lookupContainer(id).scrollTop = lookupItem(id, 1).offsetTop
 }
 // hide list
 function lookupHideList(id){
         lookupContainer(id).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
 function lookupSetLastRequestId(id, value){
 	getTag(id).setAttribute("lastRequestId", value);
 }
 // 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 form
 function lookupSetForm(id, value, idvalue, e1, e2){
			if (idvalue=='') {
	  		e1.value = value;
  			e2.value = "";
			}
			else {
	  		e1.value = value;
  			e2.value = idvalue;
			};

 }
 // insert selected data in input field
 function lookupInsertListItemToInput(id, Index){
        lookupHideList(id);
		lookupSetForm( id, decodeURIComponent(lookupItem(id,Index).getAttribute("contTitle")), decodeURIComponent(lookupItem(id,Index).getAttribute("contid")), lookupETitle(id), lookupEValue(id) );
		lookupInput(id).value = decodeURIComponent(lookupItem(id,Index).getAttribute("contTitle"));
 }
 // before update list;
 function lookupBeforeUpdateList(id){
   if (lookupInput(id).value.length == 0) { lookupHideList(id); }
 }
 // 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))) { lookupForm(id).submit(); return true; }

                        if (lookupCurrentSelectedItem > 0) {

                                lookupInsertListItemToInput(id, lookupCurrentSelectedItem);
                                					  } else lookupHideList(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);
 }



