var div = document.getElementById("autosuggest");
function AutoSuggest(elem, suggestions,dependant,foremail,multi,scount,param)
{
    var me = this;
    var dependant=dependant;
    var foremail=foremail;
    this.param = param;
    this.scount = scount;
    this.elem = elem;
    this.arrArabicMap={};
    try{
        if(document.getElementById("language")){
            if(this.param == "arabicdesignation" && document.getElementById("language").value == "ar")
                this.arrArabicMap=cache.GetItem('ar_engMap_desg').split(';');
            else if(this.param == "arabiclocation" && document.getElementById("language").value == "ar")
                this.arrArabicMap=cache.GetItem('ar_engMap_location').split(';');
        }
    }
    catch(exe){
        this.arrArabicMap={};
    }

    this.suggestions = suggestions;

    this.eligible = new Array();
    this.eligibleAR_map = new Array();
    this.inputText = null;
    this.keywordAr = null;
    this.highlighted = -1;
    this.div = document.getElementById("autosuggest");
    this.suggestFrame=document.getElementById("SuggestFrame");
    this.length = (this.elem.id).length;
    this.fieldName = this.elem.id.substr(0,this.length-2);
    if(document.getElementById("language")){
        if(document.getElementById("language").value == "ar")
            this.keywordAr = document.getElementById(this.fieldName);
    }
    var TAB = 9;
    var ESC = 27;
    var KEYUP = 38;
    var KEYDN = 40;
    var ENTER = 13;
    var ATCHK=0;
    var MULOPT=multi;
    this.elem.setAttribute("autocomplete","off");
    if(!this.elem.id)
    {
        var id = "autosuggest" + idCounter;
        idCounter++;

        this.elem.id = id;
    }
    elem.onkeydown = function(ev)
    {
        var key = me.getKeyCode(ev);
        switch(key)
        {
            case ENTER:
                if(document.getElementById("autosuggest").style.display == 'block' && me.highlighted > -1 ) {
                    me.useSuggestion(); 
                    me.cancelEvent(ev);
                    me.fireEvent(me.elem, 'focus');
                    return false;
                } else {
                    return true;
                }
                break;
            case TAB:
                if(document.getElementById("autosuggest").style.display == 'block' && me.highlighted>-1 ) {

                    me.useSuggestion();
                    me.fireEvent(me.elem, 'focus');
                    return false;
                } else {
                    return true;
                }
                break;
            case ESC:
                me.hideDiv();
                break;
            case KEYUP:
                if (me.highlighted > 0)
                {
                    me.highlighted--;
                }
                me.changeHighlight(key);
                break;
            case KEYDN:
                if (me.highlighted < (me.eligible.length - 1))
                {
                    me.highlighted++;
                }
                me.changeHighlight(key);
                break;

        }
    };
    function hideSug(){
        if(document.getElementById("autosuggest").style.display){
            me.useSuggestion(); 
            document.getElementById("autosuggest").style.display='none';
            document.getElementById("SuggestFrame").style.display='none';
            if(document.getElementById('txt2'))
                document.getElementById('txt2').value ='';
        }		
    }
    if(elem.addEventListener){
        elem.addEventListener("blur",hideSug,false);
        elem.addEventListener("focus",function(){if(elem.value == "اكتب اسم المدينة"){ elem.value="";elem.style.color = "#444"; }},false)
    }
    else {
        elem.attachEvent("onblur",hideSug);
        elem.attachEvent("onfocus",function(){
                if(elem.value == "اكتب اسم المدينة"){
                elem.value="";
                elem.style.color = "#444" ;
                }

                })
    }
    function getCaret(el) {
        if (el.selectionStart) {
            return el.selectionStart;
        } else if (document.selection) {
            el.focus();

            var r = document.selection.createRange();
            if (r == null) {
                return 0;
            }

            var re = el.createTextRange(),
                rc = re.duplicate();
            re.moveToBookmark(r.getBookmark());
            rc.setEndPoint('EndToStart', re);

            return rc.text.length;
        } 
        return 0;
    }
    elem.onkeyup = function(ev) 
    {
        var key = me.getKeyCode(ev);
        var str_input;
        //alert(key);
        switch(key)
        {

            case ENTER:

                if(document.getElementById("autosuggest").style.display == 'block' && me.highlighted>-1 ) {

                    me.useSuggestion();
                    return false;
                } else {
                    return true;
                }
            case TAB:
            case ESC:
            case KEYUP:
                return;
            case KEYDN:
                return;
            case 39:
                if(document.getElementById("autosuggest").style.display=='block' && me.highlighted>-1) {
                    me.useSuggestion();
                    return;
                }
            default:
                var str_input;
                if ( this.value.length > 0 && foremail!=1) 
                {
                    str_input = trim(this.value);
                    if(MULOPT==1){
                        var arr_tmp = str_input.split(',');
                        //str_input = this.value;
                        str_input=trim(arr_tmp[arr_tmp.length-1]);
                        arr_tmp = arr_tmp.slice(0,arr_tmp.length-1);
                        leftarray = arr_tmp.join(',');
                    }
                    else
                        leftarray='';
                    if(str_input.length <= 0||this.value.lastIndexOf(str_input)>getCaret(elem))
                    {
                        leftarray='';
                        me.hideDiv();
                        return;
                    }
                    me.inputText = str_input;
                    me.getEligible();
                    me.createDiv();
                    me.positionDiv();
                    if(dependant==1&&document.getElementById('hiddenselected').value!=''){
                        if(me.eligible.length!=0)
                            me.showDiv();
                    }
                    else if(me.eligible.length!=0&&dependant!=1)
                        me.showDiv();

                    if(me.eligible.length<=0){
                        if(document.getElementById('language')){
                            if(document.getElementById('language').value == "ar"){
                                me.keywordAr.value=document.getElementById(me.elem.id).value;
                            }
                        }
                        me.hideDiv();
                        str_input='';
                        me.inputText='';
                        leftarray='';
                    }
                    else if(me.eligible.length>0 && me.highlighted<0 && document.getElementById('language')){
                        if(document.getElementById('language').value == "ar"){
                        	if( me.eligible[0] == document.getElementById(me.elem.id).value && me.eligibleAR_map[0] ){
                                me.keywordAr.value=me.eligibleAR_map[0];
                            }
                            else if(me.keywordAr && me.inputText != ""){
                                me.keywordAr.value = me.inputText;
                            }
                        }
                    }
                }
                else if(foremail==1){
                    if(key==50|| ATCHK==1){
                        ATCHK=1;	
                        var arr_tmp;	
                        str_input = trim(this.value)	
                            if(MULOPT==1){
                                arr_tmp = str_input.split('@');
                                str_input = this.value;
                                str_input=trim(arr_tmp[arr_tmp.length-1]);
                                arr_tmp = arr_tmp.slice(0,arr_tmp.length-1);
                                leftarray = arr_tmp.join('@');
                            }
                            else{
                                arr_tmp = str_input.split('@');
                                if(arr_tmp.length==2){
                                    str_input = this.value;
                                    str_input=trim(arr_tmp[arr_tmp.length-1]);
                                    arr_tmp = arr_tmp.slice(0,arr_tmp.length-1);
                                    leftarray = arr_tmp.join('@');
                                }
                            }
                        if(str_input.length <= 0||this.value.lastIndexOf(str_input)>getCaret(elem))
                        {
                            leftarray='';
                            me.hideDiv();
                            return;
                        }
                        me.inputText = str_input;
                        me.getEligible();
                        me.createDiv();
                        me.positionDiv();
                        if(this.value.indexOf('@')!=-1&&me.eligible.length!=0){
                            me.createDiv();
                            me.positionDiv();
                            me.displayHidden();
                            me.showDiv();
                        }
                        else{
                            me.hideDiv();
                        }
                    } 
                }
                else
                {
                    me.hideDiv();
                    if(document.getElementById(me.elem.id).value == "" && document.getElementById("language")){
                   		if(document.getElementById("language").value == "ar")
		                    me.keywordAr.value = "";
                    }
                }
                if(me.eligible.length<=0)
                    me.hideDiv();
        }
    };
    this.useSuggestion = function()
    {
        if (this.highlighted > -1)
        {
            if(leftarray != '') {
                if(foremail==1)
                    leftarray += '@';
                else
                    leftarray += ', ';
            }
            // alert(this.highlighted );
            if(document.getElementById('txt2'))
                document.getElementById('txt2').value ='';
            if(this.keywordAr && this.eligibleAR_map[this.highlighted]){
                this.keywordAr.value =leftarray + this.eligibleAR_map[this.highlighted];
                //alert(this.highlighted );
            }
            else if(this.keywordAr){
                // alert(this.eligibleAR_map[this.highlighted] );	
                //alert("else "+this.eligibleAR_map );
                this.keywordAr.value = leftarray + this.eligible[this.highlighted];
            }
            if(foremail!=1 && MULOPT==1) {
                this.elem.value = leftarray+this.eligible[this.highlighted]+", ";
            }
            else
                this.elem.value = leftarray+this.eligible[this.highlighted];
            if(this.elem.createTextRange) { // Move cursor pointer to end IE
                var range = this.elem.createTextRange(); 
                range.move("character", this.elem.value.length); 
                range.select();
            }
            else { 
                this.elem.focus();
                this.elem.setSelectionRange(this.elem.value.length, this.elem.value.length);
            }
            this.hideDiv();
            setTimeout("document.getElementById('" + this.elem.id + "').focus()",0);
        }
    };

    this.displayHidden = function()
    {
        if (this.highlighted == -1 && foremail==1)
        {
            if(document.getElementById('txt2'))
                document.getElementById('txt2').value = leftarray+"@"+this.eligible[0];
        }
        else if(this.highlighted > -1 && foremail==1 && document.getElementById('txt2')){
            document.getElementById('txt2').value = leftarray+"@"+this.eligible[this.highlighted];
        }
        else if(this.highlighted > -1 && foremail!=1 && this.keywordAr){
            this.keywordAr.value=this.eligibleAR_map[this.highlighted];
        }
    };

    this.useFadedSuggestion = function()
    {
        if(document.getElementById("autosuggest").style.display && foremail==1 && document.getElementById('txt2'))
            this.elem.value=document.getElementById('txt2').value;
        this.hideDiv();
    };
    this.showDiv = function()
    {
        var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;
        var addWidth = 0;
        this.div.style.display = 'block';
        this.suggestFrame.style.display='block';
        this.div.style.fontFamily = 'verdana';
        if(document.getElementById('language')){
            if(document.getElementById('language').value == "ar"){
                this.div.style.fontFamily = 'tahoma';
                //var suggestor_width =this.div.offsetWidth - this.elem.offsetWidth;
                addWidth = (IE6)?2:0;
            }
        }

            divWidth = this.elem.clientWidth;

        this.div.style.width = divWidth+"px";
        this.suggestFrame.style.width = divWidth+"px";
        this.suggestFrame.style.height = this.div.offsetHeight+"px";
    };
    this.hideDiv = function()
    {
        this.div.style.display = 'none';
        this.suggestFrame.style.display='none';
        this.highlighted = -1;
        if(document.getElementById('txt2'))
            document.getElementById("txt2").value="";
    };
    this.changeHighlight = function()
    {
        var lis = this.div.getElementsByTagName('LI');
        for (i in lis)
        {
            var li = lis[i];
            if(!li){
                continue;
            }

            if (this.highlighted == i)
            {
                li.className = "selected";
            }
            else
            {
                li.className = "";
            }
        }
    };
this.findPosX = function (obj)
{
    var curleft = 0;
    if(obj.offsetParent)
        while(1){
            curleft += obj.offsetLeft;
            if(!obj.offsetParent)
                break;
            obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
};
this.findPosY = function (obj)
{
    var curtop = 0;
    if(obj.offsetParent)
        while(1){
            curtop += obj.offsetTop;
            if(!obj.offsetParent)
                break;
            obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
};
    this.positionDiv = function()
    {
        var eleParent = (typeof(checkparent)!='undefined' && checkparent == true)?true:false;
        var el = this.elem;
        var x = 0;
        var y = el.offsetHeight;
            x = this.findPosX(el);
        y += this.findPosY(el);

        this.div.style.left = x + 'px';
        this.div.style.top = y + 'px';
        this.suggestFrame.style.left = x + 'px';
        this.suggestFrame.style.top = y + 'px';
    };
    this.createDiv = function()
    {
        var ul = document.createElement('ul');
        for (i in this.eligible)
        {
            var word = this.eligible[i];

            var li = document.createElement('li');
            var a = document.createElement('a');
            a.href="javascript:false";
            a.innerHTML = markbold(this.inputText.toLowerCase(),word.toLowerCase());
            li.appendChild(a);

            if (me.highlighted == i)
            {
                li.className = "selected";
            }

            ul.appendChild(li);
        }

        this.div.replaceChild(ul,this.div.childNodes[0]);
        ul.onmouseover = function(ev)
        {
            var target = me.getEventSource(ev);
            while (target.parentNode && target.tagName.toUpperCase() != 'LI')
            {
                target = target.parentNode;
            }

            var lis = me.div.getElementsByTagName('LI');


            for (i in lis)
            {
                var li = lis[i];
                if(li == target)
                {
                    me.highlighted = i;
                    break;
                }
            }
            me.changeHighlight();

        };
        ul.onclick = function(ev)
        {
            me.useSuggestion();
            return false;
        };

        this.div.className="suggestion_list";
        this.div.style.position = 'absolute';

        this.suggestFrame.className="ifrmwrp";
        this.suggestFrame.style.position = 'absolute';

    };
    this.getEligible = function()
    {
        this.eligible = new Array();
        this.eligibleAR_map=new Array();
        for (i in this.suggestions) 
        {
        	if(this.eligible.length==15)break;
            var suggestion = this.suggestions[i];
            var suggestionAR_map=me.arrArabicMap[i];

            if(suggestion.toLowerCase().indexOf(this.inputText.toLowerCase()) >= "0" && foremail!=1)
            {
                this.eligible[this.eligible.length]=suggestion;
                this.eligibleAR_map[this.eligibleAR_map.length]=suggestionAR_map;
            }
            else if(suggestion.toLowerCase().indexOf(this.inputText.toLowerCase()) == "0" && foremail==1)
            {
                this.eligible[this.eligible.length]=suggestion;
            }

        }
    };
    this.getKeyCode = function(ev)
    {
        if(ev)			//Moz
        {
            return ev.keyCode;
        }
        if(window.event)	//IE
        {
            return window.event.keyCode;
        }
    };
    this.getEventSource = function(ev)
    {
        if(ev)			//Moz
        {
            return ev.target;
        }

        if(window.event)	//IE
        {
            return window.event.srcElement;
        }
    };

    this.cancelEvent = function(ev)
    {
        if(ev)			//Moz
        {
            ev.preventDefault();
            ev.stopPropagation();
        }
        if(window.event)	//IE
        {
            window.event.returnValue = false;
        }
    }
    
    this.fireEvent = function(element, evnt) {
        var evt;
        if (document.createEvent) {
            evt = document.createEvent("UIEvents");
            evt.initEvent(evnt, true, true);
            element.dispatchEvent(evt);
        }
        else {
            evt = document.createEventObject();
            evt.eventType = "on"+evnt;
            element.fireEvent(evt.eventType, evt);
        }
    }

}
function trim(inputString) {
    if (typeof inputString != "string") { return inputString; }
    var retValue = inputString;
    var ch = retValue.substring(0, 1);
    while (ch == " ") {
        retValue = retValue.substring(1, retValue.length);
        ch = retValue.substring(0, 1);
    }
    ch = retValue.substring(retValue.length-1, retValue.length);
    while (ch == " ") {
        retValue = retValue.substring(0, retValue.length-1);
        ch = retValue.substring(retValue.length-1, retValue.length);
    }
    while (retValue.indexOf("  ") != -1) {
        retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length);
    }
    return retValue;
}

function markbold(str1,str2)
{
    index = str2.indexOf(str1);
    var str_ret="";
    str_ret += str2.substr(0,index);
    str_ret += "<b>"+str2.substr(index,str1.length)+"</b>";
    str_ret += str2.substr((index+str1.length),str2.length);
    return str_ret;
}
var idCounter = 0;

