function sendStats(encQuery,type, data,node) {
    try {
        //alert(encQuery);
        var info = "q=" +encQuery+"&context=" + type;
        if(type=="redir") {
            info=info+"&url="+data;
        }
        else {
            info=info+"&type="+type+"&data="+data;
        }

        var server="http://suche.esemos.de";
        var url = server+"/medimops/stat.js?" + info;
        var fileref=document.createElement("link")
        fileref.setAttribute("rel", "stylesheet")
        fileref.setAttribute("type", "text/css")
        fileref.setAttribute("href", url)
        node.appendChild(fileref);
    // document.getElementById('statsImage').src = url;
    } catch(ex) {
    //alert(ex);
    }
}

function getURLParameters()
{
    var sURL = window.document.URL.toString();
    var map = new Object();
    if (sURL.indexOf("?") < 0)return map;//alert("No parameters.");
    var arrParams = sURL.split("?");
    var arrURLParams = arrParams[1].split("&");
    var arrParamNames = new Array(arrURLParams.length);
    var arrParamValues = new Array(arrURLParams.length);
    var i = 0;
    for (i = 0; i < arrURLParams.length; i++)
    {
        var sParam = arrURLParams[i].split("=");
        arrParamNames[i] = sParam[0];
        if (sParam[1] != "")
            arrParamValues[i] = unescape(sParam[1]);
        else
            arrParamValues[i] = "No Value";
    }
    for (i = 0; i < arrURLParams.length; i++)
        map[arrParamNames[i]] = arrParamValues[i];
    //alert(arrParamNames[i]+" = "+ arrParamValues[i]);
    return map;
}

function addClickhandlerForClass(statsClass){
    try {
        var query=getURLParameters()["searchparam"];//document.getElementById('f_search_param').value;//
        var xs = getElementsByClassName(statsClass, "*", document);
        for(var i=0;i<1000;i++){
            x=xs[i];
            if(!x)break;
            x.onclick=function(){
                sendStats(query,'redir',this.href,this);
                return true;
            }
        }
    } catch(ex) {
    //alert(ex);
    }
}

function sendResults(resultId){
    try{
        var node=document.body;
        var query=getURLParameters()["searchparam"];//document.getElementById('f_search_param').value;
        var hitNode = document.getElementById(resultId);
        var hits;
        if(hitNode == null)
            hits = 0;
        else {
            var tmp = hitNode.childNodes[0].nodeValue.trim().split(" ", 1);
            hits=parseInt(tmp);
        }
        if(hits==0 || isNaN(hits))
            sendStats(query,"noResults",0,node);
        else
            sendStats(query,"results",hits,node);
    }catch(ex){        
        sendStats(query,"noResultsOrError",0,node);
    }
}

