﻿var lastResult;
var selectedRow;
var sc;

function setSelectedRow(row) {
    selectedRow = row;

    if (sc != null) {
        for (var a = 0; a < sc.childNodes.length; a++) {
            if (a != selectedRow) {
                if (sc.childNodes[a].getAttribute("class") == "search-row-selected")
                    sc.childNodes[a].setAttribute("class", "search-row");
            }
            else
                sc.childNodes[a].setAttribute("class", "search-row-selected");
        }
    }
}

function setPageFlipWait(search) {

    var appendTo = null;

    if (sc != null) {
        if (sc.childNodes.length > 0) {
            for (var a = 0; a < sc.childNodes.length; a++) {
                if (sc.childNodes[a].getAttribute("class") == "search-row" ||
                    sc.childNodes[a].getAttribute("class") == "search-row-selected") {

                    if (appendTo == null)
                        appendTo = sc.childNodes[a];

                    if (sc.childNodes[a].hasChildNodes()) {
                        var node = sc.childNodes[a];

                        while (node.childNodes.length >= 1) {
                            node.removeChild(node.firstChild);
                        }
                    }
                }
            }
        }

        if (appendTo == null) {
            appendTo = document.createElement("div");
            appendTo.setAttribute("class", "search-row");
        }

        loaderImg = new Image();
        loaderImg.src = "/images/ajax-loader3.gif";
        appendTo.appendChild(loaderImg);
    }
}

function deleteRow(miruleid, retvalId) {
    var retobj = document.getElementById(retvalId);

    var miruleArray = retobj.value.split(",");
    var newValue = "";

    if (miruleid != null) {
        for (var i = 0; i < miruleArray.length; i++) {
            if (miruleArray[i] != miruleid) {
                if (newValue == "")
                    newValue = miruleArray[i];
                else
                    newValue += "," + miruleArray[i];
            }
        }
    }
    else {
        for (var i = 0; i < miruleArray.length - 1; i++) {
            if (newValue == "")
                newValue = miruleArray[i];
            else
                newValue += "," + miruleArray[i];
        }
    }


    retobj.value = newValue;
}

function addSelectedRow(miruleid, name, inputcontainerId, autocompleteId, retvalId, autosubmitId) {
    //alert('addSelectedRow miruleid = ' + miruleid + ' retvalId = ' + retvalId);
    var retobj = document.getElementById(retvalId);

    if (retobj.value != null && retobj.value.length > 0)
        retobj.value += "," + miruleid;
    else
        retobj.value = miruleid;

    var panel = document.createElement("div");

    // we're adding one hidden attribute with miruleid for deletion...
    var hiddenid = document.createElement("input");
    hiddenid.setAttribute("type", "hidden");
    hiddenid.setAttribute("value", miruleid);

    panel.appendChild(hiddenid);
    if (name.length > 20)
        name[20] = 0;

    panel.innerHTML = name;
    panel.setAttribute("class", "search-token");
    panel.setAttribute("onclick", "deleteRow('"+miruleid+"', '"+retvalId+"'); this.parentNode.removeChild(this)");

    var ic = document.getElementById(inputcontainerId);

    for (var a = 0; a < ic.childNodes.length; a++) {
        var cl = ic.childNodes[a];

        if (cl != null && cl.id == autocompleteId) {
            document.getElementById(inputcontainerId).insertBefore(panel,
                            cl);
            
            break;
        }
    }

    // clear current droplist
    if (sc != null) {
        if (sc.hasChildNodes()) {
            while (sc.childNodes.length >= 1) {
                sc.removeChild(sc.firstChild);
            }
        }
        selectedRow = null;
    }

    // finish by setting focus
    document.getElementById(autocompleteId).focus();

    // not quite, autosubmit?
    //alert('autosubmitId = ' + autosubmitId + " event: ???");
    if (autosubmitId.length > 0)
        __doPostBack(autosubmitId, '');
}

function submitKey(element, search, inputcontainerId, retvalId, autosubmitId, autoSubmit, keyCode, isNavigate) {
    if (keyCode == 13) {
        if (selectedRow != null) {
            if (isNavigate == true) {
                var uri = sc.childNodes[selectedRow].childNodes[2].getAttribute("value");
                window.location.href = uri;
            }
            else {
                var miruleid = sc.childNodes[selectedRow].childNodes[0].getAttribute("value");
                var mirulename = sc.childNodes[selectedRow].childNodes[1].getAttribute("value");
                // alert('miruleid = ' + miruleid);
                /* clear the input */
                document.getElementById(element).value = "";
                if (autoSubmit)
                    addSelectedRow(miruleid, mirulename, inputcontainerId, element, retvalId, autosubmitId);
                else
                    addSelectedRow(miruleid, mirulename, inputcontainerId, element, retvalId, '');
            }
        }
        else {
            if (document.getElementById(element).value == "") {
                if (autosubmitId.length > 0)
                    __doPostBack(autosubmitId, '');
            }
        }
        return false;
    }
    else
        return true;
}

