﻿var dl = null;
function createDealerLocator() {

    var options = getDLOptions();

    if (typeof (dealerSiteDealerId) != "undefined" && dealerSiteDealerId != "") {
        options.loaded = function(dl) {
            searchById(dl, dealerSiteDealerId);
        };
        if (!options.alwaysShowAllDealers)
            options.sponsoredDealerId = dealerSiteDealerId;
    } else {

        var cookie = $.cookie("DealerSponsored");
        if (cookie != null && cookie != "") {
            options.loaded = function(dl) {
                searchById(dl, cookie);
            };
            if (!options.alwaysShowAllDealers)
                options.sponsoredDealerId = cookie;
        }
        else {

            cookie = $.cookie("DealerPreferredName");
            if (cookie != null && cookie != "") {
                $("#" + dlBtn_Input).attr("value", cookie);
            }
            else {

                cookie = $.cookie("DealerSites");
                if (cookie != null && cookie != "") {
                    options.loaded = function(dl) {
                        searchById(dl, cookie);
                    };
                }
                else {

                    cookie = $.cookie("DealerSearch");
                    if (cookie != null && cookie != "" && $("#" + dlBtn_Input).attr("value") == "") {
                        $("#" + dlBtn_Input).attr("value", cookie);
                    }
                }
            }
        }
    }

    var func = options.loaded;
    options.loaded = function(dl) {
        if ($.isFunction(func))
            func(dl);
        $(".dl-loading").remove();
        $(".js #intro").css("visibility", "visible");
    };

    if (options.enableAdvancedOptions) {
        $("#dl-show-search-options").click(function() {
            $(this).toggleClass("active");
            $("#dl-filters").slideToggle();
        }).text(options.texts.txtShowAdvanced).toggle(function() { $(this).text(options.texts.txtHideAdvanced); }, function() { $(this).text(options.texts.txtShowAdvanced); }).show();

        if (options.showAdvancedOptionsDefault) {
            $("#dl-show-search-options").trigger("click");
        }
    }

    dl = new $.dealerLocator(options);
}

function resetDealerLocatorMap() {
    if (!dl)
        return;

    dl.mapManager.resetMap();
}