function registerStatsClickHandlers(queryFieldId){   
    addClickhandlerForClass("fc_product_title");
    addClickhandlerForClass("fc_list_picture");
    addClickhandlerForClass("esemos-stats");
    sendResults(queryFieldId);
}
function EsemosSuggest() {

    var pRequest;
    var pLayer;
    var pDebug = false;
    var pSearchURL = "";
    var pQueryParamName = "";
    var pForm = null;
    var pLayerName = "";
    var pAnchor;
    var pTemplate;
    var pQueryInput;
    var pSuggest = new Array();
    var pLastQuery;
    var pCurrentSelection = 0;
    var submitted = false;

    this.init = function(searchURL, formid, queryParamName, queryFieldId, divLayername, debugMode) {
        pSearchURL = searchURL;
        pForm = document.getElementById(formid);
        pQueryParamName = queryParamName;
        pLayerName = divLayername;
        pDebug = debugMode;

        if (pSearchURL == "") {
            if (pDebug) alert("no searchurl defined");
            return null;
        } else if (pForm == null) {
            if (pDebug) alert("no form found");
            return null;
        } else if (pQueryParamName == "") {
            if (pDebug) alert("no queryparamname defined");
            return null;
        } else if (pLayerName == "") {
            if (pDebug) alert("need a layer for output");
        }

        pQueryInput = document.getElementById(queryFieldId);
        pQueryInput.onkeyup = handleKeyPress;
        pQueryInput.onblur = hideLayer;

        pTemplate = document.getElementById("suggestRow");
        pAnchor = document.getElementById("suggestAnchor");
        pAnchor.removeChild(pTemplate);

        pForm.onsubmit = handleSubmit;
    }

    function handleSubmit() {
        submitted = true;
        if (pSuggest[pCurrentSelection] != undefined) {
            if (pSuggest[pCurrentSelection].split('###')[1] != "Kategorie") {
                pQueryInput.value = pSuggest[pCurrentSelection].split('###')[0].replace(/<b>/g, '').replace(/<\/b>/g, '');
            }
        }
    }

    this.handleClick = function() {
        if (pSuggest[pCurrentSelection] != undefined) {
            if (pSuggest[pCurrentSelection].split('###')[1] == "Kategorie") {
                pForm.elements["filterkategorie"].value = "__" + pSuggest[pCurrentSelection].split('###')[0] + "__";
                pQueryInput.value = "";
                pForm.submit();
            }
            else {
                pQueryInput.value = pSuggest[pCurrentSelection].split('###')[0].replace(/<b>/g, '').replace(/<\/b>/g, '');
                pForm.submit();
            }
        }
    }

    this.handleMouseOver = function(elem) {
        highlightSuggest(elem);
        pCurrentSelection = elem.getAttribute("id").split('_')[1];
    }

    this.handleMouseOut = function(elem) {
        unmarkSuggest(elem);
        pCurrentSelection = -1;
    }

    function handleKeyPress(evt) {
        evt = (evt) ? evt : ((event) ? event : null);
        var keyCode = evt.keyCode;
        if(keyCode == 13) {
        // ignore enter
        } else if (keyCode == 38) {
            moveSelection("up")
        } else if (keyCode == 40) {
            moveSelection("down");
        } else {
            if (pQueryInput.value == "") {
                hideLayer();
                return;
            }
            if (pLastQuery != pQueryInput.value)
                startAjax();
            pLastQuery = pQueryInput.value;
        }
    }

    function moveSelection(direction) {
        var pos = pCurrentSelection;
        if (direction == "up")   pos--;
        else                     pos += 1;

        if (pos < 0) {
            unmarkAll();
            pQueryInput.focus();
            pCurrentSelection = -1;
        } else {
            var tblCell = getTableCell(pos);
            if (tblCell != null) {
                unmarkAll();
                highlightSuggest(tblCell);
                pCurrentSelection = pos;
            }
        }

        var query = pQueryInput.value;
        pQueryInput.value = "";
        pQueryInput.focus();
        pQueryInput.value = query;
    }

    function trim(str) {
        return str.replace(/^\s*/, "").replace(/\s*$/, "");
    }

    function startAjax() {
        // without the next code-line the suggestion layer will not be shown, if we selected
        // an already searched query and change our query after this.
        // e.g. search for hello, then type hell and select hello from the suggestions
        // now removing the 'o' will not show the layer
        submitted = false;

        var query = pQueryInput.value;
        query = trim(query);
        // use utf8 aware encodeURIComponent instead escape
        var requestURL = pSearchURL + "?" + pQueryParamName + "=" + encodeURIComponent(query);

        //		// k.f.: Suchraum Einschränkung, z.B. Musik => finde keine Book suggestions
        //		filter=getParam("fq");
        //		type=getCategories();
        //		if(type!="all")filter="type_s:"+type;
        //		if(filter!=null && filter!="")
        //        	requestURL = requestURL + "&filter=" + encodeURIComponent(filter);

        try {
            if (window.XMLHttpRequest) {
                pRequest = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                pRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
                if (pDebug) alert("");
            }

            pLayer = document.getElementById(pLayerName);
            if (pLayer != null) {
                if (query != "") {
                    pRequest.open("GET", requestURL, true);
                    pRequest.onreadystatechange = callbackAjax;
                    pRequest.send(null);
                } else {
                    hideLayer();
                }
            } else {
                if (pDebug) alert("no layer for output found");
            }
        } catch(ex) {
            //            hideLayer();
            if (ex == undefined) {
                //                if (pDebug) alert( "Error: " + ex.getmessage );
                console.log("Error: " + ex.getmessage)
            } else {
                console.log("Error: " + ex.getmessage)
            //                if (pDebug) alert( "Error: " + ex );
            }
        }
    }

    function hideLayer() {
        if (pLayer != null) {
            pLayer.style.display = "none";
        }
    }

    function showLayer() {
        if (pLayer != null && pSuggest != null && pSuggest.length >= 1) {
            pLayer.style.display = "block";
        }
    }

    // Make public
    this.hideLayer = hideLayer;
    this.showLayer = showLayer;

    function callbackAjax() {
        if (submitted == false) {
            if (pRequest.readyState == 4) {
                if (pRequest.status == 0) {
                    if (pDebug)
                        console.log("status 0: cant ajax to different server!")
                } else if (pRequest.status == 200) {
                    handleResponse(pRequest.responseText);
                } else {
                    if (pDebug)
                        console.log("Error (" + pRequest.status + "): " + pRequest.statusText);
                }
            }
        } else {
            if (pDebug)
                console.log("already submitted!");
        }
    }

    function handleResponse(text) {
        pCurrentSelection = -1;
        pSuggest = new Array();
        pSuggest = text.split("\n");
        var newSuggest = new Array();
        var noDuplicates = new Object();

        for (var i = 0; i < pSuggest.length; i++) {
            if (i >= 15) {
                break;
            }
            var firstChar = pSuggest[i].charCodeAt(0);
            if (firstChar != 13 && firstChar != 10 && pSuggest[i].length > 0) {
                var arr = pSuggest[i].split("###");
                if (arr[0] == null || arr[1] == null)
                    continue;

                // do not add duplicate item
                if (noDuplicates[arr[0]] == null) {
                    noDuplicates[arr[0]] = arr;
                    newSuggest.push(pSuggest[i]);
                }
            }
        }
        pSuggest = newSuggest;

        while (node = pAnchor.childNodes[0]) {
            node = pAnchor.removeChild(node);
            delete node;
        }

        var tmpCounter = 0;
        for (var j in pSuggest) {
            var tmp = pSuggest[j].split("###");
            var newNode = pTemplate.cloneNode(true);
            newNode.setAttribute("id", "suggestRow_" + tmpCounter);
            tmpCounter++;
            newNode.onmouseover = function() {
                // use global variable !!
                esemosSuggest.handleMouseOver(this);
            }
            newNode.onmouseout = function() {
                // use global variable !!
                esemosSuggest.handleMouseOut(this);
            }

            for (var i = 0; i < newNode.childNodes.length; i++) {
                var node = newNode.childNodes[i];
                if (!node.firstChild)
                    continue;

                if (node.firstChild.data == "Text")
                    node.firstChild.data = tmp[0];
                else if (node.firstChild.data == "Anzahl")
                    node.firstChild.data = tmp[1];
                else if (node.firstChild.data == "Typ")
                    node.firstChild.data = tmp[2];
            }

            pAnchor.appendChild(newNode);
            pAnchor.children[pAnchor.children.length-1].children[0].innerHTML = pAnchor.children[pAnchor.children.length-1].children[0].innerHTML.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
        }

        //TODO if enter => hide
        if (pSuggest.length >= 1)
            showLayer();
        else
            hideLayer();
    }

    this.handleMouseOver = function(elem) {
        highlightSuggest(elem);
        pCurrentSelection = elem.getAttribute("id").split('_')[1];
    }

    this.handleMouseOut = function(elem) {
        unmarkSuggest(elem);
        pCurrentSelection = -1;
    }

    function highlightSuggest(tblCell) {
        tblCell.className = "highlight";
    }

    function unmarkSuggest(tblCell) {
        tblCell.className = "";
    }

    function unmarkAll() {
        for (var i = 0; i < pAnchor.childNodes.length; i++)
            unmarkSuggest(pAnchor.childNodes[i]);
    }

    function getTableCell(pos) {
        return document.getElementById("suggestRow_" + pos);
    }
}

/*
    Developed by Robert Nyman, http://www.robertnyman.com
    MIT license
    http://code.google.com/p/getelementsbyclassname/
  */
var getElementsByClassName = function (className, tag, elm){
    if (document.getElementsByClassName) {
        getElementsByClassName = function (className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
            nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
            returnElements = [],
            current;
            for(var i=0, il=elements.length; i<il; i+=1){
                current = elements[i];
                if(!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    } else if (document.evaluate) {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
            classesToCheck = "",
            xhtmlNamespace = "http://www.w3.org/1999/xhtml",
            namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
            returnElements = [],
            elements,
            node;
            for(var j=0, jl=classes.length; j<jl; j+=1){
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try	{
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    } else {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
            classesToCheck = [],
            elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
            current,
            returnElements = [],
            match;
            for(var k=0, kl=classes.length; k<kl; k+=1){
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for(var l=0, ll=elements.length; l<ll; l+=1){
                current = elements[l];
                match = false;
                for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
};

