/************************************************************************************************************
Ajax dynamic list
Copyright (C) April 2006  DTHMLGoodies.com, Alf Magne Kalleland

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.

Alf Magne Kalleland, 2006
Owner of DHTMLgoodies.com
    
************************************************************************************************************/    

    var ajaxBox_offsetX = 0;
    var ajaxBox_offsetY = 0;
    
    var minimumLettersBeforeLookup = 2;    // Number of letters entered before a lookup is performed.
    var ajax_delay = 500;
    
    var ajax_list_objects = new Array();
    var ajax_list_cachedLists = new Array();
    var ajax_list_activeInput = false;
    var ajax_list_inputIdToUpdate = false;
    var ajax_list_activeItem;
    var ajax_list_optionDivFirstItem = false;
    var ajax_list_currentLetters = new Array();
    var ajax_optionDiv = false;
    var ajax_optionDiv_iframe = false;
    var ajax_postSetValueCallbackMethod = null;
    var ajax_lastKeyPressTimestamp = null;

    var ajax_list_MSIE = false;
    if(navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Opera')<0)ajax_list_MSIE=true;
    
    var currentListIndex = 0;
    
    function ajax_getTopPos(inputObj)
    {
        
      var returnValue = inputObj.offsetTop;
      while((inputObj = inputObj.offsetParent) != null){
          returnValue += inputObj.offsetTop;
      }
      return returnValue;
    }
    function ajax_list_cancelEvent()
    {
        return false;
    }
    
    function ajax_getLeftPos(inputObj)
    {
      var returnValue = inputObj.offsetLeft;
      while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft;
      
      return returnValue;
    }
    
    function ajax_option_setValue(e,inputObj)
    {
        if(!inputObj) {
            inputObj=this;
        }
        
        var tmpValue = inputObj.innerHTML;
        if(ajax_list_MSIE) {
            tmpValue = inputObj.innerText;
        } else {
            tmpValue = inputObj.textContent;
        }
        if(!tmpValue) {
            tmpValue = inputObj.innerHTML;
        }
        ajax_list_activeInput.value = tmpValue;
        
        var inputId = ajax_list_activeInput.id;
        var inputHiddenId = inputId.substring(0, inputId.lastIndexOf("_searchEntry"));
        if(inputHiddenId) {
            inputHiddenId = inputHiddenId + "_id";
        } else {
            inputHiddenId = ajax_list_inputIdToUpdate;
        }
        
        if(document.getElementById(inputHiddenId)) {
            document.getElementById(inputHiddenId).value = inputObj.id;
        }
        ajax_callPostSetValueCallBackMethod(); 
        ajax_options_hide();
    }
    
    function ajax_callPostSetValueCallBackMethod() {
        if(this.ajax_postSetValueCallbackMethod) {        
            this.ajax_postSetValueCallbackMethod.call();
        }
    }
    
    function ajax_options_hide()
    {
        if(ajax_optionDiv)ajax_optionDiv.style.display='none';    
        if(ajax_optionDiv_iframe)ajax_optionDiv_iframe.style.display='none';
    }

    function ajax_options_rollOverActiveItem(item,fromKeyBoard)
    {
        if(ajax_list_activeItem)ajax_list_activeItem.className='optionDiv';
        item.className='optionDivSelected';
        ajax_list_activeItem = item;
        
        if(fromKeyBoard){
            if(ajax_list_activeItem.offsetTop>ajax_optionDiv.offsetHeight){
                ajax_optionDiv.scrollTop = ajax_list_activeItem.offsetTop - ajax_optionDiv.offsetHeight + ajax_list_activeItem.offsetHeight + 2 ;
            }
            if(ajax_list_activeItem.offsetTop<ajax_optionDiv.scrollTop)
            {
                ajax_optionDiv.scrollTop = 0;    
            }
        }
    }
    
    function ajax_option_list_buildList(letters,externalUrl)
    {        
        ajax_optionDiv.innerHTML = '';
        ajax_list_activeItem = false;
        if(ajax_list_cachedLists[externalUrl][letters.toLowerCase()].length<1){
            ajax_options_hide();
            return;            
        }        
        
        ajax_list_optionDivFirstItem = false;
        var optionsAdded = false;
        for(var no=0;no<ajax_list_cachedLists[externalUrl][letters.toLowerCase()].length;no++){
            if(ajax_list_cachedLists[externalUrl][letters.toLowerCase()][no].length==0)continue;
            optionsAdded = true;
            var div = document.createElement('DIV');
            
            //Build items from xml excerpts
            var element = ajax_list_cachedLists[externalUrl][letters.toLowerCase()][no];
            var id = element.getAttribute("id");
            var value = element.getAttribute("label");
            var items = [id, value];
            
            if(ajax_list_cachedLists[externalUrl][letters.toLowerCase()].length==1 && ajax_list_activeInput.value == items[0]){
                ajax_options_hide();
                return;                        
            }
            
            div.innerHTML = items[items.length-1];
            div.id = items[0];
            div.className='optionDiv';
            div.onmouseover = function(){ ajax_options_rollOverActiveItem(this,false) }
            div.onclick = ajax_option_setValue;
            if(!ajax_list_optionDivFirstItem)ajax_list_optionDivFirstItem = div;
            ajax_optionDiv.appendChild(div);
        }    
        if(optionsAdded){
            ajax_optionDiv.style.display='block';
            if(ajax_optionDiv_iframe)ajax_optionDiv_iframe.style.display='';
        }
    }
     

    function ajax_option_list_showContent(ajaxIndex,inputObj,elementName,externalUrl,whichIndex)
    {
        if(whichIndex!=currentListIndex)return;
        var letters = inputObj.value;
        var contentDOM = ajax_list_objects[ajaxIndex].responseXML;
        var elements = contentDOM.getElementsByTagName(elementName);
        ajax_list_cachedLists[externalUrl][letters.toLowerCase()] = elements;
        ajax_option_list_buildList(letters,externalUrl);
        
    }
    
    function ajax_option_resize(inputObj)
    {
        ajax_optionDiv.style.top = (ajax_getTopPos(inputObj) + inputObj.offsetHeight + ajaxBox_offsetY) + 'px';
        ajax_optionDiv.style.left = (ajax_getLeftPos(inputObj) + ajaxBox_offsetX) + 'px';
        if(ajax_optionDiv_iframe){
            ajax_optionDiv_iframe.style.left = ajax_optionDiv.style.left;
            ajax_optionDiv_iframe.style.top = ajax_optionDiv.style.top;            
        }        
        
    }

    function ajax_showOptions(inputObj,externalUrl,elementKey,elementName,elementType,operatorType,evt, postSetValueCallBackMethod, inputIdToUpdate, workingImageId)
    {
        var context = this;
    	var currentTimestamp = new Date().getTime();
    	ajax_lastKeyPressTimestamp = currentTimestamp;

        if(evt.keyCode==13 || evt.keyCode==9) {
            return;
        } 	
        window.setTimeout(function() {context.ajax_delay_callback.apply(context, [currentTimestamp, inputObj,externalUrl,elementKey,elementName,elementType,operatorType,postSetValueCallBackMethod, inputIdToUpdate, workingImageId])}, ajax_delay);
    }
    
    function ajax_delay_callback(currentTimestamp, inputObj,externalUrl,elementKey,elementName,elementType,operatorType, postSetValueCallBackMethod, inputIdToUpdate, workingImageId) {
    	if(ajax_lastKeyPressTimestamp == currentTimestamp) {
    		ajax_showOptions_load(inputObj,externalUrl,elementKey,elementName,elementType,operatorType,postSetValueCallBackMethod, inputIdToUpdate, workingImageId);
    	}
    }
    
    function ajax_showOptions_load(inputObj,externalUrl,elementKey,elementName,elementType,operatorType, postSetValueCallBackMethod, inputIdToUpdate, workingImageId)
    {
    	if(postSetValueCallBackMethod) {
            this.ajax_postSetValueCallbackMethod = postSetValueCallBackMethod;
        } else {
            this.ajax_postSetValueCallbackMethod = null;
        }
        
        if(inputIdToUpdate) {
            ajax_list_inputIdToUpdate = inputIdToUpdate;
        }
        
        if(ajax_list_currentLetters[inputObj.name]==inputObj.value)return;
        if(!ajax_list_cachedLists[externalUrl])ajax_list_cachedLists[externalUrl] = new Array();
        ajax_list_currentLetters[inputObj.name] = inputObj.value;
        if(!ajax_optionDiv){
            ajax_optionDiv = document.createElement('DIV');
            ajax_optionDiv.id = 'ajax_listOfOptions';    
            document.body.appendChild(ajax_optionDiv);
            
            if(ajax_list_MSIE){
                ajax_optionDiv_iframe = document.createElement('IFRAME');
                ajax_optionDiv_iframe.border='0';
                ajax_optionDiv_iframe.style.width = ajax_optionDiv.clientWidth + 'px';
                ajax_optionDiv_iframe.style.height = ajax_optionDiv.clientHeight + 'px';
                ajax_optionDiv_iframe.id = 'ajax_listOfOptions_iframe';
                
                document.body.appendChild(ajax_optionDiv_iframe);
            }
            
            var allInputs = document.getElementsByTagName('INPUT');
            for(var no=0;no<allInputs.length;no++){
                if(!allInputs[no].onkeyup)allInputs[no].onfocus = ajax_options_hide;
            }            
            var allSelects = document.getElementsByTagName('SELECT');
            for(var no=0;no<allSelects.length;no++){
                allSelects[no].onfocus = ajax_options_hide;
            }

            var oldonkeydown=document.body.onkeydown;
            if(typeof oldonkeydown!='function'){
                document.body.onkeydown=ajax_option_keyNavigation;
            }else{
                document.body.onkeydown=function(){
                    oldonkeydown();
                ajax_option_keyNavigation() ;}
            }
            var oldonresize=document.body.onresize;
            if(typeof oldonresize!='function'){
                document.body.onresize=function() {ajax_option_resize(inputObj); };
            }else{
                document.body.onresize=function(){oldonresize();
                ajax_option_resize(inputObj) ;}
            }
                
        }
        
        if(inputObj.value.length<minimumLettersBeforeLookup){
            ajax_options_hide();
            return;
        }
                

        ajax_optionDiv.style.top = (ajax_getTopPos(inputObj) + inputObj.offsetHeight + ajaxBox_offsetY) + 'px';
        ajax_optionDiv.style.left = (ajax_getLeftPos(inputObj) + ajaxBox_offsetX) + 'px';
        if(ajax_optionDiv_iframe){
            ajax_optionDiv_iframe.style.left = ajax_optionDiv.style.left;
            ajax_optionDiv_iframe.style.top = ajax_optionDiv.style.top;            
        }
        
        ajax_list_activeInput = inputObj;
        ajax_optionDiv.onselectstart =  ajax_list_cancelEvent;
        currentListIndex++;
        if(ajax_list_cachedLists[externalUrl][inputObj.value.toLowerCase()]){
            ajax_option_list_buildList(inputObj.value,externalUrl,currentListIndex);            
        }else{
            var tmpIndex=currentListIndex/1;
            ajax_optionDiv.innerHTML = '';
            var ajaxIndex = ajax_list_objects.length;
            ajax_list_objects[ajaxIndex] = new sack();
            
            var url = externalUrl + "?key=" + elementKey + "&value=" + inputObj.value.replace(" ", "+") + "&type=" + elementType + "&operator=" + operatorType;
            ajax_list_objects[ajaxIndex].requestFile = url;    // Specifying which file to get
            ajax_list_objects[ajaxIndex].workingImageId = workingImageId;
            
            ajax_list_objects[ajaxIndex].onCompletion = function(){ 
                ajax_option_list_showContent(ajaxIndex,inputObj,elementName,externalUrl,tmpIndex); 
            };    // Specify function that will be executed after file has been found
            
            ajax_list_objects[ajaxIndex].runAJAX();        // Execute AJAX function        
            ajax_list_objects[ajaxIndex].postSetValueCallBackMethod = postSetValueCallBackMethod;
        }
        
            
    }
    
    function ajax_option_keyNavigation(e)
    {
        if(document.all)e = event;
        
        if(!ajax_optionDiv)return;
        if(ajax_optionDiv.style.display=='none')return;
        
        if(e.keyCode==38){    // Up arrow
            if(!ajax_list_activeItem)return;
            if(ajax_list_activeItem && !ajax_list_activeItem.previousSibling)return;
            ajax_options_rollOverActiveItem(ajax_list_activeItem.previousSibling,true);
        }
        
        if(e.keyCode==40){    // Down arrow
            if(!ajax_list_activeItem){
                ajax_options_rollOverActiveItem(ajax_list_optionDivFirstItem,true);
            }else{
                if(!ajax_list_activeItem.nextSibling)return;
                ajax_options_rollOverActiveItem(ajax_list_activeItem.nextSibling,true);
            }
        }
        
        if(e.keyCode==13 || e.keyCode==9){    // Enter key or tab key
            if(ajax_list_activeItem && ajax_list_activeItem.className=='optionDivSelected')
                ajax_option_setValue(false,ajax_list_activeItem);
            if(e.keyCode==13)
                return false; 
            else 
                return true;
        }
        if(e.keyCode==27){    // Escape key
            ajax_options_hide();            
        }
    }
    
    
    document.documentElement.onclick = autoHideList;
    
    function autoHideList(e)
    {
        if(document.all)e = event;
        
        if (e.target) {
            source = e.target;
        }
        else if (e.srcElement) {
            source = e.srcElement;
        }
        if (source.nodeType == 3) { // defeat Safari bug
            source = source.parentNode;
        }
        if(source && source.tagName && source.tagName.toLowerCase()!='input' && source.tagName.toLowerCase()!='textarea') {
            ajax_options_hide();
        }
    }
    
    
    
