﻿/***************************************************************************
/*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);
        }
    }
}


/********************************************************************************************************/
/*Class Name: clsCookie                                                                                 */
/*Author: Tony Smith-Brewster                                                                           */
/*Description: Used for cookie operations                                                               */
/********************************************************************************************************/
clsCookie = Class.create();
clsCookie.prototype = {
   
    initialize : function (strName,arrData,intDays) {

        this.name  = (strName) ? ((strName.length > 0) ? strName : false) : false;
        this.value = (arrData) ? ((arrData.length > 0) ? arrData : false) : false;
        this.days  = (intDays) ? ((isNaN(intDays)) ? false : intDays) : false;

        this.bNewCookie = ( ( (this.name) && (this.value) && (this.days) ) ? true : false)
       
        if(this.bNewCookie){
            //create the cookie if it ain't there!
            if(this.readCookie(this.name) == null){
                this.createCookie(this.name,
                                  this.value,
                                  this.days);
            }
        }
        if(this.name){
            var tmpCookieData = this.readCookie(this.name);
            if(tmpCookieData){
                //Check for an array in the cookie
                if(tmpCookieData.indexOf("|") != -1)
                    this.cookieData = tmpCookieData.split("|");
                else
                    this.cookieData = tmpCookieData;
            }
        }
    }
    ,
    createCookie : function(name,value,days){
        //check for the array and make the required adjustments
        if(value[0]){
                strData = value.toString();
                var rExp = /,/g;             //Create regular expression pattern.
                value = strData.replace(rExp, "|");    //Replace "," with "|".
        }
        
          if (days) {
                var date = new Date();
                date.setTime( date.getTime() + (days * 24 * 60 * 60 * 1000) ); //Set Cookie Expire Time in Milliseconds
                var expires = "; expires=" + date.toGMTString();
          }
          
          else var expires = "";
          document.cookie = name + "=" + value + expires + "; path=/";
          
    }
    ,
    readCookie : function (name) {
          var nameEQ = name + "=";
          var ca = document.cookie.split(';');
              for(var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                    while (c.charAt(0)==' ') c = c.substring(1,c.length);
                    if (c.indexOf(nameEQ) == 0) 
                    return unescape(c.substring(nameEQ.length,c.length));
              }
          return null;
    }
    ,
    deleteCookie : function (name) {
          this.createCookie(name,"",-1);
    }
}

