﻿/***************************************************************************
/*File Name:    SuggestionListScript.js                                    */
/*Author:       Tony Smith-Brewster                                        */
/*Date:         21 July 2007                                               */
/*Description:  Script used for the suggestion list                        */
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
/*Name: Class                                                              */
/*Type: Function Object                                                    */
/*Purpose: Used to initialise a function based class object                */
/*Usage Syntax:  var clsObjectName = new Class.create(arguments);          */
/***************************************************************************/

var Class = {    
   create : function(){
        return function(){
            this.initialise.apply(this,arguments);
        }
    }
}

/***************************************************************************/
/*Name: clsChild                                                           */
/*Type: Class Object                                                       */
/*Purpose: Child element in the suggestion list.                           */
/***************************************************************************/
clsChild = Class.create();
clsChild.prototype = {
   
    initialise : function(ChildID,cssUnHighLight,cssHighLight,strText,listIndex)
    {    
        this.Base = document.createElement("div");      
        this.Base.setAttribute("id", ChildID);
        this.Base.className = cssUnHighLight;        
        this.Base.innerHTML = strText;
        this.Base.onmousedown = this.selectResult;
        this.Base.onmouseover = this.highlight;
        this.Base.onmouseout = this.unhighlight; 
        this.index = listIndex;
        this.isHighlighted = false; 
        this.NumHidden = 0;
    }
    ,
    unhighlight : function(){
        if(this.className != listSelectedStyle)
        {
            this.className = listMouseOutStyle;
            this.isHighlighted = false;  
        }
    }
    ,
    highlight : function()
    {
        if(this.className != listSelectedStyle)
        {
            this.className = listMouseOverStyle; 
            this.isHighlighted = true;
        }
    }
    ,
    selectResult : function()
    {
        List.selectIndex = this.index;
        objSearchBox.value = this.innerHTML;
        
        objSearchBox.focus();  
        this.parentNode.style.visibility = "hidden"; 
        if(document.getElementById("MaxPrice")){
            if(this.parentNode.style.visibility == "visible"){
                document.getElementById("MaxPrice").style.visibility = "hidden";
                document.getElementById("MinPrice").style.visibility = "hidden";
            }
            else{
                document.getElementById("MaxPrice").style.visibility = "visible";
                document.getElementById("MinPrice").style.visibility = "visible";
            }   
        }
    }
}

