/*!
* motorsajax.js
*/

// hack to include referer data for IE links
var referLink = null;

function urlopenwithreferer(url)
{
    if (!referLink)
        referLink = document.createElement('a');
    referLink.href = url;
    referLink.target = "_new";
    document.body.appendChild(referLink);
    referLink.click();
}

if (typeof motors == 'undefined') {
    var motors = {};
}

if (typeof motors.ajax == 'undefined') {
    motors.ajax = {};
}

if (typeof motors.carscompare == 'undefined') {

    motors.carscompare = {
        "carsdata": {
            "item": []
        },
        "isCacheValid": true
    }
}

if (typeof motors.constants == 'undefined') {
    motors.constants = {};
}

if (typeof (motors.curtain) == 'undefined') {
    motors.curtain = {};
}


(function () {
    var _create = function () {
        $curtain = $(document.createElement('div'));
        $wait = $(document.createElement('div'));
        $wait.addClass('wait')
         .appendTo($curtain);
        $curtain.addClass('curtain')
            .appendTo('body');


        $curtain.click(function () {

            var topIndex = 0;
            var itemIndex = 0;
            var itemId;
            $('.ajax-wrapper:visible').each(function () {

                itemIndex = parseInt($(this).find('.ajax').css('z-index'));
                if (isNaN(itemIndex)) { itemIndex = parseInt($(this).css('z-index')); }


                if (itemIndex > topIndex) {
                    topIndex = itemIndex;
                    itemId = $(this).attr("id");
                }

            });

            motors.ajax.close(itemId);
            motors.curtain.setCurtainIndex();

        });


        return $curtain;
    };
    var _get = function () {
        var $curtain = $('.curtain');
        if ($curtain.length == 0)
            $curtain = _create();
        return $curtain;


    };
    $.extend(motors.curtain, {

        drop: function (showWait) {
            _get().show();
            motors.curtain.wait(showWait);
        },

        raise: function () {
            _get().hide();
            motors.curtain.wait(false);
        },

        wait: function (showWait) {
            var $wait = $('.curtain .wait');
            if (showWait) {
                $wait.show();
            } else {
                $wait.hide();
            }
        },

        isVisible: function () {
            return _get().is(':visible');
        },

        setCurtainIndex: function () {

            var curtainIndex;

            if ($('.curtain').css('z-index')) {
                curtainIndex = parseInt($('.curtain').css('z-index'));
            }
            else {
                curtainIndex = 500;
            }

            var popupsNr = $('.ajax:visible').length;

            $('.ajax:visible').each(function (index) {

                $(this).css('z-index', curtainIndex - 10);

                if (index == popupsNr - 1) {                    
                    $(this).css('z-index', curtainIndex + 10);
                    //history check should be highest z-index as it appears on vehicle details, so we check if the class is history check
                    $('#historyCheck div.ajax').css('z-index', 5000);                              
                }
            });
        }
    });
})();


$.extend(motors, {

    buildUrl: function (url) {
        var absUrl = location.protocol + '//' + location.host + motors.helper.applicationRoot + url;
        return absUrl;
    },

    // load a single javascript file into the page
    loadJS: function (jsFile) {
        var jsPath = motors.buildUrl(jsFile);
        var selector = "script[src='" + jsPath + "']";
        if ($(selector).length == 0) {
            var script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = jsPath;
            $('head').append(script);
        }
    },

    loadCSS: function (cssFile) {

        var absCss = motors.buildUrl(cssFile);

        var selector = "link[href='" + absCss + "']";
        if ($(selector).length == 0) {
            var link = document.createElement('link');
            link.rel = 'stylesheet';
            link.type = 'text/css';
            link.href = absCss;
            $('head').append(link);
        }
    }


});


$.extend(motors.constants, {

    cookieOptions: { expires: 30, path: '/' },
    emptyArray: [],
    isPrivateSeller: 0,
    map: {},
    hiddenjson: "input[id$='init_data']",
    para_num_edge_entries: 2, //Pagination
    para_num_display_entries: 10,
    para_items_per_page: 15,
    dealersMap: {},
    hiddencheckboxfilter: 'ctl00_hiddencheckboxfilter',
    hiddenresults: '',
    timeout: 1500000,
    images: {},
    iskeyword: false,
    navigatorsArray: {},
    globalFauxCheckBoxes: false

});

motors.ajax.YUItrigger = true; // support variable to avoid multiple trigers for showVehicle

// Initialise YUI history
$(function () {
    if (typeof (YUI) != 'undefined') {
        YUI().use('history', function (Y) {
            Y.History.initialize('#yui-history-field', '#yui-history-iframe');
            motors.ajax.Y = Y;

            var updateCarId = function (carid) {
                if ((carid == null) || (carid == '')) {
                    // with no arguments, this will close all ajax popups
                    motors.ajax.close();
                    motors.curtain.raise();
                    return;
                }
                else if (carid.match(/^\d+$/)) {
                    if (motors.ajax.YUItrigger) {
                        motors.ajax.showVehicle(carid);
                    }
                }

                motors.ajax.YUItrigger = true;
            }

            Y.History.register('carid', '').on('history:moduleStateChange', updateCarId);

        });
    }
});