/***************************************************************************/
/*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"; 
        
        SavedSearch("visible", "visible", "visible", "visible", "visible");
        ResultsPage("visible", "visible", "visible", "visible");
        FrontPage("visible", "visible", "visible", "visible");
        LocalDealers("visible");
        LocalServices("visible", "visible", "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);
    }
    ,
    HideList : function(){
        this.Base.style.visibility = "hidden";
    }
    ,
    ShowList : function(blnShow){ 

        var objColour = FindDotNetControl("ddlColour", "select");
        var objSearchType = FindDotNetControl("ddlSearchType", "select");
    
        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"); 
       
        switch (WhatPage()){
            case "saved search":
                if(this.Base.style.visibility == "visible"){
                switch (this.Base.childNodes.length){
                    case 0:
                        SavedSearch("visible", "visible", "visible", "visible", "visible");
                        break;
                    case 1:
                        SavedSearch("visible", "visible", "visible", "visible", "visible");
                        break;
                    case 2:
                        SavedSearch("hidden", "visible", "visible", "visible", "visible");
                        break;
                    case 3:
                        SavedSearch("hidden", "visible", "visible", "visible", "visible");
                        break;
                    case 4:
                        SavedSearch("hidden", "hidden", "visible", "visible", "visible");
                        break;
                    case 5:
                        SavedSearch("hidden", "hidden", "visible", "visible", "visible");
                        break;
                    case 6:
                        SavedSearch("hidden", "hidden", "hidden", "visible", "visible");
                        break;
                    case 7:
                        SavedSearch("hidden", "hidden", "hidden", "visible", "visible");
                        break;                    
                    case 8:
                        SavedSearch("hidden", "hidden", "hidden", "hidden", "visible");
                        break;
                    case 9:
                        SavedSearch("hidden", "hidden", "hidden", "hidden", "visible");
                        break;                    
                    case 10:
                        SavedSearch("hidden", "hidden", "hidden", "hidden", "visible");
                        break;                    
                        
                    default:
                        SavedSearch("hidden", "hidden", "hidden", "hidden", "hidden");
                    }
                }else{
                    //Suggestor is hidden
                    SavedSearch("visible", "visible", "visible", "visible", "visible");
                }
                break;
                
            case "results":
                if(this.Base.style.visibility == "visible"){
                    switch (this.Base.childNodes.length){
                    case 0:
                        ResultsPage("visible", "visible", "visible", "visible");
                        break;
                    case 1:
                        ResultsPage("hidden", "visible", "visible", "visible");
                        break;
                    case 2:
                        ResultsPage("hidden", "visible", "visible", "visible");
                        break;
                    case 3:
                        ResultsPage("hidden", "hidden", "visible", "visible");
                        break;
                    case 4:
                        ResultsPage("hidden", "hidden", "visible", "visible");
                        break;
                    case 5:
                        ResultsPage("hidden", "hidden", "hidden", "hidden");
                        break;
                    case 6:
                        ResultsPage("hidden", "hidden", "hidden", "hidden");
                        break;
                    default:
                        ResultsPage("hidden", "hidden", "hidden", "hidden");
                    }
                }else{
                    //Suggestor Hidden
                    ResultsPage("visible", "visible", "visible", "visible");
                }
                break;
                
            case "services":
                if(this.Base.style.visibility == "visible"){
                    switch (this.Base.childNodes.length){
                    case 0:
                        LocalServices("visible", "visible", "visible");
                        break;
                    case 1:
                        LocalServices("visible", "visible", "visible");
                        break;
                    case 2:
                        LocalServices("hidden", "visible", "visible");
                        break;
                    case 3:
                        LocalServices("hidden", "visible", "visible");
                        break;
                    case 4:
                        LocalServices("hidden", "hidden", "visible");
                        break;
                    case 5:
                        LocalServices("hidden", "hidden", "visible");
                        break;
                    case 6:
                        LocalServices("hidden", "hidden", "visible");
                        break;
                    case 7:
                        LocalServices("hidden", "hidden", "visible");
                        break;                                                                        
                    default:
                        LocalServices("hidden", "hidden", "hidden");
                    }
                }else{
                    //Suggestor Hidden
                    LocalServices("visible", "visible", "visible");
                }
                break;
                
            case "frontpage":
                if(this.Base.style.visibility == "visible"){
                    switch (this.Base.childNodes.length){
                    case 0:
                        FrontPage("visible", "visible", "visible", "visible");
                        break;
                    case 1:
                        FrontPage("visible", "visible", "visible", "visible");
                        break;
                    case 2:
                        FrontPage("hidden", "visible", "visible", "visible");
                        break;
                    case 3:
                        FrontPage("hidden", "hidden", "visible", "visible");
                        break;
                    case 4:
                        FrontPage("hidden", "hidden", "visible", "visible");
                        break;
                    default:
                        FrontPage("hidden", "hidden", "hidden", "hidden");
                    }
                }else{
                    //Suggestor Hidden
                    FrontPage("visible", "visible", "visible", "visible");
                }
                break;
                
            case "dealers":
                if(this.Base.style.visibility == "visible"){
                    switch (this.Base.childNodes.length){
                    case 0:
                        LocalDealers("visible");
                        break;
                    case 1:
                        LocalDealers("visible");
                        break;
                    case 2:
                        LocalDealers("hidden");
                        break;
                    default:
                        LocalDealers("hidden");
                    }
                }else{
                    //Suggestor Hidden
                    LocalDealers("visible");
                }
                break;
            
            default:
        }
       
       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 27:
                this.Base.style.visibility = "hidden";
                
            case 13:
                //We want to ensure all the controls are re-shown, so all possible hidden ones are made visible.
                SavedSearch("visible", "visible", "visible", "visible", "visible");
                ResultsPage("visible", "visible", "visible", "visible");
                FrontPage("visible", "visible", "visible", "visible");
                LocalServices("visible", "visible", "visible");
                LocalDealers("visible");
                                                
                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);
	}			
}

/*
        Search Functions
*/

function motorSearch(){
var isValidSearch = false; //Always presume search is invalid until validated.
var strDataCheck = "";
var isTown = false;
    
    var re = new RegExp("^([^0-9]*)$"); 
    var strValue = objSearchBox.value.toString();
    var arr = re.exec(strValue);

    if(arr){
        isTown = true;
    }
        if(!isTown){
	        var postcode = new clsPostcode(objSearchBox.value);
            isValidSearch = postcode.isValid;
 
            if(!isValidSearch){
                isValidSearch = postcode.IsPartPostcodeValid;
            }
        }else{
            if(strValue == ''){
                isValidSearch = false;
            }else{
                isValidSearch = true;
            }
        }
    
	if(isValidSearch){ 
		document.forms[0].submit();
	}else{
	    countryID = document.getElementById("javaScriptCountry")
	    switch (countryID.value){
            case "0":
                if(objSearchBox.value == ''){
                    alert("Please enter a Place or Postcode");
	            }else{
	                alert(objSearchBox.value + " - does not appear to be a valid town or postcode.");
	            };
                break;
            case "5": //ROI
                if(objSearchBox.value == ''){
                    alert("Please enter a Place or Town");
	            }else{
	                alert(objSearchBox.value + " - does not appear to be a valid town or place.");
	            };
                break;
            default:
                if(objSearchBox.value == ''){
                    alert("Please enter a Place or Postcode");
	            }else{
	                alert(objSearchBox.value + " - does not appear to be a valid town or postcode.");
	            };
            }
	    
  	    objSearchBox.focus();
	}
}

