// Global variables for use by javascript methods the implement the necessary ajax functionality.
var inputName;
var listName;
var divName;
var focusName;
var setSelectedName;

// We set 'global' javascript variables for use by the various methods instead of handing the
// necessary values to each method independently because the updateLocations method
// doesn't really support method parameters of this sort.
function setAJAXVariableNames(_inputName, _listName, _divName, _focusName, _setSelectedName) {
    inputName = _inputName;
    listName = _listName;
    divName = _divName;
    focusName = _focusName;
    setSelectedName = _setSelectedName;
}

// Handle the input text area receiving focus.
function setFAJAX() {
    var focus = document.getElementById(focusName);
    var textArea = document.getElementById(inputName);
    if (textArea.value == "(Begin typing here)") {
        document.getElementById(inputName).style.fontStyle = "italic";
    } else {
        document.getElementById(inputName).style.fontStyle = "normal";
    }
    focus.value = 1;
}

// Handle the input text area losing focus.
function removeFAJAX() {
    var focus = document.getElementById(focusName);
    var textArea = document.getElementById(inputName);
    if (textArea.value == "(Begin typing here)") {
        document.getElementById(inputName).style.fontStyle = "italic";
    } else {
        document.getElementById(inputName).style.fontStyle = "normal";
    }
    focus.value = 0;
}

// Handle a key up event in the input text area.
function handleKeyUpAJAX(e, value, servletURL, opcode) {
    var e = (!e) ? window.event : e;
    var target = (!e.target) ? e.srcElement : e.target;
    if (target.nodeType == 3)
        target = target.parentNode;
    code = (e.charCode) ? e.charCode :
           ((e.keyCode) ? e.keyCode :
            ((e.which) ? e.which : 0));
    if (e.type == "keyup")
    {
        isKeyUpDownPressed = false;
        if ((code < 13 && code != 8) ||
            (code >= 14 && code < 32) ||
            (code >= 33 && code <= 46 && code != 38 && code != 40) ||
            (code >= 112 && code <= 123))
        {
            showLocation(value, servletURL, opcode);
            return true;
        }
        else
            if (code == 13)
            {
                var focus = document.getElementById(focusName);
                if (focus.value == 1) {

                    var cart = document.getElementById(listName);
                    var selectedIndex = cart.options.selectedIndex;
                    if (selectedIndex > -1) {
                        setValueAJAX();
                    }
                    return false;
                }
            }
            else {
                if (code == 40)
                {
                    var cart = document.getElementById(listName);
                    var selectedIndex = cart.options.selectedIndex;
                    if (selectedIndex != -1) {
                        if ((selectedIndex + 1) <= cart.options.length) {
                            cart.options.selectedIndex = selectedIndex + 1;
                        }
                    } else {
                        cart.options.selectedIndex = 0;
                    }
                    return true;
                }
                else
                    if (code == 38)
                    {
                        var cart = document.getElementById(listName);
                        var selectedIndex = cart.options.selectedIndex;
                        if (cart.options.length > 0) {
                            cart.options.selectedIndex = selectedIndex - 1;
                        }
                        return true;
                    }
                var textArea = document.getElementById(inputName);
                showLocation(value, servletURL, opcode);

                return true;
            }
    }
    else {
        showLocation(value, servletURL, opcode);
        return true;
    }
}

// Handle a key press event any where in the HTML form.
function handleKeyPressAJAX(e) {
    var focus = document.getElementById(focusName);
    if (focus.value == 1) {
var cart = document.getElementById(listName);
        var selectedIndex = cart.options.selectedIndex;

        if (selectedIndex > -1) {
            setValueAJAX();
        }
        return false;
    }

    var textArea = document.getElementById(inputName).value;
    if (textArea == "(Begin typing here)") {
        document.getElementById(inputName).value = "";
    }
    return true;
}

// Generate the appropriate XML request object in preperation for requesting AJAX data.
function newXMLHttpRequest() {
    var xmlreq = false;
    if (window.XMLHttpRequest) {
        xmlreq = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e1) {
            try {
                xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e2) {
            }
        }
    }

    return xmlreq;
}

