function customEscape(val) {
	return escape(val).replace(/%E9/g, "%C3%A9");
}

$.extend($.ford.pages, {dealer: { }});
$.extend($.ford.pages.dealer, {vars: {
	forms: false,
	delegate: null,
	searchCnt: 0
}});
$.extend($.ford.pages.dealer, {init: function() {
	// this is a hack to prevent the search from being executed multiple times 
	// due to $('#dealerSearchButton').bind('click', function() stacking up
	if($.ford.pages.dealer.vars.searchCnt > 0) {
		return false;
	}
	$.ford.pages.dealer.vars.searchCnt = 1;
	
	// Add Click to search button
	$('#dealerSearchButton').bind('click', function() {
		$.ford.pages.dealer.search();
	});
	
	// When you press enter on name or postal the search will be triggers
	$('#ds_name, #ds_postal').live("keypress", function(e) {
		 var code = (e.which ? e.which : e.keyCode);
		 if(code == 13) {
			e.preventDefault();
			$('#dealerSearchButton').trigger('click');
		}
	});
	
	//default the Dealer Type drop down (ie Quick Lane, Business Preferred, etc.)
	$.ford.pages.dealer.searching.dealerType.selected();
	
	// Populate the postal code text box with either the postal code provided in the request
	// parameters, if it exists, or the postal code in the session data of the user, if it exists.
	// In either case, trigger the search if a postal code exists.
	if(Ford.Common.getParam("postalCode")) {
		$('#ds_postal').val(Ford.Common.getParam('postalCode'));
		$('#dealerSearchButton').trigger('click');
	} else if($.ford.validation.isCalZip($.ford.vars.get('postal'))) {
		$('#ds_postal').val($.ford.vars.get('postal'));
		$('#dealerSearchButton').trigger('click');
	}
	
	$('.next-button').bind('click', function() {
		if($(this).hasClass('disabled')) {
			return;
		}
		
		// make sure we can click prev button
		$('.prev-button').removeClass('disabled');
		
		var _show = $('.js_dealer').filter(':gt('+$('.js_dealer:visible:first').data('key')+')').filter(':hidden').filter(':lt(5)');
		$('.js_dealer:visible').hide();
		$(_show).show();
		
		// show pins on map
		$.ford.pages.dealer.map.showDealers(_show);
		
		if($('.js_dealer:visible:last').data('key') == $('.js_dealer:last').data('key')) {
			$(this).addClass('disabled');
		}
	});
	
	$('.prev-button').bind('click', function() {
		if($(this).hasClass('disabled')) {
			return;
		}
		
		// make sure we can click prev button
		$('.next-button').removeClass('disabled');
		
		var _show = $('.js_dealer').filter(':lt('+$('.js_dealer:visible:last').data('key')+')').filter(':hidden');
		
		var _gt = ((((_show.length / 5) - 1) * 5) - 1);
		if(_gt > 0) {
			_show = $(_show).filter(':gt(' + _gt + ')');
		}
		
		$('.js_dealer:visible').hide();
		$(_show).show();
		
		// show pins on map
		$.ford.pages.dealer.map.showDealers(_show);
		
		if($('.js_dealer:visible:first').data('key') == $('.js_dealer:first').data('key')) {
			$(this).addClass('disabled');
		}
	});

}});
$.extend($.ford.pages.dealer,{clear: function() {
	$('.prev-button').addClass('disabled');
	$('.next-button').addClass('disabled');
}});
$.extend($.ford.pages.dealer,{search: function() {
	//NOTE: somehow this function is getting called twice during a normal walk-through of the Test Drive form (possilby others!).
	//This was noticed when FoC tags were doubling up.  As a quick patch those tags were moved inside an existing IF statement, which prevented them from executing twice. 
	$.ford.pages.dealer.clear();
	var url = null;
	if($.ford.vars.dealer && $.ford.vars.dealer.key) {
		url = $.ford.pages.dealer.searching.key.url();
	} else if($('#ds_name').val().length > 0) {
		url = $.ford.pages.dealer.searching.name.url();
	} else if($('#ds_city').val().length > 0 && $('#ds_province').val().length > 0) {
		url = $.ford.pages.dealer.searching.city.url();
	} else if($('#ds_postal').val().length > 0 ) {
		url = $.ford.pages.dealer.searching.postal.url();
	} else {
		$('#js_error_message').text('');
		$('#js_error_message').append(local('error_dealer_valid_data'));
		$('tr.error-message').removeClass('disabled');
		return;
	}
	
	$.ajax({
		url:_F.root +'/' + _F.lang + '/' + _F.type + url,
		data: {'distance':$('#distance option:selected').val()},
		dataType: 'json',
		error: function() {
			$('#js_error_message').text('');
			$('#js_error_message').append(local('label_no_dealers'));
			$('tr.error-message').removeClass('disabled');
		},
		success: function(data) {
			$('#js_error_message').text('');
			if(data.results == null) {
				$('#js_error_message').append(local('error_dealer_no_dealers'));
				$('tr.error-message').removeClass('disabled');
				return;
			}

			var list = $('#js_result_items');
			list.empty();
		
			var info = $('<li>').addClass('listDetails').attr('data-size', data.results.size);
			if(data.results.size <= 0) {
				$('#js_error_message').text('');
				$('#js_error_message').append(local('label_no_dealers'));
				$('tr.error-message').removeClass('disabled');
				info.append(local("label_no_dealers"));
			} else {
				$('#dealerSearchResults #default').hide();
				$('#dealerSearchResults #resultSet').show();
				
				// check to see if map is loaded
				if($.ford.pages.dealer.data.map == null) {
					// create in map
					var mapHeight = _F.type == 'li' ? 807 : 801;
					var mapWidth = _F.type == 'li' ? 523 : 427;
					$.ford.pages.dealer.data.map = new Microsoft.Maps.Map(document.getElementById('mapviewer'), {
						credentials: 'Ambbn3UrKV9QntCTe4zGuzDvW31EJ0ppQw1YeGsCyOFjukSfQ9JliIylgoxKIA_b', 
						width: mapWidth, 
						height: mapHeight,
						zoom: 8,
						showMapTypeSelector: false,
						enableSearchLogo: false,
						center: new Microsoft.Maps.Location(60, -90) // center to Canada
					});
					//FoC ford tag
					if (_F.type == 'fo') {
						var o = $.ford.common.getDoubleClick();
						var array = new Array();
						array[4] = _F.lang;
						array[5] = 'Find A Dealer Results';
						array[6] = 'Buying Conversion';
						o.array = array;
						o.cat = 'foc-f003';
						o.type = 'buyin236';
						o.run();
					}
					//FoC Conversion tag For Lincoln
					if (_F.type == 'li') {
						//console.log('js2/fo/ford.page.dealer.js'+Math.random());
						var axel = Math.random() + "";
						var a = axel * 10000000000000;
						$('body').prepend( $('<iframe src="http://fls.doubleclick.net/activityi;src=2359446;type=conve485;cat=linco899;u4='+ _F.lang +';u5=Find a Dealer : Lincoln Canada;u6=Conversion;ord=1;num='+ a +'?" width="1" height="1" frameborder="0" style="display:none">') );
					}
					
				} else {
					// clear current map
					$.ford.pages.dealer.data.map.entities.clear(); 
				}
				
				info.append(data.results.size);
				info.append(local("label_dealers_found"));
			}
		
			//$.ford.pages.dealer.data.map.entities.clear();
			
			list.append(info);
			
			var _zoom = 11;
			if($('#distance').val() == "50") {
				_zoom = 10;
			} else if($('#distance').val() == "100") {
				_zoom = 9;
			} else if($('#distance').val() == "200") {
				_zoom = 9;
			}
			
			$.each(data.results.list, function(key, object) {
				if(key == 0) {
					// center to first item on the list
					$.ford.pages.dealer.data.map.setView( {center: new Microsoft.Maps.Location(object.lat, object.lon), zoom: _zoom});
				}
				var li = $.ford.pages.dealer.utils.build.item(object);
				
				// only show the first 5 items in the list. Hide the rest for Next Prev Button
				if(key > 4) {
					li.hide();
					// make sure that the next button is visible
					
					$('.next-button').removeClass('disabled');
				}
				list.append(li);
				$.ford.pages.dealer.data.map.entities.push($.ford.pages.dealer.map.item(object, (key < 5)));
			});
			
			// This preselects the first item in the list. all forms require this
			if($.ford.pages.dealer.vars.forms && $('.dealer-select-button:first').is(':hidden')) {
				$('.dealer-select-button:first').trigger('click');
			}
			
			
			
			
		}
	});
	
}});
$.extend($.ford.pages.dealer, {getSelected: function(){
	var li = $('.dealer-select-button.activated').parents('li');
	var div = $(li).children('.listName');
	var dealer = {
		id: $(li).data('id'),
		name: $(div).children('#name').text(),
		address: $(div).children('#address').text(),
		city: $(div).children('#city').text(),
		phone: $(div).children('#phone').text(),
		lat: $(li).data('lat'),
		lon: $(li).data('lon')
	};
	return dealer;
}});
$.extend($.ford.pages.dealer, {searching:{}});
$.extend($.ford.pages.dealer.searching, {postal:{
	url: function() {		
		return '/search/' +  $('#search option:selected').val() + '/postal/' + $('#ds_postal').val() +'/dealer.json';
	}
}});
$.extend($.ford.pages.dealer.searching, {city:{
	url: function() {
		return '/search/' + $('#search option:selected').val() + '/city/' + customEscape($('#ds_city').val()) + '/province/' + $('#ds_province').val() + '/dealer.json';
	}
}});
$.extend($.ford.pages.dealer.searching, {name:{
	url: function() {
		return '/search/' + $('#search option:selected').val() + '/name/' + customEscape($('#ds_name').val()) + '/dealer.json';
	}
}});
$.extend($.ford.pages.dealer.searching, {key:{
	url: function() {
		return '/search/key/' + $.ford.vars.dealer.key + '/dealer.json';
	}
}});

