
function AutoSuggest(elem,chkRadio)
{
    this.debug=false;
    
    this.searchType = "";
    this.suggestType="";
    this.suggestDivID = "";
    this.hiddenID="";
    this.enabledRadio=chkRadio;
	this.listClick=null; 
	
	var me = this;

	this.elem = elem;

	this.suggestion = new suggestions();
	
	this.inputText = null; 

	this.highlighted = -1;
	 
	this.requesting=false; 
	this.submission_state=false;
	this.div = (this.suggestDivID=="")?$("autosuggest"):$(this.suggestDivID);
    
	var TAB = 9;
	var ESC = 27;
	var KEYUP = 38;
	var KEYLEFT = 37;
	var KEYRIGHT = 39;
	var KEYDN = 40;
	var ENTER = 13;
    var SHIFT = 16;
	
	elem.setAttribute("autocomplete","off");
    
	if(!elem.id)
	{
		var id = "autosuggest" + idCounter;
		idCounter++;

		elem.id = id;
	}


    elem.onkeypress = function(ev)
	{
	 
		var key = me.getKeyCode(ev);

		switch(key)
		{
			case ENTER: 	
			me.cancelEvent(ev);
			return false;
			break;
		}
	}
	
    elem.onblur = function(ev)
	{
	    if(this.value == '' && typeof  me.defaultText !='undefined') 
	    { 
	        this.value = me.defaultText; 
	        
	        if(me.hiddenID && typeof me.hiddenID !='undefined')
	        {
	          $(me.hiddenID).value='';
	           
	           if(me.searchType=='sector')
			   {
				   $(me.includeSectorID).style.visibility='hidden';
			    }
	        }
	    }
	    
	   // me.blurTimeout(1000);   
	   
	}
	

	elem.onkeydown = function(ev)
	{
		var key = me.getKeyCode(ev);

		switch(key)
		{
			case TAB:
			
			if(me.highlighted > -1)
            {  
                if(me.suggestType=="hidden")
                {
			        $(me.hiddenID).value=me.suggestion.list[me.highlighted].Code;
				    me.elem.value=me.suggestion.list[me.highlighted].Name;
				}
				else
				{
			        me.useSuggestion();
			    }
			}
			
			break;

			case ESC:
			if(!me.requesting)
			{   me.hideDiv();
			  
			}
			me.cancelEvent(ev);
			break;

			case KEYUP:
			if (me.highlighted > -1)
			{
				me.highlighted--;
			}
			me.changeHighlight(key);
			break;

			case KEYDN:
			
			if (me.highlighted < (me.suggestion.list.length - 1))
			{
				me.highlighted++;			
    
			}
			
			me.changeHighlight(key);
			
			break;
			 
			case ENTER:
			
			if(me.highlighted > -1)
            {  
                if(me.suggestType!="hidden")
                {        
                     if(typeof me.controlType!='undefined' && me.controlType=="listbox")
	                 {  me.elem.value=me.suggestion.list[me.highlighted].Name;
	                 }
	                    
	                    
				     if(me.searchType.toUpperCase() == "MANAGER") 
				     {   
					    GotoManagerFactsheet(me.suggestion.list[me.highlighted].Code,me.suggestion.list[me.highlighted].Univ);
				     }
				     else if(me.searchType.toUpperCase() == "GROUP") 
				     {
					    GotoGroupFactsheet(me.suggestion.list[me.highlighted].Code,me.suggestion.list[me.highlighted].Univ);
				     }
				     else 
				     {
					    GotoFundFactsheet(me.suggestion.list[me.highlighted].Code,me.suggestion.list[me.highlighted].Univ);
				     }
				      me.submission_state=true;
				 }
				 else
				 {
				    $(me.hiddenID).value=me.suggestion.list[me.highlighted].Code;
				    me.elem.value=me.suggestion.list[me.highlighted].Name;
				    
				    if(me.searchType=='sector')
				    {
				        $(me.includeSectorID).style.visibility='';
				        $(me.bindedHidMgr).value='';
				        $(me.bindedTxtMgr).value='Enter manager name';
				    }
				 }
				 			    
			    me.hideDiv();
			   
            }
            else if(elem.value.length>0&&me.suggestType!="hidden"&&me.controlType!="listbox")
            { 
                var txtSearch=escape(me.elem.value.urlEncode());
                
                if(!ValidateString(txtSearch))
		        {		         
			        alert('Invalid input, please provide valid input.');
			        return false;
		        }
		        else
		        {
                    searchSubmit(txtSearch);
                    me.submission_state=true;
                }
            }
           
            me.cancelEvent(ev);
            
            break;
		}
	};
	
 

	elem.onkeyup = function(ev) 
	{
		var key = me.getKeyCode(ev);
		if(this.enabledRadio==null || this.enabledRadio.checked)
		{
		    switch(key)
		    {
		        case TAB:
		        case ESC:
		        case KEYUP:
		        case KEYDN:
		        case KEYRIGHT:
		        case KEYLEFT:
		        case SHIFT:
		        case ENTER:
		            return;
    		
		        default:
               
			        if (!me.requesting&&this.value != me.inputText && (this.value.length > 2||(this.value.length>0&&me.controlType=='listbox')))
			        {
        	               	
			               if(typeof me.listClick == 'object' && me.searchType=='fund')
			               {
			                    if(me.searchType=="fund" && $(me.hiddenGroupID).value=="")
                                {
                                    alert("Please select a group");
                                    return;
                                }
                                
			                    me.inputText = this.value;
			                    var temp=me.searchType;                                
                                
                                if(!me.hiddenGroupID || $(me.hiddenGroupID).value=="")
                                {            
                                    me.searchType="fundbyuniverse";   
                                    me.requesting=true;         
                                    me.swiftLoad(me.inputText);
                                }
                                else
                                {
                                    me.searchType="fundbygroup";   
                                    me.requesting=true;         
                                    me.swiftLoad($(me.hiddenGroupID).value+'||'+me.inputText);
                                }                            
                                
                                me.searchType=temp;
                            }
                            else if(typeof me.listClick == 'object' && me.searchType=='manager' && me.hiddenSectorID && $(me.hiddenSectorID).value!="" )			           
                            {
                                 me.inputText = this.value;
			                     var temp=me.searchType;                                                                
                                 me.searchType="managerbysector";   
                                 me.requesting=true;         
                                 me.swiftLoad($(me.hiddenSectorID).value+'||'+me.inputText);
                                 me.searchType=temp;
                            }
                            else
                            {
                               me.inputText = this.value;
        		               me.requesting=true;
			                   me.swiftLoad(me.inputText);	
                            }
			               
			               	             
    		       
			        }
			        else if(!me.requesting&&this.value == me.inputText && (this.value.length > 2||(this.value.length>0&&me.controlType=='listbox')))
			        {
			            me.showDiv();
			        }
			        else
			        {
			            if(this.value.length<3)
			            { 
			                me.suggestion.keyword='';
			                me.suggestion.list.length=0;
			            }
    			       
				        me.hideDiv();
			        }
		        }
		   }
	};
	
    this.clickTimeout=function(ms,keyword)
	{
	    var _self = this;
	    
	    if(keyword=='')
        {   
            setTimeout(function(ms){_self.clickShow(keyword);}, ms);       
        }
        else
        {
            setTimeout(function(ms){_self.clickShowManager(keyword);}, ms);       
        }
    
	};
	
	this.clickShow=function(keyword)
	{ 
	    me.requesting=true;
        me.swiftLoad(keyword);
     }
    
    this.clickShowManager=function(keyword)
	{ 
	    var temp=me.searchType;
	    me.searchType="managerbysector"; 
	    me.requesting=true;
        me.swiftLoad(keyword);
        me.searchType=temp;
        
     }
          
	
	this.setListButton=function(obj)
	{
	 
        me.listClick=obj;
        me.listClick.onclick=function(ev)
        {
            //setTimeout("$('" + me.elem.id + "').value='loading...';",0);
            me.elem.value='loading...';      
            me.clickTimeout(100,'');                  
            //alert(me.elem.value);
            
        }
        
      }
      
    this.setGroupListButton=function(obj)
	{
	 
        this.listClick=obj;
        this.listClick.onclick=function(ev)
        { 
            if(me.searchType=="fund" && $(me.hiddenGroupID).value=="")
            {
                alert("Please select a group");
                return;
            }
            
            var temp=me.searchType;
            me.elem.value='loading...';
            
            if($(me.hiddenGroupID).value=="")
            {            
                me.searchType="fundbyuniverse";   
                me.requesting=true;         
                me.swiftLoad('xxx');
            }
            else
            {
                me.searchType="fundbygroup";   
                me.requesting=true;         
                me.swiftLoad($(me.hiddenGroupID).value);
            }
            
            
            me.searchType=temp;
            me.cancelEvent(ev);
        }
        
        this.listClick.onkeydown = function(ev)
	    {
		    var key = me.getKeyCode(ev);

		    switch(key)
		    {
			    case ESC:
			    if(!me.requesting)
			    {   me.hideDiv();
    			  
			    }
			    me.cancelEvent(ev);
			    break;
		    }
		}	
    }
      
    this.setSectorListButton=function(obj)
	{
	 
        this.listClick=obj;
        this.listClick.onclick=function(ev)
        { 
            
            me.elem.value='loading...';
            
            if($(me.hiddenSectorID).value!="")
            {     
                me.clickTimeout(100,$(me.hiddenSectorID).value);      
            }
            else
            {              
                me.clickTimeout(100,'');      
            }            
            
         
        }
        
        this.listClick.onkeydown = function(ev)
	    {
		    var key = me.getKeyCode(ev);

		    switch(key)
		    {
			    case ESC:
			    if(!me.requesting)
			    {   me.hideDiv();
    			  
			    }
			    me.cancelEvent(ev);
			    break;
		    }
		}	
    }  
      
    this.swiftLoad=function(txt)
    {
     
        var a=document.createElement("script");
        a.setAttribute("id","sugg_funds");
        var searchQuery = (me.searchType != "") ? "&type="+me.searchType : "";
        a.src="/Tools/Suggest.aspx?q="+encodeURIComponent(txt)+searchQuery;
        var b=$("sugg_funds"),d=document.getElementsByTagName("head")[0];
        if(b)d.removeChild(b);
        d.appendChild(a);
        me.requestLoadTimeout(50);
    }
  
    this.requestLoadTimeout=function(ms)
	{
	    var _self = this;
        var t=setTimeout(function(ms){_self.requestLoadTimeout(ms);}, ms);
        
        if(typeof sF=='object')
        {  
           me.doSuggestion(sF);
           clearTimeout(t);         
        }
    
	};
	
	this.requestTimeout=function(ms,txt)
	{
	
	  if(!me.submission_state)
	  {
	      var _self = this;
          setTimeout(function(ms){_self.deferRequest(''+txt+'');}, ms);
       }
	};
     
     
    this.deferRequest=function(txt)
    {
       if(!me.requesting&&me.inputText==txt)
       {  
           if(!me.submission_state)
           {                
               me.requesting=true;               
               me.swiftLoad(me.inputText);
    		}    
		}	
    };
    
    this.doSuggestion=function(res)
    {
        me.requesting=false;
        
        var result=[];
        
        if(typeof res == 'object')
        {   result=res;
        
        }
        else
        {
          if(me.debug)
          { 
            alert('response not in correct format ');
            
          }
          return;
        }  
       
        
        me.suggestion.list=result.slice();
		me.suggestion.keyword=me.inputText;
		
		delete sF;
		 
		
		if(!me.submission_state && me.suggestion.list.length>0&&(me.enabledRadio==null || me.enabledRadio.checked))
		{   
		    me.createDiv();
		    me.positionDiv();
		    me.showDiv();
		    
		    if(me.elem.value=='loading...')
            {   setTimeout("$('" + me.elem.id + "').value='';",0);
                me.elem.value='';
            }
		}
		else
	    {   
		    me.hideDiv();
	    }

        
        
    };

  
  
	this.blurTimeout=function(ms)
	{	
	    var _self = this;
        setTimeout(function(ms){_self.hideDiv();}, ms);
      
	};
      
 
	this.useSuggestion = function()
	{
		if (this.highlighted > -1)
		{
		    this.elem.value = this.suggestion.list[this.highlighted].Name;
			this.hideDiv();
			setTimeout("$('" + this.elem.id + "').focus()",0);
		}
	};


	this.showDiv = function()
	{
		this.div.style.display = 'block';
	};


	this.hideDiv = function()
	{
		this.div.style.display = 'none';
		this.highlighted = -1;
	};

	  
    this.changeHighlight = function()
    {
        if(typeof me.controlType!='undefined' && me.controlType=="listbox")
	    {   
	         var lis = this.div.getElementsByTagName('SELECT');
	         if(lis.length>0)
	         {  
                 for(var i=0;i<lis[0].options.length;i++)
                 {
                     var li = lis[0].options[i];
                     
                     if (this.highlighted == i)
                     {  
                        li.selected=true; 
                                          
                     }
                     else
                     {
                        li.selected=false;
                     }
                  }  
              }
	    }
	    else
	    {
             var lis = this.div.getElementsByTagName('LI');
             for(var i=0;i<lis.length;i++)
             {
                var li = lis[i];
     
                 if (this.highlighted == i)
                 {                
                    li.className = "selected";
                    
                    if(i>18)
                    {   
                        this.div.scrollTop=i*10;
                    }
                    else
                    {   
                        this.div.scrollTop=0;  
                    }
                 }
                 else
                 {
                    li.className = "";
                 }
             }
         }
     };

	this.positionDiv = function()
	{
		var el = this.elem;
		var x = 0;
		var y = el.offsetHeight;
	
		while (el.offsetParent && el.tagName.toUpperCase() != 'BODY')
		{
			x += el.offsetLeft;
			y += el.offsetTop;
			el = el.offsetParent;
		}

		x += el.offsetLeft;
		y += el.offsetTop;

  
		this.div.style.left = x + 'px';
		this.div.style.top = y + 'px';
	};   
    
    
	this.createDiv = function()
	{
		var ul = document.createElement('ul');
      	this.div = (this.suggestDivID=="")?$("autosuggest"):$(this.suggestDivID);
        
        var selectList=null; 
        if(typeof me.controlType!='undefined' && me.controlType=="listbox")
	    {
	    
	        if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
	        { 
                var ieversion=new Number(RegExp.$1) 
                if (ieversion<7)
                {
                    selectList=document.createElement('<select multiple=\"multiple\"></select>');    
                }
                else
                {
                    selectList=document.createElement('SELECT');    
                }
      
             }
             else
             {
                selectList=document.createElement('SELECT');    
             }
	    
            //alert('its a list');
           //selectList=document.createElement('SELECT');    
           //selectList.setAttribute("type","select-multiple");
           
           if(me.suggestion.list.length>15)
           { selectList.setAttribute("size","15");
           }
           else
           { selectList.setAttribute("size",me.suggestion.list.length);
           }
           selectList.setAttribute("multiple","true");
            //alert(selectList.type);
            
           	selectList.onkeydown = function(ev)
	        {
		        var key = me.getKeyCode(ev);

		        switch(key)
		        {
			        case TAB:me.hideDiv(); break;
			     }
			} 
            
           selectList.onchange = function(ev)
           {
                if(this.selectedIndex>-1)
                {
                      me.highlighted=this.selectedIndex;
                      var code=this.options[this.selectedIndex].value;
                      var name=this.options[this.selectedIndex].text;
                      var univ='U';
                      
                      
                          if(me.suggestType!="hidden")
	                      {   me.elem.value=name;
	                            if(me.searchType.toUpperCase() == "MANAGER") {
        			                
			                        window.location="/Managers/ManagerFactsheet.aspx?personCode="+code+"&univ="+univ;
	                            }
	                            else if(me.searchType.toUpperCase() == "GROUP") {
			                        window.location="/Factsheets/ManagerGroup.aspx?managerCode="+code+"&univ="+univ;
	                            }
	                            else {
			                        window.location="/Factsheets/Factsheet.aspx?fundCode="+code+"&univ="+univ;
	                            }
	                        }
	                        else
	                        {
	                            $(me.hiddenID).value=code;
	                            me.elem.value=name;
	                            $(me.div.id).style.display='none';		
	                 
	                            if(me.searchType=='sector')
				                {
				                    $(me.includeSectorID).style.visibility='';
				                    $(me.bindedHidMgr).value='';
				                    $(me.bindedTxtMgr).value='Enter manager name';
				                }	            
            			        
	                         }
                    } 
               
              } //end onchange event
              
//        selectList.onmouseover = function(ev)
//		{
//		    //alert(window.event.fromElement.tagName);
//		    var target = me.getEventSource(ev);		    
//		    //alert(target.tagName);
//            while (target.parentNode && target.tagName.toUpperCase() != 'OPTION')
//	        {
//		        target = target.parentNode;
//	        }
//		
//	        var lis = me.div.getElementsByTagName('OPTION');    			
//	        
//	        for (i in lis)
//	        {
//		        var li = lis[i];
//		        if(li == target)
//		        {
//			        me.highlighted = i;
//			        break;
//		        }
//		        
//	        }	        
//	        
//	        me.changeHighlight();
//     
//		 }//end onmouseover event
              
              
        }//end if list control
        

	    for (var j=0;j<me.suggestion.list.length;j++)
		{   
		    var word = me.suggestion.list[j].Name;
		    var code = me.suggestion.list[j].Code;
		    var univ = me.suggestion.list[j].Univ;
		    
	        if(typeof word=='string')
	        {
	        
	            if(typeof me.controlType =='undefined')
	            {    
			        var li = document.createElement('li');
			        var a = document.createElement('a');
			        li.setAttribute('id',this.div.id+'_li_'+j);
            
			        if(this.suggestType!="hidden")
			        {
			            if(me.searchType.toUpperCase() == "MANAGER") {
					        a.href="/Managers/ManagerFactsheet.aspx?personCode="+code+"&univ="+univ;
			            }
			            else if(me.searchType.toUpperCase() == "GROUP") {
					        a.href="/Factsheets/ManagerGroup.aspx?managerCode="+code+"&univ="+univ;
			            }
			            else {
					        a.href="/Factsheets/Factsheet.aspx?fundCode="+code+"&univ="+univ;
			            }
			        }
			        else
			        {
			            a.href="javascript:$('"+this.hiddenID+"').value='"+code+"';$('"+this.elem.id+"').value='"+word+"';$('"+this.div.id+"').style.display='none';void(0);";
    			        
			         }
    			   
			        var rSpan = document.createElement('div');
    			    
			        rSpan.className='rSpan';
			        rSpan.innerHTML=word;
    			    
    		        a.appendChild(rSpan);
    			    
			        li.appendChild(a);
        	    
//        	        li.appendChild(rSpan);
        	        
			        if (me.highlighted == j)
			        {
				        li.className = "selected";
			        }
        	
			        ul.appendChild(li);
			    }
			    else if(me.controlType=="listbox")
			    {
			        //inside loop
			        var item=new Option(word,code);		        
	                //item.attachEvent('onmouseover',function(){alert('d');}); 
			        selectList.options.add(item);
					
			    
			    }
			}//end if word
			
		}//end for
		
		if(typeof me.controlType!='undefined' && me.controlType=="listbox")
	    {
	        this.div.replaceChild(selectList,this.div.childNodes[0]);	        
	        me.highlighted=-1;
         }
        else
        {	
		    this.div.replaceChild(ul,this.div.childNodes[0]);
		}      

		
		
        this.div.onblur = function(ev)
	    {
	        me.blurTimeout(100);   
    	   
	    }

        document.onclick=function(e)
        {               
            var e=e? e : window.event;
            var ref=e.target? e.target : e.srcElement;

            if(ref!=me.listClick)
            { 
                if(me.elem.value == '' && typeof  me.defaultText !='undefined'&& ref!=me.elem) 
	            { 
	                me.elem.value = me.defaultText; 
	                
	                if(me.hiddenID && typeof me.hiddenID !='undefined')
	                {
	                    $(me.hiddenID).value='';
	                    
	                     if(me.searchType=='sector')
				         {
				            $(me.includeSectorID).style.visibility='hidden';
				            
				         }
	                }
	            }
                me.hideDiv();
              
             }
           
        } 
        
        document.onkeypress=function(e)
        {               
            
           	var key = null;
           	
           	if(e)			//Moz
		    {
			    key= e.keyCode;
		    }
		    if(window.event)	//IE
		    {
			    key=window.event.keyCode;
		    }
				
           	switch(key)
		    {   case ESC:
		        if(me.elem.value == '' && typeof  me.defaultText !='undefined') 
	            { 
	                me.elem.value = me.defaultText; 
	                
	                if(me.hiddenID && typeof me.hiddenID !='undefined')
	                {
	                    $(me.hiddenID).value='';
	                     if(me.searchType=='sector')
				         {
				            $(me.includeSectorID).style.visibility='hidden';
				         }
	                }
	            }
		        me.hideDiv();
		        break;
		    }
        }    

        
    	
	
		ul.onmouseover = function(ev)
		{
		    var target = me.getEventSource(ev);
		    
		    try
		    {  		    
                while (target.parentNode && target.tagName.toUpperCase() != 'LI')
	            {
		            target = target.parentNode;
	            }
    		        
	            var lis = me.div.getElementsByTagName('LI');    			
    	
	            for (var i=0;i<lis.length;i++)
	            {
		            var li = lis[i];
		            if(li == target)
		            {
			            me.highlighted = i;
			            break;
		            }
	            }
		        
	            me.changeHighlight();  		       
	            
	         }
	         catch(e)
	         {}
		};


//		ul.onclick = function(ev)
//		{
		
//			me.useSuggestion();
//			
//		
//			searchSubmit(escape(me.elem.value.urlEncode()));
//			me.submission_state=true;
//			
//			me.hideDiv();
//			me.cancelEvent(ev);
//			return false;
//		};
	
		this.div.className="suggestion_list";
		this.div.style.position = 'absolute';
		this.div.style.zIndex = 100;
		
		if(me.suggestion.list.length>18&&me.controlType!="listbox")
		{
		    this.div.className += " suggestScroll";
		}
		else
		{
		    this.div.className += " suggestNoscroll";
		}

	};

	this.mouseOverTimeout=function(ms)
	{	
	    var _self = this;
        setTimeout
        (
            function(ms)
            {             
               _self.changeHighlight();
            }
         , ms);
      
	}; 

	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;
			event.cancel = true;
		}
	}
	
	function suggestions()
	{
	   this.list=[];
	   this.keyword='';
	}	   
	
}

	
	
	
 String.prototype.urlEncode = function () 
 {
        var text = this.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < text.length; n++) {

            var c = text.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
  }

function GotoFundFactsheet(fundCode,univCode)
{
   if(fundCode!=""&&univCode!="")
   { 
     window.location="/Factsheets/Factsheet.aspx?fundCode="+fundCode+"&univ="+univCode;
   }
}

function GotoManagerFactsheet(personCode,univCode)
{   
   if(personCode!="")
   {
     window.location="/Managers/ManagerFactsheet.aspx?personCode="+personCode+"&univ="+univCode;
     
   }
   
   
}

function GotoGroupFactsheet(managerCode,univCode)
{
   if(managerCode!="")
   {
     window.location="/Factsheets/ManagerGroup.aspx?managerCode="+managerCode+"&univ="+univCode;
   }
}


var idCounter = 0;

