/// <reference path="jquery/jquery-1.5.min.js" />
if (typeof autoexposure == "undefined") { window.autoexposure = {}; }
if (typeof autoexposure.popup == "undefined") { window.autoexposure.popup = {}; }
if (typeof autoexposure.finance == "undefined") { window.autoexposure.finance = {}; }
if (typeof autoexposure.maps == "undefined") { window.autoexposure.maps = {}; }
if (typeof autoexposure.router == "undefined") { window.autoexposure.router = {}; }
if (typeof autoexposure.cookie == "undefined") { window.autoexposure.cookie = {}; }

/// vehicle details modal popup dialog
window.autoexposure.templateSettings = {
    evaluate: /<%([\s\S]+?)%>/g,
    interpolate: /<%=([\s\S]+?)%>/g
};
window.autoexposure.rotateDirection = { preview: 0, next: 1 };

window.autoexposure.template = function (str, data) {
    var c = window.autoexposure.templateSettings;
    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
	'with(obj||{}){__p.push(\'' +
	str.replace(/\\/g, '\\\\')
		.replace(/'/g, "\\'")
		.replace(c.interpolate, function (match, code) {
		    return "'," + code.replace(/\\'/g, "'") + ",'";
		})
		.replace(c.evaluate || null, function (match, code) {
		    return "');" + code.replace(/\\'/g, "'")
							.replace(/[\r\n\t]/g, ' ') + "__p.push('";
		})
		.replace(/\r/g, '\\r')
		.replace(/\n/g, '\\n')
		.replace(/\t/g, '\\t')
		+ "');}return __p.join('');";
    var func = new Function('obj', tmpl);
    return data ? func(data) : func;
};

window.autoexposure.vehicleDetails = function (vehicleid) {
    window.autoexposure.popup.loading();
    var serviceUrl = '/CMSWebParts/AutoExposure/Search/VehicleDetailsPopup_files/vehicledetailsmodal.ashx';
    if ($("#vehicledetailsurl").length > 0) {
        serviceUrl = $("#vehicledetailsurl").val();
    }
    $.ajax({
        url: serviceUrl,
        data: { 'id': vehicleid },
        type: 'POST',
        dataType: 'json',
        success: function (data) {
			initCarData(data);
            // display html
            if ($("#vehicleDetails").length == 0) {
                $('<div id="vehicleDetails" class="ajax-wrapper"></div>')
					.appendTo("body");
            }
            var templ = $("#vehicletemplate").html();
            var html = window.autoexposure.template(templ, data);
            $("#vehicleDetails").html(html);
            $("#vehicleDetails").show();
            //bind events
            $(".close-popup").click(function () { window.autoexposure.popup.close(); return false; });
            $(".curtain").dblclick(function () { autoexposure.popup.close(); });
            $(".btnPrev").click(function () { window.autoexposure.popup.rotateImage(autoexposure.rotateDirection.preview, ".images li>img"); return false; });
            $(".btnNext").click(function () { window.autoexposure.popup.rotateImage(autoexposure.rotateDirection.next, ".images li>img"); return false; });
            //$(".images li>img").click(function () { window.autoexposure.popup.currentImage(this, ".images li>img"); return false; });
			
			var oVehicleImagesContainer = jQuery('.images .main-image');
			var oPrevBtn = jQuery('.images .controls').find('a.btnPrev');
			var oNextBtn = jQuery('.images .controls').find('a.btnNext');
			var oPager = jQuery('.images #smallImages');
			var oSmallImages = jQuery('.images #smallImages').find('img');
			var oSmallImagesSRC = new Array();
			var oSmallImagesALT = new Array();
			
			oSmallImages.each(function(i){
				oSmallImagesSRC[i] = jQuery(this).attr('src');
				oSmallImagesALT[i] = jQuery(this).attr('alt');
			});
			

			if (oVehicleImagesContainer != null)
			{
				oPager.html('');
				oVehicleImagesContainer.cycle({
					delay:         0,     // additional delay (in ms) for first transition (hint: can be negative) 
					fx:            'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle') 
					height: 450, // container height 
					manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored 
					metaAttr:      'cycle',// data- attribute that holds the option data for the slideshow 
					next:          oNextBtn,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide 
					pager:         oPager,  // element, jQuery object, or jQuery selector string for the element to use as pager container 
					pagerEvent:    'click.cycle', // name of event which drives the pager navigation 
					pagerAnchorBuilder: pagerFactory,
					pause: true,      // true to enable "pause on hover" 
					pauseOnPagerHover: 0, // true to pause when hovering over pager link 
					prev:          oPrevBtn,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide 
					prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide 
					requeueTimeout: 250,  // ms delay for requeue 
					speed: 1500,  // speed of the transition (any valid fx speed value) 
					timeout: 4500  // milliseconds between slide transitions (0 to disable auto advance) 
				});
			}
			function pagerFactory(idx, slide) {
				var s = idx > 9 ? ' style="display:none"' : '';
				//return '<li' + s + '><a href="#">' + (idx + 1) + '</a></li>';
				return '<li' + s + '><img src="' + oSmallImagesSRC[idx] + '" alt="' + oSmallImagesALT[idx] + '" /></li>';
			};
			
			
			additionalDetailsTechnicalSpec('', 'TechnicalSpec', vehicleid, 'popup-perfomance_economy', 'Performance;Fuel Consumption;Engine and Drive Train');
			additionalDetailsTechnicalSpec('', 'TechnicalSpec', vehicleid, 'popup-dimensions', 'Vehicle Dimensions,Weight and Capacities');
			additionalDetailsStandart('', 'DetailedStandardFit', vehicleid, 'popup-interior', 'Interior Trim and Features;Driver Information, Aids and Communications;Heating and Ventilation;Entertainment;', false);
			additionalDetailsStandart('', 'DetailedStandardFit', vehicleid, 'popup-exterior', 'Exterior Trim and Features;Wheels and Tyres', false);
			additionalDetailsStandart('', 'DetailedStandardFit', vehicleid, 'popup-safety', 'Safety and Security;Mechanical', false);
			
            //concluate position
            if ($(".ajax-popup").length > 0) {
                //var popupWidth=parseInt($(".ajax-popup").css('width').replace('px',''));
                //var popupHeight=parseInt($(".ajax-popup").css('height').replace('px',''));
                var pageYOffset = 0;
                if (typeof (window.pageYOffset) != 'undefined') {
                    pageYOffset = window.pageYOffset;
                } else {
                    pageYOffset = $(window).scrollTop()
                }
                var innerWidth = 0;
                if (typeof (window.innerWidth) != 'undefined') {
                    innerWidth = window.innerWidth;
                } else {
                    innerWidth = $(window).width();
                }
                var popupWidth = $(".ajax-popup")[0].clientWidth;
                var popupHeight = $(".ajax-popup")[0].clientHeight;

                if (popupWidth == 0) popupWidth = $(".ajax-popup").width();
                if (popupHeight == 0) popupWidth = $(".ajax-popup").height();

                var left = (innerWidth - popupWidth) / 2;
                var top = pageYOffset + 50;
                if ((pageYOffset + popupHeight + 50) > document.height) {
                    top = document.height - popupHeight;
                }
                $(".ajax-popup").css({ 'left': left + 'px', 'top': top + 'px', 'position': 'absolute', 'z-index': '1000' });
            }
            window.autoexposure.popup.loaded();
            // load finance data
            autoexposure.finance.VehicleParams = {};
            autoexposure.finance.VehicleParams.associatedDealerName = data.associatedDealerName;
            autoexposure.finance.VehicleParams.derivative = data.Variant;
            autoexposure.finance.VehicleParams.manufacturer = data.Make;
            autoexposure.finance.VehicleParams.model = data.Model;
            autoexposure.finance.VehicleParams.price = "£" + data.formated_price;
            autoexposure.finance.VehicleParams.returnUrl = data.returnUrl;
            autoexposure.finance.VehicleParams.vCurrentMileage = data.Mileage;
            autoexposure.finance.VehicleParams.vRegDate = data.vRegDate;
            autoexposure.finance.VehicleParams.vRegNumber = data.vRegNumber;
            autoexposure.finance.VehicleParams.vehicleIdentifier = data.vehicleIdentifier;
            autoexposure.finance.VehicleParams.vehicleImageUrl = data.vehicleImageUrl;
            autoexposure.finance.CompanyName = data.company_name;
            autoexposure.finance.SiteId = data.siteid;
            autoexposure.finance.AccountID = data.accountID;
            autoexposure.finance.URL = '/CMSWebParts/AutoExposure/Finance/FinanceService.ashx';
            autoexposure.finance.CurrentVehicleId = vehicleid;
            var vehicleQuery = 'vehicleData=' + autoexposure.finance.CurrentVehicleId;
            if (data.financeEnabled == '1') {
                //set default form values
                $("#MaximumTerm").val(data.FinancePreferredPeriodDefault);
                $("#TotalDeposit").val(data.FinanceDepositDefault);
                var urlFinance = autoexposure.finance.URL + '?AccountID=' + autoexposure.finance.AccountID;
                urlFinance += '&' + $("#formfinanceoptions").serialize();
                /*urlFinance += '&MaximumTerm=' + $('#maximumTerm').val();
                urlFinance += '&TotalDeposit=' + $('#totalDeposit').val();
                urlFinance += '&AnnualMileage=' + $('#annualMileage').val();*/
                autoexposure.finance.load(urlFinance, vehicleQuery);
            } else {
                $('.AEFinance').slideUp('slow', function () { $('.AEFinance').css('display', 'none'); });
            }
            if (data.insuranceEnabled == '1') {
                var urlInsurance = '/CMSWebParts/AutoExposure/Finance/InsuranceService.ashx?AccountID=' + autoexposure.finance.AccountID;
                autoexposure.finance.loadinsurance(urlInsurance, vehicleQuery);
            } else {
                $('.AEInsurance').remove();
            }
            // load maps
            autoexposure.maps.info = {};
            autoexposure.maps.info.Title = data.Title;
            autoexposure.maps.info.Postcode = $("#map-postcode").val();//data.Postcode;
            autoexposure.maps.info.Address1 = $("#map-address1").val();//data.Address1;
            autoexposure.maps.info.Address2 = $("#map-address2").val();//data.Address2;
            autoexposure.maps.info.Address3 = $("#map-address3").val();//data.Address3;
            autoexposure.maps.info.Phone = $("#map-phone").val();//data.Phone;
            autoexposure.maps.info.City = $("#map-city").val();//data.City;
            autoexposure.maps.info.County = $("#map-county").val();//data.County;
            autoexposure.maps.initMapLoad();
            autoexposure.aetabs(null);
			// reader facebook like button
			if(typeof(FB)!='undefined'){
				if(FB.XFBML && FB.XFBML.parse){
					FB.XFBML.parse();
				}
			}
			// update icon
			updateResultIconStatus();
			var selIns = autoexposure.cookie.get('selins');
			autoexposure.cookie.remove('selins');
			if(selIns){
				$(".tabs>li.tab").each(function(i,e){
				$(e).removeClass('active');
				$(".tab-content>li[class!=controls]").css({ 'display': 'none' });
					if(i==3){
						$(e).css({ 'display': 'block' }).addClass('active');
						$(".tab-content>li[class!=controls]:eq(3)").css({ 'display': 'block' });
					}
				});
			}
        },
        error: function (jqXHR, textStatus, errorThrown) {
            window.autoexposure.popup.close();
        }		
    });
}

function initCarData(data) {
	try	{
	
		if (!window.cardata)
			window.cardata = {};
		if (document.body.className.indexOf('addComparison') < 0)
			document.body.className += ' addComparison';
			window.cardata["json_"+data.VehicleID] = {
				des: data.Make + ' ' + data.Model + ' ' + data.Variant,
				dor: data.NoDoors + ' door',
				bod: data.BodyStyle,
				col: data.Colour,
				mil: data.Mileage + ' miles',
				reg: data.vRegDate + ' (' + data.vRegNumber + ' reg)',
				pri: data.Price
		};
	} catch(e) {
	  
	}
}

window.autoexposure.popup.loading = function () {
    if ($(".curtain").length == 0) {
        $('<div class="curtain"><div class="wait"></div></div>')
			.appendTo("body");
    }
    $(".curtain,.wait").css({ 'display': 'block' });
}

window.autoexposure.popup.loaded = function () {
    $(".wait").css({ 'display': 'none' });
}
window.autoexposure.popup.close = function () {
    $("#vehicleDetails,.curtain,.wait").css({ 'display': 'none' });
	location.hash="";
}

window.autoexposure.popup.rotateImage = function (direction, selector) {
    if ($(selector).length > 0) {
        var items = new Array();
        var index = 0;
        var src = '';
        $(selector).each(function (i, e) {
            var item = {};
            item.el = e;
            item.current = !!($(e).attr('current'));
            if (item.current) {
                index = i;
            }
            items.push(item);
        });
        $(selector).removeAttr('current');
        if (direction == window.autoexposure.rotateDirection.next) {
            index = (items.length == (index + 1) ? 0 : (index + 1));
        } else if (direction == window.autoexposure.rotateDirection.preview) {
            index = ((index == 0) ? (items.length - 1) : (index - 1));
        }
        src = $(items[index].el).attr('rel');
        $(items[index].el).attr('current', '1');
        $("#mainimage").attr("src", src);
        return false;
    }
}

window.autoexposure.popup.currentImage = function (img, selector) {
    $(selector).removeAttr('current');
    $(img).attr('current', '1');
    $("#mainimage").attr("src", $(img).attr('rel'));
}


autoexposure.finance.numberToCurrency = function (number, decimalSeparator, thousandsSeparator, nDecimalDigits) {
    //default values
    decimalSeparator = decimalSeparator || '.';
    thousandsSeparator = thousandsSeparator || ',';
    nDecimalDigits = nDecimalDigits || 2;

    var fixed = number.toFixed(nDecimalDigits), //limit/add decimal digits
		parts = RegExp('^(-?\\d{1,3})((\\d{3})+)\\.(\\d{' + nDecimalDigits + '})$').exec(fixed); //separate begin [$1], middle [$2] and decimal digits [$4]

    if (parts) { //number >= 1000 || number <= -1000
        return parts[1] + parts[2].replace(/\d{3}/g, thousandsSeparator + '$&') + decimalSeparator + parts[4];
    } else {
        return fixed.replace('.', decimalSeparator);
    }
}

autoexposure.finance.load = function (url, query) {

    if (!url) {
        url = autoexposure.finance.URL + '?AccountID=' + autoexposure.finance.AccountID;
		if ($('#TotalDeposit').val() == "")
		{
			$('#TotalDeposit').val(0);
		}
        url += '&' + $("#formfinanceoptions").serialize();
        /*url += '&MaximumTerm=' + $('#maximumTerm').val();
        url += '&TotalDeposit=' + $('#totalDeposit').val();
        url += '&AnnualMileage=' + $('#annualMileage').val();*/
    }
    if (!query) {
        query = 'vehicleData=' + autoexposure.finance.CurrentVehicleId;
    }
    $('#submitFinance').attr('disabled', 'disabled');
    $(".FinanceRepresentative-panel,.FinanceWeaver-panel").css('opacity', '.5');
    $.ajax({
        'url': url,
        'type': 'post',
        'data': query,
        'success': function (data) {
            $('#submitFinance').removeAttr('disabled');
            var dataErrorType = data != null && data.ErrorType !== undefined && data.ErrorType.length > 0 ? data.ErrorType : '0';
            if (data != null && dataErrorType == '0' && data.errorField == null) {
                data.vehicleResultsField = data.vehicleResultsField[0];
                data.CompanyName = autoexposure.finance.CompanyName;
                data.SiteID = autoexposure.finance.SiteId;
                data.VehicleFormParams = autoexposure.finance.VehicleParams;
				data.VehicleFormParams.returnUrl=window.location.href.replace(window.location.hash,"")+"#vehicledetails/"+autoexposure.finance.CurrentVehicleId;
                // finance representative
                try {
                    var templ = $("#FinanceRepresentativeTemplate").html();
                    var html = autoexposure.template(templ, data);
                    $(".FinanceRepresentative-panel").html(html);
                    // finance representative
                    templ = $("#FinanceWeaverTemplate").html();
                    html = autoexposure.template(templ, data);
                    $(".FinanceWeaver-panel").html(html);
                } catch (e) {
                    console.log(e);
                }
            } else {
                $('.AEFinance').slideUp('slow', function () {
                    $('.AEFinance').css('display', 'none');
                });
            }
            $(".FinanceRepresentative-panel,.FinanceWeaver-panel").css('opacity', '1');
            //bing events
            $(".FWBtn-quote").click(function () {
                var rurl = $(this).attr('rel');
                $("#AEOverlay").slideDown('slow', function () {
                    $("#AEPopUp").slideDown();
                    $('#AEPopUp .AEPopUp-Content')
					.html('<iframe frameborder="0" src="' + rurl + '"></iframe>')
					.slideDown();
                });
                return false;
            });
            $('#AEPopUp .AEClose').click(function () {
                $('#AEPopUp').slideUp('slow', function () {
                    $('#AEOverlay').slideUp();
                    $('#AEPopUp, #AEPopUp .AEPopUp-Content').hide();
                });
                return false;
            });
        }
    });
}

autoexposure.finance.loadinsurance = function (url, query) {
    if (!url) {
        return false;
    }
    if (!query) {
        return false;
    }
    $.ajax({
        'url': url,
        'type': 'post',
        'data': query,
        'dataType': 'xml',
        'success': function (data) {

            var dataErrorType = data != null && jQuery(data).find('ErrorType') != null && jQuery(data).find('ErrorType').length > 0 ? jQuery(data).find('ErrorType').text() : '0';

            if (data != null && dataErrorType == '0') {
                //var xmlDoc = $.parseXML(data);
                $xml = $(data);

                $oCDForm = $xml.find('CustomerDetailsForm');
                $oCalculations = $xml.find('Calculations') != null && $xml.find('Calculations').length > 0 ? $xml.find('Calculations') : null;
                $oCalculation = $oCalculations != null && $oCalculations.find('Calculation') != null && $oCalculations.find('Calculation').length > 0 ? $oCalculations.find('Calculation') : null;
                $oCompanies = $oCalculation != null ? $oCalculation.find('Companies') : null;

                if ($oCDForm != null && $oCDForm.length > 0 && ($oCompanies == null || $oCompanies.length == 0)) {
                    if ($(".AEInsurance-link").length > 0) {
                        $(".AEInsurance-link").html('<a class="FWGet-quote" href="' + $oCDForm.find('Url').text() + '"><span>' + $oCDForm.find('DisplayText').text() + '</span></a>');
                    }
                    else {
                        $('.AEInsurance').prepend('<div class="AEInsurance-link"><a target="_blank" class="FWGet-quote" href="' + $oCDForm.find('Url').text() + '"><span>' + $oCDForm.find('DisplayText').text() + '</span></a></div>');						
						$('#tab-insurance-quotes').click(function(){ 
							var vid=query.split("=")[1];
							autoexposure.cookie.set('sendervid',vid,1);
							location.replace($oCDForm.find('Url').text());
							return false;
						});
                    }
                } else if ($oCompanies != null && $oCompanies.length > 0) {
                    if ($oCompanies.find('Company') != null && $oCompanies.find('Company').length > 0) {
                        var tempFooter = '<tr class="tfoot">' + $('.FinanceInsurance-list').find('table tr.tfoot').html() + '</tr>';
                        $('.FinanceInsurance-list').find('table tr.tfoot').remove();

                        $oCompanies.find('Company').each(function () {
                            var oCompany = $(this);

                            var tempData = '<tr><th>';
                            tempData += '<img class="prov-art" src="' + oCompany.find('LogoUrl').text() + '" alt="" />';
                            tempData += '<a target="_blank" href="' + oCompany.find('Urls').find('KeyFacts').text() + '"><img class="prov-art" src="/App_Themes/AutoExposure/images/logo_finance_keyfacts.png" alt="" /></a>';
                            tempData += oCompany.find('Name').text() + '</th>';
                            tempData += '<td>&pound; ' + oCompany.find('AnnualPremium').text() + '</td>';
                            tempData += '<td>&pound; ' + oCompany.find('MonthlyPremium').text() + '</td>';
                            tempData += '<td><a target="_blank" href="' + oCompany.find('Urls').find('ReviewAndBuy').text() + '">Select</a></td>';
                            tempData += '</tr>';
                            $('.FinanceInsurance-list').find('table').append(tempData);
                        });

                        $('.FinanceInsurance-list').find('table').append(tempFooter);
                        $('#AEInsuranceEditBtn').attr('href', $oCDForm.find('Url').text()).click(function(){ 
							var vid=query.split("=")[1];
							autoexposure.cookie.set('sendervid',vid,1);
							return true;
						});
                        $('.AEInsurance-container').slideDown();
                        $('.AEWeaver-main').slideDown();
                    }
                }
            } else {
                $('.AEInsurance').slideUp('slow', function () {
                    $('.AEInsurance').css('display', 'none');
                });
            }
            //clearTimeout(autoexposure.finance.timeoutID);
            //autoexposure.finance.timeoutID = setTimeout(autoexposure.finance.loadinsurance(url, query), 1000 * 30);
        },
        'error': function () {
            $('.AEInsurance').slideUp();
        }
    });
}


autoexposure.maps.initMapLoad = function () {
    if (typeof (google) === 'undefined' || typeof (google.maps) === 'undefined') {
        var body = document.getElementsByTagName('body')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = 'http://maps.googleapis.com/maps/api/js?sensor=false&callback=autoexposure.maps.load';
        body.appendChild(script);
    } else {
        autoexposure.maps.load();
    }
}

autoexposure.maps.load = function () {
    if (typeof (google) === 'undefined' ||
	typeof (google.maps) === 'undefined' ||
	typeof (google.maps.Geocoder) === 'undefined') return;

    var icon = new google.maps.MarkerImage(
			   'App_Themes/AutoExposure/images/gmap/gmapicon.png',
			   new google.maps.Size(29, 43),
			   new google.maps.Point(0, 0),
			   new google.maps.Point(17, 43));

    var shadow = new google.maps.MarkerImage(
			   'App_Themes/AutoExposure/images/gmap/shadow-gmapicon.png',
			   new google.maps.Size(51, 43),
			   new google.maps.Point(0, 0),
			   new google.maps.Point(17, 43));
    if (!autoexposure.maps.geocoder)
        autoexposure.maps.geocoder = new google.maps.Geocoder();

    autoexposure.maps.geocoder.geocode(
	   { 'address': autoexposure.maps.info.Postcode },
	   function (results, status) {
	       if (status == google.maps.GeocoderStatus.OK) {
	           var customLocation = results[0].geometry.location;
	           var aeOptions = {
	               zoom: 14,
	               center: customLocation,
	               mapTypeId: google.maps.MapTypeId.ROADMAP
	           }

	           autoexposure.maps.map = new google.maps.Map(document.getElementById("map_canvas"), aeOptions);
	           var marker = new google.maps.Marker({
	               'position': customLocation,
	               'map': autoexposure.maps.map,
	               'title': autoexposure.maps.info.Title,
	               'clickable': false,
	               'icon': icon,
	               'shadow': shadow
	           });
	           var templ = $("#vehiclemapstemplate").html();
	           var content = autoexposure.template(templ, autoexposure.maps.info);
	           var infowindow = new google.maps.InfoWindow(
			{
			    'content': content,
			    'size': new google.maps.Size(10, 10),
			    'position': customLocation
			});
	           infowindow.open(autoexposure.maps.map);
	       }
	       else {
	       }
	   });
}

autoexposure.maps.getDirection = function (address) {
    var rendererOptions = {
        draggable: true
    };
    if (!autoexposure.maps.directionsDisplay)
        autoexposure.maps.directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    if (!autoexposure.maps.directionsService)
        autoexposure.maps.directionsService = new google.maps.DirectionsService();
    var myOptions = {
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    autoexposure.maps.map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
    autoexposure.maps.directionsDisplay.setMap(autoexposure.maps.map);
    autoexposure.maps.directionsDisplay.setPanel(document.getElementById('directionsPanel'));
    google.maps.event.addListener(autoexposure.maps.directionsDisplay, 'directions_changed', function () {
        //autoexposure.maps.computeDistance(autoexposure.maps.directionsDisplay.directions);
    });
    $("#directionsPanel").css('display', 'none');
    var request = {
        origin: address,
        destination: autoexposure.maps.info.Postcode,
        waypoints: [],
        travelMode: google.maps.DirectionsTravelMode.DRIVING
    };
    autoexposure.maps.directionsService.route(request, function (response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            autoexposure.maps.directionsDisplay.setDirections(response);
            $("#directionsPanel").css('display', 'block');
        }
    });
}
//** ui **//
autoexposure.aetabs = function (opt) {
    opt = $.extend({
        tabheader: '.tabs>li.tab',
        tabcontent: '.tab-content>li[class!=controls]',
        selected: 0,
        click: function (e) { }
    }, opt);

    $(opt.tabheader).each(function (i, e) {
        if (opt.selected == i) {
            $(this).addClass('active');
        }
        $(this).attr('tabindex', i);
        $(this).find('a')
        .attr('href', '#tab-' + i)
        .attr('tabindex', i);
    }).click(function () {
        $(opt.tabheader).removeClass('active');
        $(this).addClass('active');
        $(opt.tabcontent).css({ 'display': 'none' });
        $(opt.tabcontent)
        .eq($(this).attr('tabindex'))
        .show();
        opt.click(this);
        return false;
    });

    $(opt.tabcontent).each(function (i, e) {
        $(this).css({ 'display': 'none' });
        if (opt.selected == i) {
            $(this).css({ 'display': 'block' });
        }
    });
}

autoexposure.showcontrols = function (opt) {
    if (!opt) return;
    opt = $.extend({
        show: '',
        hide: '',
        remClass: { se: '', classname: '' },
        addClass: { se: '', classname: '' }
    }, opt);

    if (opt.hide != '') {
        $(opt.hide).hide();
    }
    if (opt.remClass && opt.remClass.classname && opt.remClass.se) {
        $(opt.remClass.se).removeClass(opt.remClass.classname);
    }
    if (opt.addClass && opt.addClass.classname && opt.addClass.se) {
        $(opt.addClass.se).addClass(opt.addClass.classname);
    }
    if (opt.show != '') {
        $(opt.show).show();
    }
}

autoexposure.router = {
    exps: {
        namedParam: /:([\w\d]+)/g,
        splatParam: /\*([\w\d]+)/g,
        escapeRegExp: /[-[\]{}()+?.,\\^$|#\s]/g,
        hashStrip: /^#*!?/,
		isExplorer: /msie [\w.]+/
    },
	root: '/',
	historyStarted:false,
	interval: 50,
	handlers:[],
	previous_fragment:'',	
	_hasPushState:!!(false && window.history && window.history.pushState),
    listen: function () {
		
		if(this.handlers.length==0) return false;
		
        var fn = function () {
			autoexposure.router.checkUrl();            
        };
        previous_fragment = location.hash;
		var docMode = document.documentMode;
		var oldIE = (this.exps.isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
		// Depending on whether we're using pushState or hashes, and whether
        // 'onhashchange' is supported, determine how we check the URL state.
        /*if (this._hasPushState) {
         $(window).bind('popstate', this.checkUrl);
        } else */
		if ("onhashchange" in window && !oldIE) {
            window.onhashchange = fn;
        } else {
            setInterval(fn, 50);
        }
		autoexposure.router.checkUrl();
    },
    onhashchanged: function (hash) {
        if (!hash) return false;
        var fragment = hash.replace(autoexposure.router.exps.hashStrip, '');
		var args = this._extractParameters(route, fragment);
    },	
	// Convert a route string into a regular expression, suitable for matching
    // against the current location hash.
	_routeToRegExp : function(route) {
      route = route.replace(autoexposure.router.exps.escapeRegExp, "\\$&")
                   .replace(autoexposure.router.exps.namedParam, "([^\/]*)")
                   .replace(autoexposure.router.exps.splatParam, "(.*?)");
      return new RegExp('^' + route + '$');
    },
	// Given a route, and a URL fragment that it matches, return the array of
    // extracted parameters.
    _extractParameters : function(route, fragment) {
      return route.exec(fragment).slice(1);
    },
	// Bind all defined routes to `Backbone.history`. We have to reverse the
    // order of the routes here to support behavior where the most general
    // routes can be defined at the bottom of the route map.
    _bindRoutes : function() {
      if (!this.routes) return;
      for (var route in this.routes) {		
		var regex=this._routeToRegExp(route);
		var infn=this.routes[route];
		var fn=function(fragment){
			var args = autoexposure.router._extractParameters(regex, fragment);
			var run_fn='';
			run_fn+=infn+"(";
			for(var i=0;i<args.length;i++){				
				run_fn+="'"+args[i]+"'";
				run_fn+=((args.length-1)===i)?'':',';
			}
			run_fn+=")";
			eval(run_fn);
		};
		this.onroute(route,fn,regex);
      }
    },
	// Get the cross-browser normalized URL fragment, either from the URL,
    // the hash, or the override.
    getFragment : function(fragment, forcePushState) {
      if (fragment == null) {
        if (this._hasPushState || forcePushState) {
          fragment = window.location.pathname;
          var search = window.location.search;
          if (search) fragment += search;
          if (fragment.indexOf(this.root) == 0) 
		  fragment = fragment.substr(this.root.length);
        } else {
          fragment = window.location.hash;
        }
      }
      return fragment.replace(this.exps.hashStrip, '');
    },
	// Add a route to be tested when the fragment changes. Routes added later may
    // override previous routes.
    onroute : function(route, callback,regex) {
      this.handlers.unshift({route : route, callback : callback, regex : regex});
    },
	// Checks the current URL to see if it has changed, and if it has,
    // calls `loadUrl`, normalizing across the hidden iframe.
    checkUrl : function(e) {
      var current = this.getFragment();
      if (current == this.previous_fragment) 
	  current = this.getFragment(current);
      if (current == this.previous_fragment || 
	  current == decodeURIComponent(this.previous_fragment)) 
	  return false;
      this.loadUrl() || this.loadUrl(window.location.hash);
    },
    // Attempt to load the current URL fragment. If a route succeeds with a
    // match, returns `true`. If no defined routes matches the fragment,
    // returns `false`.
    loadUrl : function(fragmentOverride) {
      var fragment = this.previous_fragment = this.getFragment(fragmentOverride);
      var matched = false;
	  for(var i in this.handlers){
	  var handler=this.handlers[i];
		if (handler.regex.test(fragment)) {
          handler.callback(fragment);
          return true;
        }
	  }
      return matched;
    },
    addrule: function (rule,name, fn) {
		if(!this.routes){
			this.routes={};
		}
		this.routes[route]=fn;
    },
	addrules: function (options) {
		options || (options = {});
		if (options.routes) this.routes = options.routes;
		this._bindRoutes();		
	}
}

autoexposure.cookie={
	get:function(name) {
		var cookieArr, cookie, i = 0;
		name += "=";
		cookieArr = document.cookie.split(';');
		for (; i < cookieArr.length; i++) {
			cookie = cookieArr[i];
			while (cookie.charAt(0) === ' ') {
				cookie = cookie.substring(1, cookie.length);
			}
			if (cookie.indexOf(name) === 0) {
				return unescape(cookie.substring(name.length, cookie.length));
			}
		}
		return null;
	},
	set:function(name, value, days) {
		var date, expires = "";
		if (days) {
			date = new Date();
			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
			expires = "; expires=" + date.toGMTString();
		}
		document.cookie = name + "=" + escape(value) + expires + "; path=/"; //safari doesn't like the unescaped val
	},
	remove:function(key){
		autoexposure.cookie.set(key,"",-1);
	}
}


    
// mark active cars onload
function updateResultIconStatus() {
	var cookieJson = JSON.parse(autoexposure.cookie.get('aeCarCompare')), iconEl;
	for (car in cookieJson) {		
		iconEl = $(".compare[id='add_" + car+"']");
		if (iconEl.length > 0)
			iconEl.addClass('active');
	}
}

function additionalDetailsStandart(el, requestPage, vehicleID, targetElement, detailsCategory, showCategoryOnTop) {
	//var carId = el.id.split('_')[1],
	var carId = vehicleID,
		body,
		script,
		carJson,
		targ,
		varName = ((requestPage == 'TechnicalSpec') ? 'jCapTechSpec_' : 'jDetailedStandardFit_'),
		displayFields = {
			"Safety and Security": ['All'],
			"Mechanical": ['All'],
			"Interior Trim and Features": ['All'],
			"Exterior Trim and Features": ['All'],
			"Heating and Ventilation": ['All'],
			"Driver Information, Aids and Communications": ['All'],
			"Entertainment": ['All'],
			"Wheels and Tyres":  ['All']
			//"Interior Trim and Features": ['Seating','Interior Trim Embellishment','Carpets','Interior Features'],
			//"Exterior Trim and Features": ['Driving Mirrors','Glass','Body Features','Exterior Lights'],
			//"Safety and Security": ['Safety']
			
		};
		
	// Show standard features grouped by category (dataset taken from displayFields JSON)
	// this works a LOT more efficently on browsers that natively support Array.indexOf ;)
	function postScriptLoadStandart(carId, varName, carJson) {
		var targHTML = '<table class="' + varName + '">', optHtml = '<div class="spec-list">', optHtml = '', catCount = 0, optClass, optText, optArr, optName, optCount, optVal, targ = document.getElementById(targetElement);
		if (!carJson) try {
			carJson = eval(varName + carId); // make sure the data is available. and yes, eval, i know. :|
		} 
		catch(err) { 
			targ.innerHTML = 'No data found for this vehicle'; // we crapped out
			return false; 
		}
		
		var detCategories = detailsCategory.split(';');
		optCount = 0;
		optHtml += '<ul id="' + targetElement + '-' + targetElement + '-'+ carId + '-data" class="vdp-featured-list">';
		for (cat in displayFields) { // get categorys from config JSON
			if (displayFields.hasOwnProperty(cat) && ((detailsCategory != '' && detailsCategory.indexOf(cat) != -1) || detailsCategory == '')) {
				optArr = displayFields[cat]; // get current cat options array from config JSON
				optHtml += (showCategoryOnTop && showCategoryOnTop === true ? '<li class="title-' + carId + '-tab"><strong>' + cat.replace('Trim and', ' ') + '</strong></li>' : '');
				for (var i = carJson.DATA.CATEGORY.indexOf(cat); i <= carJson.DATA.CATEGORY.lastIndexOf(cat); i++ ) { // get current category subset from JSONP array
					optName = carJson.DATA.SUBCATEGORY[i];
					optVal = carJson.DATA.OPTIONDESCRIPTION[i];
					if (optArr.indexOf(optName) > -1 || optArr.indexOf('All') > -1) { // check option is in displayFields array
						optHtml += '<li class="' + ((optCount%2 == 0) ? 'even' : 'odd') + '">'+optVal+'</li>';					
						optCount++; // we need a seperate counter because skipped fields will still be counted by i
					}
				}
				
				catCount++;
			}
		}
		optHtml += '</ul>';
		optHtml += '</div>';
		targ.innerHTML = optHtml;
	}

	targ = document.getElementById(targetElement);
	
	// hide spec on second button push
	if ($('ul.spec-tabs', targ).filter(":visible").length > 0) {
		targ.innerHTML = '';
		return false;
	}
	
	try {
		// use existing variable if it exists
		carVar = eval(varName + carId);
		postScriptLoadStandart(carId, varName, carJson);
	}
	catch(err) {
		// retrive cardata with json
		if (targ) {
			targ.innerHTML = 'Loading...';
			body = document.getElementsByTagName('body')[0];
			script = document.createElement('script');
			script.type = 'text/javascript';
			script.src = 'http://capdata.autoexposure.co.uk/'+requestPage+'.cfm?Vehicleid=' + carId + '&GroupTo=1'
			script.onload = function () {
				if (!script.onloadDone) {
					script.onloadDone = true;
					postScriptLoadStandart(carId, varName);
				}
			};
			script.onreadystatechange = function () {
				if (("loaded" === script.readyState || "complete" === script.readyState) && !script.onloadDone) {
					script.onloadDone = true;
					postScriptLoadStandart(carId, varName);
				}
			};
			body.appendChild(script);
		}
	}
}

function additionalDetailsTechnicalSpec(el, requestPage, vehicleID, targetElement, detailsCategory) {
	//var carId = el.id.split('_')[1],
	var carId = vehicleID,
		body,
		script,
		carJson,
		targ,
		varName = ((requestPage == 'TechnicalSpec') ? 'jCapTechSpec_' : 'jDetailedStandardFit_'),
		displayFields = {
			"Engine and Drive Train": ['All'],
			"Performance": ['All'],
			"Fuel Consumption": ['All'],
			//"Emissions": ['All'],
			//"Wheels and Tyres": ['All'],
			"Vehicle Dimensions": ['All'],
			"Weight and Capacities": ['All']
			//"Safety and General":['All'],
			//"Performance": ["Engine Power (BHP)","Engine Torque (LBS.FT)","0 to 60 (secs)","Top Speed (MPH)"],
			//"Fuel Consumption": ['EC Combined (mpg)','EC Urban (mpg)','EC Extra Urban (mpg)'],
			//"Vehicle Dimensions": ['Length (mm)','Width (mm)','Height (mm)']
		};
		
	// Show standard features grouped by category (dataset taken from displayFields JSON)
	// this works a LOT more efficently on browsers that natively support Array.indexOf ;)
	function postScriptLoadTechnicalSpec(carId, varName, carJson) {
		var targHTML = '<table class="' + varName + '">', optHtml = '<div class="spec-list">', optHtml = '', catCount = 0, optClass, optText, optArr, optName, optCount, optVal, targ = document.getElementById(targetElement);
		if (!carJson) try {
			carJson = eval(varName + carId); // make sure the data is available. and yes, eval, i know. :|
		} 
		catch(err) { 
			targ.innerHTML = 'No data found for this vehicle'; // we crapped out
			return false; 
		}
		
		for (cat in displayFields) { // get categorys from config JSON
			if (displayFields.hasOwnProperty(cat) && ((detailsCategory != '' && detailsCategory.indexOf(cat) != -1) || detailsCategory == '')) {
				optArr = displayFields[cat]; // get current cat options array from config JSON
				optCount = 0;
				//optText = cat.replace(/\W/g, '').toLowerCase();
				//optClass = (catCount == 0) ? 'active' : '';
				//optHtml += '<table id="' + optText + '-' + carId + '-data" class="' + optClass + '">';
				optHtml += '<ul id="' + targetElement + '-' + cat.toLowerCase().replace(" ", "").replace('&', '_').replace('#', '_').replace('$', '_') + '-'+ carId + '-data" class="vdp-featured-list-tech">';
				//tabHtml += '<li id="' + optText + '-' + carId + '-tab" class="' + optClass + '"><a href="#">' + cat + '</a></li>';
				for (var i = carJson.DATA.TECHCATEGORY.indexOf(cat); i <= carJson.DATA.TECHCATEGORY.lastIndexOf(cat); i++ ) { // get current category subset from JSONP array
					optName = carJson.DATA.TECHOPTION[i];
					optVal = carJson.DATA.TECHOPTIONVALUE[i];
					if (optArr.indexOf(optName) > -1 || optArr.indexOf('All') > -1) { // check option is in displayFields array
						optHtml += '<li class="' + ((optCount%2 == 0) ? 'even' : 'odd') + '"><span class="optName">'+optName+'</span><span class="optVal">'+optVal+'</span></li>';					
						optCount++; // we need a seperate counter because skipped fields will still be counted by i
					}
				}				
				optHtml += '</ul>';
				catCount++;
			}
		}
		
		optHtml += '</div>';
		targ.innerHTML = optHtml;
		// add to summary
		var ind = '';
		var isexist = false;
		var optsArray = new Array('No. of Seats', 'No. of Gears', 'CO2 (g/kg)', 'Insurance Group', 'Std. Man. Warranty (Years from new)', 'Standard Man. Warranty (Mileage)', 'Man. Paintwork Guarantee (Years from new)', 'Man. Corrosion Guarantee (Years from new)');
		
		for (oa = 0; oa < optsArray.length; oa++)
		{
			isexist = false;
			ind = carJson.DATA.TECHOPTION.indexOf(optsArray[oa]);
			if (ind > 0)
			{
				$("#popup-summary dl dt").each(function(i,e){
					if ($(e).text() === optsArray[oa])
					{
						isexist = true;
					}
				});
				if (!isexist)
				{
					$("#popup-summary dl").append('<dt>' + carJson.DATA.TECHOPTION[ind] + '</dt><dd>' + carJson.DATA.TECHOPTIONVALUE[ind] + '</dd>');
				}
			}
		}
	}
	targ = document.getElementById(targetElement);
	
	// hide spec on second button push
	if ($('ul.spec-tabs', targ).filter(":visible").length > 0) {
		targ.innerHTML = '';
		return false;
	}
	
	try {
		// use existing variable if it exists
		carVar = eval(varName + carId);
		postScriptLoadTechnicalSpec(carId, varName, carJson);
	}
	catch(err) {
		// retrive cardata with json
		if (targ) {
			targ.innerHTML = 'Loading...';
			body = document.getElementsByTagName('body')[0];
			script = document.createElement('script');
			script.type = 'text/javascript';
			script.src = 'http://capdata.autoexposure.co.uk/'+requestPage+'.cfm?Vehicleid=' + carId + '&GroupTo=1'
			script.onload = function () {
				if (!script.onloadDone) {
					script.onloadDone = true;
					postScriptLoadTechnicalSpec(carId, varName);
				}
			};
			script.onreadystatechange = function () {
				if (("loaded" === script.readyState || "complete" === script.readyState) && !script.onloadDone) {
					script.onloadDone = true;
					postScriptLoadTechnicalSpec(carId, varName);
				}
			};
			body.appendChild(script);
		}
	}
}

$(document).ready(function(){
	$('.wp_YTFeedItem a').each(function(){
			$(this).attr('target', '_blank');
		});
});