$.extend($.ford.pages.dealer.searching, {dealerType:{
	selected: function() {		
		// see if search was launched from another page, if so preset the dealer type filter
		var dealerType = $.ford.common.getParam('dealerType');
		
		if(dealerType == "BPNSLS") {
			$('#search option:eq(1)').attr('selected', 'selected');
		} else if(dealerType == "FASTLANE") {
			$('#search option:eq(2)').attr('selected', 'selected');
		} else if(dealerType == "NEWVEHICLE") {
			$('#search option:eq(3)').attr('selected', 'selected');
		} else if(dealerType == "FASTLANE") {
			$('#search option:eq(4)').attr('selected', 'selected');
		} else if(dealerType == "MTRUCK") {
			$('#search option:eq(5)').attr('selected', 'selected');
		} else if(dealerType == "SVT") {
			$('#search option:eq(6)').attr('selected', 'selected');
		} else if(dealerType == "HYBRID") {
			$('#search option:eq(7)').attr('selected', 'selected');
		} else if(dealerType == "PANDS") {
			$('#search option:eq(8)').attr('selected', 'selected');
		}
	}
}});

$.extend($.ford.pages.dealer, {data: {}});
$.extend($.ford.pages.dealer.data, {map: null});
$.extend($.ford.pages.dealer, {map: {}});
$.extend($.ford.pages.dealer.map, { showDealers: function(_show) {
	var _map = $.ford.pages.dealer.data.map;
	for(var i = _map.entities.getLength() - 1; i >= 0; i--) {
		var pin = _map.entities.get(i); 
		if (pin instanceof Microsoft.Maps.Pushpin) { 
			pin.setOptions({visible: false});
			// change the pin to the correct marker
			$.each(_show, function(key, item){
				if($(item).data('key') == pin._text) {
					pin.setOptions({visible: true});
				}
			});
		}
	} 
}});
$.extend($.ford.pages.dealer.map, {item: function(object, show) {
	var pushpinOptions = {icon: '/images/forms/marker_inactive.png', text : object.count+'', visible: show, typeName:'bingPushPin', textOffset: new Microsoft.Maps.Point(-0.5, 5)}; 
    var pin = new Microsoft.Maps.Pushpin(new Microsoft.Maps.Location(object.lat, object.lon), pushpinOptions);

    Microsoft.Maps.Events.addHandler(pin, 'click', function() {
    	$('.js_dealer[data-key="'+ pin._text +'"]').trigger('click');
    }); 
    
    return pin;
}});
$.extend($.ford.pages.dealer.map, {info: function(object) {
	
	var _map = $.ford.pages.dealer.data.map;
	
	for(var i= _map.entities.getLength() - 1; i >= 0; i--) {
		var info= _map.entities.get(i); 
		if (info instanceof Microsoft.Maps.Infobox) { 
			_map.entities.removeAt(i);  
		}
	} 
	
	var options = {/*offset:new Microsoft.Maps.Point(-130,45),*/ showPointer: false};
	var infoBox = new Microsoft.Maps.Infobox(new Microsoft.Maps.Location(object.lat, object.lon), options);    
	
	var holder = $('<div>');
	var info = $('<div>').addClass('bingPopup');
	holder.append(info);

	//info.append( $('<div>').addClass('closeBtn').click( function(){ $(this).parent().remove(); alert('hi'); }) ); //this here close-button can't be clicked, so it's been removed for now
	info.append($('<span>').addClass('name').append(object.name));
	info.append($('<br>'));
	info.append(object.address);
	info.append($('<br>'));
	info.append(object.city + ' ' + object.province + ' ' + object.postal);
	info.append($('<br>'));
	info.append('Tel: ' + object.phone);

	var elm_opt = $('<ul>').addClass('mm-options');
	info.append(elm_opt);

	// do not show for lincoln dealers
	if(_F.type != 'li') {
		if(object.hybrid) {
			elm_opt.append($('<li>').addClass('hybrid').text(local("label_hybrid")));
		}

		if(object.preferred) {
			elm_opt.append($('<li>').addClass('preferred-dealer').text(local("label_preferred")));
		}
	
		if(object.fastLane) {
			elm_opt.append($('<li>').addClass('fast-lane').text(local("label_fastlane")));
		}
		if(object.svt) {
			elm_opt.append($('<li>').addClass('svt').text(local("label_svt")));
		}
	};
	
	info.append( $('<div>').addClass('connector') );
	
	infoBox.setHtmlContent($(holder).html());
	
	return infoBox;
}});
$.extend($.ford.pages.dealer, {utils: {}});
$.extend($.ford.pages.dealer.utils, {build: {}});
$.extend($.ford.pages.dealer.utils.build, {item: function(object) {
	var li = $('<li>');
	li.addClass('js_dealer')
	  .attr('data-id', object.key)
	  .attr('data-key', object.count)
	  .attr('data-lat', object.lat)
	  .attr('data-lon', object.lon)
	  .append($('<div>').addClass('listCount').append(object.count));
	
	li.bind('click', function() {
		var _obj = object;
		var _map = $.ford.pages.dealer.data.map;
		$('.js_dealer .listCount').removeClass('active');
		$(this).children('.listCount').addClass('active');
		
		if ($(this).data('lat') != null && $(this).data('lon') != null) {
			_map.setView( {center: new Microsoft.Maps.Location($(this).data('lat'), $(this).data('lon')), zoom: 11});
			_map.entities.push($.ford.pages.dealer.map.info(_obj));
			
			for(var i = _map.entities.getLength() - 1; i >= 0; i--) {
				var pin = _map.entities.get(i); 
				if (pin instanceof Microsoft.Maps.Pushpin) { 
					pin.setOptions({icon: '/images/forms/marker_inactive.png'});
					// change the pin to the correct marker
					if($(this).data('key') == pin._text) {
						pin.setOptions({icon: '/images/forms/marker_active.png'});
					}
				}
			}
		}
		
	});
	
	var elm_name = null;
	if(object.url != "") {
		elm_name = $('<a>').attr('href', object.url).attr('target', '_blank').append(object.name);
	} else {
		elm_name = object.name;
	}	
	
	var body = $('<div>');
	body.addClass('listName')
		.append($('<div>').attr('id', 'name').append(elm_name))
		.append($('<div>').attr('id', 'address').append(object.address))
		.append($('<div>').attr('id', 'city').append(object.city + ', ' + object.province + ' ' + object.postal))
		.append($('<div>').attr('id', 'phone').append(object.phone));
	
	if(object.distance != null) {
		body.append($('<div>').append(object.distance).append(' km'));
	}
	
	if($.ford.pages.dealer.vars.forms) {
		var button = $.ford.pages.dealer.utils.build.button.select();
		body.append(button);
		$(button).bind('click', function() {
			$('.dealer-select-button').removeClass('activated');
			$(this).addClass('activated');
			if($.isFunction($.ford.pages.dealer.vars.delegate.dealerChanged)) {
				$.ford.pages.dealer.vars.delegate.dealerChanged();
			}
		});
	} else {
		if(object.inventory != null) {
			body.append($.ford.pages.dealer.utils.build.button.inventory(object.inventory));
		}
	}
	
	li.append(body);
	var icons = $('<div>');
	icons.addClass('iconList');
	if(_F.type != 'li') {
		if(object.hybrid) {
			icons.append($('<div>').addClass('hybrid').append($('<span>').addClass('iconDesc').text(local("label_hybrid"))));
			
		}

		if(object.preferred) {
			icons.append($('<div>').addClass('preferred-dealer').append($('<span>').addClass('iconDesc').text(local("label_preferred"))));
		}
	
		if(object.fastLane) {
			icons.append($('<div>').addClass('fastlane').append($('<span>').addClass('iconDesc').text(local("label_fastlane"))));
		}
		if(object.svt) {
			icons.append($('<div>').addClass('svt').append($('<span>').addClass('iconDesc').text(local("label_svt"))));
		};
	};
	li.append(icons);
	li.append($('<div>').addClass('clear'));
	return li;
}});
$.extend($.ford.pages.dealer.utils.build, {button: {}});
$.extend($.ford.pages.dealer.utils.build.button, {inventory: function(url) {
	var inventory = null;
	inventory = $('<a>');
	$(inventory).attr('href', url);
	$(inventory).text(local('label_inventory'));
	$(inventory).attr('target', '_blank');
	$(inventory).addClass('dealer-inventory-button');
	$(inventory).addClass('_js_wt');
	$(inventory).attr('data-wtGroup', 'LocateDealer');
	$(inventory).attr('data-wtSubGroup', 'Inventory');
	return inventory;
}});
$.extend($.ford.pages.dealer.utils.build.button, {select: function() {
	var select = null;
	select = $('<div>');
	select.addClass('dealer-select-button');
	select.text(local("label_select"));
	return select;
}});





