/**
 * 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_cont = document.getElementById('search_border');
  if(base._OBJ) {
    //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 predictive searches");
      }
      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.display = 'block';
    };
    base.hide = function() {
      base._OBJ_panel.style.display = 'none';
    };
    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();
      }); 
    };
    //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.display = 'none';
    base._OBJ_panel.style.position = 'absolute';
    base._OBJ_panel.style.overflow = 'auto';
    base._OBJ_panel.style.height = '200px';
    base._OBJ_panel.style.border = '1px solid #CCCCCC';
    base._OBJ_panel.style.top = 0 + "px";
    base._OBJ_panel.style.left = 0 + "px";
    base._OBJ_panel.id = "search_panel_container";
    base._OBJ.parentNode.appendChild(base._OBJ_panel);
    //set the events
    base._OBJ.onkeyup = function(e) {
      if(base._OBJ.value.length > 0) {
        base.suggestList();
      }
    };
    
    _block_close = false;
    
    base._OBJ_panel.onblur = function(e) { //lost focus
    	//waiting a few milli sec. .. before hide the clicked panel ;)
	    setTimeout(function() {
	  	base.hide();
	    }, 500);
    };
    
    base._OBJ.onblur = function(e) { //lost focus
	    //waiting a few milli sec. .. before hide the clicked panel ;)
    	setTimeout(function() {
    		if (!_block_close) {
    		      	base.hide();
    		}
		}, 500);
    };

      base._OBJ.onfocus = function(e) { //got focus
    	  if (base._OBJ.value == 'Enter search term') {
    		  base._OBJ.value = '';
    	  }
    	  if(base._OBJ.value.length > 0) {
    	  base.suggestList();
      }
    };
    
    base._OBJ_panel.onfocus = function(e) { //got focus
    	_block_close = true;
    };
  } else {
    //no field found..
    alert("Field with ID " + id + " couldn't found!");
  }
};


function ASOFieldSuggest(id, file_layout, file_data) {
	ASObase = this;
	  ASObase.FILE_XSLT_LAYOUT = file_layout;
	  ASObase.FILE_XML_DATA = file_data;
	  ASObase._OBJ = $(id);
	  
	  ASObase._OBJ_cont = document.getElementById('search_border_ASO');
	  
	  if(ASObase._OBJ) {
	    //define the functions..
	    ASObase.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 predictive searches");
	      }
	      return(requestInstance);
	    };
	    ASObase.loadDocument = function(file, funcAfterDocumentLoaded) {
	      var myRequest = ASObase.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);
	    };
	    ASObase.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));
	      }
	    };
	    ASObase.getDocumentOffsetTop = function(obj) {
	      return(parseInt(obj.offsetTop) + ((obj.offsetParent) ? ASObase.getDocumentOffsetTop(obj.offsetParent) : 0));
	    };
	    ASObase.getDocumentOffsetLeft = function(obj) {
	      return(parseInt(obj.offsetLeft) + ((obj.offsetParent) ? ASObase.getDocumentOffsetLeft(obj.offsetParent) : 0));
	    };
	    ASObase.show = function() {
	      ASObase._OBJ_panel.style.display = 'block';
	    };
	    ASObase.hide = function() {
	      ASObase._OBJ_panel.style.display = 'none';
	    };
	    ASObase.suggestList = function() {
	      ASObase.loadDocument(ASObase.FILE_XML_DATA + "?" + ASObase._OBJ.name + "=" + ASObase._OBJ.value, function(request) {
	        ASObase._OBJ_panel.innerHTML = ASObase.parseXmlDocument(ASObase._xsltSheet, request.responseXML);
	        ASObase._OBJ_panel.style.top = (ASObase.getDocumentOffsetTop(ASObase._OBJ) + ASObase._OBJ.offsetHeight) + "px";
	        ASObase._OBJ_panel.style.left = "219px";
	        ASObase.show();
	      });
	    };
	    //load xslt layout
	    ASObase.loadDocument(ASObase.FILE_XSLT_LAYOUT, function(request) {
	      ASObase._xsltSheet = request.responseXML;
	    });
	    //create html panel to show
	    ASObase._OBJ_panel = document.createElement('div');
	    ASObase._OBJ_panel.style.display = 'none';
	    ASObase._OBJ_panel.style.position = 'absolute';
	    ASObase._OBJ_panel.style.overflow = 'auto';
	    ASObase._OBJ_panel.style.height = '200px';
	    ASObase._OBJ_panel.style.border = '1px solid #CCCCCC';
	    ASObase._OBJ_panel.style.top = 0 + "px";
	    ASObase._OBJ_panel.style.left = 0 + "px";
	    ASObase._OBJ_panel.id = "search_panel_container_ASO";
	    ASObase._OBJ.parentNode.appendChild(ASObase._OBJ_panel);
	    //set the events
	    ASObase._OBJ.onkeyup = function(e) {
	      if(ASObase._OBJ.value.length > 0) {
	        ASObase.suggestList();
	      }
	    };
	    
	    ASObase._block_close = false;
	    
	    ASObase._OBJ_panel.onblur = function(e) { //lost focus
	    	//waiting a few milli sec. .. before hide the clicked panel ;)
		    setTimeout(function() {
		  	ASObase.hide();
		    }, 500);
	    };
	    
	    ASObase._OBJ.onblur = function(e) { //lost focus
		    //waiting a few milli sec. .. before hide the clicked panel ;)
	    	setTimeout(function() {
	    		if (!ASObase._block_close) {
	    		      	ASObase.hide();
	    		}
			}, 500);
	    };

	    ASObase._OBJ.addEvent("focus", function() {
	    	if (ASObase._OBJ.getProperty('value') == 'Enter search term') {
	    		ASObase._OBJ.getProperty('value') = '';
	    	}
	    	if(ASObase._OBJ.value.length > 0) {
	    	  ASObase.suggestList();
	    	}
	    });	    
	    
	    ASObase._OBJ_panel.onfocus = function(e) { //got focus
	    	ASObase._block_close = true;
	    };
	  } else {
	    //no field found..
	    alert("Field with ID " + id + " couldn't found!");
	  }
	};