﻿// Initializes a new instance of the StringBuilder class
// and appends the given value if supplied
function StringBuilder(value)
{
    this.strings = new Array("");
    this.append(value);
}

// Appends the given value to the end of this instance.
StringBuilder.prototype.append = function (value)
{
    if (value)
    {
        this.strings.push(value);
    }
}

// Clears the string buffer
StringBuilder.prototype.clear = function ()
{
    this.strings.length = 1;
}

// Converts this instance to a String.
StringBuilder.prototype.toString = function ()
{
    return this.strings.join("");
}

var ComboboxControl=
{
    elements:[],
    Init:function()
    {
        //TODO: CPHJBMN 20080307: Fix for big combo lits on SE site
        /*
        if (location.href.indexOf("FHC_SE") != -1)
        {
            return;
        }
        */

        if(!Lib.Browser.isIE()&&!Lib.Browser.isMOZ())
            return;
        //var c=Lib.Html.getElementsByClassName("combobox");
        var c=Lib.Html.getElementsByClassName("combobox", document, "select");
        for(var i=0;i<c.length;i++)
        {
            var requestUrl=c[i].getAttribute("requestUrl");
            this.elements[i]=new ComboBox(c[i],i);            
            if(requestUrl) 
                ComboBox_MakeDynamic(this.elements[i],requestUrl);                                    
                
        }
    }
}
function toogleVisibility(oComboBox,obj)
{   var node;    
    var b=false;
    
    if (oComboBox.listContainer.id != obj.id)     
    {
        if (obj.className!='comboboxContainer') node = obj.parentElement
            for(i=0;i<node.childNodes.length;i++)
            {
                if(node.childNodes[i]==document.activeElement){b=true}
            }             
    }
    if (oComboBox.listContainer.id == document.activeElement.id) {b=true;}
    
    if (!b)oComboBox.toogleVisibility(false);
}
function ComboBox_MakeDynamic(oComboBox,sRequestUrl)
{    
    this.element=oComboBox;
    oComboBox.requestUrl=sRequestUrl;
    oComboBox.requested=[];
    oComboBox.MatchList=function(bAllItems)
    {
        this.toogleVisibility(true);
        this.activeListItemIndex=-1;
        var s=this.GetTextfield().value.toLowerCase();
        var f=false;
        for(var i=0;i<this.requested.length;i++)
        {
            if(this.requested[i]==s.substr(0,this.requested.length))
            {
                f=true;
                break;
            }
        }
        if(f)
        {
            this.toogleVisibility(true);
            this.activeListItemIndex=-1;
            this.DisplayItems(this.GetSubset(s));
            return;
        }
        this.requested[this.requested.length]=s;
        this.DisplayItems([]);
        //window.open(this.requestUrl+this.GetTextfield().value)
        Lib.XmlHttp.Load(this.requestUrl+s,new Function("s",this.obj+".MatchListCB(s)"),true)
    }
    oComboBox.MatchListCB=function(sItems)
    {
    
        var itemsToAdd=sItems.split("|");
        // invalid text since request
        if(itemsToAdd[0]!=this.GetTextfield().value.toLowerCase())
            return false;
        for(var i=1;i<itemsToAdd.length;i++)
            this.list[this.list.length]=new this.ListItem(itemsToAdd[i],itemsToAdd[i]);
        this.toogleVisibility(true);
        this.activeListItemIndex=-1;
        this.DisplayItems(this.GetSubset(this.GetTextfield().value));
    }
}
function ComboBox(oOrigEl,iIndex)
{   
    window[this.obj="__CB"+iIndex]=this;
    var P=Lib.Html.grpWscroll(oOrigEl);
    this.orig=oOrigEl;
    this.listShown=false;
    this.activeListItemIndex=-1;    
    this.Init=function()
    {
        var width = this.orig.offsetWidth-(Lib.Browser.isIE()?1:2);
        var textboxWidth = width-34;
        var d=document.createElement("div");
        d.className="comboboxContainer";        
        var text = this.orig.options[this.orig.selectedIndex].text;
        var disabled = "";
        if (this.orig.disabled == true)
            disabled = 'disabled="disabled"';
        var s='<input onfocusout=\'toogleVisibility(' + this.obj + ',this)\' type="text" style="width:'+textboxWidth+'px;padding-right:30px;" id="__'+this.obj+'_textField" obj="'+this.obj+ '" ' + disabled + '/>';
        s+='<div onfocusout=\'toogleVisibility(' + this.obj + ',this)\'  class="buttonContainer" style="left:'+(textboxWidth+18)+'px;" onmouseover="this.childNodes[0].style.display=\'none\'" onmouseout="this.childNodes[0].style.display=\'block\';this.childNodes[1].style.display=\'block\'" onmousedown="this.childNodes[1].style.display=\'none\';'+this.obj+'.ButtonClick()" onmouseup="this.childNodes[1].style.display=\'block\'" ondragstart="return false">';
        s+='<img src="../../images/combobox/btn_arr_down.png" class="button"/>';
        s+='<img src="../../images/combobox/btn_arr_down_hover.png" class="buttonHover"/>';
        s+='<img src="../../images/combobox/btn_arr_down_pressed.png" class="buttonPressed"/>';
        s+='</div>';
        d.innerHTML=s;
        
        this.list=[];
        if (!this.orig.disabled)
        {
        for(var i=0;i<this.orig.options.length;i++)
            if(this.orig.options[i].text)    
                this.list[this.list.length]=new this.ListItem(this.orig.options[i].text,this.orig.options[i].value);
        }
        var id=this.orig.id||"";
        var name=this.orig.name||"";
        this.valueElement=document.createElement("input");
        this.valueElement.type="hidden";
        
        (this.orig.form||this.orig.parentNode).appendChild(this.valueElement);
        
        this.orig.parentNode.replaceChild(d,this.orig);
        
        this.valueElement.id=id;
        this.valueElement.name=name;     
        
        this.listContainer=document.createElement("DIV");                
        this.listContainer.className="comboboxlist";      
        
        this.listContainer.name = "list" + name;     
        this.listContainer.id = "list" + id;
        this.listContainer.onfocusout='toogleVisibility(' + this.obj + ',this)';
        
        this.listContainer.style.width=width+"px";
        
        this.listContainer.style.zIndex="1000";
        document.body.appendChild(this.listContainer);

        this.SetListPosition();

        if(text)
            this.setText(text);

        this.GetTextfield().onkeydown=new Function("e","return "+this.obj+".Keydown(e)")
        this.GetTextfield().onkeyup=new Function("e","return "+this.obj+".Keyup(e)")
        this.DisplayItems(this.list);
    }
    this.setValue=function(sValue)
    {
        this.valueElement.value=sValue;
    }
    this.setText=function(sValue)
    {
        this.GetTextfield().value=sValue;
        this.setValue(sValue);
    }
    this.toogleVisibility=function(bVisible)
    {
        this.listShown=typeof(bVisible)=="boolean"?bVisible:!this.listShown;
        this.listContainer.style.display=this.listShown?"block":"none"
        if(this.listShown)
            this.SetListPosition()
    }
    this.SetListPosition=function()
    {
        var P=Lib.Html.grp(this.GetTextfield())
        var t=this.GetTextfield();
        this.listContainer.style.top=(P.y+(Lib.Browser.isIE()?21:20))+"px";        
        this.listContainer.style.left=(t.offsetLeft+t.parentNode.offsetLeft)+"px";
    }
    this.Keydown=function(e)
    {
        var e=e?e:event;
    
        if(e.keyCode==13)
        {
            if(this.toogleVisibility(false))
            if(Lib.Browser.IsIE())
                event.cancelBubble=true;
            // else mozilla cancel event propagation
    
            return false;
        }
        if(e.keyCode==38||e.keyCode==40)
        {
            if(!this.listShown)
                this.MatchList();
        }
        if(e.keyCode==38)
        {
            this.displayedItemIndex--;
            if(this.displayedItemIndex<0)
                this.displayedItemIndex=this.displayedItems.length-1;
            var el=this.getItem(this.displayedItemIndex);
            this.MarkItemHover(el);
            this.listContainer.scrollTop=this.displayedItemIndex*16;
            this.setText(el.innerHTML);
            return;
        }
        if(e.keyCode==40)
        {
            this.displayedItemIndex++;
            if(this.displayedItemIndex>=this.displayedItems.length)
                this.displayedItemIndex=0;
            var el=this.getItem(this.displayedItemIndex)
           
            if(el)
            {
                this.MarkItemHover(el)
                this.listContainer.scrollTop=this.displayedItemIndex*16;
                this.setText(el.innerHTML);
            }
            else
            {
                // TODO: Implement proper debugging routine.
                // alert(this.listContainer.innerHTML);
            }
            
            return;
        }
        // TODO: This doesn't work - need to find another way of assuring that the entered value is retrieved.. form-event or better key event handling..
//        this.setValue(this.GetTextfield().value);
        
        return true;
    }
    this.Keyup=function(e)
    {
        var e=e?e:event;
        if(e.keyCode==13&&this.GetTextfield().value.length>0)
            return;
        if(e.keyCode!=38&&e.keyCode!=40)
            this.MatchList();
        return false
    }
    this.ButtonClick=function()
    {
        if(this.listShown)
            this.toogleVisibility()
        else
            this.MatchList(true);
    }
    // DO NOT MODIFY
    this.MatchList=function(bAllItems)
    {
        this.toogleVisibility(true);
        this.activeListItemIndex=-1;
        this.DisplayItems(bAllItems?this.list:this.GetSubset(this.GetTextfield().value));
    }
    // END
    
    this.GetSubset=function(sValue)
    {
        var r=[];
        for(var i=0;i<this.list.length;i++)
            if(this.list[i].text.substr(0,sValue.length).toLowerCase()==sValue.toLowerCase())
                r[r.length]=this.list[i];
        return r;
    }
    this.displayedItems=[];
    this.displayedItemIndex=-1;
    this.displayedItem=null;
    this.DisplayItems=function(aItems)
    {
        if(!this.IsEqual(aItems,this.displayedItems))
        {
            var s="";
            var sb = new StringBuilder();
            for(var i=0;i<aItems.length;i++) 
            {
                //s+='<div class="item" index="'+i+'" id="__'+this.obj+'_item_'+i+'
                //" onmouseover="'+this.obj+'.MarkItemHover(this)" value="'+aItems[i].value+
                //'" onmousedown="'+this.obj+'.ItemClick(this)">'+aItems[i].text+'</div>'
                //CPHJBBG : Optimized string build
                sb.append('<div class="item" index="');
                sb.append(i);
                sb.append('" id="__');
                sb.append(this.obj);
                sb.append('_item_');
                sb.append(i);
                sb.append('" onmouseover="');
                sb.append(this.obj);
                sb.append('.MarkItemHover(this)" value="');
                sb.append(aItems[i].value);
                sb.append('" onmousedown="');
                sb.append(this.obj);
                sb.append('.ItemClick(this)">');
                sb.append(aItems[i].text);
                sb.append('</div>');
            }
            //this.listContainer.innerHTML=s;    
            this.listContainer.innerHTML=sb.toString();    
            this.displayedItemIndex=-1;
            this.displayedItems=aItems;
        }
    }
    this.MarkItemHover=function(el)
    {
        if(this.displayedItem)
            this.MarkItemNormal(this.displayedItem);

        el.className="item itemHover";

        this.displayedItemIndex=el.getAttribute("index");
        this.displayedItem=el;
    }
    this.MarkItemNormal=function(el)
    {
        el.className="item";
    }
    this.ItemClick=function(el)
    {
        el.className="item";
        this.setText(el.innerHTML);
        this.toogleVisibility(false);
    }
    this.GetTextfield=function()
    {
        return document.getElementById('__'+this.obj+'_textField');
    }
    this.getItem=function(iIndex)
    {
        return document.getElementById("__"+this.obj+'_item_'+iIndex);
    }
    this.IsEqual=function(a1,a2)
    {
        if(a1.length!=a2.length)
            return false;
        for(var i=0;i<a1.length;i++)
            if(a1!=a2)
                return false;
    }
    this.ListItem=function(sText,oValue)
    {
        this.text=sText;
        this.value=oValue;
    }
    
    this.Init()
}
Lib.Event.attachEvent(window,"onload",function(){ComboboxControl.Init()});