//*** Function to grab a control ***
  function FindDotNetControl(strName, strType)
  {
        var objInputs = document.getElementsByTagName(strType);
        for (i = 0;i < objInputs.length; i++)
        {
              if (objInputs[i].id.indexOf(strName)>= 0)
              {
                    return objInputs[i];
                    break;
              }
        }
        return -1;
  }

    function ChangeVisibility(objectName, visibility)
    {
        var theObject = FindDotNetControl(objectName, "select");
        if(theObject != -1){
            theObject.style.visibility = visibility;
        }else{
        
        }
    }
    
    function SavedSearch(firstLine, secondLine, thirdLine, fourthLine, fifthLine){
        var objRadius = FindDotNetControl("ddlRadius", "select");
        if(objRadius != -1){
            //UK
            ChangeVisibility("ddlModels", firstLine);
            ChangeVisibility("ddlMaxMileage", thirdLine);
            ChangeVisibility("ddlNumDoors", fourthLine);
            ChangeVisibility("ddlTransmission", fifthLine);
        }else{
            //ROI
            ChangeVisibility("ddlMinPrice", firstLine);
            ChangeVisibility("ddlType", secondLine);
            ChangeVisibility("ddlFuelType", thirdLine);
            ChangeVisibility("ddlColour", fourthLine);
            ChangeVisibility("ddlSearchType", fifthLine);
        }
    }
    
    function ResultsPage(firstLine, secondLine, thirdLine, fourthLine){
        var objRadius = FindDotNetControl("ddlRadius", "select");
        if(objRadius != -1){
            //UK
            ChangeVisibility("ddlRadius", firstLine);
            ChangeVisibility("ddlType", secondLine);
            ChangeVisibility("ddlFuelType", thirdLine);
            ChangeVisibility("ddlColour", fourthLine);
        }else{
            //ROI
            ChangeVisibility("ddlMinPrice", firstLine);
            ChangeVisibility("ddlType", secondLine);
            ChangeVisibility("ddlFuelType", thirdLine);
            ChangeVisibility("ddlColour", fourthLine);
        }
    }
    
    function FrontPage(firstLine, secondLine, thirdLineLeft, thirdLineRight){
        ChangeVisibility("ddlManufacturers", firstLine);
        ChangeVisibility("ddlModels", secondLine);
        ChangeVisibility("ddlMinPrice", thirdLineLeft);
        ChangeVisibility("ddlMaxPrice", thirdLineRight);
    }
    
    function LocalServices(firstline, secondline, thirdline){
        var objRadius = FindDotNetControl("ddlRadius", "select");
        if(objRadius != -1){
            //UK
            ChangeVisibility("ddlRadius", firstline);
            ChangeVisibility("ddlBusinessCategory", thirdline);
        }else{
            //ROI
            ChangeVisibility("ddlBusinessCategory", secondline);
        }
    }
    
    function LocalDealers(firstline){
        ChangeVisibility("ddlRadius", firstline);
    }
    
    function WhatPage(){
        
        var objSearchType = FindDotNetControl("ddlSearchType", "select");
        var objColour = FindDotNetControl("ddlColour", "select");
        var objBusiness = FindDotNetControl("ddlBusinessCategory", "select");
        var objMake = FindDotNetControl("ddlManufacturers", "select");
    
        //Saved Search
        if(objSearchType != -1){return "saved search";}
                
        //Results Page
        if(objColour != -1){return "results";}
        
        //Local Services
        if(objBusiness != -1){return "services";}     
        
        //FrontPage
        if(objMake != -1){return "frontpage";}
        
        //Local Dealers
        return "dealers";
    }
    
document.onclick=check;
function check(e){
    var target = (e && e.target) || (event && event.srcElement);    
    var locationBox = FindDotNetControl("txtSearchText", "input");
    
    if(target==locationBox){
        //The user clicked the location text box, so don't do anything.
        return;
    }else{
        //It's not the location control, so hide it.
        List.ShowList(false);
    }

}