var ajaxBox_offsetX = 0;
var ajaxBox_offsetY = 0;
var ajax_list_externalFile = 'includes/suggest.php';	// Path to external file
var minimumLettersBeforeLookup = 3;	// Number of letters entered before a lookup is performed.

var ajax_list_objects = [];
var ajax_list_cachedLists = [];
var ajax_list_activeInput = false;
var ajax_list_activeItem;
var ajax_list_optionDivFirstItem = false;
var ajax_list_currentLetters = [];
var ajax_optionDiv = false;
var ajax_optionDiv_iframe = false;
var disable_ajax_frame = false;

var ajax_list_MSIE = false;


function encode_utf8(rohtext) {
    // dient der Normalisierung des Zeilenumbruchs
    rohtext = rohtext.replace(/\r\n/g,"\n");
    var utftext = "";
    for(var n=0; n<rohtext.length; n++) {
        // ermitteln des Unicodes des  aktuellen Zeichens
        var c=rohtext.charCodeAt(n);
        // alle Zeichen von 0-127 => 1byte
        if (c<128)
            utftext += String.fromCharCode(c);
        // alle Zeichen von 127 bis 2047 => 2byte
        else if((c>127) && (c<2048)) {
            utftext += String.fromCharCode((c>>6)|192);
            utftext += String.fromCharCode((c&63)|128);}
        // alle Zeichen von 2048 bis 66536 => 3byte
        else {
            utftext += String.fromCharCode((c>>12)|224);
            utftext += String.fromCharCode(((c>>6)&63)|128);
            utftext += String.fromCharCode((c&63)|128);}
    }
    return utftext;
}

if ((navigator.userAgent.indexOf('MSIE') >= 0) && (navigator.userAgent.indexOf('Opera') < 0)) { 
    ajax_list_MSIE = true;
    var temp = navigator.appVersion.split("MSIE");
    var version = parseFloat(temp[1]);
    if (version >= 5.5) { 
        disable_ajax_frame = false;                
    } else {
        disable_ajax_frame = true;
    }
}

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;
    if (document.getElementById(ajax_list_activeInput.name + '_hidden')) {
        document.getElementById(ajax_list_activeInput.name + '_hidden').value = inputObj.id; 
    }
    ajax_options_hide();
}

function ajax_option_setValueMouseOver(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;
    if (document.getElementById(ajax_list_activeInput.name + '_hidden')) {
        document.getElementById(ajax_list_activeInput.name + '_hidden').value = inputObj.id; 
    }
}

function ajax_options_hide() {
    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,paramToExternalFile) {    
    ajax_optionDiv.innerHTML = '';
    ajax_list_activeItem = false;
    if (ajax_list_cachedLists[paramToExternalFile][letters].length <= 1) {
        ajax_options_hide();
        return;			
    }
    
    
    
    ajax_list_optionDivFirstItem = false;
    var optionsAdded = false;
    for(var no=0;no<ajax_list_cachedLists[paramToExternalFile][letters].length;no++) {
        if (ajax_list_cachedLists[paramToExternalFile][letters][no].length == 0) {
            continue;
        }
        optionsAdded = true;
        var div = document.createElement('DIV');
        var items = ajax_list_cachedLists[paramToExternalFile][letters][no].split(/###/gi);
        
        if (ajax_list_cachedLists[paramToExternalFile][letters].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); 
            ajax_option_setValueMouseOver(false,this);
        };
        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,paramToExternalFile) {
    var letters = inputObj;
    var content = ajax_list_objects[ajaxIndex].response;
    var elements = content.split('|');
    ajax_list_cachedLists[paramToExternalFile][letters] = elements;
    ajax_option_list_buildList(letters,paramToExternalFile);    
}


function dump(arr,level) {
    var dumped_text = "";
    if (!level) {
        level = 0;
    }
    
    //The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++) {
        level_padding += "    ";
    }
    
    if (typeof(arr) == 'object') { //Array/Hashes/Objects
        for(var item in arr) {
            var value = arr[item];
            
            if (typeof(value) == 'object') { //If it is an array,
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += dump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else { //Stings/Chars/Numbers etc.
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}

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,paramToExternalFile,e) {
    var inputLetters = inputObj.value;
    
    if ((e.keyCode==38) || (e.keyCode==40)) {
        return;
    }
    if (ajax_list_currentLetters[inputObj.name] == inputLetters) {
        return;
    }
    if (disable_ajax_frame) {
        return;
    }
    if (!ajax_list_cachedLists[paramToExternalFile]) {
        ajax_list_cachedLists[paramToExternalFile] = [];
    }
    //if(inputObj.value.length == 3) {  // clear cache if 3 letters are asked prevents problems with cache to old
    //var ajax_list_cachedLists = new array();
    //    ajax_list_cachedLists[paramToExternalFile] = new Array();
    //}
    ajax_list_currentLetters[inputObj.name] = inputLetters;
    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 (inputLetters.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;
                

                
    if (ajax_list_cachedLists[paramToExternalFile][inputLetters]) {
        ajax_option_list_buildList(inputLetters,paramToExternalFile);			                       
    } else {
        ajax_optionDiv.innerHTML = '';
        var ajaxIndex = ajax_list_objects.length;
        ajax_list_objects[ajaxIndex] = new sack();
        var url = ajax_list_externalFile + '?' + paramToExternalFile + '=1&letters=' + encodeURI(inputLetters);
        ajax_list_objects[ajaxIndex].requestFile = url;	// Specifying which file to get
        ajax_list_objects[ajaxIndex].onCompletion = function() { 
            ajax_option_list_showContent(ajaxIndex,inputLetters,paramToExternalFile); 
        };	// Specify function that will be executed after file has been found
        ajax_list_objects[ajaxIndex].runAJAX();		// Execute AJAX function		
    }
    
}
	
function ajax_option_keyNavigation(e) {
    if (document.all) {
        e = event;
    }
    if (disable_ajax_frame) {
        return;
    }
    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);
        ajax_option_setValueMouseOver(false,ajax_list_activeItem);
    }
    
    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);
            ajax_option_setValueMouseOver(false,ajax_list_activeItem);
        }
    }
		
    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) { 
            ajax_options_hide();			
            return false; 
        } else { 
            return true;
        }
    }
    if (e.keyCode == 27) {	// Escape key
        ajax_options_hide();			
    }
}

