﻿
//Global variables
var ASB_SelectedMenuItem = 0;
var ASB_TextBoxID;
var ASB_IS_CLICK_IN = false;
var ASB_ResultDivMenuID;
var ASB_SelectedValueControlID;
var ASB_isClickedAnyButton = false;
var ASB_GetDataFromServerMethod = null;

function asbInitialize(AutoSuggestBox_Properties) {
    ASB_TextBoxID = AutoSuggestBox_Properties.ASB_TextBoxID;
    ASB_ResultDivMenuID = AutoSuggestBox_Properties.ASB_ResultDivMenuID;
    ASB_SelectedValueControlID = AutoSuggestBox_Properties.ASB_SelectedValueControlID;
    ASB_SelectedMenuItem = AutoSuggestBox_Properties.ASB_SelectedMenuItem;
    ASB_IS_CLICK_IN = AutoSuggestBox_Properties.ASB_IS_CLICK_IN;
    ASB_GetDataFromServerMethod = AutoSuggestBox_Properties.ASB_GetDataFromServerMethod;
}

// Over here we make a call back to our server side page and return the results from our query 
// to a DIV tag sitting under the text box
function asbAjaxSuccess(result) {
    if (result != "") {
        if (asbCreateElementFromResultText(result) > 0)
            asbShowDiv(ASB_ResultDivMenuID);
    }
    else if (result != "") {
        if (asbCreateElementFromResultXML(result) > 0)
            asbShowDiv(ASB_ResultDivMenuID);
    }
}

function asbAjaxFailure(result) {
    alert("مشکلی در سرویس پیش آمده است");
}

function context() {
    alert("Context");
}
function loadXMLDoc(xmlPath) {
    try //Internet Explorer
    {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    }
    catch (e) {
        try //Firefox, Mozilla, Opera, etc.
        {
            xmlDoc = document.implementation.createDocument("", "", null);
        }
        catch (e) { alert(e.message) }
    }
    try {
        xmlDoc.async = false;
        xmlDoc.loadXML(xmlPath);
        return (xmlDoc);
    }
    catch (e) { alert(e.message) }
    return (null);
}

function loadXMLString(text) {
    try //Internet Explorer
      {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(text);
    }
    catch (e) {
        try //Firefox, Mozilla, Opera, etc.
         {
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(text, "text/xml");
        }
        catch (e) { alert(e.message) }
    }
    return xmlDoc
}

function asbCreateElementFromXMLElement(xmlDoc) {
    var resultDiv = document.getElementById(ASB_ResultDivMenuID);    
    resultDiv.style.height = "auto";
    resultDiv.style.width = "auto";
    resultDiv.style.overflowY = "hidden";

    //remove all childs
    resultDiv.innerHTML = "";
    var textBoxID = ASB_TextBoxID;
    var items = xmlDoc.getElementsByTagName("i");
    var browserCondition = asbIsIE7OrLater();
    for (var i = 0; i < items.length; i++) {
        var itemTitle = items[i].getElementsByTagName('t')[0].firstChild.data;
        var itemValue = items[i].getElementsByTagName('v')[0].firstChild.data;

        var itemIndex = i + 1;
        var CtrlID = textBoxID + "_mi_" + itemIndex;

        if (browserCondition) {
            //IE6,IE7,later
            var itemElementHTML = "<div id='" + CtrlID + "' class='asbMenuItem' name='" + CtrlID + "' onclick='asbOnMouseClick(\"" + itemIndex + "\")' ";
            itemElementHTML += "onmouseover='asbOnMouseOver(\"" + itemIndex + "\")'>";
            itemElementHTML += itemTitle + "</div>";

            var itemValueElementHTML = "<input id='" + CtrlID + "_value' type='hidden' value='" + itemValue + "'/>";
            resultDiv.innerHTML += itemElementHTML;
            resultDiv.innerHTML += itemValueElementHTML;
        }
        else {
            //IE8,FireFox,Opera,...
            var itemTitleElement = document.createTextNode(itemTitle);
            var itemElement = document.createElement("div");
            itemElement.setAttribute("class", "asbMenuItem")
            itemElement.setAttribute("id", CtrlID);
            itemElement.setAttribute("name", CtrlID);
            itemElement.setAttribute("onclick", "asbOnMouseClick(" + itemIndex + ")");
            itemElement.setAttribute("onmouseover", "asbOnMouseOver(" + itemIndex + ")");

            itemElement.appendChild(itemTitleElement);

            var itemValueElement = document.createElement("input");
            itemValueElement.setAttribute("id", CtrlID + "_value");
            itemValueElement.setAttribute("type", "hidden");
            itemValueElement.setAttribute("value", itemValue);

            resultDiv.appendChild(itemElement);
            resultDiv.appendChild(itemValueElement);
        }
    }

    var width = resultDiv.clientWidth;
    if (resultDiv.clientHeight >= 200) {
        width += 30;
        resultDiv.style.height = "200px";
        resultDiv.style.overflowY = "scroll";
    }
    //debugger;
    var TextBox = document.getElementById(textBoxID);
    if (width < TextBox.clientWidth)
        width = TextBox.clientWidth;

    resultDiv.style.width = width + "px";

    return items.length;
}

