﻿var currentResponse = "";
var browser = (navigator.appName=="Netscape" ? "FF": "IE");

var AF = {
    Go: function(e) {
        var keyCode;

        if (browser == "IE") // IE
        {
            keyCode = window.event.keyCode
        }
        else // Netscape/Firefox/Opera
        {
            keyCode = e.which
        }
        if (keyCode == 13 || keyCode == 33 || keyCode == 34) {
            keyCode = 0;
            return false;
        }
        AF.Container.innerHTML = '';

        if (keyCode == 40 || keyCode == 38) {
            if (keyCode == 40)
                AF.Element.setAttribute("currentposition", parseInt(AF.Element.getAttribute("currentposition")) + 1);
            if (keyCode == 38)
                AF.Element.setAttribute("currentposition", parseInt(AF.Element.getAttribute("currentposition")) - 1);
            AF.Render(currentResponse);
        }
        else {
            AF.Element.setAttribute("currentposition", 0)
            if (AF.Element.getAttribute("prevValue") == AF.Element.value) return;
            AF.Element.setAttribute("prevValue", AF.Element.value);
            if (AF.Timer != null) window.clearTimeout(AF.Timer);
            AF.Timer = window.setTimeout(AF.Retrieve, 100);
        }

    },
    Focus: function(el) {
        AF.Element = el;
        var coords = Util.Position.Coords(el);
        if (!document.getElementById(el.id + '_Container')) {
            //'<div id="' + el.id + '_Container' + '" class="af" unselectable="on" onclick="window.event.cancelBubble = true">'
            var dv = document.createElement("div");
            dv.setAttribute("id", el.id + "_Container");
            dv.setAttribute("class", "af");
            dv.setAttribute("className", "af");
            dv.setAttribute("unselectable", "on");
            //dv.setAttribute("onclick", "window.event.cancelBubble = true");
            document.body.appendChild(dv);
            var columnWidths = AF.Element.getAttribute("columnWidths").split('|');
            var width = 0;
            for (var i = 0; i < columnWidths.length; i++) width += Number(columnWidths[i]) + 10;
            document.getElementById(el.id + '_Container').style.width = width + "px";

        }
        var container = document.getElementById(el.id + '_Container');
        AF.Container = document.getElementById(el.id + '_Container');
        AF.Container.style.left = coords.x + (el.offsetX ? Number(el.offsetX) : 0) + "px";
        AF.Container.style.top = coords.y + el.offsetHeight + (el.offsetY ? Number(el.offsetY) : 0) + "px";

        AF.Container.style.display = el.value != '' ? 'block' : 'none';
        el.select();
        if (!el.getAttribute("initialized")) {
            //if (browser == "IE")
            if (el.addEventListener)
                el.addEventListener("keyup", function(event) { AF.Go(event); }, false)
            else
                el.onkeyup = function() { AF.Go(this); }
            //el.onkeypress = function() { AF.Go(this); }
            el.onblur = function() { AF.Blur(this); }
            el.setAttribute("initialized", true);
        }
    },
    Blur: function(e) {
        AF.Container.style.display = 'none';
        var t = window.event;

        var keynum = 0;
        if (!(typeof (t) == "undefined")) // IE
        {
            keynum = window.event.keyCode
        }
        else if (!(typeof (e.which) == "undefined")) // Netscape/Firefox/Opera
        {
            keynum = e.which
        }
        var keyCode = keynum; //window.event.keyCode;
        if (keyCode == 0) AF.SelectItem(e);
    },
    Retrieve: function() {
        AF.Container.scrollTop = 0;
        AF.Element.afValue = '';
        Util.ServerCall('Product', AF.Element.value, true, 'AF.Render');
    },
    Render: function(response) {
        response = unescape(response).replace(/\~\~/gi, "\\'");
        if (response.length > 0) {
            var items = eval(response);
            if (!AF.Element.getAttribute("ContainerHtml")) {
                var arrColumnHtml = ('<td style="width: {0}px; color: black" unselectable="on">' + AF.Element.getAttribute("columnTitles").replace(/\|/gi, '</td><td unselectable="on" style="width: {0}px; border-left: solid 1px #C1CADE; color:black">') + '</td>').split('{0}');
                var arrColumnWidths = AF.Element.getAttribute("columnWidths").split('|');
                for (var i = 0; i < arrColumnWidths.length; i++) {
                    arrColumnHtml[i] = arrColumnHtml[i] + arrColumnWidths[i];
                }
                AF.Element.setAttribute("ContainerHtml", '<table cellspacing="0" cellpadding="0" border="0"><thead><tr>' + arrColumnHtml.join('') + '</tr></thead><tbody>{0}</tbody></table>');
            }

            var rowHtml = '';
            if (parseInt(AF.Element.getAttribute("currentposition")) == -1) AF.Element.setAttribute("currentposition", 0)
            if (parseInt(AF.Element.getAttribute("currentposition")) > items.length - 1) AF.Element.setAttribute("currentposition", items.length - 1)
            for (var i = 0; i < items.length; i++) {
                if (i == parseInt(AF.Element.getAttribute("currentposition"))) {
                    AF.Element.setAttribute("currentdescription", items[i][2]);
                    AF.Element.setAttribute("currentsku", items[i][1]);
                    AF.Element.setAttribute("currentkey", items[i][0]);
                    AF.Element.setAttribute("currentprice", items[i][3]);
                    AF.Element.setAttribute("currentpriceFormatted", items[i][4]);
                    AF.Element.setAttribute("currentcatalogid", items[i][5]);
                    AF.Element.setAttribute("currentfeatureid", items[i][6]);
                    rowHtml += '<tr onmousedown="AF.ItemClick(this)" key="' + items[i][0] + '" pos="' + i + '"  style="background-color:#84A6DB"><td unselectable="on" style="height:15px">' + items[i].splice(1, items[i].length).join('</td><td unselectable="on">') + '</td></tr>';
                }
                else
                    rowHtml += '<tr onmousedown="AF.ItemClick(this)" key="' + items[i][0] + '" pos="' + i + '" ><td unselectable="on">' + items[i].splice(1, items[i].length).join('</td><td unselectable="on">') + '</td></tr>';
            }
            if (items.length == 0)
                AF.Container.innerHTML = '<div style="padding: 5px">No matches found for "' + AF.Element.value + '"</div>';
            else {
                var cont = AF.Element.getAttribute("ContainerHtml");
                cont = cont.replace("{0}", rowHtml)
                AF.Container.innerHTML = cont;
            }

            AF.Container.style.display = 'block';
            currentResponse = response;

            var scrolltopthis = 0;
            if (AF.Element.getAttribute("currentposition") > -1) {
                var rowPositionTop = $(AF.Container).find("TR:eq(" + AF.Element.getAttribute("currentposition") + ")").get(0).offsetTop;
                AF.Container.scrollTop = rowPositionTop - (AF.Container.offsetHeight / 2); //scrolltopthis;
            }
        }
    },
    ItemClick: function(el) {
        AF.Element.setAttribute("prevValue", '');
        AF.Element.setAttribute("currentposition", el.getAttribute("pos"));
        AF.Render(currentResponse);
        AF.Element.value = AF.Element.getAttribute("currentsku");
        AF.Element.setAttribute("afValue", el.getAttribute("key"));
        AF.Element.blur(el);

    },
    SelectItem: function(el) {
        if (!(typeof (AF.Element.getAttribute("currentcatalogid")) == "undefined")) {
            document.getElementById(jsProduct).value = (AF.Element.getAttribute("currentcatalogid") != null ? AF.Element.getAttribute("currentcatalogid") : "");
            document.getElementById(jstxtItemDescription).value = (AF.Element.getAttribute("currentcatalogid") != null ? AF.Element.getAttribute("currentdescription") : "");
            document.getElementById(jstxtUnitPrice).value = (AF.Element.getAttribute("currentcatalogid") != null ? AF.Element.getAttribute("currentpriceFormatted") : "");
            document.getElementById(jstxtTotal).value = (AF.Element.getAttribute("currentcatalogid") != null ? AF.Element.getAttribute("currentpriceFormatted") : "");
            document.getElementById(jsSelectedFeature).value = (AF.Element.getAttribute("currentcatalogid") != null ? AF.Element.getAttribute("currentfeatureid") : "");
            RecalcPrice();
            document.getElementById(jstxtQty).focus();
            document.getElementById(jstxtQty).select();
            if (AF.Timer != null) window.clearTimeout(AF.Timer);
        }

        AF.Element.prevValue = '';
        AF.Element.setAttribute("afValue", parseInt(AF.Element.getAttribute("currentposition")));
        if (AF.Element.getAttribute("currentkey") != "") AF.Element.value = AF.Element.getAttribute("currentsku");
        AF.Container.style.display = 'none';

        //AF.Element.blur();

        //if (AF.Element.onItemClick) eval(AF.Element.onItemClick);
    },

    Timer: null,
    Element: null,
    ItemOn: null

};


