﻿
//Global variables
var g_nSelMenuItem = 0;
var g_sTextBoxID;
var g_bCancelSubmit;
var g_sOldTextBoxValue = "";
var ex_hdnSelectedValue = "";
var ASB_IS_CLICK_IN = false;
var ASB_Data_Service_URL;
var __attachTo = 'right';
var resultDivMenuID;
var selectedValueControlID;
var isClickedAnyButton = false;
var asbGetDataFromServer = null;

function asbInitialize(AutoSuggestBox_Properties) {
    g_sTextBoxID = AutoSuggestBox_Properties.AutoSuggestBoxID;
    //__attachTo = AutoSuggestBox_Properties.attachTo;
    resultDivMenuID = AutoSuggestBox_Properties.resultDivMenuID;
    selectedValueControlID = AutoSuggestBox_Properties.selectedValueControlID;
    g_nSelMenuItem = AutoSuggestBox_Properties.g_nSelMenuItem;
    g_bCancelSubmit = AutoSuggestBox_Properties.g_bCancelSubmit;
    g_bCancelSubmit = AutoSuggestBox_Properties.g_bCancelSubmit;
    g_sOldTextBoxValue = AutoSuggestBox_Properties.g_sOldTextBoxValue;
    ex_hdnSelectedValue = AutoSuggestBox_Properties.ex_hdnSelectedValue;
    ASB_IS_CLICK_IN = AutoSuggestBox_Properties.ASB_IS_CLICK_IN;
    asbGetDataFromServer = AutoSuggestBox_Properties.GetDataFromServer;
    //isClickedAnyButton = AutoSuggestBox_Properties.isClickedAnyButton;

}