function asbCreateElementFromResultText(resultText) {
    var xmlDoc = loadXMLString(resultText);
    return asbCreateElementFromXMLElement(xmlDoc);
}

function asbCreateElementFromResultXML(resultXML) {
    var xmlDoc = loadXMLDoc(resultXML);
    return asbCreateElementFromXMLElement(xmlDoc);
}
function asbSetSelectedValue(sValue) {
    var SelectedValue = document.getElementById(ASB_TextBoxID + "_SelectedValue");
    SelectedValue.value = sValue;
}
function asbSetTextBoxValue() {
    var divMenuItem;
    divMenuItem = asbGetSelMenuItemDiv();
    if (divMenuItem) {
        var sMenuItemValueID;
        sMenuItemValueID = GetDivMenuItemID(ASB_SelectedMenuItem) + "_value";
        var hdnMenuItemValue = document.getElementById(sMenuItemValueID);

        if (hdnMenuItemValue) {
            //Set selected value of control to the value of selected menu item
            asbSetSelectedValue(hdnMenuItemValue.value);
        }

        var txtCtrl;
        txtCtrl = document.getElementById(ASB_TextBoxID);
        txtCtrl.value = divMenuItem.innerHTML;
        asbSetNameValueVariables();
    }
}

function asbGetTextBoxValue() {
    var txtCtrl;
    txtCtrl = document.getElementById(ASB_TextBoxID);
    return (txtCtrl.value);
}

function asbOnMouseClick(nMenuIndex) {
    ASB_IS_CLICK_IN = true
    ASB_SelectedMenuItem = nMenuIndex;

    asbSetTextBoxValue();
    asbHideSlow(ASB_ResultDivMenuID);
}

function asbOnBlur() {
    if (ASB_IS_CLICK_IN == false)
        asbHideSlow(ASB_ResultDivMenuID);
}

function asbOnMouseOver(nMenuIndex) {
    var divMenuItem;
    divMenuItem = asbGetMenuItemDiv(nMenuIndex)

    if (divMenuItem) {
        if (nMenuIndex != ASB_SelectedMenuItem) {
            asbUnhighlightSelMenuItem();

            ASB_SelectedMenuItem = nMenuIndex;
            //asbSetTextBoxValue();

            divMenuItem.className = "asbSelMenuItem"
        }
    }
}

function asbOnKeyPress(event) {
    if (asbGetKey(event) == 13)
        return false;
}

function asbOnKeyUp(evt) {
    var nKey;
    nKey = asbGetKey(evt);

    //Skip up/down/enter
    if ((nKey != 38) && (nKey != 40) && (nKey != 13)) {
        var sNewValue;
        sNewValue = asbGetTextBoxValue();
        window.setTimeout("ASB_isClickedAnyButton = false;", 1000);
        if (ASB_isClickedAnyButton == false) window.setTimeout("asbCallback()", 1000);
        ASB_isClickedAnyButton = true;
    }
}

function asbOnKeyDown(evt) {
    var nKey;
    nKey = asbGetKey(evt);

    //Detect if the user is using the down button
    if (nKey == 38) //Up arrow
    {
        asbMoveDown()
    }
    else if (nKey == 40) //Down arrow
    {
        asbMoveUp()
    }
    else if (nKey == 13) //Enter
    {
        //Only works in IE
        // evt.cancelBubble = true;

        // if (evt.returnValue) evt.returnValue = false;
        // if (evt.stopPropagation) evt.stopPropagation();
        if (asbGetTextBoxValue() != "") {
            asbHideSlow(ASB_ResultDivMenuID);
            return true;
        }
    }
    return false
}

function asbCallback() {
    var sNewValue = asbGetTextBoxValue();
    if ((sNewValue.length <= 5) && (sNewValue.length > 0) && ASB_isClickedAnyButton == false)
        ASB_GetDataFromServerMethod(sNewValue);
}

