/**
 * osCommerce: JS OSCFieldSuggest
 *
 * File: includes/class.OSCFieldSuggestjs
 * Version: 1.0
 * Date: 2007-03-28 17:49
 * Author: Timo Kiefer - timo.kiefer_(at)_kmcs.de
 * Organisation: KMCS - www.kmcs.de
 * Licence: General Public Licence 2.0
 */

/**
 * The field gots a suggestlist..
 *
 * @param id please give your fields an ID
 * @param file_layout the xslt document
 * @param file_data the xml document, that will be generated
 * @example
 *   var myFieldSuggestion = new OSCFieldSuggest('search_field_id', 'includes/search_suggest.xsl', 'searchsuggest.php');
 *   //params will be automatically added like searchsuggest.php?myformfieldname=myformfieldvalue
 */

function OSCFieldSuggest(id, file_layout, file_data) {
  base = this;
  base.FILE_XSLT_LAYOUT = file_layout;
  base.FILE_XML_DATA = file_data;
  base._OBJ = document.getElementById(id);
  base._OBJ.focus();
/* the currently selected suggestion (by arrow keys or mouse)*/
  var position_selected = -1;
  if(base._OBJ) {
  oldInputValue = base._OBJ.value;
    //define the functions..
    base.createXmlHttpRequest = function() {
      var requestInstance = false;
      if (window.XMLHttpRequest) { //FE
        requestInstance = new XMLHttpRequest();
        if (requestInstance.overrideMimeType) {
          requestInstance.overrideMimeType('text/xml');
        }
      } else if (window.ActiveXObject) { // IE
        try {
          requestInstance = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
          try { //last chance..
            requestInstance = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {}
        }
      }
      if(!requestInstance) {
        alert("Sorry, your browser don't support a little bit AJAX");
      }
      return(requestInstance);
    };
    base.loadDocument = function(file, funcAfterDocumentLoaded) {
      var myRequest = base.createXmlHttpRequest();
      myRequest.open('GET', file, true);
      myRequest.onreadystatechange = function(e) {
        if(myRequest.readyState == 4 && myRequest.status == 200) {
          funcAfterDocumentLoaded(myRequest);
        } else if(myRequest.readyState == 4) {
          //error file isn't loaded.. 
          alert("Sorry, the file " + file + " couldn't loaded!");
        }
      };
      myRequest.send(null);
    };
    base.parseXmlDocument = function(xsltLayout, xmlData) {
      if(document.all) {
        return(xmlData.transformNode(xsltLayout));
      } else {
        var processor = new XSLTProcessor();
        processor.importStylesheet(xsltLayout);
        var result = processor.transformToDocument(xmlData);
        var xmls = new XMLSerializer();
        return(xmls.serializeToString(result));
      }
    };
    base.getDocumentOffsetTop = function(obj) {
      return(parseInt(obj.offsetTop) + ((obj.offsetParent) ? base.getDocumentOffsetTop(obj.offsetParent) : 0));
    };
    base.getDocumentOffsetLeft = function(obj) {
      return(parseInt(obj.offsetLeft) + ((obj.offsetParent) ? base.getDocumentOffsetLeft(obj.offsetParent) : 0));
    };
    base.show = function() {
      base._OBJ_panel.style.visibility = 'visible';
    };
    base.hide = function() {
      base._OBJ_panel.style.visibility = 'hidden';
    };
    base.suggestList = function() {
      base.loadDocument(base.FILE_XML_DATA + "?" + base._OBJ.name + "=" + base._OBJ.value, function(request) {
        base._OBJ_panel.innerHTML = base.parseXmlDocument(base._xsltSheet, request.responseXML);
        base._OBJ_panel.style.top = (base.getDocumentOffsetTop(base._OBJ) + base._OBJ.offsetHeight) + "px";
        base._OBJ_panel.style.left = base.getDocumentOffsetLeft(base._OBJ) + "px";
        base.show();
        position_selected = -1;
      }); 
    };
    //load xslt layout
    base.loadDocument(base.FILE_XSLT_LAYOUT, function(request) {
      base._xsltSheet = request.responseXML;
    });
    //create html panel to show
    base._OBJ_panel = document.createElement('div');
    base._OBJ_panel.style.visibility = 'hidden';
    base._OBJ_panel.style.position = 'absolute';
    base._OBJ_panel.style.overflow = 'visible';
    base._OBJ_panel.style.height = '0px';
    base._OBJ_panel.style.border = '1px solid #CCCCCC';
    base._OBJ_panel.style.top = 0 + "px";
    base._OBJ_panel.style.left = 0 + "px";
    base._OBJ.parentNode.appendChild(base._OBJ_panel);
    //set the events
    base._OBJ.onkeyup = function(e) {
    	 // get the event
  		e = (!e) ? window.event : e;
  		
    	code = (e.charCode) ? e.charCode :
       ((e.keyCode) ? e.keyCode :
       ((e.which) ? e.which : 0));    
    if(code == 13)
    {      // check to see if any function is currently selected      	
      if(position_selected>=0)
      	base._OBJ_panel.getElementsByTagName("tr").item(position_selected).getElementsByTagName('td').item(0).onclick();
    }
    // if the down arrow is pressed we go to the next suggestion     
	else if((code == 40) && (position_selected<(base._OBJ_panel.getElementsByTagName("tr").length-1)))
      {
      	position_selected++;	      	
      	newTR=base._OBJ_panel.getElementsByTagName("tr").item(position_selected);
        newTR.className = "moduleRowOver";
        if(position_selected>0){
			oldTR=base._OBJ_panel.getElementsByTagName("tr").item(position_selected-1);
	      	oldTR.className = "";
        }
      }
      // if the up arrow is pressed we go to the previous suggestion      
     else if((code == 38) && (position_selected>0))
     {
      	position_selected--;
      	newTR=base._OBJ_panel.getElementsByTagName("tr").item(position_selected);
        newTR.className = "moduleRowOver";
      	if (position_selected<(base._OBJ_panel.getElementsByTagName("tr").length-1)){
			oldTR=base._OBJ_panel.getElementsByTagName("tr").item(position_selected+1);
	      	oldTR.className = "";
      	}
       }
     
      if(base._OBJ.value.length > 0) {
      	if (oldInputValue != base._OBJ.value){
	      	oldInputValue = base._OBJ.value;      	
	        base.suggestList();
      	}
      	else
      		base.show();
      }
    };
    base._OBJ.onblur = function(e) { //lost focus
      //waiting a few milli sec. .. before hide the clicked panel ;)
      setTimeout(function() {
        base.hide();
      }, 500);
    };
    base._OBJ.onfocus = function(e) { //got focus
      if(base._OBJ.value.length > 0 ) {   
      	if (oldInputValue != base._OBJ.value){
      	oldInputValue = base._OBJ.value;
        base.suggestList();
      	}
      	else
      		base.show();
      }
    };
  } else {
    //no field found..
    alert("Field with ID " + id + " couldn't found!");
  }
};