function pausecomp(millis) {
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while (curDate - date < millis);
}

function MoveToButton(which) {
    which.value = which.value;
    document.getElementById(jsbtn_AddItem).focus();
}

function CheckEverything() 
{
    var qty = document.getElementById(jstxtQty).value;
    if (isNaN(qty) || isNaN(unitPrice)) return false;
    return true;
}

function RecalcPrice() 
{
    var qty = document.getElementById(jstxtQty).value;
    if (isNaN(qty)) {
        alert("Please enter a number for the quantity");
        document.getElementById(jstxtQty).focus();
        return false;
    }
    var unitPrice = AF.Element.getAttribute("currentprice");
    if (isNaN(qty) || isNaN(unitPrice) || unitPrice == null) return;
    if (qty.length > -1 && unitPrice.length > -1)
        document.getElementById(jstxtTotal).value = "$" + CurrencyFormatted(parseFloat(qty) * parseFloat(unitPrice));
//    if (window.event && window.event.keyCode == 0) {
//        document.getElementById(jsbtn_AddItem).focus();
//    } 
}
function CurrencyFormatted(amount) {
    var i = parseFloat(amount);
    if (isNaN(i)) { i = 0.00; }
    var minus = '';
    if (i < 0) { minus = '-'; }
    i = Math.abs(i);
    i = parseInt((i + .005) * 100);
    i = i / 100;
    s = new String(i);
    if (s.indexOf('.') < 0) { s += '.00'; }
    if (s.indexOf('.') == (s.length - 2)) { s += '0'; }
    s = minus + s;
    return s;
}