function getDLOptions() {

    var mapIcon = new GIcon();
    mapIcon.image = vpath + "images/dealer-locator/map-icon-{0}.png";
    mapIcon.shadow = vpath + "images/dealer-locator/map-icon-shadow.png";
    mapIcon.iconSize = new GSize(27, 46);
    mapIcon.shadowSize = new GSize(45, 50);
    mapIcon.iconAnchor = new GPoint(9, 46);
    mapIcon.infoWindowAnchor = new GPoint(9, 46);

    var notVerifiedIcon = new GIcon();
    notVerifiedIcon.image = vpath + "images/dealer-locator/list-item-{0}.png";
    notVerifiedIcon.iconSize = new GSize(33, 38);
    notVerifiedIcon.shadowSize = new GSize(0, 0);
    notVerifiedIcon.iconAnchor = new GPoint(16, 30);
    notVerifiedIcon.infoWindowAnchor = new GPoint(16, 38);

    var listIcon = vpath + "images/dealer-locator/list-item-{0}.png";

    var miniMarker = new GIcon();
    miniMarker.image = vpath + "images/dealer-locator/mini-marker.png";
    miniMarker.iconSize = new GSize(16, 16);
    miniMarker.shadowSize = new GSize(0, 0);
    miniMarker.iconAnchor = new GPoint(6, 6);
    miniMarker.infoWindowAnchor = new GPoint(0, 0);

    var mapIcons = new Array();
    var listIcons = new Array();
    var notVerifiedIcons = new Array();

    for (var i = 0; i < 9; i++) {

        var b = new GIcon(mapIcon);
        b.image = b.image.replace("{0}", i + 1);

        var nv = new GIcon(notVerifiedIcon);
        nv.image = nv.image.replace("{0}", i + 1);

        var l = listIcon.replace("{0}", i + 1);

        mapIcons.push(b);
        notVerifiedIcons.push(nv);
        listIcons.push(l);
    }

    var markers = { miniMarker: miniMarker, mapIcons: mapIcons, listIcons: listIcons, notVerifiedIcons: notVerifiedIcons };

    var cluster1Icon = new GIcon();
    cluster1Icon.iconSize = new GSize(53, 52);
    cluster1Icon.image = vpath + "modules/dealer-locator/2.1/gfx/cluster1.png";
    cluster1Icon.iconAnchor = new GPoint(26, 26);
    cluster1Icon.shadowSize = new GSize(0, 0);
    cluster1Icon.infoWindowAnchor = new GPoint(0, 0);

    var cluster2Icon = new GIcon();
    cluster2Icon.iconSize = new GSize(56, 55);
    cluster2Icon.image = vpath + "modules/dealer-locator/2.1/gfx/cluster2.png";
    cluster2Icon.iconAnchor = new GPoint(28, 27);
    cluster2Icon.shadowSize = new GSize(0, 0);
    cluster2Icon.infoWindowAnchor = new GPoint(0, 0);

    var cluster3Icon = new GIcon();
    cluster3Icon.iconSize = new GSize(66, 65);
    cluster3Icon.image = vpath + "modules/dealer-locator/2.1/gfx/cluster3.png";
    cluster3Icon.iconAnchor = new GPoint(33, 32);
    cluster3Icon.shadowSize = new GSize(0, 0);
    cluster3Icon.infoWindowAnchor = new GPoint(0, 0);

    /* If ddUrl is set via WIP_DrivingDirectionsUrl.wcm */
    if (typeof (ddUrl) != "undefined") {
        dldirectionsUrl = ddUrl;
    }

    $.extend($dlOptions, {
    	markers: markers,
    	cluster1Icon: cluster1Icon,
    	cluster2Icon: cluster2Icon,
    	cluster3Icon: cluster3Icon,
    	btnSubmitId: dlBtn_Submit,
    	inputId: dlBtn_Input,
    	brandId: dlBrandId,
    	node: dlNodeId,
    	createMarkerIcon: createMarkerIcon,
    	showDealersOnMap: true,
    	dealersUrl: dlDimUrl,
    	dealerUrl: dlDimDealerUrl,
    	dealerInfoCloseImg: vpath + "images/dealer-locator/close.png",
    	isRetailerIconUrl: vpath + "modules/dealer-locator/gfx/is_retailer.png",
    	hasServiceIconUrl: vpath + "modules/dealer-locator/gfx/has_service.png",
    	directionsUrl: (typeof dldirectionsUrl == "undefined") ? null : dldirectionsUrl,
    	dealerInfoRendered: function(dealer, el, markers) {
    		var preferred = $.cookie("DealerPreferred");
    		var cb = el.find("input:checkbox");
    		cb[0].checked = (preferred != null && preferred == dealer.id);
    	},
    	dealerRendered: function(dealer, el, markers) {
    		$dlOptions.mapNumberChanged(dealer, markers);
    		$dlOptions.distanceChanged(dealer);
    	},
    	mapNumberChanged: function(dealer, markers) {
    		if (!dealer.el)
    			return;
    		if (dealer.mapNumber <= $dlOptions.dealersWithNumbers)
    			dealer.el.find(".list-icon").attr("src", $dlOptions.markers.listIcons[dealer.mapNumber - 1]);
    		else
    			dealer.el.find(".list-icon").attr("src", $dlOptions.markers.miniMarker.image);
    	},
    	distanceChanged: function(dealer) {
    		if (!dealer.el || $dlOptions.distanceUnit === '')
    			return;

    		dealer.el.find(".distance").text(" (" + dealer.distanceFromSearch + " " + $dlOptions.distanceUnit + ")");
    	},
    	filters: (typeof dlFilters == "undefined") ? null : dlFilters,
    	userFilters: dlUserFilters,
    	userFiltersContainerId: "dl-filters",
    	dealerLevelFilters: dlLevels,
    	renderDealer: renderDealer,
    	renderDealerInfo: renderDealerInfo,
    	createMarkerIcon: createMarkerIcon,
    	createDealerName: createDealerName,
    	dealersWithNumbers: 9
    });

    return $dlOptions;
}

