﻿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);

	createUSFilters(dl, dl.activeFilters);
}

function createUSFilters(dl, filters) {

	if (typeof (usFilters) == 'undefined')
		return;

	var filterContainer = $('<div id="us-filters"></div>")').appendTo("#dl-filters").append('<div class="user-filter">' + usFilterPrefix + '</div>');

	$(usFilters).each(function() {

		var f = this;

		var cb = $('<input type="checkbox" id="' + this.id + '" />').click(function() {

			if ($(this).is(":checked"))
				filters.push(f);
			else {
				$(filters).each(function(i, e) {
					if (f.id == e.id)
						filters.splice(i, 1);
				});
			}

			dl.filterDealers(filters);

		});

		var label = $('<label for="' + this.id + '"><img src="' + this.iconSmallUrl + '"/>' + this.label + '</label>');

		$('<div class="user-filter"></div>').append(cb).append(label).appendTo(filterContainer);

		if (this.checked) {
			cb.attr("checked", "checked");
		}

	});
}

function resetDealerLocatorMap() {
	if (!dl)
		return;

	dl.mapManager.resetMap();
}

function getDLOptions() {

	var mapIcon = new GIcon();
	mapIcon.image = vpath + "images/dealer-locator/map-icon-blue-{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-blue-{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-blue-{0}.png";

	var miniMarker = new GIcon();
	miniMarker.image = vpath + "images/dealer-locator/mini-marker-blue.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 + "images/dealer-locator/is_retailer.png",
		hasServiceIconUrl: vpath + "images/dealer-locator/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);
			cb.checkbox();
		},
		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.PhoneService)
			    dealer.ServicePhone = getPropertyValue(this.Values);
			else if (this.ProgId == dlProperyNames.PhoneStore)
			    dealer.OfficePhone = 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, null, dealer.extendedDealer.a.AddressComment).replace(/\n/g, "<br/>");
	}
}

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, addressComment) {
	return addressFormatString
		.replace("{$streetaddress}", streetaddress ? (addressComment ? streetaddress + ", " + addressComment : 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) {

	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 createUSIcons(dealer) {

	if (typeof (usFilters) == 'undefined')
		return '';

	var container = '<div class="us-icons">';

	$(usFilters).each(function() {
		if (!this.userMatchFilter(dealer))
			return;
		container += '<img src="' + this.iconSmallUrl + '" />';
	});

	container += '</div>';

	return container;
}

var chooseDealerButton;

function createChooseDealerButton(el, dealer) {

	if (!chooseDealerButton)
		chooseDealerButton = $(".choose-dealer-button");

	if (chooseDealerButton.length == 0)
		return;

	chooseDealerButton.clone().attr("href", "").removeClass("hidden").appendTo(el).click(function(e) {
		$(document).trigger("dealer-selected", [dealer]);
		if (parent)
			parent.$(parent.document).trigger("dealer-selected", [dealer]);

		e.preventDefault();
		e.stopPropagation();
	});
}

function renderDealer(dealer, el, markers) {

	if (el) {

		populateExtended(dealer);

		var addressText = formatAddress(dealer.extendedDealer.a.Address,
			dealer.extendedDealer.a.City, dealer.extendedDealer.a.PostalCode,
			dealer.extendedDealer.a.State);

		var content = $('<img class="list-icon png"/><h2>'
			+ dealer.miniDealer.n + '</h2>'
			+ '<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)
			+ (location.search.indexOf("choose-dealer=1") >= 0 ? "" : createUSIcons(dealer))
			);

		el.addClass("dealer").append(content).hover(function() {
			$(this).addClass("dealer-hover");
		}, function() {
			$(this).removeClass("dealer-hover");
		});

		createChooseDealerButton(el, dealer);

		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));

		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 = $(createTooltips(dealer) + '<img class="dealer-info-close png" src="'
		+ dl.defaults.dealerInfoCloseImg + '"" /><h2>'
		+ dealer.miniDealer.n + '</h2>'
		+ ((dealer.Presentation != undefined && dealer.Presentation != null && dealer.Presentation != "") ? '<p class="presentation">' + dealer.Presentation + '</p>' : '')
		+ ((typeof (dealerSiteDealerId) == "undefined" && dealer.ExposeUrl == "True") ? '<a href="FindDealerPage.axd?did=' + dealer.id + '&sid=' + sid + '&lid=' + lid + '" 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 && dl.defaults.directionsUrl ? '<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.ServicePhone != undefined && dealer.ServicePhone != null && dealer.ServicePhone != "") ? '<tr><td><b>' + $dlOptions.texts.txtServicePhone + '</b></td><td>' + dealer.ServicePhone + '</td></tr>' : '')
		+ ((dealer.OfficePhone != undefined && dealer.OfficePhone != null && dealer.OfficePhone != "") ? '<tr><td><b>' + $dlOptions.texts.txtOfficePhone + '</b></td><td>' + dealer.OfficePhone + '</td></tr>' : '')
		+ ((dealer.Fax != undefined && dealer.Fax != null && dealer.Fax != "") ? '<tr><td><b>' + $dlOptions.texts.txtFax + '</b></td><td>' + dealer.Fax + '</td></tr>' : '')
		+ (($dlOptions.showDealerEmail && 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>'
		+ (($dlOptions.texts.txtContactLinkText != undefined && $dlOptions.texts.txtContactLinkText != null && $dlOptions.texts.txtContactLinkText != "" && dealer.Email != undefined && dealer.Email != null && dealer.Email != "") ? '<a class="contact level2-link" href="FindDealerPage.axd?pt=dealercontactform&did=' + dealer.id + '&sid=' + sid + '&lid=' + lid + '&fb=' + cffb + '">' + $dlOptions.texts.txtContactLinkText + '</a>' : '')
		+ ((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");

		createChooseDealerButton(el, dealer);

		el.find(".dealer-info-close").click(function() {
			el.remove();
			resultContainer.removeClass("dealer-info-visibe");
		});

		el.find("#cb-preferred").bind("uncheck", function() {
			$.cookie("DealerPreferred", null, { expires: 365, path: '/' });
			$.cookie("DealerPreferredName", null, { expires: 365, path: '/' });
		}).bind("check", function() {
			$.cookie("DealerPreferred ", dealer.id, { expires: 365, path: '/' });
			$.cookie("DealerPreferredName", $dlOptions.createDealerName(dealer), { 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"),
		from: (typeof ddFrom == "undefined") ? "" : ddFrom,
		to: (typeof ddTo == "undefined") ? "" : ddTo,
		dealerUrl: dlDimDealerUrl,
		brandId: dlBrandId,
		node: dlNodeId,
		txtHeadline: ddTxtResultHeadline,
		txtError: ddTxtError,
		geoCodePrefix: dlSearchPrefix,
		createDealerName: createDealerName
	};

	if (typeof (dealerSiteDealerId) != "undefined" && dealerSiteDealerId != "") {
		ddOpt.dealerId = dealerSiteDealerId;
	}

	dd = new $.drivingDirections(ddOpt);
	$(".js #intro").css("visibility", "visible");
}

function backToDealerLocator() {
	var url = dlUrl + ((typeof ddTo == "undefined") ? "" : ("?dlquery=" + encodeURIComponent(ddTo)));
	location.href = url;
}