function asbGetSelMenuItemDiv() {
    return asbGetMenuItemDiv(ASB_SelectedMenuItem);
}
function GetDivMenuItemID(nMenuItem) {
    return (ASB_TextBoxID + "_mi_" + nMenuItem);
}
function asbGetMenuItemDiv(nMenuItem) {
    var sDivMenuItemID;
    sDivMenuItemID = GetDivMenuItemID(nMenuItem);

    return document.getElementById(sDivMenuItemID)
}
function asbMoveUp() {
    var nMenuItem;
    nMenuItem = ASB_SelectedMenuItem + 1;

    //Check if menu item exists
    if (asbGetMenuItemDiv(nMenuItem)) {
        asbSelectMenuItem(nMenuItem)
    }
}
function asbMoveDown() {
    var nMenuItem;
    nMenuItem = ASB_SelectedMenuItem - 1;

    if (nMenuItem != 0) {
        asbSelectMenuItem(nMenuItem)
    }
}
//Highlights a div
function asbSelectMenuItem(nMenuItem) {
    var divMenuItem;
    divMenuItem = asbGetMenuItemDiv(nMenuItem)

    if (divMenuItem) {
        if (nMenuItem != ASB_SelectedMenuItem) {
            asbUnhighlightSelMenuItem();

            ASB_SelectedMenuItem = nMenuItem;
            asbSetTextBoxValue();

            divMenuItem.className = "asbSelMenuItem"
        }
    }
}
//unhighlights a div
function asbUnhighlightSelMenuItem() {
    var divMenuItem;
    divMenuItem = asbGetSelMenuItemDiv()

    if (divMenuItem) {
        divMenuItem.className = "asbMenuItem"
    }
}
//Detects what key was pressed
function asbGetKey(evt) {
    evt = (evt) ? evt : (window.event) ? event : null;
    if (evt) {
        var cCode = (evt.charCode) ? evt.charCode :
				((evt.keyCode) ? evt.keyCode :
				((evt.which) ? evt.which : 0));
        return cCode;
    }
}

function asbShowDiv() {
    var divMenu = document.getElementById(ASB_ResultDivMenuID);
    var ASBTextBox = document.getElementById(ASB_TextBoxID);
    
    var time = 500;
    if (asbIsIE())
        time = 100;
    var offsetX = 0;
    if (divMenu.clientWidth > ASBTextBox.clientWidth)
        offsetX = ASBTextBox.clientWidth - divMenu.clientWidth;

    //asbChangeOpac(ASB_ResultDivMenuID, 0);
    asbShowSlow(ASB_ResultDivMenuID, ASBTextBox, time, offsetX, 0);
}

function asbOpacity(objID, opacStart, opacEnd, millisec) {
    var speed = Math.round(millisec / 100);
    var timer = 0;
    if (opacStart > opacEnd) {
        for (i = opacStart; i >= opacEnd; i--) {
            setTimeout("asbChangeOpac('" + objID + "','" + i + "')", (timer * speed));
            timer++;
        }
        setTimeout("asbTurnOffVisibility('" + objID + "')", (timer * speed));
    } else if (opacStart < opacEnd) {
        asbTurnOnVisibility(objID);
        for (i = opacStart; i <= opacEnd; i++) {
            setTimeout("asbChangeOpac('" + objID + "','" + i + "')", (timer * speed));
            timer++;
        }
    }
}

function asbTurnOffVisibility(objID) {
    document.getElementById(objID).style.visibility = "hidden";
}

function asbTurnOnVisibility(objID) {
    document.getElementById(objID).style.visibility = "visible";
}

function asbChangeOpac(objID, opacity) {
    var obj = document.getElementById(objID);
    obj.style.opacity = (opacity / 100);
    obj.style.MozOpacity = (opacity / 100);
    obj.style.KhtmlOpacity = (opacity / 100);
    obj.style.filter = "alpha(opacity=" + opacity + ")";    
}

function asbFindPos(obj) {
    var curleft = curtop = 0;
    if (obj.offsetParent) {
        curtop = obj.offsetTop;
        curleft = obj.offsetLeft;
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
    }
    return [curleft, curtop];
}

function asbHideSlow(objID) {
    var time = 500;
    if (asbIsIE())
        time = 100;
    asbOpacity(objID, 100, 0, time);
}

function asbShowSlow(objID, owner, time, offsetLeft, offsetTop) {

    var obj = document.getElementById(objID);
    var pos = asbFindPos(owner);

    obj.style.left = pos[0] + offsetLeft + "px";
    if (asbIsIE())
        pos[1] += 1;
    else
        pos[1] += 3;
    obj.style.top = pos[1] + owner.clientHeight + offsetTop + "px";

    //asbChangeOpac(objID, 0);
    asbOpacity(objID, 0, 100, time);

    return false;
}
function asbIsIE() {
    return (navigator.appName == "Microsoft Internet Explorer");
}
function asbIsNav() {
    return (navigator.appName == "Netscape");
}

function asbIsIE7OrLater() {
    if (navigator.appVersion.indexOf("MSIE 7.0") != -1 || navigator.appVersion.indexOf("MSIE 6.0") != -1)
        return true;
    return false;
}