    
    /**
    * $Id: og.js 989 2007-10-19 11:30:28Z root $
    * Suggestion Lib
    * 
    * @category page system
    * @package v4 javascript
    * @author Bastian Kraus <basti@partys-bei-uns.de>
    * @copyright 2006 DTmedia GmbH
    * @version www.partys-bei-uns.de - Version 4 - $Rev: 989 $
    * @link http://www.partys-bei-uns.de
    */

    var SG_INST_COUNT = 0;
    
    var SG_SEARCHFIELD_WIDTH = '140px';
    
    var SG_DATALIST_WIDTH = 350;
    var SG_DATALIST_HEIGHT = 250;
    var SG_DATALIST_DISPLAY = 'none';
    
    function sG() {
        var sgInstanceID;
        var sgInstanceName;
        var sgContainer;
        var sgContainer_Name;
        var sgList;
        var sgList_Name;
        var sgListSelectedItem;
        var sgListShown = false;
        var sgSearchField;
        var sgSearchField_Name;
        var sgSearchField_PreValue = "";
        var sgDataSubmitField;
        var sgDataSubmitField_Name;
        var sgDataSubmitField_PreValue = "";
        var sgSearchFieldHidden;
        var sgSearchFieldHidden_Name;
        var sgQueryInProgress = false;
        var sgQueryTimeout;
        var sgSearchData = new Array;
        var sgDataSource;
        
        this.init = function (sInstanceName, sInputField){
            // init instance
            sgInstanceName = sInstanceName;
            sgInstanceID = ++SG_INST_COUNT;
            sgContainer_Name = 'sgContainer_' + sgInstanceID;
            sgList_Name = 'sgList_' + sgInstanceID;
            sgSearchField_Name = 'sgSearchField_' + sgInstanceID;
            if(sInputField)
              sgSearchField_Name = sInputField;
            sgSearchFieldHidden_Name = 'sgSearchFieldHidden_' + sgInstanceID;
            
            if(!sgDataSubmitField_Name) sgDataSubmitField_Name = 'sgDataSubmitField_' + sgInstanceID;
            
            // init sg search view
            document.write('<div id="' + sgContainer_Name + '"></div>');
            sgContainer = document.getElementById(sgContainer_Name);
            
            // creating input field nodes
            var nDataSubmitField = document.createElement('input');
            nDataSubmitField.name = sgDataSubmitField_Name;
            nDataSubmitField.id = sgDataSubmitField_Name;
            nDataSubmitField.value = sgDataSubmitField_PreValue;
            nDataSubmitField.type = 'hidden';
            
            if(sInputField) {
              var nSearchField = document.getElementById(sInputField);
              nSearchField.setAttribute('autocomplete','off');
            } else {
              var nSearchField = document.createElement('input');
              nSearchField.name = sgSearchField_Name;
              nSearchField.id = sgSearchField_Name;
              nSearchField.value = sgSearchField_PreValue;
              nSearchField.type = 'text';
              nSearchField.setAttribute('autocomplete','off');
              nSearchField.style.width = SG_SEARCHFIELD_WIDTH;
            }
            
            var nSearchFieldHidden = document.createElement('input');
            nSearchFieldHidden.name = sgSearchFieldHidden_Name;
            nSearchFieldHidden.id = sgSearchFieldHidden_Name;
            nSearchFieldHidden.type = 'hidden';
            
            sgContainer.appendChild(nDataSubmitField);
            if(!sInputField) sgContainer.appendChild(nSearchField);
            sgContainer.appendChild(nSearchFieldHidden);
            
            sgSearchField = document.getElementById(sgSearchField_Name);
            sgDataSubmitField = document.getElementById(sgDataSubmitField_Name);
            sgSearchFieldHidden = document.getElementById(sgSearchFieldHidden_Name);    
            eval("sgSearchField.onkeyup = function(event){ if(!event){ event = window.event; } " + sgInstanceName + ".doAction(event); };");
            eval("sgSearchField.onblur = function(event){ if(!event){ event = window.event; } window.setTimeout(\"" + sgInstanceName + ".listHide()\",100); };");
        }
        
        this.setDataFieldName = function(mValue){
            if(mValue) sgDataSubmitField_Name = mValue;
        }
        
        this.setDataSource = function(sDataSource){
            if(sDataSource) sgDataSource = sDataSource;
        }
        
        this.setPreselectData = function(sPreName, sPreValue){
            sgSearchField_PreValue = sPreName;
            sgDataSubmitField_PreValue = sPreValue;
            maySubmitForm = true;
        }
        
        this.doAction = function (ev){
            if(!ev) ev = window.event;
            // alert(ev.keyCode);
            switch(ev.keyCode){
                case 40:
                    // Pfeil nach unten
                    if(!sgListShown && sgSearchField.value != ''){
                        this.loadList();
                    }else{
                        this.listRowDown();
                    }
                    break;
                case 38:
                    // Pfeil nach oben
                    if(!sgListShown && sgSearchField.value != ''){
                        this.loadList();
                    }else{
                        this.listRowUp();
                    }
                    break
                case 39:
                    // Pfeil nach rechts
                    if(sgListSelectedItem){
                        this.loadList();
                        maySubmitForm = true;
                    }
                case 13:
                    // Enter
                    if(sgListSelectedItem){
                        this.listHide();
                        maySubmitForm = true; 
                    }
                    break;
                default:
                    maySubmitForm = false;
                    if(sgQueryTimeout) window.clearTimeout(sgQueryTimeout);
                    sgQueryTimeout = window.setTimeout(sgInstanceName + ".loadList()",500); 
                    break;
            }
        }
        
        this.resetHiddenDataField = function(){
            sgDataSubmitField.value = '';
        }

        this.loadList = function(){
            if(sgQueryInProgress) return false;
            sgQueryInProgress = true;
            sgSearchFieldHidden.value = sgSearchField.value;
            this.resetHiddenDataField();
            if(sgSearchField.value.length >= 3){
                var ajForm = getAjaxFormObject();
                var inputSearch = document.createElement('input');
                inputSearch.type = 'hidden';
                inputSearch.name = inputSearch.id = 'sgSuche';
                inputSearch.value = sgSearchField.value;
                
                var inputInstance = document.createElement('input');
                inputInstance.type = 'hidden';
                inputInstance.name = inputInstance.id = 'sgInstanceName';
                inputInstance.value = sgInstanceName;
                
                ajForm.appendChild(inputSearch);
                ajForm.appendChild(inputInstance);

                var formContent = xajax.getFormValues(AJ_CONTAINER_FORM_ID);
                eval("xajax_" + sgDataSource + "(formContent);");
            }
            sgQueryInProgress = false;
            maySubmitForm = false;
        }
        
        this.fillList = function(aData){
            this.buildList();
            if(!sgList){
                alert('Fehler im Listenobjekt!');
                return false;
            }
            if(aData.length > 0){
                for(c=0;c<aData.length;c++){
                    var listItem = document.createElement('div');
                    listItem.id = 'sgLI_' + aData[c][1];
                    eval("listItem.onmouseover = function(event){ if(!event){ event = window.event; } " + sgInstanceName + ".listMarkRow(this); };");
                    eval("listItem.onmouseout = function(event){ if(!event){ event = window.event; } " + sgInstanceName + ".listRemoveMarkRow(this); };");
                    eval("listItem.onclick = function(event){ if(!event){ event = window.event; } " + sgInstanceName + ".listMarkRow(this); " + sgInstanceName + ".listHide(); maySubmitForm = true; };");
                    listItem.innerHTML = '<strong>' + aData[c][0] + '</strong> ';
                    listItem.className = 'sgListItem';
                    listItem.setAttribute('dataID', aData[c][1]);
                    if(aData[c][2]) {
                      listItem.setAttribute('dataName', aData[c][0]+' (' + html_decode(aData[c][2]) + ')');
                      listItem.innerHTML += '(' + aData[c][2] + ')';
                    } else {
                      listItem.setAttribute('dataName', aData[c][0]);
                    }
                    sgList.appendChild(listItem);
                }
            }
            this.listShow();
        }
        
        this.buildList = function(){
            sgList = this.listGetBaseNode();
            if(!this.sgList){
                var nSgl = document.createElement('div');
                nSgl.id = sgList_Name;
                nSgl.name = sgList_Name;
                nSgl.className = 'sgList';
                nSgl.style.width = SG_DATALIST_WIDTH + 'px';
                nSgl.style.height = SG_DATALIST_HEIGHT + 'px';
                //var parentOffsetPos = findPos(sgSearchField);
                //nSgl.style.top = parentOffsetPos[1] + 'px';
                //nSgl.style.left = parentOffsetPos[0] + 'px';
                sgContainer.appendChild(nSgl);
                sgList = document.getElementById(sgList_Name);
            }
            if(sgList.hasChildNodes()){
                while(sgList.childNodes.length)
                  sgList.removeChild(sgList.childNodes[0]);
                sgListSelectedItem = null;
            }
        }

        this.listGetBaseNode = function(){
            if(sgContainer.hasChildNodes){
                for(var c=0;c<sgContainer.childNodes.length;c++){
                    if(sgContainer.childNodes[c].id == sgList_Name){
                        return sgContainer.childNodes[c];
                    }
                }
            }
        }

        this.listShow = function(){
            if(sgList){
                sgList.style.display = 'block';
                sgListShown = true;
            }
        }

        this.listHide = function(){
            if(sgList){
                sgList.style.display = 'none';
                sgListShown = false;
                sgListSelectedItem = false;
            }
            maySubmitForm = true;
        }

        this.listRowUp = function(){
            if(sgList.hasChildNodes()){
                var nodeToSelect;
                if(sgListSelectedItem){
                    if(sgListSelectedItem.id == sgList.childNodes[0].id){
                        nodeToSelect = sgList.childNodes[sgList.childNodes.length - 1];
                    }else{
                        nodeToSelect = sgListSelectedItem.previousSibling;
                    }
                }else if(!sgListSelectedItem){
                    nodeToSelect = sgList.childNodes[sgList.childNodes.length - 1];
                }
                this.listMarkRow(nodeToSelect);
                this.listScroll();
            }
        }

        this.listRowDown = function(){
            if(sgList.hasChildNodes()){
                var nodeToSelect;
                if(sgListSelectedItem){
                    if(sgListSelectedItem.id == sgList.childNodes[sgList.childNodes.length - 1].id){
                        nodeToSelect = sgList.childNodes[0];
                    }else{
                        nodeToSelect = sgListSelectedItem.nextSibling;
                    }
                }else if(!sgListSelectedItem){
                    var nodeToSelect = sgList.childNodes[0];
                }
                this.listMarkRow(nodeToSelect);
                this.listScroll();
            }
        }
        
        this.listScroll = function(){
            if(!sgListSelectedItem) return false;
            if(sgList.scrollHeight > SG_DATALIST_HEIGHT){
                var pOffset = sgListSelectedItem.offsetParent;
                sgList.scrollTop = sgListSelectedItem.offsetTop;
            }
        }

        this.listMarkRow = function(nodeToMark){
            if(sgList.hasChildNodes && nodeToMark){
                if(sgListSelectedItem) sgListSelectedItem.className = 'sgListItem';
                nodeToMark.className = 'sgListItemActive';
                sgListSelectedItem = nodeToMark;
                sgSearchField.value = nodeToMark.getAttribute('dataName');
                sgDataSubmitField.value = nodeToMark.getAttribute('dataID');
            }
        }
        
        this.listRemoveMarkRow = function(nodeToUnmark){
            nodeToUnmark.className = 'sgListItem';
        }
    }
  
    function html_decode(str) {
      str = str.replace(/&auml;/g, '\u00E4');
      str = str.replace(/&ouml;/g, '\u00f6');
      str = str.replace(/&uuml;/g, '\u00fc');
      str = str.replace(/&Auml;/g, '\u00c4');
      str = str.replace(/&Ouml;/g, '\u00d6');
      str = str.replace(/&Uuml;/g, '\u00dc');
      str = str.replace(/&szlig;/g, '\u00df');
      return str;
    }