/*
 * ELBNAH Combobox
 *
 **/
var elementid;
var val;
var dohide;

function cbSelect(elementid,val){
	if(!document.getElementById(elementid)) return false;
	element = document.getElementById(elementid);
	element.value = val;
        element.select();
	autoShowHide(elementid+'_list');
	return true;
}	// Ende Methode


function cbSelectDropTo(elementid,newtarget,val){
	if(!document.getElementById(elementid)) return false;
        if(!document.getElementById(newtarget)) return false;


        targetElement = document.getElementById(newtarget);
        // Ausgeblendetes Zielfeld ausblenden
        if(targetElement.parentNode.style.display == 'none')
            targetElement.parentNode.style.display = 'inline-block';

	element = document.getElementById(elementid);
	element.value = val;
        targetElement.select();
	autoShowHide(elementid+'_list');
        autoShowHide(targetElement.id+'_list');
	return true;
}	// Ende Methode


function cbSelectHidden(txtfieldid,txtvalue,hiddenfieldid,hiddenvalue) {
    txtField = document.getElementById(txtfieldid);
    hiddenField = document.getElementById(hiddenfieldid);
    txtField.value = txtvalue;
    hiddenField.value = hiddenvalue;
    autoShowHide(txtfieldid+'_list');
    return true;
}


function cbSelectRepSelect(elementid,labelVal,value){
	if(!document.getElementById(elementid)) return false;
	element = document.getElementById(elementid);
	elementRep = document.getElementById(elementid+'_val');
	element.value = labelVal;
	elementRep.value = value;
	autoShowHide(elementid+'_list');
	
	haystacklist = autocompleteList(elementid);	// Passende Liste finden
	childc = haystacklist.childNodes.length;
	haystacklength = childc;	// Anzahl der Kindselemente speichern
	
	// Alle Elemente der Zielliste durchgehen und ermitteln
	for(a=0; a<haystacklength; a++){
		
	}
	return true;
}	// Ende Methode

function keep_alive(){
	cleartimer(dohide);
}

function blur_close_suggest(elementid){
	dohide = setTimeout('show_hide("hide","'+elementid + '_list'+'")', 1000);
}
// Ermitteln ob Auswahlrelevante Tasten verwendet wurden.
var selIndex = -1;
var innerList;
var lastFieldid;

function keyControll(field, evt) {

  var keyCode =
    document.layers ? evt.which :
    document.all ? event.keyCode :
    document.getElementById ? evt.keyCode : 0;
    var r = '';
    initCB(field);

  switch(keyCode){
  	// Arrow right
  	case 39:
  		
  	break;
  	 // Arrow down
  	case 40:
        if(evt.type != 'keydown') return;
        show_hide('show',autocompleteList(elementid).id);
        if(selIndex < maxIndex) selIndex++;
  		doMarkComboField(field,selIndex);
        scrollToLi(autocompleteList(elementid));
  	break;
  	// Arrow up
  	case 38:
        if(evt.type != 'keydown') return;
        if(selIndex > 0) selIndex--;
        if(selIndex == 0) field.select();
        if(selIndex == -1) selIndex = maxIndex;
  		doMarkComboField(field,selIndex);
        scrollToLi(autocompleteList(elementid));
  	break;
  	// Arrow left
  	case 370:
  		 
  	break;

    // Enter
    case 13:
        if(evt.type != 'keydown') return;
        holdEvent(evt);
        selectedLink =  innerList[selIndex][1].lastChild;
        if(document.all){
            selectedLink.click();
        }else {
             simulateClick(selectedLink);
        }
        if(selectedLink.href)
            document.location = selectedLink.href;

        return;
    break;

    default:
        co_autocomplete(field);
    break;

    case 9:
       
    break;
  }	// Ende Switch
}

/**
 * Initiiert Positionierungsscript
 */