var inQuery = 0;
var latestQuery;
var itemsOnPage = 8;
var pageNumber = 0;

function autoComplete(viewerId, type, element, search, inputcontainerId, retvalId, autosubmitId, types, keyCode, recursion) {
    var tb = document.getElementById(element);

    // if recursion > 1 we're in page flip, otherwise reset page num
    if (recursion == 0) {
        pageNumber = 0;
    }

    var d = new Date();
    latestQuery = d;
    
    if (keyCode == 8) {
        // delete latest if our text input is empty
        if (tb.value.length == 0) {
            var ic = document.getElementById(inputcontainerId);

            for (var a = 0; a < ic.childNodes.length; a++) {
                var cl = ic.childNodes[a];

                if (cl != null && cl.id == element) {
                    // if we havea child node before this, delete it
                    if (a > 0) {
                        deleteRow(null, retvalId);
                        ic.removeChild(ic.childNodes[a - 1]);
                    }
                    break;
                }
            }

            // empty selections as well
            sc = document.getElementById(search);
            if (sc.hasChildNodes()) {
                while (sc.childNodes.length >= 1) {
                    sc.removeChild(sc.firstChild);
                }
            }
            sc.style.display = 'none';
            
            return;
        }
    }

    if (keyCode == 13) {
        return false;
    }
    else if (keyCode == 40 || keyCode == 38) {
        /* arrows down/up */
        sc = document.getElementById(search);
        var selections = sc.childNodes.length-1;

        if (selections > 0) {
            if (selectedRow == null)
                selectedRow = 0;
            else {
                if (keyCode == 40)
                    selectedRow = selectedRow + 1;
                else
                    selectedRow = selectedRow - 1;
            }

            if (selectedRow < 0)
                selectedRow = 0;

            if (selectedRow >= selections)
                selectedRow = selections - 1;

            setSelectedRow(selectedRow);
        }

    }
    else {
        inQuery = 1;

        // make loading box if we don't have nutin
        sc = document.getElementById(search);
        var lpanel;

        if (sc.hasChildNodes() == false) {
            lpanel = document.createElement("div");
            lpanel.setAttribute("class", "search-row");

            loaderImg = new Image();
            loaderImg.src = "/images/ajax-loader3.gif";
            lpanel.appendChild(loaderImg);
            
            sc.appendChild(lpanel);           
            sc.setAttribute("style", "display: block");
        }

        $.ajax({
            type: "POST",
            url: "/webservices/Search.asmx/SearchEntities",
            data: "{'viewerId':'" + viewerId + "', 'text':'" + tb.value + "', 'types':'" + types + "', 'itemsOnPage':'" + itemsOnPage + "', 'pageNumber':'" + pageNumber + "' }",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                // did we do a query in between?
                if (latestQuery != d)
                    return;

                if (lastResult != msg.d) {
                    lastResult = msg.d;

                    sc = document.getElementById(search);
                    if (sc.hasChildNodes()) {
                        while (sc.childNodes.length >= 1) {
                            sc.removeChild(sc.firstChild);
                        }
                    }

                    var a = 0;

                    for (var i in msg.d.Results) {
                        var panel = document.createElement("div");
                        panel.setAttribute("class", "search-row");
                        panel.setAttribute("onmouseover", "setSelectedRow(" + a + ");");

                        if (type == "search")
                            panel.setAttribute("onclick", "window.location.href = '" + msg.d.Results[i].Url + "'");
                        else
                            panel.setAttribute("onclick", "addSelectedRow(" + msg.d.Results[i].MiruleId + ", '" + msg.d.Results[i].EntityName + "', '" + inputcontainerId + "', '" + element + "', '" + retvalId + "', '" + autosubmitId + "'); document.getElementById('" + element + "').value=''; ");

                        var hideMiruleId = document.createElement("input");
                        hideMiruleId.setAttribute("type", "hidden");
                        hideMiruleId.setAttribute("value", msg.d.Results[i].MiruleId);
                        panel.appendChild(hideMiruleId);

                        var hideEntityName = document.createElement("input");
                        hideEntityName.setAttribute("type", "hidden");
                        hideEntityName.setAttribute("value", msg.d.Results[i].EntityName);
                        panel.appendChild(hideEntityName);

                        var hideEntityURI = document.createElement("input");
                        hideEntityURI.setAttribute("type", "hidden");
                        hideEntityURI.setAttribute("value", msg.d.Results[i].Url);
                        panel.appendChild(hideEntityURI);

                        a++;
                        sc.appendChild(panel);

                        // add picture
                        var picPanel = document.createElement("div");
                        picPanel.setAttribute("class", "search-drop-pic");
                        panel.appendChild(picPanel);

                        var pic = document.createElement("img");
                        pic.setAttribute("src", "/imageminifbsquare/" + msg.d.Results[i].MiruleId + ".jpg");
                        pic.setAttribute("style", "width: 24px; height: 24px");
                        picPanel.appendChild(pic);

                        var textPanel = document.createElement("div");
                        textPanel.setAttribute("class", "search-drop-text");
                        panel.appendChild(textPanel);

                        var lnk = document.createElement("a");

                        if (type == search)
                            lnk.setAttribute("href", msg.d.Results[i].Url);
                        lnk.appendChild(document.createTextNode(msg.d.Results[i].EntityName));

                        textPanel.appendChild(lnk);

                        if (msg.d.Results[i].Info != null) {
                            var infospan = document.createElement("span");
                            infospan.setAttribute("class", "mi-selector-info");
                            infospan.appendChild(document.createTextNode(" " + msg.d.Results[i].Info));
                            textPanel.appendChild(infospan);
                        }

                        //textPanel.innerHTML = msg.d.Results[i].EntityName;

                        // add desc
                        if (msg.d.Results[i].Excerpt != null && msg.d.Results[i].Excerpt.length > 0) {
                            textPanel.innerHTML += "<span class=\"mi-selector-info\"> " + msg.d.Results[i].Excerpt + "</span>";
                        }

                        //alert("miruleid = " + msg.d[i].MiruleId);

                        var breakPanel = document.createElement("div");
                        breakPanel.setAttribute("style", "clear: both");
                        panel.appendChild(breakPanel);
                    }

                    /* more pages? */
                    if (msg.d.More == true || pageNumber > 0) {
                        var mpanel = document.createElement("div");
                        mpanel.setAttribute("class", "search-row-nav");
                        sc.appendChild(mpanel);

                        // prev page
                        var left = document.createElement("a");
                        left.appendChild(document.createTextNode("<<"));

                        if (pageNumber > 0) {
                            left.onclick = function () {
                                setPageFlipWait(search);
                                pageNumber--;
                                autoComplete(viewerId, type, element, search, inputcontainerId, retvalId, autosubmitId, types, keyCode, recursion + 1);
                                return false;
                            };
                            left.setAttribute("class", "LinkButton2");
                        }
                        else {
                            left.setAttribute("class", "disabled-button");
                            left.onclick = function () { return false; };
                        }

                        var right = document.createElement("a");
                        right.appendChild(document.createTextNode(">>"));

                        if (msg.d.More == true) {
                            right.onclick = function () {
                                setPageFlipWait(search);
                                pageNumber++;
                                autoComplete(viewerId, type, element, search, inputcontainerId, retvalId, autosubmitId, types, keyCode, recursion + 1);
                                return false;
                            };
                            right.setAttribute("class", "LinkButton2");
                        }
                        else {
                            right.setAttribute("class", "disabled-button");
                            right.onclick = function () { return false; };
                        }
                        mpanel.appendChild(left);
                        mpanel.appendChild(right);
                    }

                    // jump to main search link
                    var jpanel = document.createElement("div");
                    jpanel.setAttribute("class", "search-row-nav");
                    sc.appendChild(jpanel);

                    var lnk = document.createElement("a");
                    lnk.setAttribute("href", "/h/Haku?p1=" + encodeURIComponent(tb.value));
                    lnk.appendChild(document.createTextNode("Hakusivulle"));
                    jpanel.appendChild(lnk);
                   
                    /* make visible if we have children */
                    if (sc.hasChildNodes())
                        sc.setAttribute("style", "display: block");
                    else
                        sc.setAttribute("style", "display: none");

                    inQuery = 0;
                }
            }
        });

        
    }

    return true;
}