function populateExtended(dealer) {

    if (!dealer.extendedPopulated) {
        $(dealer.extendedDealer.p).each(function() {

            if (this.ProgId == dlProperyNames.Website)
                dealer.Website = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.Email)
                dealer.Email = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.PhoneShop)
                dealer.Phone = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.PhoneOffice)
                dealer.StorePhone = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.PhoneService)
                dealer.ServicePhone = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.Fax)
                dealer.Fax = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.Presentation)
                dealer.Presentation = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.OpenHours)
                dealer.OpenHours = getPropertyValue(this.Values);
            else if (this.ProgId == dlProperyNames.Exposure)
                dealer.ExposeUrl = getPropertyValue(this.Values);

            dealer.extendedPopulated = true;
        });

        dealer.formattedAdress = formatAddress(dealer.extendedDealer.a.Address,
			dealer.extendedDealer.a.City, dealer.extendedDealer.a.PostalCode,
			dealer.extendedDealer.a.State).replace(/\n/g, "<br/>");

        if (dealer.extendedDealer.a.AddressComment) {
            dealer.formattedAdress = dealer.formattedAdress + "<br/>" + dealer.extendedDealer.a.AddressComment;
        }

        $(dealerUrls).each(function() {
            if (this.ID == dealer.id)
                dealer.Url = this.Url;
        });
    }
}

function getPropertyValue(values) {

    var defaultValue = null;
    for (var i = 0; i < values.length; i++) {
        if (this.BrandAlias == dlBrandId)
            return values[i].Value;
        if (this.BrandAlias == null)
            defaultValue = values[i].Value;
    }
    return defaultValue;
}

function createDealerName(dealer) {
    if (!dealer.miniDealer.uniqueIdentifier)
        return dealer.miniDealer.n;

    return (dealer.miniDealer.n + ", " + formatAddress(dealer.miniDealer.uniqueIdentifier.Address,
			dealer.miniDealer.uniqueIdentifier.City, dealer.miniDealer.uniqueIdentifier.PostalCode,
			dealer.miniDealer.uniqueIdentifier.State)).replace(/\n/g, " ");
}

function formatAddress(streetaddress, city, zipcode, state, country) {
    return addressFormatString
		.replace("{$streetaddress}", streetaddress ? streetaddress : "")
		.replace("{$city}", city ? city : "")
		.replace("{$zipcode}", zipcode ? zipcode : "")
		.replace("{$state}", state ? state : "")
		.replace("{$country}", country ? country : "")
		.replace("{$postaladdress}\n", "");
}

function createDLToolTip(headline, desc, imgSrc, imgSrcLarge) {

    if (imgSrc == '')
        return '';

    if (headline == '' || desc == '')
        return '<img class="matching-filter" src="' + imgSrc + '" />';

    var content = '<div class="matching-filter tooltip-item">'
					+ '<span title="' + desc + '"><img src="' + imgSrc + '" /></span>'
					+ '<div class="tooltip" style="display: none;">'
					+ '<div class="tooltip-content">'
					+ '<h4>' + headline + '</h4>'
					+ (imgSrcLarge != "" ? '<img src="' + imgSrcLarge + '" />' : "")
					+ '<p>' + desc + '</p>'
					+ '</div><div class="tooltip-bottom"></div></div></div>';

    return content;
}

function createTooltips(dealer) {


    if ((!$dlOptions.dealerLevelFilters || $dlOptions.dealerLevelFilters.length == 0) && (!$dlOptions.userFilters || $dlOptions.userFilters.length == 0))
        return "";

    var tips = '<div class="matching-filters">';

    $($dlOptions.dealerLevelFilters).each(function(i, filter) {
        if (!filter.userMatchFilter(dealer))
            return;

        if (filter.iconSmallUrl == '')
            return;

        tips += createDLToolTip(filter.tooltipHeadline, filter.tooltipDesc, filter.iconSmallUrl, filter.iconLargeUrl);
    });

    $($dlOptions.userFilters).each(function(i, filter) {
        if (!filter.userMatchFilter(dealer))
            return;

        if (filter.iconSmallUrl == '')
            return;

        tips += createDLToolTip(filter.tooltipHeadline, filter.tooltipDesc, filter.iconSmallUrl, filter.iconLargeUrl);
    });

    tips += '</div>';

    return tips;
}