// 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(resultDivMenuID);
    }
    else if (result != "") {
        if (asbCreateElementFromResultXML(result) > 0)
            asbShowDiv(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(resultDivMenuID);
    resultDiv.style.display = "inline";
    resultDiv.style.oppacity = "100";
    resultDiv.style.height = "auto";
    resultDiv.style.width = "auto";
    resultDiv.style.overflowY = "hidden";

    //remove all childs
    resultDiv.innerHTML = "";
    var textBoxID = g_sTextBoxID;
    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 hdnSelectedValue = document.getElementById(g_sTextBoxID + "_SelectedValue");
    hdnSelectedValue.value = sValue;
    ex_hdnSelectedValue = sValue;
}
function asbSetTextBoxValue() {
    var divMenuItem;
    divMenuItem = asbGetSelMenuItemDiv();
    if (divMenuItem) {
        var sMenuItemValueID;
        sMenuItemValueID = GetDivMenuItemID(g_nSelMenuItem) + "_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(g_sTextBoxID);
        txtCtrl.value = divMenuItem.innerHTML;
        asbSetNameValueVariables();
    }
}

function asbGetTextBoxValue() {
    var txtCtrl;
    txtCtrl = document.getElementById(g_sTextBoxID);
    return (txtCtrl.value);
}

function asbOnMouseClick(nMenuIndex) {
    ASB_IS_CLICK_IN = true
    g_nSelMenuItem = nMenuIndex;
    //g_sTextBoxID=sTextBoxID;

    asbSetTextBoxValue();
    asbHideSlow(resultDivMenuID);
    //asbHideDiv();
}

function asbOnBlur() {
    if (ASB_IS_CLICK_IN == false && !asbIsVisibleDiv())
        asbHideSlow(resultDivMenuID);
    //asbHideDiv()
}

function asbOnMouseOver(nMenuIndex) {
    //g_sTextBoxID=sTextBoxID;

    //asbSelectMenuItem(nMenuIndex);
    var divMenuItem;
    divMenuItem = asbGetMenuItemDiv(nMenuIndex)

    if (divMenuItem) {
        if (nMenuIndex != g_nSelMenuItem) {
            asbUnhighlightSelMenuItem();

            g_nSelMenuItem = nMenuIndex;
            //asbSetTextBoxValue();

            divMenuItem.className = "asbSelMenuItem"
        }
    }
}

function asbOnKeyPress(evt) {
    if (asbGetKey(evt) == 13 && asbGetTextBoxValue() != "")// && ex_hdnSelectedValue != "")
        return true;
    else
        return false;
}

function asbOnKeyUp(evt) {
    //    AutoSuggestBox_Properties.isClickedAnyButton = 

    var nKey;
    nKey = asbGetKey(evt);

    //Skip up/down/enter
    if ((nKey != 38) && (nKey != 40) && (nKey != 13)) {
        var sNewValue;
        sNewValue = asbGetTextBoxValue();
        window.setTimeout("isClickedAnyButton = false;", 1000);
        if (isClickedAnyButton == false) window.setTimeout("asbCallback()", 1000);
        isClickedAnyButton = true;
    }
    if (g_sOldTextBoxValue != sNewValue) {
        asbSetSelectedValue("");
    }
}


function asbCallback() {
    var sNewValue = asbGetTextBoxValue();
    if ((sNewValue.length <= 5) && (sNewValue.length > 0) && isClickedAnyButton == false)
        asbGetDataFromServer(sNewValue);
}

function asbOnKeyDown(evt) {
    //Save current text box value before key press takes affect
    g_sOldTextBoxValue = asbGetTextBoxValue();

    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
    {
        if (asbIsVisibleDiv(resultDivMenuID)) {
            asbHideSlow(resultDivMenuID);
            //asbHideDiv();

            //Only works in IE
            evt.cancelBubble = true;

            if (evt.returnValue) evt.returnValue = false;
            if (evt.stopPropagation) evt.stopPropagation();

            g_bCancelSubmit = true;
        }
        else {
            g_bCancelSubmit = false;
        }
    }
    //else {
    //  asbHideSlow(resultDivMenuID);
    //asbHideDiv();
    //}

    return true;
}
function asbGetSelMenuItemDiv() {
    return asbGetMenuItemDiv(g_nSelMenuItem);
}
function GetDivMenuItemID(nMenuItem) {
    return (g_sTextBoxID + "_mi_" + nMenuItem);
}
function asbGetMenuItemDiv(nMenuItem) {
    var sDivMenuItemID;
    sDivMenuItemID = GetDivMenuItemID(nMenuItem);

    return document.getElementById(sDivMenuItemID)
}
function asbMoveUp() {
    var nMenuItem;
    nMenuItem = g_nSelMenuItem + 1;

    //Check if menu item exists
    if (asbGetMenuItemDiv(nMenuItem)) {
        asbSelectMenuItem(nMenuItem)
    }
}
function asbMoveDown() {
    var nMenuItem;
    nMenuItem = g_nSelMenuItem - 1;

    if (nMenuItem != 0) {
        asbSelectMenuItem(nMenuItem)
    }
}
//Highlights a div
function asbSelectMenuItem(nMenuItem) {
    var divMenuItem;
    divMenuItem = asbGetMenuItemDiv(nMenuItem)

    if (divMenuItem) {
        if (nMenuItem != g_nSelMenuItem) {
            asbUnhighlightSelMenuItem();

            g_nSelMenuItem = 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 asbHideDiv() {
    document.getElementById(resultDivMenuID).style.display = 'none';
    g_nSelMenuItem = 0;
}
function asbIsVisibleDiv() {
    if (document.getElementById(resultDivMenuID).style.display == 'inline') {
        return false;
    }
    else {
        return true;
    }
}
function asbShowDiv() {
    var divMenu = document.getElementById(resultDivMenuID);
    var ASBTextBox = document.getElementById(g_sTextBoxID);
    var time = 500;
    if (asbIsIE())
        time = 100;
    var offsetX = 0;
    if (divMenu.clientWidth > ASBTextBox.clientWidth)
        offsetX = ASBTextBox.clientWidth - divMenu.clientWidth;


    asbShowSlow(resultDivMenuID, ASBTextBox, time, offsetX, 0);
    //divMenu.style.opacity = "100";
    //var location;
    //if(__attachTo=='left')
    //divMenu.style.right= document.getElementById(g_sTextBoxID).clientRight+"px";
    //else
    //divMenu.style.left= document.getElementById(g_sTextBoxID).clientLeft+"px";
}

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++;
        }
    } else if (opacStart < opacEnd) {
        for (i = opacStart; i <= opacEnd; i++) {
            setTimeout("asbChangeOpac('" + objID + "','" + i + "')", (timer * speed));
            timer++;
        }
    }
}

function asbChangeOpac(objID, opacity) {
    var obj = document.getElementById(objID);
    obj.style.display = 'inline';
    obj.style.opacity = (opacity / 100);
    obj.style.MozOpacity = (opacity / 100);
    obj.style.KhtmlOpacity = (opacity / 100);
    obj.style.filter = "alpha(opacity=" + opacity + ")";
    if (opacity == 0)
        obj.style.display = 'none';
}

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;
}