function initCB(field) {
 
    if(lastFieldid != field.id)
            selIndex = -1;

    lastFieldid = field.id;

    newList = getLiInnerHTML(field); 	// Backup der alten ListElemente erstellen.
    innerList = new Array();
    g = 0;
    // alle ausgeblendeten Verwerfen
    for (var i = 0; i < newList.length; i++){
        if(newList[i][1].style.display != 'none'
            && newList[i][1].firstChild.tagName != 'SPAN'){
            innerList[g] = new Array();
            innerList[g][1] = newList[i][1];
            if(newList[i][1].className == 'coactive')
                   selIndex = g;
            g++;
        }

    }	// Endfor
  maxIndex = innerList.length-1;
  scrollToLi(autocompleteList(lastFieldid))
}

/**
 * Bei einer Scrollbarenliste auf das Aktuelle Element scrollen
 */
function scrollToLi(listElement) {
    if(!innerList[selIndex]) return;
    liOffestTop = innerList[selIndex][1].offsetTop;
    listHeight = listElement.style.height.replace('px','');
    var scrollBy = liOffestTop-60;
    // Wenn das Element au�erhalb der Sichtbarkeit ist
    listElement.scrollTop = scrollBy;   
}

function holdEvent(e)
{ 
	if (!e) e = window.event;

    e.cancelBubble = true;
	if (e.stopPropagation)
        e.stopPropagation();
    if(e.preventDefault)
        e.preventDefault();
   
        e.returnValue=false;
    return;
}


function simulateClick(targetElement) {
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);
    targetElement.dispatchEvent(evt);
}

function doMarkComboField() {
        result = new Array();					// Leeres ArrayObject vorbereiten
        // Elemente in der Liste suchen, die der Eingabe entsprechen
        for (var i = 0; i < innerList.length; i++){
            if(!innerList[i][1]) continue;
            innerList[i][1].className = '';	// Unpassende Elemente ausbleden

        }	// Endfor

        if(!innerList[selIndex]) return;
        innerList[selIndex][1].className = 'hov';
}

function cleartimer(id)
{
	clearTimeout(id);
}

function getKey(keyStroke) {
   var keyCode = (document.layers) ? keyStroke.which : event.keyCode;
   var keyString = String.fromCharCode(keyCode).toLowerCase();
   alert(keyCode);
}

// Funktion zum ermitteln von Text zwischen den LI HTML-Tags einer Liste
// Diese Funktion kann ggf. auch die Werte mehrerer Listen finden und ausgeben.
function getLiInnerHTML(element){
	var haystack = new Array();
	var haystacklist;
	var childc;
	var thisnode;
	var thisnodevalue;
	var arraycounter=0;

	// Diese Funktion kann mit this, sowie mit IDs umgehen.
	if(!element.id){
		element = document.getElementById(elementid);  
		if(!document.getElementById(elementid)) return false;
	}	// Endif

	elementid = element.id;	// ID des TriggerElements ermitteln

	if(!haystack[elementid]) haystack[elementid] = new Array();
	if(!autocompleteList(elementid)) return false;
	haystacklist = autocompleteList(elementid);	// Passende Liste finden
	childc = haystacklist.childNodes.length;
	haystacklength = childc;	// Anzahl der Kindselemente speichern
	
	// Alle Elemente der Zielliste durchgehen und ermitteln
	for(a=0; a<haystacklength; a++){
		if(haystacklist.childNodes[a].nodeName != 'LI') continue;
		
		if(haystacklist.childNodes[a].childNodes){
			nodeUlSubNode = haystacklist.childNodes[a].childNodes[1];
			if(nodeUlSubNode){
				if(nodeUlSubNode.nodeName != 'UL') continue;
				for(d=0; d<nodeUlSubNode.childNodes.length; d++){
					thisnodevalue = nodeUlSubNode.childNodes[d].lastChild.innerHTML; // Werte des LI ermitteln
					if(!thisnodevalue || thisnodevalue == null) continue;
					haystack[elementid][arraycounter] = new Array(thisnodevalue,nodeUlSubNode.childNodes[d]);
					arraycounter = arraycounter+1;	// a ist hier nicht zuverlaessig genug 
				}
			}
		}
		thisnodevalue = haystacklist.childNodes[a].lastChild.innerHTML; // Werte des LI ermitteln
		if(!thisnodevalue || thisnodevalue == null) continue;
		haystack[elementid][arraycounter] = new Array(thisnodevalue,haystacklist.childNodes[a]);
		arraycounter = arraycounter+1;	// a ist hier nicht zuverlaessig genug 
	}	// Endfor
	return haystack[elementid];
}
// Funktion zum finden einer Liste zum autovervollst�ndigen
function autocompleteList(elementid){
	if(!document.getElementById(elementid+'_list')) return false;	// Passende Liste finden
	return document.getElementById(elementid+'_list');
}	// Ende Funktion

