/*jslint bitwise: true, browser: true, eqeqeq: true, immed: true, newcap: true, nomen: true, regexp: true, undef: true, white: true, indent: 4 */
/*global CartwrightUtil*/
/*global ActiveXObject*/
/*global window*/

// Set up Cartwright namespace
var CartwrightWWW = {
    ddvid: {
        currentoption: 0,
        displayselect: function() {
            var selects = document.getElementById("ddviewer").getElementsByTagName("select");
            for (var j = 0; j < selects.length; j++) { // Note: start at 1 as to not include transparent GIF, maybe use CSS here instead
                if (selects[j].id.substring(0, 4) === 'deck') {
                    selects[j].style.display = 'none'; // Hide current image
                }
            }
            if (document.forms["ddviewer"].bodytype.selectedIndex === -1 || document.forms["ddviewer"].chassis.selectedIndex === -1) {
                document.getElementById("deck_none").style.display = 'inline';
                return;
            }
            var selecttodisp = 'deck_';
            var sel = document.forms["ddviewer"].bodytype;
            selecttodisp += sel.options[sel.selectedIndex].value;
            sel = document.forms["ddviewer"].chassis;
            selecttodisp += sel.options[sel.selectedIndex].value;

            document.getElementById(selecttodisp).style.display = 'inline';
            document.forms["ddviewer"].elements[selecttodisp].selectedIndex = -1;
        },
        showvid: function(sel, v) {
            var xmlHttp;
            if (!v) {
                v = sel.options[sel.selectedIndex].value;
            }
            if (!(xmlHttp = new CartwrightUtil.Xhr())) { // Create AJAX object and check it exists
                return true; // If we couldn't create the AJAX object return true and follow the link
            }
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState === 4) {
                    document.getElementById("video").innerHTML = xmlHttp.responseText;
                }
            };
            var lb = new CartwrightUtil.BgFade(document.getElementById("video"));
            lb.width = '715px';
            lb.height = '530px';
            lb.topmargin = '20px';
            lb.show();
            document.getElementById("video").innerHTML = "Loading...";
            var geturl = 'videoinc.asp?stretch=exactfit&h=530&w=680&n=' + v;
            xmlHttp.open("GET", geturl, true);
            xmlHttp.send(null);
            return false;  	// cancel form submission     
        },
        select: function(opt) {
            document.forms["ddviewer"].bodytype.selectedIndex = -1;
            document.forms["ddviewer"].chassis.selectedIndex = -1;
            if (opt === "cs") {
                document.forms["ddviewer"].bodytype.selectedIndex = 0;
            }
            if (opt === "van") {
                document.forms["ddviewer"].bodytype.selectedIndex = 1;
            }
            if (opt === "fridge") {
                document.forms["ddviewer"].bodytype.selectedIndex = 2;
            }
        },
        showopt: function(val) {
            var burl = 'img/products/double_deck_configurator/1_config_home/';
            var burl2 = 'img/products/double_deck_configurator/2_chassis_config/';
            document.getElementById("ddbackground").style.backgroundImage = 'url(img/products/double_deck_configurator/3_deck_configurations/Backdrops/' + val + '.jpg)'; ;
            document.getElementById("ddtext").style.display = 'none';
            document.getElementById("stepstraight").style.display = 'block';

            for (var i = 1; i <= 4; i++) {
                document.getElementById("ddselect" + i).src = burl + i + '.jpg';
                document.getElementById("ddselect" + i + "t").src = burl + i + 't.jpg';
            }
            document.getElementById("ddselect" + val).src = burl + val + 'b.jpg';
            document.getElementById("ddselect" + val + "t").src = burl + val + 'tb.jpg';
            document.getElementById("frameselectstraight").src = burl2 + 'straight.gif';
            document.getElementById("frameselectstep").src = burl2 + 'step.gif';
            this.currentoption = val;
            this.hidealldecks();
        },
        showframeopt: function(val) {
            var burl2 = 'img/products/double_deck_configurator/2_chassis_config/'
            if (val === 'step') {
                document.getElementById("frameselectstraight").src = burl2 + 'straight.gif';
                document.getElementById("frameselectstep").src = burl2 + 'stepb.gif';
            }
            if (val === 'straight') {
                document.getElementById("frameselectstraight").src = burl2 + 'straightb.gif';
                document.getElementById("frameselectstep").src = burl2 + 'step.gif';
            }
            this.hidealldecks();
            document.getElementById('dd' + this.currentoption + val).style.display = 'block';
        },
        hidealldecks: function() {
            document.getElementById("dd1step").style.display = 'none';
            document.getElementById("dd1straight").style.display = 'none';
            document.getElementById("dd2step").style.display = 'none';
            document.getElementById("dd2straight").style.display = 'none';
            document.getElementById("dd3step").style.display = 'none';
            document.getElementById("dd3straight").style.display = 'none';
            document.getElementById("dd4step").style.display = 'none';
            document.getElementById("dd4straight").style.display = 'none';



        }
    },
    // Gallery functions
    gallery: {
        initialisegallery: function() {
            setTimeout(function() {
                var eles = document.getElementById("frontpagegallery").getElementsByTagName("img"); // All image elements within the gallery
                var k = -1; // Initial checking value
                for (var j = 1; j < eles.length; j++) { // Note: start at 1 as to not include transparent GIF, maybe use CSS here instead
                    k = (eles[j].style.display === 'inline') ? j + 1 : k;
                    k = (k === eles.length) ? 1 : k;
                    eles[j].style.display = 'none'; // Hide current image
                }
                eles[k].style.display = 'inline'; // Show next image
                setTimeout(arguments.callee, 4000); 	// Run again forever
            }, 2000);
        }
    }, // end gallery

    cheetah: {
        showcheetahmenu: function(a, b) {
            if (!b) {
                b = 6;
            }
            for (var i = 1; i <= b; i++) {
                document.getElementById("cheetah" + i).style.display = "none";
                document.getElementById("cheetahmenu" + i).className = "";
            }
            document.getElementById("cheetah" + a).style.display = "block";
            document.getElementById("cheetahmenu" + a).className = "cheetahmenuselected";
        }
    },



    // Products menu functions
    menu: {
        hidesubmenus: function(currentele) {
            var eles = document.getElementById("productmenu").getElementsByTagName("ul");  // Contains all the submenus
            for (var j = 0, forl = eles.length; j < forl; j++) { // Run through them
                if (eles[j] !== currentele) {  // If this isn't the selected one, if none is selected (i.e. no argument passed) we ge rid of it
                    eles[j].style.display = 'none';
                    eles[j].style.width = '0px';
                }
            }
        },

        showsubmenu: function(ele) {
            var calledele = ele.getElementsByTagName("ul")[0];
            this.hidesubmenus(calledele);   // Hide all submenus except this one
            if (calledele.style.width === '') {
                calledele.style.width = '0px'; // If the width isn't initailsed, do so, else the if below does sads
            }
            calledele.style.display = 'block';
            setTimeout(function() {     // Calls first loop
                if (parseInt(calledele.style.width, 10) < 210) {  // Increases size and loops again if not at 210 yet
                    calledele.style.width = (parseInt(calledele.style.width, 10) + 8) + 'px';
                    calledele.style.height = (parseInt(calledele.style.width, 10) + 3) + 'px';
                    setTimeout(arguments.callee, 1); // Carries on looping
                } else {
                    calledele.style.height = 'auto';  // Resets the height to what it should be when the loop is done (stops odd mouseout behaviour)
                }
            }, 1);

        }

    }, // end menu
    jobs: {
        openjob: function(job) {
            var xmlHttp;
            if (!(xmlHttp = new CartwrightUtil.Xhr())) { // Create AJAX object and check it exists
                return true; // If we couldn't create the AJAX objectm return true and let the link follow through
            }
            var that = this;
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState === 4) {
                    document.getElementById("jobinf").innerHTML = xmlHttp.responseText;
                }
            };

            var lb = new CartwrightUtil.BgFade(document.getElementById("jobinf"), 1);
            document.getElementById("jobinf").innerHTML = "Loading...";
            var geturl = 'jobdet.asp?p=1&jobid=' + job;
            xmlHttp.open("GET", geturl, true);
            xmlHttp.send(null);
            return false; // Prevent link being clicked if everything worked out        
        }
    },



    jobs2: {
        openjob: function(a) {
            document.getElementById("jobtext").innerHTML = "Loading...";
            document.getElementById('jobdetail').style.display = 'block';
            document.getElementById('jobinfo').style.display = 'block';
            window.document.body.scroll = 'no';
            var xmlHttp;
            if (!(xmlHttp = new CartwrightUtil.Xhr())) { // Create AJAX object and check it exists
                return true; // If we couldn't create the AJAX objectm return true and let the link follow through
            }
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState === 4) {
                    document.getElementById("jobtext").innerHTML = xmlHttp.responseText;
                }
            };
            var geturl = 'jobdet.asp?jobid=' + a;
            xmlHttp.open("GET", geturl, true);
            xmlHttp.send(null);
            return false; // Prevent link being clicked if everything worked out
        },

        closejobwin: function() {
            document.getElementById('jobdetail').style.display = 'none';
            document.getElementById('jobinfo').style.display = 'none';
        }
    }, // end jobs


    /*
    *  NOTE:
    *  Unfortunate use of two variables, num and offset. 
    *  num defines the addiotional scroll div - images based on num should be 10*num plus it's number. Num is checked each time and set to 0
    *  offset 10*num and is used to subtract from the array of images to get to the right place
    * 
    *  Will be a better way to do all this - will investiage in the future
    *
    */
    featurescroll: {
        currentoption: 1,
        featurescrolldown: function(num) {
            num = (num === undefined) ? "" : num;
            var offset = 10 * ((num === undefined) ? 0 : num);
            this.currentoption++;
            this.currentoption = this.currentoption < 1 + offset ? 2 + offset : this.currentoption;
            this.currentoption = this.currentoption > this.optioncount(num) + offset ? this.optioncount(num) + offset : this.currentoption;
            this.showoption(this.currentoption, num);
        },
        featurescrollup: function(num) {
            num = (num === undefined) ? "" : num;
            var offset = 10 * ((num === undefined) ? 0 : num);
            this.currentoption--;
            this.currentoption = this.currentoption < 1 + offset ? 1 + offset : this.currentoption;
            this.showoption(this.currentoption, num);

        },
        optioncount: function(num) {
            num = (num === undefined) ? "" : num;
            return document.getElementById('featurescroller' + num).getElementsByTagName("img").length;
        },
        scrolltooption: function(num) {
            num = (num === undefined) ? "" : num;
            var offset = 10 * ((num === undefined) ? 0 : num);
            var mele = document.getElementById('featurescroller' + num);
            var currentoptiondiv = mele.getElementsByTagName("img")[this.currentoption - offset - 1];
            var ele = document.getElementById('featurescroller' + num);
            var containerheight = ele.parentNode.offsetHeight;
            var newtop = -currentoptiondiv.offsetTop + parseInt(containerheight - currentoptiondiv.offsetHeight, 10) / 2;
            var elemax = parseInt(ele.offsetHeight, 10) - containerheight;
            newtop = (newtop < -elemax) ? -elemax : newtop;
            newtop = (newtop > 0) ? 0 : newtop;
            ele.style.top = newtop + 'px';
        },


        //        featurescrolldownOLD: function (num) {
        //            num = (num === undefined) ? "" : num;
        //            var ele = document.getElementById('featurescroller' + num);
        //            var newtop = (parseInt(ele.style.top, 10) - 50);
        //            var elemax = parseInt(ele.offsetHeight, 10) - 265;
        //            newtop = (newtop < -elemax) ? -elemax : newtop;
        //            ele.style.top = newtop + 'px';
        //        },

        //        featurescrollupOLD: function (num) {
        //            num = (num === undefined) ? "" : num; ;
        //            var ele = document.getElementById('featurescroller' + num);
        //            var newtop = (parseInt(ele.style.top, 10) + 50);
        //            newtop = (newtop > 0) ? 0 : newtop;
        //            ele.style.top = newtop + 'px'; // Do scroll		
        //        },

        showoption: function(a, num) {
            num = (num === undefined) ? "" : num;
            var offset = 10 * ((num === undefined) ? 0 : num);
            var pele = document.getElementById('popdetails' + num);
            for (var i = 0, getl = pele.getElementsByTagName("div").length; i < getl; i++) {
                var hele = pele.getElementsByTagName("div")[i];
                if (hele.id) {
                    pele.getElementsByTagName("div")[i].style.display = 'none';
                }
            }
            var mele = document.getElementById('featurescroller' + num);
            for (i = 0, getl = mele.getElementsByTagName("img").length; i < getl; i++) {
                mele.getElementsByTagName("img")[i].className = '';
                if (i === a - offset - 1) {
                    mele.getElementsByTagName("img")[i].className = 'scrollitemselected';
                }
            }
            this.currentoption = a;
            document.getElementById('option' + a).style.display = 'block';
            this.scrolltooption(num);
        },

        showstandard: function(a) {
            var ele = document.getElementById("standardoption" + a);
            ele.style.display = 'block';
        },

        hidestandard: function(a) {
            var ele = document.getElementById("standardoption" + a);
            ele.style.display = 'none';
        }
    }, // End featurescroll



    productgallery: {
        currentimage: 1,
        galleryrunning: 0,

        gallerystart: function() {
            if (this.galleryrunning === 0) {
                this.galleryrunning = 1;
                this.galleryrun();
            }
        },

        gallerystop: function() {
            document.getElementById('galleryplay').className = "";
            this.galleryrunning = 0;
        },


        galleryrun: function() {
            if (this.galleryrunning === 1) {
                if (document.getElementById('galleryplay')) {
                    document.getElementById('galleryplay').className = "playing";
                }
                this.gallerynextimage();
                var that = this;
                setTimeout(function() {
                    that.galleryrun();
                }, 5000);
            }
        },

        opengallery: function() {
            if (!document.getElementById('galleryimage1')) {
                return; // Make sure gallery exists, if not don't even try
            }
            var lb = new CartwrightUtil.BgFade(document.getElementById("gallerycont"));
            lb.closebutton = false;
            lb.closediv = document.getElementById("galleryclose");
            lb.width = '600px';
            lb.show();


            /*if (document.getElementById('gallery')) {
            document.getElementById('gallery').style.display = 'block';
            }
            if (document.getElementById('gallerybg')) {
            document.getElementById('gallerybg').style.display = 'block';
            }
            if (document.getElementById('galleryplay')) {
            document.getElementById('galleryplay').className = "playing";
            }*/
            var that = this;
            setTimeout(function() {
                that.gallerystart();
            }, 1000);

        },

        gallerynext: function() {
            this.gallerystop();
            this.gallerynextimage();

        },

        galleryprev: function() {
            this.gallerystop();
            this.galleryprevimage();
        },

        galleryprevimage: function() {
            var oldimage = this.currentimage;
            this.currentimage = this.currentimage - 1;
            if (this.currentimage === 0) {
                this.currentimage = this.piccount();
            }
            document.getElementById('galleryimage' + this.currentimage).style.opacity = 0;
            document.getElementById('galleryimage' + oldimage).style.opacity = 1;
            document.getElementById('galleryimage' + this.currentimage).style.filter = 'alpha(opacity=0)';
            document.getElementById('galleryimage' + oldimage).style.filter = 'alpha(opacity=100)';
            document.getElementById('galleryimage' + this.currentimage).style.display = 'block';
            this.fade(oldimage, this.currentimage, 0);
        },

        gallerynextimage: function() {
            var oldimage = this.currentimage;
            this.currentimage = this.currentimage + 1;
            if (this.currentimage > this.piccount()) {
                this.currentimage = 1;
            }
            document.getElementById('galleryimage' + this.currentimage).style.opacity = 0;
            document.getElementById('galleryimage' + oldimage).style.opacity = 1;
            document.getElementById('galleryimage' + this.currentimage).style.filter = 'alpha(opacity=0)';
            document.getElementById('galleryimage' + oldimage).style.filter = 'alpha(opacity=100)';
            document.getElementById('galleryimage' + this.currentimage).style.display = 'block';
            this.fade(oldimage, this.currentimage, 0);
        },


        galleryclose: function() {
            this.galleryrunning = 0;
            if (document.getElementById('gallery')) {
                document.getElementById('gallery').style.display = 'none';
            }
            if (document.getElementById('gallerybg')) {
                document.getElementById('gallerybg').style.display = 'none';
            }
        },

        fade: function(oldimg, newimg, a) {
            a = a + 0.1;
            a = (a > 1) ? 1 : a;
            var b = 1 - a;
            b = (b < 0.0001) ? 0 : b;
            document.getElementById('galleryimage' + oldimg).style.opacity = b;
            document.getElementById('galleryimage' + newimg).style.opacity = a;
            document.getElementById('galleryimage' + oldimg).style.filter = 'alpha(opacity=' + b * 100 + ')';
            document.getElementById('galleryimage' + newimg).style.filter = 'alpha(opacity=' + a * 100 + ')';
            if (a < 1) {
                var that = this;
                setTimeout(function() {
                    that.fade(oldimg, newimg, a);
                }, 100);
            } else {
                document.getElementById('galleryimage' + oldimg).style.display = 'none';
            }
        },

        piccount: function() {
            var cele = document.getElementById("gallerypics");
            return cele.getElementsByTagName("div").length;
        }
    }, // End product gallery


    repair: {
        dorepsearch: function() {
            var xmlHttp;
            if (!(xmlHttp = new CartwrightUtil.Xhr())) { // Create AJAX object and check it exists
                return true; // If we couldn't create the AJAX objectm return true and let the form submit itself
            }
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState === 4) {
                    document.getElementById("represults").innerHTML = xmlHttp.responseText;
                    var t = new CartwrightUtil.Sorttable(document.getElementById('dt1')); 	// TODO: t is unused, investigate consequences
                }
            };
            var geturl = 'repairsearch.asp?postcode=' + document.forms['repairform'].postcode.value; // TODO: JSLint doesn't like this for some reason and suggests dot notation, investigation further
            xmlHttp.open("GET", geturl, true);
            xmlHttp.send(null);
            return false;  	// cancel form submission
        }
    }, // End repair

    factorytour: {
        events: function() {

            var eles, j, getl;
            eles = document.getElementById("tourmenu").getElementsByTagName("li"); // Get all list items
            for (j = 0, getl = eles.length; j < getl; j++) {
                CartwrightUtil.event.addHandler(eles[j], "mouseover", this.show);
                CartwrightUtil.event.addHandler(eles[j], "mouseout", this.hide);
            }
            eles = document.getElementById("ftmoeles").getElementsByTagName("div"); // Get all DIVs on image map
            for (j = 0, getl = eles.length; j < getl; j++) {
                CartwrightUtil.event.addHandler(eles[j], "mouseover", this.show);
                CartwrightUtil.event.addHandler(eles[j], "mouseout", this.hide);
            }

        },

        show: function(event) {
            var ele = CartwrightUtil.event.getTarget(event).id.split("_")[0];
            if (ele !== "") {
                document.getElementById(ele + 'text').style.display = 'block';
            }
        },

        hide: function(event) {
            var ele = CartwrightUtil.event.getTarget(event).id.split("_")[0];
            if (ele !== "") {
                document.getElementById(ele + 'text').style.display = 'none';
            }
        }
    }, // end factory tour







    products: {
        hasslid: 0,  // Monitors slide out of items
        canslideonload: 1,

        slideoutonload: function() {
            document.getElementById('productinf').style.width = '0px';
            this.canslideonload = 1;
            var that = this;
            setTimeout(function() {
                // Before we do the slide check that no elements have appeared that would make the slide look daft
                if (that.hadslid === 1) {
                    return;
                }
                if (document.getElementById('standardfeatures')) {
                    if (document.getElementById('standardfeatures').style.display === 'block') {
                        return;
                    }
                }
                if (document.getElementById('popularoptions')) {
                    if (document.getElementById('popularoptions').style.display === 'block') {
                        return;
                    }
                }
                if (document.getElementById('productinf').style.width > 0) {
                    return;
                }
                if (document.getElementById('gallerycont')) {
                    if (document.getElementById('gallerycont').style.display === 'block') {
                        return;
                    }
                }
                that.slideout();
            }, 3000);
        },


        slideout: function() {
            var w = parseInt(document.getElementById('productinf').style.width, 10);
            this.hadslid = 1;
            if (w < 250) {
                document.getElementById('productinf').style.width = (w + 10) + 'px';
                document.getElementById('productinf').style.left = (701 - (w + 10)) + 'px';
                setTimeout(arguments.callee, 1);
            }
        },

        slidein: function() {
            var w = parseInt(document.getElementById('productinf').style.width, 10);
            if (w > 0) {
                document.getElementById('productinf').style.width = (w - 10) + 'px';
                document.getElementById('productinf').style.left = (701 - (w - 10)) + 'px';
                setTimeout(arguments.callee, 1);
            }
        },


        slideproduct: function(a) {
            if (a) {
                return;
            }
            CartwrightWWW.menu.hidesubmenus();
            if (document.getElementById('productinf').style.width === "") {
                document.getElementById('productinf').style.width = '0px';
            }
            if (parseInt(document.getElementById('productinf').style.width, 10) === 0) {
                if ((a !== undefined && this.hasslid === 0) || a === undefined) {
                    this.hideall();
                    this.slideout();
                    this.hasslid = 1;
                }
            } else {
                if (a === undefined) {
                    this.slidein();
                }
            }
        },




        ddprodswap: function(prod, num) {		// Prod is the one to show, num is the number of different ones
            if (num === undefined) {
                num = 4; 						// Set how many options they are as 4 if not sent by function
            }
            for (var i = 1; i <= num; i++) {
                document.getElementById('ddoption' + i).style.display = 'none';
                document.getElementById('ddmenuitem' + i).className = 'ddmenuitem';
            }
            document.getElementById('ddoption' + prod).style.display = 'block';
            document.getElementById('ddmenuitem' + prod).className = 'ddmenuitemselected';
            return false;
        },




        /* Display/hide standard features window where available */
        standardfeatures: function() {
            var ele = document.getElementById('standardfeatures');

            if (!ele) {
                return;  // if we don't have this feature, don't do anything
            }
            this.hasslid = 1;
            if (ele.style.display === 'block') {
                ele.style.display = 'none';
            } else {
                this.hideall();
                ele.style.display = 'block';
            }
        },

        /* Display/hide popular options window where available */
        popularoptions: function(num) {
            if (!num) {
                num = "";
            }
            var ele = document.getElementById('popularoptions' + num);
            if (!ele) {
                return; // if we don't have this feature, don't do anything
            }
            if (ele.style.display === 'block') {
                ele.style.display = 'none';
            } else {
                this.hideall();
                ele.style.display = 'block';
            }

        },

        hideall: function() {
            CartwrightWWW.menu.hidesubmenus();
            this.slidein();
            var pele = document.getElementById('popularoptions');
            if (pele) {
                pele.style.display = 'none';
            }
            pele = document.getElementById('popularoptions1');
            if (pele) {
                pele.style.display = 'none';
            }
            var sele = document.getElementById('standardfeatures');
            if (sele) {
                sele.style.display = 'none';
            }
        }
    }, // end products
    productpageswap: {
        showpage: function(pages, page) {
            var allpages = pages.split(" ");
            for (var i = 0, l = allpages.length; i < l; i++) {
                this.hideele(allpages[i]);
            }

            var ele = document.getElementById(page);
            if (ele) {
                ele.style.display = 'block';
            }
        },

        hideele: function(ele) {
            if (document.getElementById(ele)) {
                document.getElementById(ele).style.display = 'none';
            }
        }
    }, // End coldstore
    demountprocedure: {
        next: function(current, last) {
            document.getElementById('demproc' + current).style.display = 'none';
            document.getElementById('demproc' + (current + 1)).style.display = 'block';
        },
        prev: function(current, last) {
            document.getElementById('demproc' + current).style.display = 'none';
            document.getElementById('demproc' + (current - 1)).style.display = 'block';
        },
        allowhide: true,
        shownav: function(c, a) {
            if (a === 1) {
                this.allowhide = false;
            }
            var ele = document.getElementById('demountnav' + c);
            ele.style.display = 'block';
            var h = parseInt(ele.style.height, 10);
            setTimeout(function() {
                if (h < 20) {
                    ele.style.height = (h++) + "px";
                    ele.style.top = (310 - h) + "px";
                    setTimeout(arguments.callee, 1);
                }
            }, 1);
        },
        hidenav: function(c) {

            var ele = document.getElementById('demountnav' + c);
            ele.style.display = 'block';
            var h = parseInt(ele.style.height, 10);
            setTimeout(function() {
                if (h > 0 && CartwrightWWW.demountprocedure.allowhide) {
                    ele.style.height = (h--) + "px";
                    ele.style.top = (310 - h) + "px";
                    setTimeout(arguments.callee, 1);
                }
            }, 50);
        },
        allowhiding: function() {
            this.allowhide = true;
        }
    },


    finance: {
        finance: function(a) {
            // Unrolled from loop deliberately
            document.getElementById('finance1').style.display = 'none';
            document.getElementById('finance2').style.display = 'none';
            document.getElementById('finance3').style.display = 'none';
            document.getElementById('finance4').style.display = 'none';
            document.getElementById('finance' + a).style.display = 'block';
        }
    }, // end finance


    video: {
        switchvideo: function(v, vidcount) {  // Switch between videos            
            var xmlHttp;
            if (!(xmlHttp = new CartwrightUtil.Xhr())) { // Create AJAX object and check it exists
                return true; // If we couldn't create the AJAX object return true and follow the link
            }
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState === 4) {
                    for (var i = 0; i <= vidcount; i++) {
                        if (document.getElementById("vidselect" + i).className === 'videoselectedodd') {
                            document.getElementById("vidselect" + i).className = 'videoselectodd';
                        }
                        if (document.getElementById("vidselect" + i).className === 'videoselectedeven') {
                            document.getElementById("vidselect" + i).className = 'videoselect';
                        }

                    }
                    if (document.getElementById("vidselect" + v).className === 'videoselectodd') {
                        document.getElementById("vidselect" + v).className = 'videoselectedodd';
                    } else {
                        document.getElementById("vidselect" + v).className = 'videoselectedeven';
                    }

                    document.getElementById("video").innerHTML = xmlHttp.responseText;
                }
            };
            var geturl = 'videoinc.asp?n=' + v;
            xmlHttp.open("GET", geturl, true);
            xmlHttp.send(null);
            return false;  	// cancel form submission     
        }
    },
    used: {
        showusedmenu: function(a, b) {
            if (!b) {
                b = 3;
            }
            for (var i = 1; i <= b; i++) {
                document.getElementById("used" + i).style.display = "none";
                document.getElementById("usedmenu" + i).className = "";
            }
            document.getElementById("used" + a).style.display = "block";
            document.getElementById("usedmenu" + a).className = "cheetahmenuselected";
        },

        usedmenu: function(menu) {
            var ele = document.getElementById(menu + 'search');
            if (ele.style.display === 'block') {
                ele.style.display = 'none';
            } else {
                ele.style.display = 'block';
            }
            return false;
        },
        /*
        * Create the vehicle object from the spec passed to it
        * The function are added next via prototype to save memory
        */
        vehicles: [],
        vehicle: function(cts, type, year, axle, suspension, taillift, shutter, price, pricecat, quantity, image) {
            this.cts = cts;
            this.type = type;
            this.typematch = true;
            this.year = year;
            this.yearmatch = true;
            this.axle = axle;
            this.axlematch = true;
            this.suspension = suspension;
            this.suspensionmatch = true;
            this.taillift = taillift;
            this.tailliftmatch = true;
            this.shutter = shutter;
            this.shuttermatch = true;
            this.price = price;
            this.pricecat = pricecat;


            this.quantity = quantity;
            this.vis = true;
            this.image = image;
        },
        initUsedFunctions: function() { // Adds the prototype to the vehicle object
            /*
            * Function to display the vehicle
            * First it checks if there is a match (vis has been set to true). If it is, it checks to see if the vehicle
            * has already been displayed. If so it can just write this information, else it creates the info and then write sit
            * 
            * I've done it this way to save loading time etc by only showing the vehicles information when it is requseted, and then
            * keeping that info stored if it gets selected again
            */
            this.vehicle.prototype.displayme = function() {
                var ret;
                if (this.vis) { // If matches on all items, display
                    if (document.getElementById(this.cts).innerHTML === "") {   // If not initialised yet, set the div up
                        var ih = '<div style="float: left; padding: 0px;">';
                        //ih+='<img src="img/used_sales/' + this.cts + '.jpg" alt="" />';
                        ih += '<img src="' + this.image + '" alt="" width="133" height="100" />';
                        ih += '</div>';
                        ih += '<div style="float: left; margin-left: 5px; width: 140px; text-align: left; padding-top: 5px">';
                        ih += 'Product Type: ' + this.type;
                        ih += '<br/>';
                        ih += 'Year Of Man: ' + this.year;
                        ih += '<br/>';
                        ih += 'Axles:' + this.axle;
                        ih += '<br/>';

                        ih += 'Quantity:' + this.quantity;
                        ih += '<br/>';
                        ih += 'Price:' + this.price;
                        ih += '<br/>';
                        //ih+='Suspension:' + this.suspension;
                        //ih += '<br/>';
                        //ih+='Taillift:' + this.taillift;
                        //ih+='<br/>';
                        //ih+='Shutter/Door:' + this.shutter;
                        //ih+='<br/>';
                        ih += '<a href="useddetails.asp?id=' + this.cts + '" onclick="CartwrightWWW.used.moredetails(\'' + this.cts + '\'); return false;">> More Details</a>';
                        ih += '</div>';
                        document.getElementById(this.cts).innerHTML = ih;
                    }
                    document.getElementById(this.cts).style.display = 'block';
                    ret = 1;
                } else {
                    document.getElementById(this.cts).style.display = 'none';   // Don't want to show it, so hide it
                    ret = 0;
                }
                return ret;
            };
            this.vehicle.prototype.hideme = function() {
                document.getElementById(this.cts).style.display = 'none';
            };
            this.vehicle.prototype.filtercheck = function(filtertype) {
                filtertype = filtertype.replace(" ", "_");
                var setitem = filtertype + 'match';
                this[setitem] = false;  // Set to false
                if (document.getElementById(filtertype + '_Any').checked) {
                    this[setitem] = true; // If any is checked, set to true
                }
                var checkele = filtertype + "_" + this[filtertype].replace(/ /g, "-");
                if (document.getElementById(checkele)) {
                    if (document.getElementById(checkele).checked) {
                        this[setitem] = true; // If the matching element is checked, set to true
                    }
                }
                this.vis = this.typematch && this.yearmatch && this.axlematch && this.tailliftmatch && this.shuttermatch && this.pricecatmatch;
            };

            this.vehicle.prototype.additem = function() {
                return '<div class="usedinfo" id="' + this.cts + '" style="display: none"></div>\r';
            };
        },
        setitemvisible: function(filtertype, ele, filtervalue) {
            if (ele.id !== filtertype + '_Any') {
                ele.disabled = true;
                // Cancel the display of all other checkboxes	
                var listelement = ele.parentNode.parentNode.parentNode.childNodes;
                for (var i = 0; i < listelement.length; i++) {
                    var listelement2 = listelement[i].childNodes;
                    if (listelement2 !== undefined) {
                        for (var j = 0; j < listelement2.length; j++) {
                            var listelement3 = listelement2[j].childNodes;
                            if (listelement3 !== undefined) {
                                for (var k = 0; k < listelement3.length; k++) {
                                    if (listelement3[k].id !== undefined) {
                                        listelement3[k].checked = false;
                                    }
                                }
                            }
                        }
                    }
                }
                ele.checked = true;
            }
        },

        uncheck: function(ele) {
            var listelement = ele.parentNode.parentNode.parentNode.childNodes;
            for (var i = 0; i < listelement.length; i++) {
                var listelement2 = listelement[i].childNodes;
                if (listelement2 !== undefined) {
                    for (var j = 0; j < listelement2.length; j++) {
                        var listelement3 = listelement2[j].childNodes;
                        if (listelement3 !== undefined) {
                            for (var k = 0; k < listelement3.length; k++) {
                                if (listelement3[k].id !== undefined) {
                                    listelement3[k].checked = false;
                                }
                            }
                        }
                    }
                }
            }
        },

        checkallblank: function(ele) {
            var elechecked = false;
            var listelement = ele.parentNode.parentNode.parentNode.childNodes;
            for (var i = 0; i < listelement.length; i++) {
                var listelement2 = listelement[i].childNodes;
                if (listelement2 !== undefined) {
                    for (var j = 0; j < listelement2.length; j++) {
                        var listelement3 = listelement2[j].childNodes;
                        if (listelement3 !== undefined) {
                            for (var k = 0; k < listelement3.length; k++) {
                                if (listelement3[k].id !== undefined) {
                                    elechecked = elechecked || listelement3[k].checked;
                                }
                            }
                        }
                    }
                }
            }
            return elechecked;
        },


        addallitems: function() {      // No longer needed?
            var dispele = document.getElementById("searchresults");
            var displaydata = "";
            for (var i = 0; i < this.vehicles.length; i++) {
                displaydata += this.vehicles[i].additem();
            }
            dispele.innerHTML = displaydata;

            this.dofilter();
        },

        usedpage: function(page) {
            this.dofilter(undefined, page);
        },

        dofilter: function(ele, page) {
            if (ele) {
                if (ele.id.split("_")[1] === "Any") {
                    this.uncheck(ele); // If it is the any string, run the uncheck process
                    document.getElementById(ele.id.split("_")[0] + "_Any").checked = true;
                    document.getElementById(ele.id.split("_")[0] + "_Any").enabled = false;
                } else {
                    document.getElementById(ele.id.split("_")[0] + "_Any").checked = false;
                    document.getElementById(ele.id.split("_")[0] + "_Any").enabled = true;
                }
                if (ele.checked === false && !this.checkallblank(ele)) { // If no elements are checked, check any - first make sure we have unchcked for speed
                    document.getElementById(ele.id.split("_")[0] + "_Any").checked = true;
                    document.getElementById(ele.id.split("_")[0] + "_Any").enabled = false;
                }
            }




            if (ele) {
                for (var i = 0; i < this.vehicles.length; i++) {
                    this.vehicles[i].filtercheck(ele.id.split("_")[0]); // Run all the filters
                }
            } else {
                for (i = 0; i < this.vehicles.length; i++) {
                    this.vehicles[i].filtercheck("type");
                    this.vehicles[i].filtercheck("year");
                    this.vehicles[i].filtercheck("axle");
                    this.vehicles[i].filtercheck("taillift");
                    this.vehicles[i].filtercheck("shutter");
                    this.vehicles[i].filtercheck("pricecat");
                }
            }


            // Check what page we're on, filter the results based on this	
            var currentpage = 1;
            if (page) {
                currentpage = page;
            }
            var pagelength = 15;
            var firstresult = ((currentpage - 1) * pagelength) + 1;
            var lastresult = firstresult + pagelength - 1;

            var visibleresults = 0;
            // Actually show them
            for (i = 0; i < this.vehicles.length; i++) {
                visibleresults += this.vehicles[i].vis;
                if (visibleresults >= firstresult && visibleresults <= lastresult) {
                    this.vehicles[i].displayme();
                } else {
                    this.vehicles[i].hideme();
                }
            }
            var pageele = document.getElementById("pageselect");
            if (visibleresults > 0) {
                var pages = Math.ceil(visibleresults / pagelength);
                if (pages === 1) {
                    pageele.innerHTML = '&nbsp;';
                } else {
                    var newpageeleHTML = '';
                    for (i = 1; i <= pages; i++) {
                        if (currentpage === i) {
                            newpageeleHTML += i + '&nbsp';
                        } else {
                            newpageeleHTML += '<a href="javascript: CartwrightWWW.used.usedpage(' + i + ')">' + i + '</a>&nbsp;'; // TODO: Naughty - fix and add event handler instead
                        }
                    }
                    pageele.innerHTML = newpageeleHTML;
                }
                lastresult = (visibleresults < lastresult) ? visibleresults : lastresult;
                document.getElementById('resultsele').innerHTML = 'Displaying ' + firstresult + ' to ' + lastresult + ' of ' + visibleresults + ' matches for your search';
            } else {
                pageele.innerHTML = '&nbsp;';
                document.getElementById('resultsele').innerHTML = 'No matches found';

            }
            document.getElementById('searchresults').style.height = 'auto';
            if (parseInt(document.getElementById('searchresults').offsetHeight, 10) < 150) {
                document.getElementById('searchresults').style.height = '150px';
            }
        },

        moredetails: function(cts) {


            var xmlHttp;
            if (!(xmlHttp = new CartwrightUtil.Xhr())) { // Create AJAX object and check it exists
                return true; // If we couldn't create the AJAX objectm return true and let the link follow through
            }
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState === 4) {
                    document.getElementById("useddetails").innerHTML = xmlHttp.responseText;
                }
            };
            document.getElementById("useddetails").innerHTML = "Loading...";
            var lb = new CartwrightUtil.BgFade(document.getElementById("useddetails"));
            lb.width = "660px";
            lb.show();
            var geturl = 'useddet.asp?id=' + cts;
            xmlHttp.open("GET", geturl, true);
            xmlHttp.send(null);
            return false;  // Prevent link being clicked if everything worked out
        },

        closeusedwin: function() {
            document.getElementById('useddetail').style.display = 'none';
            document.getElementById('usedinfo').style.display = 'none';
        }
    },
    news: {
        switchpage: function(p) {
            document.getElementById('news1').style.display = 'none';
            document.getElementById('news2').style.display = 'none';
            document.getElementById('news3').style.display = 'none';
            document.getElementById('news' + p).style.display = 'block';
        },
        showarticle: function(i) {
            if (document.getElementById('article' + i).style.display === 'none') {
                document.getElementById('article' + i).style.display = 'block';
                document.getElementById('pr' + i).style.backgroundImage = 'url(img/news/arrow_up.jpg)';
            } else {
                document.getElementById('article' + i).style.display = 'none';
                document.getElementById('pr' + i).style.backgroundImage = 'url(img/news/arrow_down.jpg)';
            }
        }

    },
    timeline: {
        timelinesliderdragging: 0, // Tells us if the thing is being dragged
        timeline: [], // Array to contain all timeline items

        /* Object to contain each event - contructor!!! */
        Timelineevent: function(y) {
            this.y = y;
            this.l = 0;
            this.div1 = undefined;
            this.div2 = undefined;


            this.additem();
        },


        /* Returns the element closest to the current slider position */
        getclosest: function() {
            var slider = document.getElementById("slider");
            var closest;
            var distance = 1000; // Dummy val, can't be exceeded
            for (var i = 0, getl = this.timeline.length - 1; i <= getl; i++) {
                var d = Math.abs(this.timeline[i].l - parseInt(slider.style.left, 10) - 10); // Gets the distance from this item - use abs to remove negative
                if (d < distance) {  // If this is the new closest, set the distance to this one for future checks
                    closest = this.timeline[i];
                    distance = d;
                }
            }
            return closest; // Returns the timeline item
        },


        /* Starts sliding towards the new item */
        gotoitem: function(timelineitem) {
            var slider = document.getElementById("slider");
            var dir;
            dir = parseInt(slider.style.left, 10) > timelineitem.l ? -1 : 1;
            var t = this;   // To pass in to anonymous function - possibly do using call?
            setTimeout(function() {
                var slider = document.getElementById("slider");
                var cursliderlocation = parseInt(slider.style.left, 10);
                cursliderlocation = cursliderlocation + (dir * 5);
                if (dir * cursliderlocation < dir * timelineitem.l) {
                    slider.style.left = cursliderlocation + 'px';
                    t.getclosest().showinfo();
                    setTimeout(arguments.callee, 1);
                } else {
                    slider.style.left = (timelineitem.l - 7) + 'px';
                    timelineitem.showinfo();
                }
            }, 1);
        },



        /* Event handler to go to the selected item when it is clicked on */
        gototimelineitem: function(curobject) {
            return function(e) {
                e = window.event || e;
                var target = e.target ? e.target : e.srcElement;
                var targetid = target.id.replace('timelineselect_', "");
                for (var i = 0, getl = curobject.timeline.length - 1; i <= getl; i++) {
                    if (curobject.timeline[i].y === targetid) {
                        curobject.gotoitem(curobject.timeline[i]);
                    }
                }
            };
        },


        /* Starts slider running */
        startslider: function(curobject) {
            return function(e) {
                document.body.focus(); /* Stops text selection etc */
                e = window.event || e;
                curobject.timelinesliderdragging = 1;
                return false;
            };
        },

        /* Handles slider being dragged */
        dragslider: function(curobject) {
            return function(e) {
                e = window.event || e;
                var target = e.target ? e.target : e.srcElement;
                target.ondragstart = function() {
                    return false;       // Clear the drag function
                };
                if (curobject.timelinesliderdragging === 1) {
                    var slider = document.getElementById("slider");
                    var sliderparent = document.getElementById("slidercont");
                    slider.style.left = (CartwrightUtil.mousePosition.getMouseX(e) - CartwrightUtil.elePosition.findPosX(sliderparent) - 10) + 'px';
                }
            };
        },

        /* Stops the drag and moves to the nearest item */
        stopdragslider: function(curobject) {
            return function(e) {
                if (curobject.timelinesliderdragging === 1) {
                    curobject.gotoitem(curobject.getclosest());
                }
                curobject.timelinesliderdragging = 0;
            };
        },

        /* Initialises the timeline (called on startup)
        * Sets up the prototype functions for the object
        * Pushes the timeline parts to the array
        * Adds the event handlers to the slider
        */
        initialisetimeline: function() {

            // Add prototypes
            this.Timelineevent.prototype.container = this;  // This is a reference to the main host object so it can be used from within the prototypes
            /* Hides all other timeline items (including the welcome one) and shows this one */
            this.Timelineevent.prototype.showinfo = function() {
                document.getElementById("welcome").style.display = 'none';
                document.getElementById("welcome1").style.display = 'none';
                for (var i = 0, getl = this.container.timeline.length - 1; i <= getl; i++) {
                    this.container.timeline[i].hideinfo();
                }
                this.div1.style.display = 'block';
                this.div2.style.display = 'block';
            };

            /* Hides the information div for this event */
            this.Timelineevent.prototype.hideinfo = function() {
                this.div1.style.display = 'none';
                this.div2.style.display = 'none';
            };

            /* Adds the item and displays the bar on the timeline */
            this.Timelineevent.prototype.additem = function() {
                var sliderparent = document.getElementById("slidercont");   // Gets the main div the slider exists within
                var newdiv = document.createElement('div');                 // Creates new div to contain this item
                this.l = Math.floor((this.y - 1950) / 60 * 483 + 194);      // Calculates position based on item year
                newdiv.style.left = this.l + 'px';                          // Positions use PX
                newdiv.className = 'timelinepoint';
                newdiv.id = 'timelineselect_' + this.y;                     // Set ID to include year
                CartwrightUtil.event.addHandler(newdiv, "click", this.container.gototimelineitem(this.container)); // Sets event handler for a click to be gototimelineitem below
                sliderparent.appendChild(newdiv);
                this.div1 = document.getElementById('timeline_' + this.y);  // These two lines set name of the matching information div
                this.div2 = document.getElementById('timelinea_' + this.y);
            };

            this.timeline.push(new this.Timelineevent('1954'));
            this.timeline.push(new this.Timelineevent('1958'));
            this.timeline.push(new this.Timelineevent('1968'));
            this.timeline.push(new this.Timelineevent('1970'));
            this.timeline.push(new this.Timelineevent('1978'));
            this.timeline.push(new this.Timelineevent('1987'));
            this.timeline.push(new this.Timelineevent('1989'));
            this.timeline.push(new this.Timelineevent('1990'));
            this.timeline.push(new this.Timelineevent('1993'));
            this.timeline.push(new this.Timelineevent('1994'));
            this.timeline.push(new this.Timelineevent('2003'));
            this.timeline.push(new this.Timelineevent('2005'));
            this.timeline.push(new this.Timelineevent('2007'));
            this.timeline.push(new this.Timelineevent('2008'));
            var slider = document.getElementById("slider");
            CartwrightUtil.event.addHandler(slider, "mousedown", this.startslider(this));
            CartwrightUtil.event.addHandler(slider, "mousemove", this.dragslider(this));
            CartwrightUtil.event.addHandler(slider, "mouseup", this.stopdragslider(this));
            CartwrightUtil.event.addHandler(slider, "mouseout", this.stopdragslider(this));
            document.getElementById("loading").style.display = 'none';
            document.getElementById("slidercont").style.display = 'block';
        }

    }
};	
  