// Request AJAX data from the appropriate servlet.
function showLocation(itemCode, servletURL, opcode) {
    var textArea = document.getElementById(inputName);
    if (textArea.value == "(Begin typing here)") {
        document.getElementById(inputName).style.fontStyle = "italic";
    } else {
        document.getElementById(inputName).style.fontStyle = "normal";
    }
    var setSelected = document.getElementById(setSelectedName);
    setSelected.value = 0;
    if (itemCode.length > 0) {
        textArea = document.getElementById(inputName);
        var locationsList = document.getElementById(listName);
        setSelected = document.getElementById(setSelectedName);
        var holdThisValue = null;

        if (locationsList.options.length == 1) {
            checkSelected();
        }

        if (locationsList.options.length > 1) {
            if (checkSelected()) {
                var holdcontents = document.getElementById(divName);
                holdcontents.selectedIndex = 0;
            }
        }

        if(holdThisValue == null){
            holdThisValue = "";
        }

        if (locationsList.options[0] == undefined || locationsList.options.length > 0 || holdThisValue.toUpperCase() != textArea.value.toUpperCase()) {
            var req = newXMLHttpRequest();
            req.onreadystatechange = handler(req, updateLocations);
            req.open("POST", servletURL, true);
            req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
            var result = "";
            for (var i = 0; i < itemCode.length; i++) {
                if (itemCode.charAt(i) == " ") result += "+";
                else result += itemCode.charAt(i);
            }
            result = escape(itemCode);
            result = result.replace(/\+/g, '%2B');
            result = result.replace(/\"/g, '%22');
            result = result.replace(/\'/g, '%27');

            req.send("op=" + opcode + "&f=" + result);
        }
        else {
            if (holdThisValue != textArea.value) {
                textArea.value = holdThisValue;
                setSelected.value = 1;
            }
        }
    }
    else {
        var holdcontents = document.getElementById(divName);
        holdcontents.selectedIndex = -1;
        holdcontents.style.visibility = 'hidden';
    }
}

// Handles the AJAX response from the server and calls the appropriate handler method.
function handler(req, responseXmlHandler) {
    return function () {
        if (req.readyState == 4) {
            if (req.status == 200) {
                responseXmlHandler(req.responseXML);
            } else {
                //alert("HTTP error: " + req.status);
            }
        }
    }
}

// The handler method to handle the AJAX data coming back from the server.
function updateLocations(locations) {
    var locationsVals = locations.getElementsByTagName("locations")[0];
    // If we didn't get anything back from the server, 
    // exit here or risk the wrath of IE's stellar javascript error detection.
    if (locationsVals == null) {
        return;
    }
    var selectedIndex = -10;
    var items = locationsVals.getElementsByTagName("item");
    var contents = document.getElementById(listName);
    var holdcontents = document.getElementById(divName);

    contents = document.getElementById(listName);
    selectedIndex = contents.selectedIndex;
    contents.innerHTML = "";
    if (items.length > 0) {
        holdcontents.style.visibility = 'visible';
    }
    for (var I = 0; I < items.length; I++) {
        var item = items[I];
        var name = item.getElementsByTagName("desc")[0].firstChild.nodeValue;

        var option = document.createElement("option");
        option.value = name;
        option.text = name;
        var d, dom, ie, ie4, ie5x, moz, mac, win, lin, old, ie5mac, ie5xwin, op;
        n = navigator;
        nua = n.userAgent;

        if (nua.indexOf('Safari') != -1) {
            contents.appendChild(option);
        } else {
            contents.options.add(option, I);
        }
    }

    contents.options.selectedIndex = -1;
    var setSelected = document.getElementById(setSelectedName);

    var textArea = document.getElementById(inputName);
    var locationsList = document.getElementById(listName);
    var holdThisValue = null;
    if (locationsList.options.length > 0) {
        checkSelected();
    }

}

// Handles the user's selection of an AJAX data value.
function setValueAJAX() {
    var textArea = document.getElementById(inputName);
    var cart = document.getElementById(listName);
    var holdThisValue = cart.options[cart.selectedIndex].value;
    textArea.value = holdThisValue;
    if (textArea.value == "(Begin typing here)") {
        document.getElementById(inputName).style.fontStyle = "italic";
    } else {
        document.getElementById(inputName).style.fontStyle = "normal";
    }
    var holdcontents = document.getElementById(divName);
    holdcontents.style.visibility = 'hidden';
    var setSelected = document.getElementById(setSelectedName);
    setSelected.value = 1;
}

// Handle a click event any where in the HTML document.
function hideAJAX(e) {
    var targ
    if (!e) var e = window.event
    if (e.target) targ = e.target
    else if (e.srcElement) targ = e.srcElement
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode
    var tname
    tname = targ.tagName
    tname = targ.id


    if (tname == listName) {
        setValueAJAX();
    }

    if (tname != listName) {
        var holdcontents = document.getElementById(divName);
        holdcontents.style.visibility = 'hidden';
        var setSelected = document.getElementById(setSelectedName);
        if (setSelected.value == 0) {
            if (tname == inputName) {
                var textArea = document.getElementById(inputName).value;
                if (textArea == "(Begin typing here)") {
                    document.getElementById(inputName).value = "";
                } else {
                    document.getElementById(inputName).value = "(Begin typing here)";
                    document.getElementById(inputName).style.fontStyle = "italic";
                }
            }
            else
            {
                document.getElementById(inputName).value = "(Begin typing here)";
                document.getElementById(inputName).style.fontStyle = "italic";
            }
        }
    }
}

// Determine if they have entered something that matches one of the locations in the drop down.
function checkSelected() {
    var textArea = document.getElementById("WHERE");
    var locationsList = document.getElementById("WHEREList");
    var setSelected = document.getElementById("setSelected");

    var textAreaMatch = textArea.value;
    // Trim leading spaces.
    while (textAreaMatch.substring(0, 1) == ' '){
        textAreaMatch = textAreaMatch.substring(1, textAreaMatch.length);
    }

    // Trim trailing spaces.
    while (textAreaMatch.substring(textAreaMatch.length-1, textAreaMatch.length) == ' ') {
        textAreaMatch = textAreaMatch.substring(0, textAreaMatch.length-1);
    }

    for (var i = 0 ; i < locationsList.options.length; i++) {
        if (textAreaMatch.toUpperCase() == locationsList.options[i].value.toUpperCase()) {
            textArea.value = locationsList.options[i].value;
            setSelected.value = 1;

            return true;
        }
    }

    return false;
}