var Util = {
    ServerCallWithCapture: function(action, value) {
        var response = Util.ServerCall(action, value, false);
        if (response != '') { alert('The following error occurred while saving:\n\n' + response); return true; }
        return false;
    },
    ServerCall: function(action, value, async, target) {
        if (typeof (value) == 'object') {
            var lst = ''; for (var nvp in value) { if (typeof (value[nvp]) === 'string' || typeof (value[nvp]) === 'number') lst += '&' + nvp + '=' + escape(value[nvp]); } value = lst;
        }

        var http;
        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            http = new XMLHttpRequest();
        }
        if (window.ActiveXObject) {
            // code for IE6, IE5
            http = new ActiveXObject("Microsoft.XMLHTTP");
        }

        //var http = new ActiveXObject('MSXML2.XMLHTTP');
        http.open('POST', window.location.href, async ? true : false);
        http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        http.send('ClientAction=' + action + '&ClientValue=' + value);
        if (async) { http.onreadystatechange = function() { if (http.readyState == 4 && http.status == 200) eval(target + "('" + escape(http.responseText) + "')"); }; }
        if (!async) return http.responseText;
    },
    Position: {
        X: function(el) { return el.offsetLeft + (el.offsetParent ? Util.Position.X(el.offsetParent) : el.x ? el.x : 0); },
        Y: function(el) { return (el.offsetParent ? el.offsetTop + Util.Position.Y(el.offsetParent) : el.y ? el.y : 0); },
        Coords: function(el) { return { x: Util.Position.X(el), y: Util.Position.Y(el) }; }
    }
};