$.extend(motors.ajax, {
    // populate an element via an ajax query, and load any javascript files as necessary.
    // file: the http handler that will return our data
    // data: variables that will be passed to the handler
    // id: id of the element to inject data into.  if it doesn't exist, it'll be created.
    // e.g. motors.ajax.load('myhandler.ashx', {id: 'bob'}, 'mycontrol')
    load: function (file, options, id, cleanup) {

        if (motors.ajax.preventRequests == true) { return false; }

        // TODO: Default options
        var _type = "GET",
            _data,
            _curtain = false,
            requestType,
            requestCurrent;

        if (file.indexOf(motors.helper.applicationRoot) == -1) {
            file = motors.helper.applicationRoot + file;
        }

        /**/
        if (options != null) {

            if (options.Type != undefined) {
                _data = encodeURIComponent(JSON.stringify(motors.constants.jsonfilter));
                _type = "POST";
                // Only do curtain related stuff if the curtain isn't already visible
                _curtain = false; // !motors.curtain.isVisible();
                file = file + '&SearchGuid=' + $('#SearchGuid').val();
            } else { _data = $.extend(options.query, { 'SearchGuid': $('#SearchGuid').val() }) }

        } else {
            _data = null;
        }


        // TODO: Decide whether we need to show progress indicator
        if (_curtain) { motors.curtain.drop(true); }

        if (typeof (motors.ajax.requests) == 'undefined')
            motors.ajax.requests = {};

        // modified abort code for IE7, the old one wasn't being liked.
        requestType = options ? options.Type : 'default';
        requestCurrent = motors.ajax.requests[requestType];
        if (typeof requestCurrent !== 'undefined') {
            requestCurrent.abort();
        }

        motors.curtain.wait(true);

        motors.ajax.requests[requestType] = $.ajax({
            type: _type,
            url: file,
            timeout: motors.constants.timeout,
            data: _data, //(options != null) ? options.query : null,
            dataType: 'html',
            error: function (XMLHttpRequest, textStatus, errorThrown) {

                if (_curtain)
                    motors.curtain.raise();
                // TODO: Send details to error handler on site
                if (cleanup)
                    cleanup();
            },
            success: function (data, textStatus) {

                var dealerList = $('div.searchResults').find("div[id$='dealerList']");
                if (dealerList.length > 0) {
                    dealerList.hide();
                }

                /*MS Ad tags fix, MS removed function to refresh ads so had to write in emergency code to refresh on Ajax successs*/
                //checks if leaderboard is there then on success refreshes ads
                var elemAd = document.getElementById('AdTag_MotorsLeaderBoard');
                if (elemAd != null) {
                    elemAd.innerHTML = "";
                    dapMgr.renderAd("AdTag_MotorsLeaderBoard", "&PG=UKMGM1&AP=1390", 728, 90);
                }
                //checks if skyscarper is there then on success refreshes ads
                var elemAdSky = document.getElementById('AdTag_MotorsSkyScraper_TwoCol');
                if (elemAdSky != null) {
                    elemAdSky.innerHTML = "";
                    dapMgr.renderAd("AdTag_MotorsSkyScraper_TwoCol", "&PG=UKMGM3&AP=1090", 160, 600);
                }
                //checks if skyscraper and mpu is there then on success refreshes ads as mpu is on RNG sites
                var elemAdmpu = document.getElementById('mpu');
                if ((elemAdmpu != null) && (elemAdSky != null)) {
                    elemAdmpu.innerHTML = "";
                    dapMgr.renderAd("mpu", "&PG=UKMGM2&AP=1089", 300, 250);
                }
                /*End MS Tags*/

                if (data.indexOf('No postcode given by Fast') != -1) {

                    motors.setLocationCookie();

                    toggleSliders(false);
                    toggleSearchOptions(false);

                    if (dealerList.length > 0) {
                        $('div.searchResults')
                            .find("div[id$='dealerList']").show().end()
                            .find("div[id$='noResultText'], div[id$='searchResultText'], div[id$='topLine']").hide();
                    }
                    else {
                        $('div.searchResults')
                            .find("div[id$='noPostcode']").show().end()
                            .find("div[id$='noResultText'], div[id$='searchResultText'], div[id$='topLine']").hide();
                    }

                    motors.structure.togglePagination(true);
                    motors.ajax.ajaxSuccess(options.Type, "", options.UpdateNav, 200);

                    return false;

                } else {

                    $('#resultRows, .search-results-text, .topLine').show();

                    //persistent AtoZ dealer links
                    if (typeof id != 'undefined' && (id == 'historyCheck' || !! ~id.indexOf('carfinder') || id == 'financeForm')) {
                        motors.ajax.atozReveal();
                    }

                    if (motors.constants.jsonfilter != undefined) {
                        if (motors.constants.jsonfilter.document.LocationUniqueId) {
                            toggleSliders(true);
                            toggleSearchOptions(true);
                        }
                    }

                    /*start location patch (content wrapped in new condition above)*/

                    if ((options != null) && (options.Type != undefined)) {

                        //alert(motors.ajax.requests[requestType].status);                  
                        motors.ajax.ajaxSuccess(options.Type, data, options.UpdateNav, motors.ajax.requests[requestType].status)

                    }
                    else {

                        // TODO: We ought to be able to switch to document.getElementById with no ill effects
                        if (options && options.isTab) {

                            $('.car-' + options.query.carID).addClass('requestDone');
                            $('.car-' + options.query.carID).html(data);

                        } else if (options && options.isMap) {

                            //TODO: make this suck less, and ditch the unecessary noddy .
                            //had to hack the heck out of it to get it working. originally the 3rd time it ran it failed every time without throwing an error. LOL :|
                            var selector = '#' + id;
                            var $selector = $(selector);
                            var element = $(selector).get(0);
                            if (element == null) {
                                var div = document.createElement('div');
                                div.id = id;
                                div.className = 'ajax-wrapper';
                                document.body.appendChild(div);
                                $selector = $(div);
                            }
                            var vOffset = (options && options.vOffset) ? options.vOffset : 50;
                            vOffset += window.pageYOffset || document.documentElement.scrollTop;
                            if (typeof vOffset == 'undefined') { vOffset += document.documentElement.scrollTop; };

                            var code = '<div id="map-container" class="ajax" style="padding:10px; background:#fff; border:3px solid #6AA91A; -moz-border-radius:8px;">' +
                                        '<div id="map-canvas" style="width:600px; height:300px;">Loading Map...</div>' +
                                        '<div class="close">close</div>' +
                                   '</div>';
                            $selector
                                .html(code)
                                .find('div.ajax')
                                .css({
                                    'top': vOffset,
                                    'left': Math.round(($(window).width() / 2) - ($('div.ajax').width() / 2)) + 'px',
                                    'margin-left': 0
                                })
                                .show()
                                .find('div.close').click(function () {
                                    $('#dealerMap').remove();
                                    motors.curtain.raise(true);
                                });

                            googleMap(options.mapStart, options.mapEnd, '', options.dealerId);

                        } else if (options && options.isCompare) {

                            var carData = JSON.parse(data, null);

                            if (motors.carscompare.carsdata.item.length == 5) {

                                alert("You can add maximum of 5 cars ");
                                return false;

                            } else {

                                motors.carscompare.carsdata.item.push(carData);
                                motors.addCarToCompare(options.query.carID);

                            }

                        } else if (options && options.isNewCarDetail) {

                            $('.' + options.query.tab + '-car-' + options.query.carID).addClass('requestDone');
                            $('.' + options.query.tab + '-car-' + options.query.carID).html(data);

                        } else {

                            var selector = '#' + id;
                            var $selector = $(selector);
                            var element = $(selector).get(0);

                            // Create the element if it doesn't exist
                            if (element == null) {
                                var div = document.createElement('div');
                                div.id = id;
                                div.className = 'ajax-wrapper';
                                document.body.appendChild(div);

                                $selector = $(div);
                            }

                            //Default to a 50px offset from the top of the page                        
                            var vOffset = (options && options.vOffset) ? options.vOffset : 50;
                            vOffset += window.pageYOffset || document.documentElement.scrollTop;

                            if (typeof vOffset == 'undefined') { vOffset += document.documentElement.scrollTop; };

                            $selector.empty()
                                 .append(data)
                                 .find('.ajax')
                                 .css({
                                     'top': vOffset,
                                     'left': Math.round(($(window).width() / 2) - ($('.ajax').width() / 2)) + 'px',
                                     'margin-left': 0
                                 })
                                 .show();

                            if (options && options.cssClass) {
                                $selector.addClass(options.cssClass);
                            }

                            // Add the close click handler
                            // The latter three need to be removed, eventually (.close, .closetext, .closebottom)
                            $selector.find('.ajax-close, .close-text, .close, .closetext, .closebottom').each(function () {
                                $(this).bind('click', function () {
                                    motors.ajax.close(id);
                                });
                            });

                        }
                    }


                } /* end location patch  (content wrapped in new condition above) */

                if ((_curtain) && (typeof motors.curtain != 'undefined')) {
                    motors.curtain.raise();
                }
                motors.curtain.setCurtainIndex();
                motors.curtain.wait(false);
            }
        });

    },


    close: function (id) {
        var selector = '#' + id;
        if ((id != null) && (selector.length > 1)) {
            $(selector).find('.ajax').hide();
        } else {
            $('.ajax').hide();
        }

        if (typeof motors.curtain != 'undefined') { motors.curtain.setCurtainIndex(); };

        var rise = true;

        // if no visvible popups rise
        $('.ajax').each(function () {
            if ($(this).is(':visible')) { rise = false; }
        });

        if (rise) {
            if (typeof motors.curtain != 'undefined') { motors.curtain.raise(); };
        };

    },

    getModels: function (event) {
        var $elem = $(event.target);
        var isModelSelected = false;

        if ($elem.hasClass('makeModelLinkSelected')) {
            $elem = $elem.parent().siblings('.makeModelLink')
            isModelSelected = true;

        }

        var make = $elem.text();
        var identifier = '.nav-wrapper.nav-manufacturers li.' + $elem.parent().attr('class').replace(' active', '');
        identifier += ' ,.nav-wrapper.nav-popularmanufacturers li.' + $elem.parent().attr('class').replace(' active', '');

        motors.navigators.openModelsNavigator($elem, 'nav-models', identifier, make);



        if (isModelSelected) {

            var $itemFly = $(identifier).find('.fly-item')
            $itemFly.css('margin-left', '10px').css('top', $itemFly[0].offsetTop + 15 + 'px')
        }

        // TODO: Need to change the 'link' to being a div?

        return false;
    },

    navigatorRequest: function (navigator) {

        motors.ajax.ajaxGenerix('RequestNavigators', 0);

    },

    requestData: function () {
        //motors.sliders.buildSlidersQuery(''); // this is all the function did.
        motors.constants.jsonfilter.document.postcode = $('#nav-postcode').attr('value');

        motors.ajax.ajaxGenerix('RequestData', 0)
        //motors.search.updateNavigatorCounts();
        //highlights tabs that have selected items under them
        motors.structure.indicateTab(motors.constants.jsonfilter.document);
    },

    buildRequestUrl: function (requestType, page) {

        var _url = "";

        switch (requestType) {

            case "Pagination":
                page = parseInt(page) + 1;
                _url = motors.buildUrl("/Ajax/search.ashx");
                break;
            case "RequestData":
                _url = motors.buildUrl("/Ajax/search.ashx");
                break;
            case "DealerMap":
                // Nope, sorry.  We've deleted that file.
                //_url = motors.buildUrl("/Ajax/DealerMap.aspx");
                break;

        }

        _url = _url + "?pageNo=" + page + "&iskeyword=" + motors.checkForKeyWord() + "&OrderBy=" + motors.getSelectedTab();

        return _url;
    },

    ajaxGenerix: function (requestType, page) {

        if (!motors.validate()) { return false; }
        motors.ajax.load(motors.ajax.buildRequestUrl(requestType, page), { Type: requestType })
    },

    ajaxSuccess: function (requestType, ajaxResult, optional, status) {

        var rx = /<filter>(.+?)<\/filter>/;
        var sJson = ajaxResult.match(rx);

        if (sJson instanceof Array && sJson.length > 0) {
            var filter = eval('(' + sJson[1] + ')');
            if (filter && filter.sliders) {
                motors.constants.jsonfilter.document.sliders = filter.sliders;
            }
            if (filter) {
                motors.constants.jsonfilter.document.requestdatetime = filter.document.requestdatetime
                motors.constants.jsonfilter.document.requestedpage = filter.document.requestedpage
                motors.constants.jsonfilter.document.totalresults = filter.document.totalresults
                motors.constants.jsonfilter.document.totalpages = filter.document.totalpages
                motors.constants.jsonfilter.document.numberofresultsperpage = filter.document.numberofresultsperpage
            }
        }

        if (status == 200) {

            //  var topBanner = ajaxResult.slice(ajaxResult.indexOf("<topbanner>") + 11, ajaxResult.indexOf("</topbanner>"));

            //  motors.search.updateNavigatorCounts();

            /* GOOGLE EVENTS TRACKING - Track misc AJAX events as pageviews
            */
            if ((typeof _gaq != 'undefined')) {
                var pageUrl = window.location.href.split(window.location.hostname)[1];
                pageUrl = pageUrl.replace('#', ''); // strip hash from ropey JS
                _gaq.push(['_trackPageview']);
                _gaq.push(['_trackPageLoadTime']);
            }
            /* end GOOGLE EVENT TRACKING */

            switch (requestType) {

                case "Pagination":

                    motors.structure.rebuildResult(ajaxResult.slice(ajaxResult.indexOf("<searchResults>") + 15, ajaxResult.indexOf("</searchResults>")), 'searchResultsHTML', 'Search');
                    motors.structure.rebuildResult(ajaxResult.slice(ajaxResult.indexOf("<impactstrip>") + 13, ajaxResult.indexOf("</impactstrip>")), 'impactStripHTML', 'ImpactStrip');
                    // motors.structure.rebuildResult(topBanner, 'topBannerHTML', 'TopBanner');

                    ; break;

                case "RequestData":

                    motors.structure.rebuildResult(ajaxResult.slice(ajaxResult.indexOf("<searchResults>") + 15, ajaxResult.indexOf("</searchResults>")), 'searchResultsHTML', 'Search');
                    motors.structure.rebuildResult(ajaxResult.slice(ajaxResult.indexOf("<impactstrip>") + 13, ajaxResult.indexOf("</impactstrip>")), 'impactStripHTML', 'ImpactStrip');

                    //                    if (topBanner != "") {

                    //                        $('.defaultTop').hide();
                    //                    } else {

                    //                        $('.defaultTop').show();
                    //                    }

                    //motors.structure.rebuildResult(topBanner, 'top_banner', 'TopBanner');

                    var rrStart = ajaxResult.indexOf("<RelatedReviews>") + 16;
                    var rrEnd = ajaxResult.indexOf("</RelatedReviews>");
                    if (rrStart < rrEnd) {
                        motors.structure.rebuildResult(ajaxResult.slice(rrStart, rrEnd), 'relatedReviews', 'RelatedReviews');
                    }

                    ; break;

                case "DealerMap":

                    /*
                    motors.constants.dealersMap = eval('(' + ajaxResult.slice(ajaxResult.indexOf("<mapdata>") + 9, ajaxResult.indexOf("</mapdata>")) + ')');
                    motors.map.displayMap();
                    */
                    ; break;
            }

            /* Ajax Banner Ads - Added by Mat F 2010-05-19 */
            if (!$('html').hasClass('ltie8')) {
                var jsData = motors.constants.jsonfilter.document.data,
                    jsManu = '',
                    jsModels = '',
                    jsPostcode = '',
                    targetStr = '';

                if (jsData.manufacturer) {

                    for (var i = 0, len = jsData.manufacturer.item.length; i < len; i++) {
                        var modelList = "";
                        // Check if models is undefined
                        if (jsData.manufacturer.item[i].models.item !== undefined) {

                            modelList = jsData.manufacturer.item[i].models.item.join(',').replace(/ /g, '_').replace(/\,/g, ';MODEL=')
                        }
                        var manuName = jsData.manufacturer.item[i].name.replace(' ', '_'), modelList;
                        jsManu += (i > 0) ? ';MANU=' + manuName : manuName;
                        jsModels += (i > 0) ? ';MODEL=' + modelList : modelList;
                    }

                }

                if (motors.constants.jsonfilter.document.postcode) {
                    jsPostcode = motors.constants.jsonfilter.document.postcode.replace(/\,/g, ';POSTCODE=').replace(/ /g, '');
                }

                targetStr = ';AREA=' + $('#bannerSiteArea').val() + ';ENVIRONMENT=' + $('#bannerEnvironment').val() + ';MODEL=' + jsModels + ';MANU=' + jsManu + ';POSTCODE=' + jsPostcode + ';';

                if (typeof thisisAdTagA != 'undefined') {
                    targetStr += 'sn=thisis;taga=' + thisisAdTagA + ';tagb=' + thisisAdTagB;
                }
                //refresh ads can be found /js/motors-generic-lib.js
                refreshAds('/StaticHtml/andbanners.html?target=' + escape(targetStr));
            }
            /* End Ajax Banner Ads */

        }
    },

    persistCheck: function (navigator, value) {

        if (motors.constants.jsonfilter.document.data[navigator].item != undefined) {
            if (motors.constants.jsonfilter.document.data.manufacturerpopular.item.indexOf(value) != -1) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }

    },

    ajaxError: function () {

        // TODO: Remove this function
        if (_showMe) {
            alert('There was an error while processing your request, please try again or reset your search');
        }

    },

    showTabDetails: function (myObj, carid) {

        if (!$(myObj).hasClass('showDetailTab')) {

            var myNewObj = jQuery.extend(true, {}, $(myObj).parents('.result-item-hold').find('.showDetailTab'));
            myObj = $(myNewObj);

        }
        //Add hide details text
        if ($(myObj).hasClass('detailsOpen')) {
            //colapse
            $(myObj).removeClass('detailsOpen');
            $(myObj).find('a.sign').html("[ + ]");
            $(myObj).find('a:last').text("Show Details");

            //$(this).siblings('.result-item-expand').css('display', 'none');
            $(myObj).parent('div').siblings('.result-item-expand').css('display', 'none');

        } else {

            //open
            $(myObj).addClass('detailsOpen');
            $(myObj).find('a.sign').html("[ - ]");
            $(myObj).find('a:last').text("Hide Details");

            //$(this).siblings('.result-item-expand').css('display', 'block');
            $(myObj).parent('div').siblings('.result-item-expand').css('display', 'block');

            //Load vehicle details

            if (!$('.car-' + carid).hasClass('requestDone')) {
                motors.ajax.loadVehicleTabDetails(carid);
            }
            //Load vehicle details
        }
        return false;

    }, addToCompare: function (myObj, carid) {

        if ($(myObj).hasClass('removeCar' + carid)) {

            $(myObj).find('a').text('Add to Compare');
            $(myObj).removeClass('removeCar' + carid);
            motors.removeCarCompare(carid);

        } else {

            $(myObj).find('a').text('Remove');
            $(myObj).addClass('removeCar' + carid);

            var url = motors.helper.applicationRoot + "/Ajax/VehicleDetails.ashx";
            var query = { carID: carid, isTab: 'false', isCompare: 'true' };
            var options = {
                query: query,
                vOffset: 50,
                isTab: false,
                isCompare: true
            };

            motors.ajax.load(url, options, 'vehicleDetails');
        }

    },

    loadVehicleTabDetails: function (carid) {

        //motors.loadJS('http://cdn2.motors.co.uk/v2live/scripts/ext/swfobject.js');

        var url = motors.helper.applicationRoot + "/Ajax/VehicleDetails.ashx";
        var query = { carID: carid, isTab: 'true' };
        var options = {
            query: query,
            vOffset: 50,
            isTab: true

        };

        motors.ajax.load(url, options, 'vehicleDetails');


    },

    trackEvents: function (category, action, label, value) {
        if (arguments.length >= 2 && (typeof _gaq != 'undefined')) {
            _gaq.push(['_trackEvent', category, action, label, value]);
        }
    },

    trackGoals: function (path) {

        if ((typeof _gaq != 'undefined')) {
            _gaq.push(['_trackPageview', path]);
        }

    },

    trackEcom: function (carId, path) {
        /* GOOGLE ECOM TRACKING http://bit.ly/zjbrd */
        var res = $('#carRes' + carId),
            hiddeninfo = res.find('input:hidden'),
            orderID = (Math.floor(Math.random() * carId)).toString(),
            prodDesc = 'Detailed Vehicle View';

        if (hiddeninfo.val()) hiddeninfo = hiddeninfo.val().split(',');

        //Log car redirect
        if (path && path != '' && path.split('/')[2] == 'www.car-redirect.co.uk') {
            prodDesc = 'Sponsored Result Vehicle';
        }

        if ((typeof _gaq != 'undefined')) {
            _gaq.push(['_trackPageview']);
            _gaq.push(['_trackPageLoadTime']);
            _gaq.push(['_addTrans',
                orderID,                                            //Order ID (Random number)*
                hiddeninfo[0],                                      //Affiliation (Private or Dealer ID)
                '0',                                                //Total*
                '0',                                                //Shipping
                motors.constants.jsonfilter.document.postcode       //City (User location)
            ]);
            _gaq.push(['_addItem',
                orderID,                                            //Order ID (Random number)*
                hiddeninfo[1],                                      //SKU/Code (Vehicle ID)*
                prodDesc,                                           //Product name (Description)
                hiddeninfo[2],                                      //category (Make/Model)
                '0',                                                //Unit price*
                '1'                                                 //Quantity*
            ]);
            _gaq.push(['_trackTrans']);
            //* = required
        }
    },

    addCriteoTag: function (carid) {
        function guidGenerator() {
            var S4 = function () {
                return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
            };
            return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
        }
        $("body").append("<img src=\"" + "https:" + "//" + 'sslwidget' + ".criteo.com/pmo/display.js?p1=" + escape("v=2&wi=7715086&t=" + guidGenerator() + "&s=1&i1=" + carid + "&p1=1&q1=1") + "&t1=transaction&resptype=gif\" width=\"1\" height=\"1\" />");
    },

    showVehicleDetails: function (carid, imageNumber, vehicleStandout) {

        motors.ajax.addCriteoTag(carid);

        if ($('#vehicleDetails').length == 0) {
            var div = document.createElement('div');
            div.id = 'vehicleDetails';
            $(div).addClass('ajax-wrapper');
            document.body.appendChild(div);
        }

        //Google Ecommerce Tracking
        motors.ajax.trackEcom(carid, '');

        var url = motors.helper.applicationRoot + "/Ajax/VehicleDetails.ashx";
        var query = { carID: carid, imageNumber: imageNumber, vehicleStandout: vehicleStandout };
        var options = {
            query: query,
            vOffset: 50
        };

        motors.curtain.drop(true);

        motors.ajax.load(url, options, 'vehicleDetails',
            function () {
                motors.curtain.raise();

            });

        if (motors.ajax.Y) {
            motors.ajax.Y.History.navigate('carid', carid);
        }


        motors.ajax.YUItrigger = false;

    },

    showVehicle: function (carid) {
        showVehicleDetails(carid, 1, 0);


    },

    showBenefits: function (querystring) {
        var url = motors.helper.applicationRoot + '/ajax/manufacturerbenefits.ashx?' + querystring;
        var options = {
            query: querystring,
            vOffset: 50
        };
        motors.curtain.drop(true);
        motors.ajax.load(url, options, 'benefits', function () { motors.curtain.raise(); });
    },

    showCarFinder: function (popupType) {

        var id = 'carfinder_' + popupType,
            url = '/ajax/carfinder.ashx',
            query = {
                finderPart: popupType,
                mvtIndex: (arguments.length == 2) ? arguments[1] : 0
            },
            options = {
                query: query,
                vOffset: 150
            };

        $(id).remove();

        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () {
            if (typeof motors.curtain != 'undefined') {
                motors.curtain.raise;
            }

        });

        //event tracking
        motors.ajax.trackGoals(url);

        return false;
    },

    submitEmailForm: function (url, form) {
        /* 
        *   IE7 fix - submit form with ajax
        *
        *   regular form submit was redirecting to the default action on 
        *   submit & rendering context.response as a new doc. 
        *   When IE7 finally dies, remove this and make the button type=submit 
        *   so it'll work without js enabled
        */

        //for data recording
        url = url + '?SearchGuid=' + $('#SearchGuid').val();

        //$.extend(options.query, { 'SearchGuid': $('#SearchGuid').val() })

        var err = false,
            f = $(form);
        f.find('input:button').attr("disabled", "disabled");
        $('div.error', f).removeClass('error');
        $('input:visible:not([value])', f).each(function () {
            $(this).parent('div.formrow').addClass('error');
            err = true;
        });

        // $.extend(_data, { 'SearchGuid': $('#SearchGuid').val() })

        if (!err) {
            $.ajax({
                type: "POST",
                cache: false,
                url: url,
                data: f.serialize(),
                success: function (m) {
                    f.html(m);
                },
                error: function (m) {
                    f.html(m); // complete doesn't return m so we're stuck with both of these doing the same thing.
                }
            });
        } else {
            $('div.error:first input', f).focus();
            if ($('div.validation-error', f).length === 0) { f.append('<div class="validation-error">Please complete the fields highlighted red</div>'); }
            f.find('input:button').removeAttr("disabled");
        }
        return false;
    },

    showEmailForm: function (vehicleId, vehicleStandout) {

        var id = 'email_dealer';
        var url = '/ajax/emaildealer.ashx';
        var query = (vehicleStandout === undefined) ? { carID: vehicleId, vehicletype: 'cars'} : { carID: vehicleId, vehicleStandout: vehicleStandout, vehicletype: 'cars' };
        var options = {
            query: query,
            vOffset: 150
        };
        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

        //event tracking
        motors.ajax.trackGoals(url);


        return false;
    },
    showVansEmailForm: function (vehicleId, vehicleStandout) {

        var id = 'email_dealer';
        var url = '/ajax/emaildealer.ashx';
        var query = (vehicleStandout === undefined) ? { carID: vehicleId, vehicletype: 'vans'} : { carID: vehicleId, vehicleStandout: vehicleStandout, vehicletype: 'vans' };
        var options = {
            query: query,
            vOffset: 150
        };
        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

        //event tracking
        motors.ajax.trackGoals(url);


        return false;
    },

    showDealerEmailForm: function (dealerId) {

        var id = 'email_dealer';
        var url = '/ajax/emaildealer.ashx';
        var query = { dealerID: dealerId };
        var options = {
            query: query,
            vOffset: 150
        };
        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

        //event tracking
        motors.ajax.trackGoals(url);

        return false;
    },
    showPrivateSellerEmailForm: function (vehicleId, make, model, siteswitch) {

        var id = 'emailPrivateSeller';
        //default legacy, if from new PS then switch to call
        var url = '/ajax/EmailPrivateSeller_Legacy.ashx';
        if (siteswitch == "motorsps") {
            url = '/ajax/EmailPrivateSeller.ashx';
        }
        var query = { carID: vehicleId, carMake: make, carModel: model };
        var options = {
            query: query,
            vOffset: 150
        };
        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

        //event tracking
        motors.ajax.trackGoals(url);

        //audit tracking
        $.post('/audit/contact-seller/' + vehicleId);

        return false;
    },
    sendDealerEmail: function () {

        var data = motors.ajax.emailvalidation;
        var isError = false;

        omnitureAuto('event8', 'email dealer'); // open email dealer form: omniture tracking trigger

        if (data != null) {
            for (var v in data) {
                var rx = data[v];
                var $input = $('.email-dealer #' + v);
                var val = $input.val();

                if (val.match(rx) == null) {
                    $input.parent('.formrow').addClass('error');
                    isError = true;
                } else {
                    $input.parent('.formrow').removeClass('error');
                }
            }
        }

        if (!isError) {
            var data = {};
            var form = document.emailDealer.elements;
            for (var i = 0; i < form.length; i++) {
                if (form[i] && form[i].name && form[i].value) {
                    data[form[i].name] = form[i].value;
                }
            }

            $.ajax({
                type: 'POST',
                url: motors.buildUrl('/ajax/emaildealer.ashx'),
                data: data,
                success: function (data, textStatus) {
                    var form = document.getElementById('emailDealer');
                    while (form.hasChildNodes()) {
                        form.removeChild(form.childNodes[0]);
                    }
                    form.innerHTML = data;
                },
                error: function (xhr, textStatus, errorThrown) {
                    var form = document.getElementById('emailDealer');
                    while (form.hasChildNodes()) {
                        form.removeChild(form.childNodes[0]);
                    }
                    form.appendChild(document.createTextNode('An error occurred: ' + textStatus + errorThrown));
                }
            });
        }
        return false;
    },

    showDealerMap: function (s, e, dealerId) {

        var id = 'dealerMap';
        var url = '/Ajax/DealerMapGoogle.ashx';
        var query = {};
        var options = {
            vOffset: 200,
            mapStart: s,
            mapEnd: e,
            isMap: true,
            dealerId: dealerId
        };

        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });



        return false;
    },

    showDealerInformation: function (dealerId, capCarId) {

        var id = 'dealerInformation';
        var url = '/ajax/dealerinformation.ashx';
        var query = { dealerID: dealerId };
        var options = {
            query: query,
            vOffset: 200
        };

        motors.ajax.trackEcom(capCarId, '', dealerId);

        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

        return false;
    },

    showCarTabDetails: function (carId, tabName) {

        var resultType = "div.result-item-hold",
            thisis = ($('body').hasClass('thisis')) ? true : false;

        //if not new car page
        if (!$('body').hasClass('newcarpage')) motors.ajax.trackEcom(carId, '');

        if (tabName != 'hideall') {
            var tabId = '#tab-' + tabName + '-car-' + carId;

            if (!$('.' + tabName + '-car-' + carId).hasClass('requestDone')) {
                motors.ajax.loadVehicleTabDetails(carId, tabName);
            }
            else if ($('.' + tabName + '-car-' + carId).html() == "Loading...") {
                motors.ajax.loadVehicleTabDetails(carId, tabName);
            }
        }

        var $expandArea = (tabName != 'hideall') ?
                            $(tabId).parents(resultType).next('div.result-item-expand') :
                            $('#carRes' + carId).find('div.result-item-expand');

        var $expandWhat = (tabName != 'hideall') ?
                            $expandArea.find('.' + tabName) :
                            $expandArea.prev(resultType);

        $expandArea.find('div.expand-group').removeClass('open');

        if (tabName != 'hideall') {
            if ($(tabId).hasClass('current')) {
                $(tabId).removeClass('current').parent('li').siblings('li').find('a').removeClass('current');
                if (!thisis) {
                    $(tabId).parents(resultType).css('background-image', 'url(http://cdn2.motors.co.uk/v2live/images/bg_search_results_720_bottom.gif)');
                }
                $expandArea.hide().find('div.frameholder').hide();
            } else {
                $(tabId).parent('li').siblings('li').find('a').removeClass('current');
                $(tabId).addClass('current');
                if (!thisis) {
                    $(tabId).parents(resultType).css('background-image', 'url(http://cdn2.motors.co.uk/v2live/images/bg_newcar_result_btm.gif)');
                }
                $expandArea.show().find('div.frameholder').show();
                $expandWhat.addClass('open');

                // ThisIs JS components are loaded from inline script in the XSLT, because the ajax core is flakey as hell
                scrollToSearch('#carRes' + carId);
            }

        } else {
            $expandWhat.find('.extras-menu ul.tabs-list li a').removeClass('current');
            $expandWhat.css('background-image', 'url(http://cdn2.motors.co.uk/v2live/images/bg_search_results_720_bottom.gif)');
            $expandArea.hide();
        }

        $('div.result-wrapper').toggleClass('relative'); //firefox whitespace hack

        try {
            d = $('#carRes' + carId).find('input[type="hidden"]').val().split(',');
            _gaq.push(['_trackPageview', '/used_car_view/' + d[0] + '/' + d[1] + '/' + d[2] + '/' + tabName + '"/>']);
            _gaq.push(['_trackEvent', 'SearchImpression', 'vehicleDetails', carId, tabName]);
        } catch (err) { }

        omnitureAuto('event8', 'details'); // view car details: omniture tracking trigger

        if (parseInt(motors.constants.jsonfilter.document.totalresults) <= parseInt(motors.constants.jsonfilter.document.numberofresultsperpage)) {
            motors.structure.togglePagination(true);
        }

        return false;
    },

    loadVehicleTabDetails: function (carId, tabName) {

        var url = motors.helper.applicationRoot + "/Ajax/VehicleTabDetails.ashx";
        var query = { carID: carId, isNewCarDetail: 'true', tab: tabName };
        var options = {
            query: query,
            isNewCarDetail: true
        };

        if (tabName == 'usedCarMap') {
            var dealerId = $('#carRes' + carId).find('input[type="hidden"]').val().split(',')[0];
            $.post('/audit/map-view/' + carId + '/' + dealerId);
        }

        motors.ajax.load(url, options, 'newVehicleDetails');
    },

    toggleAllDealers: function (moreCarsLink) {

        if ($(moreCarsLink).hasClass('more')) {
            $(moreCarsLink).removeClass('more').addClass('less');
            $(moreCarsLink).text('Less dealers');
            $(moreCarsLink).parents('.dealeroffers').children('.moreDealers').show();
        } else {
            $(moreCarsLink).removeClass('less').addClass('more');
            $(moreCarsLink).text('All dealers');
            $(moreCarsLink).parents('.dealeroffers').children('.moreDealers').hide();
        }
        return false;
    },
    sponsoredLinks: function (carId, url) {

        //event tracking
        motors.ajax.trackGoals(url);

        //Google Ecommerce Tracking
        motors.ajax.trackEcom(carId, url);

        //criteo tag
        motors.ajax.addCriteoTag(carId);

        //C2C Event tracking
        _gaq.push(['_trackEvent', 'C2C Click', 'Sponsored Result', 'Vehicle ID,' + carId]);

        //For new Ecom
        var orderID = (Math.floor(Math.random() * carId)).toString();

        //New Ecom
        _gaq.push(['_addItem',
            orderID,                                            //Order ID (Random number)*
            carId,                                      //SKU/Code (Vehicle ID)*
            'C2C Click',                                           //Product name (Description)
            'Sponsored Result',                                      //category (Make/Model)
            '0',                                                //Unit price*
            '1'                                                 //Quantity*
        ]);

        // this won't pass a referrer in IE which is bad
        //window.open(url);

        // so we do this now for IE
        if (navigator.appName == "Microsoft Internet Explorer") {
            urlopenwithreferer(url);
        }
        else {
            window.open(url);
        }        
        return false;
    },
    atozReveal: function (url) {

        var dealerList = $('div.searchResults').find("div[id$='dealerList']");
        if (dealerList.length > 0) {
            $('.DealerList').show();
            $('#resultRows, .noResultText, .search-results-text, .topLine').hide();
            motors.structure.togglePagination(true);

            //event tracking
            if (arguments.length) motors.ajax.trackGoals(url);
        }

        return false;
    },
    trackDealerAtoZ: function (url) {
        var dealerId = url.split('/')[3];
        $.post('/audit/dealer-list/' + dealerId);
        window.location.href = url;
        return false;
    },
    finance: function (domain) {
        if (domain === 'jp') {
            var id = 'financeForm',
                url = '/ajax/finance.ashx',
                options = {
                    vOffset: 150
                };

            motors.curtain.drop(true);
            motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

            //event tracking
            motors.ajax.trackGoals(url);
            motors.ajax.trackEvents('JP advert click', 'Finance', 'Used Car Search Page');
        }

        return false;
    },
    historyCheck: function (url, domain) {
        var id = 'historyCheck',
            url = '/ajax/historycheck.ashx',
            options = {
                query: {
                    domain: (domain) ? domain : 'motors',
                    checker: (domain && domain == 'jp') ? 'AutoCheck' : 'Parkers',
                    account: (domain && domain == 'jp') ? 'sc=147' : 'sc=388&amp;bcd=c1fdeLYN0410XXmoxAN1'
                },
                vOffset: 50
            };

        motors.curtain.drop(true);
        motors.ajax.load(url, options, id, function () { if (typeof motors.curtain != 'undefined') { motors.curtain.raise } });

        //event tracking
        motors.ajax.trackGoals(url);
        return false;
    },
    stockAuditTracking: function (url, carinfo) {
        $.post('/audit/dealer-view/' + carinfo);
        window.location.href = url;
        return false;
    },
    stockAuditTrackingVan: function (url, carinfo) {
        $.post('/audit/dealer-van-view/' + carinfo);
        window.location.href = url;
        return false;
    }
});