/***************************************************************************/
/*Name: clsList                                                            */
/*Type: Class Object                                                       */
/*Purpose: The suggestion list.                                            */
/***************************************************************************/
clsList = Class.create();
clsList.prototype = {
    initialise : function(Parent,ParentDivID,cssClass)
    {    
        this.Cache = new Array();
        this.Base = document.createElement("div");
        this.Base.setAttribute("id", ParentDivID); 
        this.Parent = Parent;
        this.x =  function(tParent){
            var x = tParent.offsetLeft;
            var objParent = tParent;
            while (objParent.offsetParent){
                objParent = objParent.offsetParent;
                x += objParent.offsetLeft;               
            } 
            return(x);
        }
        this.y = function(tParent){
            var y = tParent.offsetTop + tParent.offsetHeight;
            var objParent = tParent;
            while (objParent.offsetParent){
                objParent = objParent.offsetParent;
                y += objParent.offsetTop; 
            } 
            return(y);
        }
        
        if(!document.all){
            this.Base.onmouseup = this._resetSelectedIndex; 
            this.Base.onscroll = this._resetSelectedIndex;
        }else{
            this.Base.onscroll = this._resetSelectedIndex;
        }   
        this.bHandleIEWC3Bug = false; //Bug in IE scrollbar mouseup event (not WC3 compliant)
        this.HiddenTop = 0;
        this.HiddenBottom = 0;
        this.isElement = false;
        this.Base.className = cssClass;
        this.Base.style.width = (Parent.offsetWidth - 1) + "px";
        this.Base.style.left = this.x(this.Parent) + "px";
        this.Base.style.top = this.y(this.Parent) + "px";
        this.ListCount = 0;
        this.selectedIndex = -1;
    }
    ,
    _resetSelectedIndex : function(){
        if(!List.bHandleIEWC3Bug){
            if(this.style.visibility == "visible"){
                if(List.selectedIndex < 0) List.selectedIndex = 0;
                this.childNodes[List.selectedIndex].className = listMouseOutStyle;
                List.selectedIndex = Math.round(this.scrollTop / this.childNodes[0].clientHeight);
                List.HiddenTop = Math.round(this.scrollTop / this.childNodes[0].clientHeight);
                List.HiddenBottom = this.childNodes.length - (List.HiddenTop + 14);
                this.childNodes[List.selectedIndex].className = listSelectedStyle;
                objSearchBox.focus();
                objSearchBox.value = this.childNodes[List.selectedIndex].innerHTML;     
            }
        }   
        List.bHandleIEWC3Bug = false;
    }
    ,
    InitCache : function(key,ArrayList){
        if(!this.isElement) {
            document.body.appendChild(List.Base);
            this.isElement = true;
        }
        var cacheKey = (this.GetKey(key)); 
        if(!this.CheckCache(cacheKey)){
            this.Cache[cacheKey] = new Array(ArrayList);
        }
        this.FilterList(key);   
    }
    ,
    Add : function(styleUnHighLight,styleHighLight,strData){
            this.child = new clsChild("Child_" + this.ListCount,styleUnHighLight,styleHighLight,strData,this.ListCount++); 
                        this.Base.appendChild(this.child.Base);
            this.child.Base.style.width = (parseInt(this.Base.style.width)) + "px";
            
            if(((this.Base.childNodes.length) * this.child.Base.clientHeight) > (this.child.Base.clientHeight * 14)){
                this.Base.style.height = (this.child.Base.clientHeight * 14);
            }else{
                this.Base.style.height = ((this.Base.childNodes.length) * this.child.Base.clientHeight).toString() + "px";
            }
    }
    ,
    GetKey : function(key){
        return(key.slice(0,3).toUpperCase());
    }
    ,
    BuildList : function(key){
       this.ClearList(); 
       for (var x = 0; x < this.Cache[key][0].length; x++){
         this.Add(listMouseOutStyle,listMouseOverStyle,this.Cache[key][0][x]);  
       }    
    }
    ,
    ClearList : function(){
        while (this.Base.childNodes.length > 0)
            this.Base.removeChild(this.Base.childNodes[0]);
            this.ListCount = 0;
            this.selectedIndex = 0;
    }
    ,
    CheckCache : function(key){
        key = (this.GetKey(key));
        return(this.Cache[key] ? this.Cache[key] : false);
    }
    ,
    ShowList : function(blnShow){
       this.Base.style.left = this.x(this.Parent) + "px";
       this.Base.style.top = this.y(this.Parent) + "px";
       this.Base.style.overflowY = ((this.Base.childNodes.length <= 14) ? "hidden" : "scroll"); 
       this.Base.style.visibility = (blnShow ? "visible" :"hidden"); 
       
       if(document.getElementById("MaxPrice")){
           if(this.Base.style.visibility == "visible"){
               document.getElementById("MaxPrice").style.visibility = "hidden";
               document.getElementById("MinPrice").style.visibility = "hidden";
           }
           else{
            document.getElementById("MaxPrice").style.visibility = "visible";
            document.getElementById("MinPrice").style.visibility = "visible";
           }
       }
       
       this.HiddenBottom = (this.Base.childNodes.length - 14);
       this.HiddenTop = 0;
    }
    ,
    FilterList : function(key,keyCode){
        if(keyCode == 13 || keyCode == 9 || keyCode == 38 || keyCode == 40) return;
        this.ClearList();    
        this.selectedIndex = -1;
        var cacheKey = (this.GetKey(key));
        if(!this.Cache[cacheKey]) return;
        for(var x = 0; x < this.Cache[cacheKey][0].length; x++)
        {   //Following statement clears any bad data (from the cache) returned from the DB   
            if(this.Cache[cacheKey][0][x].toUpperCase().indexOf(cacheKey) == -1){
                this.Cache[cacheKey][0].splice(x--,1);           
            }else if(this.Cache[cacheKey][0][x].toUpperCase().indexOf(key.toUpperCase()) != -1){
                this.Add(listMouseOutStyle,listSelectedStyle,this.Cache[cacheKey][0][x]);       
            }
        }
        
        this.ShowList((this.ListCount > 0 ? true : false));
        
    }
    ,
    unhightlightChild : function(item){
       item.className = listMouseOutStyle;
       item.isHighlighted = false;
    }
    ,
    hightlightChild : function(item){
        item.className = listSelectedStyle;  
        item.isHighlighted = true;
    }
    ,
    doUpScroll : function(HiddenBotNode,index){
       return((index == ((this.Base.childNodes.length - 1) - (HiddenBotNode + 14))) ? true : false);
    }
    ,
    doDownScroll : function(HiddenTopNodes,index){
        return((index == (HiddenTopNodes + 14))? true : false);
    }
    ,
    KeyPress : function(keyCode,bIsKeyEvent){
        switch(keyCode){       
            case 13:          
                if(this.Base.style.visibility != "visible") break;
                if(this.selectedIndex < 0) this.selectedIndex = 0;
                objSearchBox.value = this.Base.childNodes[this.selectedIndex].innerHTML;
                this.ShowList(false);
                break;
      
            case 38:
                try{
                    this.unhightlightChild(this.Base.childNodes[this.selectedIndex--]);
                    if(this.selectedIndex < 0){
                        this.selectedIndex = 0;
                        this.hightlightChild(this.Base.childNodes[this.selectedIndex]);
                    }else{
                        this.hightlightChild(this.Base.childNodes[this.selectedIndex]);
                        if(this.doUpScroll(this.HiddenBottom,this.selectedIndex)){
                            this.Base.scrollTop -= this.Base.childNodes[this.selectedIndex].clientHeight;
                            this.HiddenTop--;
                            this.HiddenBottom++;
                        }             
                        objSearchBox.value = this.Base.childNodes[this.selectedIndex].innerHTML; 
                    }
                }  
                catch(e){
                    return;
                }      
                break;
            case 40:
                try{
                    if(this.selectedIndex < 0){
                        this.hightlightChild(this.Base.childNodes[++this.selectedIndex]);
                    }else{
                        this.unhightlightChild(this.Base.childNodes[this.selectedIndex++]); 
                        if(this.selectedIndex >= this.Base.childNodes.length) this.selectedIndex = this.Base.childNodes.length - 1;
                        this.hightlightChild(this.Base.childNodes[this.selectedIndex]);
                        if(this.doDownScroll(this.HiddenTop,this.selectedIndex)){ 
                            this.bHandleIEWC3Bug = true;
                            this.Base.scrollTop += this.Base.childNodes[this.selectedIndex].clientHeight;                          
                            this.HiddenTop++;
                            this.HiddenBottom--;                      
                        }   
                        objSearchBox.value = this.Base.childNodes[this.selectedIndex].innerHTML;                 
                    }
                }
                catch(e){
                    return;
                }
                break;
            case 9:
                if(this.selectedIndex < 0) 
                    this.selectedIndex = 0;
                if(this.Base.childNodes.length > 0){
                    objSearchBox.value = this.Base.childNodes[this.selectedIndex].innerHTML;
                    this.ShowList(false);
                }
            break;
        }
    }
}

var objSearchBox = document.getElementById(ElementID);
var List = new clsList(objSearchBox,'DataList_ID',listStyle);
/*************************************************************************/
/*Call Back Stuff                                                        */
/*************************************************************************/
function GetTowns_CallBack(response){
var objTowns;
	if (response != null && response.value != null){		
		objTowns = response.value;			
		var key = objSearchBox.value;
		List.InitCache(key,objTowns);
	}			
}
  