function renderDealer(dealer, el, markers) {

    if (el) {

        populateExtended(dealer);

        var addressText = dealer.formattedAdress;

        var content = $('<img class="list-icon png"/><h3>'
			+ dealer.miniDealer.n + '</h3>'
			+ '<p class="city">' + dealer.extendedDealer.a.City + (!dealer.miniDealer.vl ? ' [' + $dlOptions.texts.txtNotVerifiedLocationText + "]" : "") + '<span class="distance"></span></p>'
			+ ((dealer.Phone != undefined && dealer.Phone != null && dealer.Phone != "") ? '<p class="phone">' + dealer.Phone + '</p>' : '')
			+ '<a class="more-info level2-link">' + $dlOptions.texts.txtMoreInfo + '</a>'
			+ createTooltips(dealer)
			);

        el.addClass("dealer").append(content).hover(function() {
            $(this).addClass("dealer-hover");
        }, function() {
            $(this).removeClass("dealer-hover");
        });

        createTooltip(el.find(".tooltip-item"));
    }
}

function renderDealerInfo(dealer, el, markers) {

    if (el) {

        var resultContainer = $("#dl-result");

        populateExtended(dealer);

        $(".dealer-info").remove();

        var directionsUrl = "";
        if (dl.defaults.directionsUrl)
            directionsUrl = dl.defaults.directionsUrl + (dl.defaults.directionsUrl.indexOf("?") >= 0 ? "&" : "?") + "to=" + encodeURIComponent($dlOptions.createDealerName(dealer));

        var input = $("#" + dlBtn_Input);
        if (input.attr("value") != "" && input.attr("value") != dealer.miniDealer.n && input.attr("value") != undefined) {
            directionsUrl += "&from=" + encodeURIComponent(input.attr("value"));
        }

        var website = dealer.Website ? dealer.Website : "";

        if (website.indexOf("http://") != 0)
            website = "http://" + website;

        var content = $('<img class="dealer-info-close png" src="'
		+ dl.defaults.dealerInfoCloseImg + '"" /><h3>'
		+ dealer.miniDealer.n + '</h3>'
		+ createTooltips(dealer)
		+ ((typeof (dealerSiteDealerId) == "undefined" && dealer.ExposeUrl == "True" && dealer.Url != undefined && dealer.Url != null && dealer.Url != "") ? '<a href="' + dealer.Url + '" class="dealersite-url level2-link">' + $dlOptions.texts.txtDealerSitesLinkText + '</a>' : '')
		+ '<h3 class="dealer-info-adress">'
		+ $dlOptions.texts.txtAdress + '</h3><p class="dealer-info-adress">' + dealer.formattedAdress + (!dealer.miniDealer.vl ? '<br/> [' + $dlOptions.texts.txtNotVerifiedLocationText + "]" : "") + '</p>'
		+ (dealer.miniDealer.vl ? '<a class="directions level2-link" href="' + directionsUrl + '">' + $dlOptions.texts.txtGetDirections + '</a>' : "")
		+ '<h3 class="dealer-info-contact">'
		+ $dlOptions.texts.txtContactInformation + '</h3><table><colgroup><col class="col1"/><col class="col2"/></colgroup><tbody>'
		+ ((dealer.Phone != undefined && dealer.Phone != null && dealer.Phone != "") ? '<tr><td><b>' + $dlOptions.texts.txtPhone + '</b></td><td>' + dealer.Phone + '</td></tr>' : '')
		+ ((dealer.StorePhone != undefined && dealer.StorePhone != null && dealer.StorePhone != "") ? '<tr><td><b>' + $dlOptions.texts.txtStorePhone + '</b></td><td>' + dealer.StorePhone + '</td></tr>' : '')
		+ ((dealer.ServicePhone != undefined && dealer.ServicePhone != null && dealer.ServicePhone != "") ? '<tr><td><b>' + $dlOptions.texts.txtServicePhone + '</b></td><td>' + dealer.ServicePhone + '</td></tr>' : '')
		+ ((dealer.Fax != undefined && dealer.Fax != null && dealer.Fax != "") ? '<tr><td><b>' + $dlOptions.texts.txtFax + '</b></td><td>' + dealer.Fax + '</td></tr>' : '')
		+ ((dealer.Email != undefined && dealer.Email != null && dealer.Email != "") ? '<tr><td><b>' + $dlOptions.texts.txtEmail + '</b></td><td><a href="mailto:' + dealer.Email + '">' + dealer.Email + '</a></td></tr>' : '')
		+ (($dlOptions.showDealerWebsite && dealer.Website != undefined && dealer.Website != null && dealer.Website != "") ? '<tr><td><b>' + $dlOptions.texts.txtHomepage + '</b></td><td>' + ($dlOptions.linkWebsite ? '<a href="' + website + '" target="_blank">' + dealer.Website + '</a>' : dealer.Website) + '</td></tr>' : '')
		+ '</tbody></table>'
		+ ((dealer.OpenHours != undefined && dealer.OpenHours != null && dealer.OpenHours != "") ? '<h3 class="dealer-info-open">' + $dlOptions.texts.txtOpeningHours + '</h3><p class="open-hours">' + dealer.OpenHours.replace(/\n/g, "<br/>") + '</p>' : '')
		+ '<p class="dealer-info-preferred"><input id="cb-preferred" type="checkbox"/><label for="cb-preferred">'
		+ $dlOptions.texts.txtPreferred + '</label>'
		+ +'</p>');

        el.append(content).addClass("dealer-info");

        el.find(".dealer-info-close").click(function() {
            el.remove();
            resultContainer.removeClass("dealer-info-visibe");
        });

        el.find("#cb-preferred").click(function() {
            if (this.checked) {
                $.cookie("DealerPreferred ", dealer.id, { expires: 365, path: '/' });
                $.cookie("DealerPreferredName", $dlOptions.createDealerName(dealer), { expires: 365, path: '/' });
            }
            else {
                $.cookie("DealerPreferred", null, { expires: 365, path: '/' });
                $.cookie("DealerPreferredName", null, { expires: 365, path: '/' });
            }
        });

        var sponsored = $.cookie("DealerSponsored");
        if (((sponsored != null && sponsored.toLowerCase() == dealer.id.toLowerCase()) || (typeof (dealerSiteDealerId) != "undefined" && dealerSiteDealerId.toLowerCase() == dealer.id.toLowerCase())) && !$dlOptions.alwaysShowAllDealers)
            el.find(".dealer-info-close").remove();

        if (dealer.el != null)
            el.append(dealer.el.find(".list-icon").clone());

        createTooltip(el.find(".tooltip-item"));
        
        el.css("top", resultContainer.scrollTop());
    }
}