// Gesamten Inhalt eines Textfeldes selektieren um das Leeren zu erleichtern
function markValue(field){
    field.select();
}

// Alle Kindselemente sichtbar machen, wenn nicht der Autocompleter, sondern der User explizit die Liste anfragt.
function showAllChildNods(elementid){
	if(!document.getElementById(elementid)) return false;	// Passende Liste finden
	autocompletelist = document.getElementById(elementid);   
	childc = autocompletelist.childNodes.length;
	for(a=0; a<childc; a++){
		if(autocompletelist.childNodes[a].nodeName != 'LI') continue;
		autocompletelist.childNodes[a].style.display='block'; // Elemente sichtbar machen.
	}
    fieldId = elementid.replace('_list','');
    field = document.getElementById(fieldId);
    initCB(field);
	return true;
}	// Ende Funktion

// Funktion zum Vorschlagen von passenden Treffer aus dem Haystack
function co_autocomplete(element){
	var oldlist;
	var needle;
	var listobject;
	needle = element.value;					// Suchanfrage entspricht dem Eingabewerte des Textfeldes.

	elementid = element.id;				 	// ID des TriggerElements ermitteln
	if(!autocompleteList(elementid)) return false;
	autocompletelist = autocompleteList(elementid);
	oldlist = getLiInnerHTML(elementid); 	// Backup der alten ListElemente erstellen.
	if(!oldlist) return false;				// Wenn kein Backup erstellt werden konnte, beenden.	

	result = new Array();					// Leeres ArrayObject vorbereiten

	// Elemente in der Liste suchen, die der Eingabe entsprechen
	for (var i = 0; i < oldlist.length; i++){

		oldlist[i][1].style.display='none';	// Unpassende Elemente ausbleden	
		
		if (oldlist[i][0].toLowerCase().search(needle.toLowerCase()) != -1 ||
                oldlist[i][0].replace(/(\s|-)+/, '').toLowerCase().search(needle.replace(/(\s|-)+/, '').toLowerCase()) != -1){
			if(oldlist[i][0] == null || !oldlist[i][0]) continue;
			result.push(oldlist[i][0]);		 // Ergebnis hinzufgen, im Ergebnisarray
			oldlist[i][1].style.display='block';	
		}

	}	// Endfor

	// Wenn ein Ergebnis gefunden wurde, zeige die Liste an.
    if(autocompletelist.id != 'searchInventory_list')
	(needle && result.length>0) ? show_hide('show',autocompletelist.id) : show_hide('hide',autocompletelist.id);
    selIndex = -1;
    return true;
}


function show_hide(action,elementid)
{
    if(!document.getElementById(elementid))
            return;

    targetElement = document.getElementById(elementid);

    if(action == "show")

		  targetElement.style.display="block";
	else

		targetElement.style.display="none";
}


function autoShowHide(elementid){
	if(!document.getElementById(elementid)) return false;
	element = document.getElementById(elementid);
	if(element.style.display == 'none'){
		element.style.display = "block";
		return true;
	}
	else{
		element.style.display = "none";
	}
}