function createMarkerIcon(dealer, markers) {

    if (dealer.mapNumber > $dlOptions.dealersWithNumbers)
        return markers.miniMarker;

    if (dealer.miniDealer.vl && markers.mapIcons[dealer.mapNumber - 1] != null) {
        return markers.mapIcons[dealer.mapNumber - 1];
    }

    if (markers.notVerifiedIcons[dealer.mapNumber - 1] != null) {
        return markers.notVerifiedIcons[dealer.mapNumber - 1];
    }

    return G_DEFAULT_ICON;
}

var dd = null;
function createDrivingDirections() {


    var ddOpt = {
        dealerDetailsZoomLevel: ddDetailsZoomLevel,
        defaultMapZoom: ddDefaultMapZoom,
        defaultMapCenter: new GLatLng(ddDefaultMapCenterLat, ddDefaultMapCenterLng),
        submit: $("#" + ddSubmit),
        result: $("#dl-result"),
        toInput: $("input.dd-to"),
        fromInput: $("input.dd-from"), 
        from: (typeof ddFrom == "undefined") ? "" : ddFrom,
        to: (typeof ddTo == "undefined") ? "" : ddTo,
        dealersUrl: dlDimUrl,
        dealerUrl: dlDimDealerUrl,
        brandId: dlBrandId,
        node: dlNodeId,
        txtHeadline: ddTxtResultHeadline,
        txtError: ddTxtError,
        geoCodePrefix: dlSearchPrefix,
        createDealerName: createDealerName,
        loaded: function() {
            $(".dl-loading").remove();
            $(".js #intro").css("visibility", "visible");
        }
    };

    if (typeof (dealerSiteDealerId) != "undefined" && dealerSiteDealerId != "") {
        ddOpt.dealerId = dealerSiteDealerId;
    }

    dd = new $.drivingDirections(ddOpt);
}

function backToDealerLocator() {
    var url = dlUrl + ((typeof ddTo == "undefined") ? "" : ("?dlquery=" + encodeURIComponent(ddTo)));
    location.href = url;
}
