/**
 * @class HD.util.Dealer
 * @description Displays an overlay with all dealer information and directions.
 * 
 * @constructor
 * @property {object} 	config
 *                    	The configuration for the widget.
 * @property {object} 	dealerInfo
 *                    	Object with all the information about 1 dealer, provided by the dealer services endpoint. 
 * @property {string} 	dealerid
 *                    	If dealerInfo is not available, the dealerid must be provided to contact the endpoint.
 * @property {string} 	display
 *                    	To customize the selected view.
 *                    	Supported values are: details, directions.
 *                    	Default value is details. 
 * @property {string} 	directionsLocation
 *                    	Value from a location field provided by the customer.
 *                    	Supported values may be a zip code, city, state, point of interest. 
 *                    	Must also use the parameter display set to directions.
 * @property {string} 	language
 * 						Sets the language. Valid languages are cs, da, de, en, es, fr, it, nl, nn, pt.
 */
HD.util.Dealer = function(config) {
	this.config = config || {};
	this.model = new HD.util.Dealer.Model(this.config);
	this.view = new HD.util.Dealer.View(this.model);
	this.controller = new HD.util.Dealer.Controller(this.model, this.view);
	this.model.addObserver(this.view);
};

/**
 * The data model for HD.util.Dealer
 * @param {object}	config The configuration for the model.
 */
HD.util.Dealer.Model = function(config) {
	this.config = config;
	this.observers = [];
};

HD.util.Dealer.Model.prototype = {};
HD.extend(HD.util.Dealer.Model, [HD.util.Observable]);

/**
 * The view for HD.util.Dealer
 * @param {object}	model The data model for the player
 */
HD.util.Dealer.View = function(model){
	this.model = model;
	this.config = this.model.config;
	this.observers = [];
};

/**
 * The collection of default templates.
 * @fieldOf HD.util.Dealer.View
 */
HD.util.Dealer.View.templates = {
	/**
	 * Placeholder text for the content for when the dealer information is not provided.
	 * @memberOf HD.util.Dealer.View
	 */
	placeholderText : 'Missing dealer information. DealerInfo or dealerid must be provided on the widget config.',
	
	/**
	 * @constant
	 * @return {string} Placeholder text for the content for when the dealer information is not provided.
	 * @memberOf HD.util.Dealer.View
	 */
	getPlaceholderText : function(){
		return this.placeholderText;
	}
	
};

HD.util.Dealer.View.prototype = {
	/** Overlay events */
	EVENTS : {
		OPEN : "OPEN",
		CLOSE : "CLOSE"
	},
	
	/**
	 * Load Google script if needed
	 */
	setListeners : function() {
		//Close any opened overlay
		if(HD.util.Common.overlay){
			HD.util.Common.overlay.hide(true);
		}
		
		//Cache config
		HD.util.Dealer.View.prototype.config = this.config;
		
		//Load Google API Asynchronously
		if(!window.google) {
			var language = HD.util.Localization.getLanguageFromLocale({validLanguages : ['cs','da','de','en','es','fr','it','nl','no','pt']});
			var scriptPath = window.parent.location.protocol + "//maps.googleapis.com/maps/api/js?sensor=false&callback=HD.util.Dealer.View.prototype.init&language=" + language;
			var script = document.createElement("script");
			script.type = "text/javascript";
			script.src = scriptPath;
			document.body.appendChild(script);
		} else {
			this.init();
		}
	},
	
	/**
	 * Display the overlay and apply the config
	 */
	init : function() {
		if(!this.config) {
			this.config = HD.util.Dealer.View.prototype.config;
		}
		HD.util.Dealer.View.prototype.playerContainerID = null;
		HD.util.Dealer.View.prototype.data = null;
		
		//Reset directions flags
		HD.util.Dealer.View.prototype.directionsOrigin = null;
		HD.util.Dealer.View.prototype.directionsMapReady = null;
		
		// Load all configs
		this.dealerInfo = this.config.dealerInfo ? this.config.dealerInfo : '';
		this.dealerid = this.config.dealerid ? this.config.dealerid : '';
		this.display = this.config.display ? this.config.display : 'details';
		this.directionsLocation = this.config.directionsLocation ? this.config.directionsLocation : '';
		this.rentalDealer = this.config.rentalDealer ? this.config.rentalDealer : false;
		this.ridersEdgeDealer = this.config.ridersEdgeDealer ? this.config.ridersEdgeDealer : false;
		this.language = '';
		
		//If dealerInfo and dealerid were not submitted display placeholder
		if (this.dealerInfo == '' && this.dealerid == '') {
			this.displayPlaceholder();
			return false;
		}
		
		//Check if language is available, if not default to en
		if(this.config.language) {
			this.language = this.config.language;
		} else {
			var language = HD.util.Localization.getLanguageFromLocale({validLanguages : ['cs','da','de','en','es','fr','it','nl','no','pt']});

			if(language) {
				this.language = language;
			} else {
				this.language = 'en';
			}
		}
		
		//Cache language
		HD.util.Dealer.View.prototype.language = this.language;

		//Create the language file path
		var languageFile = '/en_US/Media/js/dealer-locator/language/' + this.language + '.js';
		
		//Load language file
		var headTag = document.getElementsByTagName('head')[0];
		var includeFile = document.createElement('script');
		includeFile.setAttribute('type','text/javascript');
		includeFile.setAttribute('src',languageFile);
		headTag.appendChild(includeFile);
		
		//Get dealerInfo and display overlay, if not available call endpoint 
		if (this.dealerInfo != '') {
			this.displayDealerOverlay();
		} else {
			var url = this.buildUrl(this.dealerid);
			this.submitEndpointRequest(url);
		}
		
	},

	/**
	 * Display the placeholder content if the dealer info is missing
	 */
	displayPlaceholder : function () {
		
		var placeholder = '<div class="missingPlaceholder">' + HD.util.Dealer.View.templates.getPlaceholderText() + '</div>';
		HD.util.Common.showOverlay( placeholder, '', 400, 150, true, 'dealerOverlay' );
		
	},
	
	/**
	 * Simple wrapper to show the spinner.
	 */
	showSpinner: function() {
		loadingOverlay = new YAHOO.widget.Panel("loadingOverlay",{width:"32px",fixedcenter:true,close:false,draggable:false,zindex:200000,modal:true,underlay:"none",visible:false});
		loadingOverlay.setHeader( '' );
		loadingOverlay.setBody( '<img src="/en_US/Media/images/dealer-locator/loading.gif" />' );
		loadingOverlay.render( document.body );
		loadingOverlay.show();
	},
	  
	hideSpinner: function() {
		loadingOverlay.destroy();
	},
	
	/**
	 * Add a parameter to an array of parameters in name=value format, but only
	 * if the value is not empty.
	 * 
	 * @param {Array} params array to add to
	 * @param {String} name name for parameter
	 * @param {String} value for parameter
	 * @param {Boolean} forceAdd true to force add of parameter even if no value
	 * 
	 * @returns reference to current object so that calls are chainable
	 */
	pushParam: function( params, name, value, forceAdd ) {
		if ( null == forceAdd ) {
			forceAdd = false;
		}
		
		// only add if value not empty
		if ( /\S/.test( value ) || forceAdd ) {
			params.push( name + '=' + escape( value ) );
		}
		
		// make calls chainable
		return this;
	},
	
	/**
	 * This method puts together the full URL for a call to the endpoint for searches by dealer id.
	 * 
	 * @returns url for calling the endpoint
	 */
	buildUrl: function(dealerID) {
		var params   = [ '_type=json' ];
		var endpoint = HD.util.Common.getServerUrl() + '/dealerservices/services/rest/dealers/search';
		
		//Check if searching by dealer ID
		if(dealerID) {
			this.pushParam( params, 'dealerIds', dealerID );
		}
		
		return endpoint + '?' + params.join( '&' );

	},
	
	/**
	 * Display dealer icons
	 */
	getDealerIcons: function(dealer) {
	
		var offerings = dealer.offerings;
		var programCodes = dealer.programCodes;
		var services = '';
		var container = '<div class="services">'
						+ '<div class="icons title">' + this.languageData.dealerOverlay_dealerServicesLabel + '</div>'
						+ '<div class="iconsContainer">';
							
		if(offerings.hasMotorCycles) {
			services += '<div id="hasMotorCycles" class="serviceIcon"></div>';
		}
		if(offerings.hasHDService) {
			services += '<div id="hasHDService" class="serviceIcon"></div>';
		}
		if(offerings.hasMotorClothes) {
			services += '<div id="hasMotorClothes" class="serviceIcon"></div>';
		}
		if(offerings.hasAccessories) {
			services += '<div id="hasAccessories" class="serviceIcon"></div>';
		}
		if(offerings.hasECommerce) {
			services += '<div id="hasECommerce" class="serviceIcon"></div>';
		}
		if(offerings.hasRentals) {
			services += '<div id="hasRentals" class="serviceIcon"></div>';
		}
		if(dealer.onlineRental == true) {
			services += '<div id="hasOnlineRentals" class="serviceIcon"></div>';
		}
		if(offerings.hasRidersEdge) {
			services += '<div id="hasRidersEdge" class="serviceIcon"></div>';
		}
		if(offerings.hasHOGChapter) {
			services += '<div id="hasHOGChapter" class="serviceIcon"></div>';
		}
		
		if(services != ''){
			container += services + '</div></div>';
		} else {
			container = '';
		}

		return container;
	
	},
	
	/**
	 * This method provides the core functionality on the page by running the
	 * actual call to the endpoint and handling the response.
	 */
	submitEndpointRequest: function( url, display, directionsLocation ) {
		var self = this;
		
		self.showSpinner();
		
		YAHOO.util.Connect.asyncRequest( 'GET', url, {
			failure:
				function( response ) {
					self.hideSpinner();
					alert('Internal error. Please try again.');
				},
				
			success:
				function( response ) {

					HD.util.form.jsonHandleResponse( response,
						function( responseData ) {
							var dealerResponse = ( null == responseData
									                 ? null
									                 : responseData.dealerResponse
									                 );
							var dealer        = ( null == dealerResponse
									                 ? []
									                 : dealerResponse.dealers
									                 );
							
							if ( ( null == dealer ) || ( 0 == dealerResponse.dealers.length ) ) {
								self.hideSpinner();
								alert('Internal error. Please try again.');
								return;
							}
							
							self.dealerInfo = dealer[0];
							self.displayDealerOverlay();
							self.hideSpinner();

						}
					);
				}
			}
		);
	},
	
	/**
	 * Display dealer overlay
	 */
	displayDealerOverlay: function() {
		
		this.languageData = '';
		if(window.DealerSearch && DealerSearch.Language) {
			this.languageData = DealerSearch.Language.data;
		}

		if(this.languageData == '') {
			setTimeout("HD.util.Dealer.View.prototype.displayDealerOverlay();",100);
		} else {

			//Customize the display of services if request is coming from the Dealer Locator
			var selectedProgram = '';
			if (window.DealerSearch != undefined && DealerSearch.searchType && DealerSearch.searchType != 'country') {
				
				var filterClass = '';
				if(DealerSearch.searchType == 'dealerLocation') {
					filterClass = 'location_programs';
					
				} else if(DealerSearch.searchType == 'dealerName') {
					filterClass = 'name_programs';
				}
	
				//Check if a filter is applied, and pre-select tab OR hide information
				var filtersObjects = HD.getByClass(filterClass, '*', self.containerEl);
				for ( var i in filtersObjects ) {
					if(filtersObjects[i].checked == true && filtersObjects[i].value != '') {
						selectedProgram = filtersObjects[i].value;
					}
				}
			
			}
			
			//Pre-select the dealer information tab
			if(this.rentalDealer == true) {
				selectedProgram = 'RE';
			}
			if(this.ridersEdgeDealer == true) {
				selectedProgram = 'RD';
			}			
			
			var dealerData = this.dealerInfo;
			var secureId = dealerData.id * 29;
			HD.util.Dealer.View.prototype.dealerId = dealerData.id;
			
			var dealer_name =  dealerData.name ? dealerData.name : '';
			//Adjust the dealer name if rentals is selected
			if(selectedProgram == 'RE' && dealerData.rentalsInfo.name) {
				dealer_name = dealerData.rentalsInfo.name;
			}
			
			var dealer_address = dealerData.contact.address1 ? dealerData.contact.address1 : '';
			if(dealer_address && dealerData.contact.address2){
				dealer_address += '<br/>';
				dealer_address += dealerData.contact.address2;
			}
			if(dealer_address && dealerData.contact.address3){
				dealer_address += '<br/>';
				dealer_address += dealerData.contact.address3;
			}
			
			var dealer_city = dealerData.contact.city ? dealerData.contact.city : '';
			var dealer_state = dealerData.contact.state ? ', ' + dealerData.contact.state : '';
			var dealer_postalCode = dealerData.contact.postalCode ? dealerData.contact.postalCode : '';
			var dealer_phoneNumber = dealerData.contact.phoneNumber ? dealerData.contact.phoneNumber : '';
			var dealer_faxNumber = dealerData.contact.faxNumber ? dealerData.contact.faxNumber : '';
			
			var overlayContent =  '<div id="dealerDetailOverlay">'
								+ '<div id="dealerInfoContainer" class="dealerInfo"><div class="dealerName cufon">'
								+ dealer_name
								+ '</div>'
								+ '<div class="printBtn"><a href="javascript:HD.util.Dealer.View.prototype.printDirections();">'
								+ this.languageData.dealerOverlay_printButtons
								+ '</a></div>'
								+ '<div id="dealerTabControls">'
								+ '<div class="infoTab">'
								+ '<a href="javascript:HD.util.Dealer.View.prototype.changeTab(\'dealerInfoContainer\',\'dealerInfo\')">'
								+ this.languageData.dealerOverlay_infoTab
								+ '</a>'
								+ '</div>'
								+ '<div class="directionsTab">'
								+ '<a href="javascript:HD.util.Dealer.View.prototype.changeTab(\'dealerInfoContainer\',\'dealerDirections\')">'
								+ this.languageData.dealerOverlay_directionsTab
								+ '</a>'
								+ '</div>'
								+ '</div>'
								+ '<div id="dealerMapContainer">'
								+ '<div id="hdDirectionsMap"></div>'
								+ '<div id="dealerLocationMap"></div>'
								+ '<div class="directionsBtn">'
								+ '<a href="javascript:HD.util.Dealer.View.prototype.changeTab(\'dealerInfoContainer\',\'dealerDirections\')">'
								+ this.languageData.dealerOverlay_getDirectionsLabel
								+ '</a>'
								+ '</div>'
								+ '</div>'
								+ '<div id="dealerDetailsContainer">'
								+ '<div class="address">'
								+ '<div class="title">'
								+  dealer_name + '</div>'
								+  dealer_address + '<br/>'
						        +  dealer_city + dealer_state + ', '
						        +  dealerData.contact.country + ' ' + dealer_postalCode + '<br/>'
						        +  dealer_phoneNumber;
			
							// Do not show '(fax)' if there is no fax number
							if(dealer_faxNumber && dealer_faxNumber.length > 0){
								overlayContent +=  
								'<br/>'
								+ dealer_faxNumber + ' ('
								+ this.languageData.dealerOverlay_faxLabel
								+ ')';
							}
	
			if ( null != dealerData.website ) {
				overlayContent += '<br/><a class="websiteLink" href="' + dealerData.website + '" target="_blank">' + dealerData.website + '</a>';
			}
	
			//Add other services icons
			overlayContent += this.getDealerIcons(dealerData);
	
			//Close container
			overlayContent += '</div>';		
			
			//Start programs list
			overlayContent += '<div id="dealerProgramsList">';
	
			//Get hours of operation		
			if(dealerData.hours && dealerData.hours.dealerHours) {
				overlayContent += '<div class="hours title">'
								+ this.languageData.dealerOverlay_hoursOperationLabel
								+ '</div>'
								+ '<div class="hours programsContainer">'
								+ dealerData.hours.dealerHours
								+ '</div>';
			}
			
			//Get Rider's Edge courses offered and display links
			if(dealerData.ridersEdgeInfo && (selectedProgram == '' || selectedProgram == 'RD')) {
				overlayContent += this.getRidersEdgeInfo(dealerData);
			}
			
			//Display Rental link if applicable
			if(dealerData.programCodes && dealerData.programCodes.length > 0) {
				for ( var i in dealerData.programCodes ) {
					if(dealerData.programCodes[i] == 'RE' && (selectedProgram == '' || selectedProgram == 'RE')) {
						overlayContent += '<div class="rentals title">'
										   + this.languageData.dealerOverlay_rentalTitle
										   + '</div>'
										   + '<div class="rentals programsContainer">'
												+ this.getRentalsInfo(dealerData)
										   + '</div>';
					}
				}
			}		
			
			//Display HOG link if applicable
			if(dealerData.hogInfo && (selectedProgram == '' || selectedProgram == 'HOG')) {
				overlayContent += '<div class="hog title">'
								    + this.languageData.dealerOverlay_hogTitle
								    + '</div>'
									+ '<div class="hog programsContainer">'
										+ this.getHOGInfo(dealerData)
									+ '</div>';
			}
			
			//Display Test Ride link if applicable
			if(dealerData.programCodes && dealerData.programCodes.length > 0 && dealerData.contact.country == 'USA') {
				for ( var i in dealerData.programCodes ) {
					if(dealerData.programCodes[i] == 'TR' && (selectedProgram == '' || selectedProgram == 'TR')) {
						overlayContent += '<div class="testRide title">'
										    + this.languageData.dealerSearch_searchFilterTestRide
										    + '</div>'
											+ '<div class="testRide programsContainer">'
												+ '<a href="/en_US/Content/Pages/Try_a_Bike/Schedule_a_Test_Ride.html?dealerId='
												+ secureId
												+ '&dlr_loc=true">'
												+ this.languageData.dealerOverlay_testRideLabel
												+ '</a>'
											+ '</div>';
					}
				}
			}
	
			//End programs list
			overlayContent += '</div>';
			
			//Close details container
			overlayContent += '</div>';
			
			//Create directions container
			overlayContent += '<div id="dealerDirectionsContainer">\
								  <div id="dealerDirectionsForm">\
									<div class="title">'
								  	+ this.languageData.dealerOverlay_getDirectionsLabel
								  	+ '</div>\
									<form method="post" action="javascript:void(0)" onsubmit="HD.util.Dealer.View.prototype.displayDirections(\''
											+ dealerData.contact.latitude
											+ '\', \''
											+ dealerData.contact.longitude
											+ '\'); return false;">\
									<div class="fieldBox">\
										<div class="label">'
											+ this.languageData.dealerOverlay_fromFieldLabel
											+ ':\
										</div>\
										<div class="field">\
											<input id="origin" name="origin" type="text" />\
										</div>\
									</div>\
									<div class="fieldBox">\
										<div class="label">'
											+ this.languageData.dealerOverlay_toFieldabel
											+ ':\
										</div>\
										<div class="field">\
										<input id="destination" name="destination" type="text" value="'
								+ dealer_name
								+ '" disabled="disabled" />\
										</div>\
									</div>\
									<input class="directionsFormBtn cufon" name="submit" type="submit" value="'
								+ this.languageData.dealerOverlay_getDirectionsLabel
								+ '" />\
									   </form>\
									</div>\
									<div id="dealerDirectionsResults">\
										<a class="editRoute cufon" href="javascript:HD.util.Dealer.View.prototype.changeTab(\'dealerDirectionsContainer\',\' \')">'
										+ this.languageData.dealerOverlay_editRouteButton
										+ '</a>\
										<div id="hdDirections"></div>\
										<span id="notFoundMessage">'
										+ this.languageData.dealerOverlay_addressNotFound 		
										'</span>\
									</div>\
									</div>';
			
			HD.util.Common.showOverlay( overlayContent, '', 925, 645, true );
			HD.addClass('hdwcOverlay_c','dealerLocatorOverlay');
			
			HD.util.Dealer.View.prototype.dealerLatLng = new Object();
			HD.util.Dealer.View.prototype.dealerLatLng.Lat = dealerData.contact.latitude;
			HD.util.Dealer.View.prototype.dealerLatLng.Lng = dealerData.contact.longitude;
			
			this.dealerMap = this.displayDirectionsMap(this.dealerLatLng.Lat, this.dealerLatLng.Lng, 'dealerLocationMap');
			
			//Reset the directions flag
			this.directionsMapReady = false;
			
			//Setup the tooltip on dealer services icons
			this.setupServicesTooltip();
			
			//Enable the programs list effect
			//If program is selected open the program list
			if (selectedProgram != '' && dealerData.hours && dealerData.hours.dealerHours) {
				$('#dealerProgramsList').accordion({
					active: 1,
					autoHeight: false,
					icons: {
						header: "item-closed",
						headerSelected: "item-open"
					}
				});
			} else {
				$('#dealerProgramsList').accordion({
					active: 0,
					autoHeight: false,
					icons: {
						header: "item-closed",
						headerSelected: "item-open"
					}
				});
			}
				
			//Go directly to the directions tab if user used the directions link 
			if(this.display == 'directions' ) {
				this.changeTab('dealerInfoContainer','dealerDirections');
			}
	
			//Automatically get directions when the location is provided
			if(this.directionsLocation != '' ) {
				HD.get('origin').value = this.directionsLocation;
				this.displayDirections(dealerData.contact.latitude, dealerData.contact.longitude);
			}
			
			//Trigger tracking
			var documentPath = window.location.pathname;
			var pageNameTracking = documentPath.substring(documentPath.lastIndexOf('/') + 1);
			var trackingString = '/Locators/Dealer+Locator/Dealer+Info/' + dealerData.id;
			_hbPageView(pageNameTracking, trackingString);
		}
		
	},
	
	/**
	 * Returns the Riders Edge information
	 */
	getRidersEdgeInfo: function(dealerData) {
		
		var riderEdgeData = '';
		var secureId = dealerData.id * 29;
		var ridersEdgeInfo = dealerData.ridersEdgeInfo;
		
		if(ridersEdgeInfo.courseOffered && ridersEdgeInfo.PM && ridersEdgeInfo.email) {
			
			riderEdgeData += '<div class="ridersEdge title">'
								+ this.languageData.dealerOverlay_ridersEdgeTitle
								+ '</div>\
				   				<div class="ridersEdge programsContainer">';
			
			if(ridersEdgeInfo.courseOffered) {
				riderEdgeData += '<div class="subtitle"><strong>'
									+ this.languageData.dealerOverlay_courseOfferingsLabel
									+ ':</strong></div>';
				if(ridersEdgeInfo.courseOffered == '1,2' || ridersEdgeInfo.courseOffered == '1,2,3' ) {
					riderEdgeData += '<div>'
									+ this.languageData.dealerOverlay_newRiderCourseLabel
									+ ' - <a href="/en_US/Content/Pages/learn-to-ride/search-riders-edge.html?expLvl=new&dealerid='
									+ secureId
									+ '&dlr_loc=true">'
									+ this.languageData.dealerOverlay_searchForClassesLabel
									+ '</a>.</div><div>'
									+ this.languageData.dealerOverlay_skilledRiderLabel
									+ ' - <a href="/en_US/Content/Pages/learn-to-ride/search-riders-edge.html?expLvl=skilled&dealerid='
									+ secureId
									+ '&dlr_loc=true">'
									+ this.languageData.dealerOverlay_searchForClassesLabel
									+ '</a>.</div>';
				} else if(ridersEdgeInfo.courseOffered == '1' || ridersEdgeInfo.courseOffered == '1,3' ) {
					riderEdgeData += '<div>'
									+ this.languageData.dealerOverlay_newRiderCourseLabel
									+ ' - <a href="/en_US/Content/Pages/learn-to-ride/search-riders-edge.html?expLvl=new&dealerid='
									+ secureId
									+ '&dlr_loc=true">Search for classes and sign up</a>.</div>';
				} else if(ridersEdgeInfo.courseOffered == '2' || ridersEdgeInfo.courseOffered == '2,3' ) {
					riderEdgeData += '<div>'
									+ this.languageData.dealerOverlay_skilledRiderLabel
									+ ' - <a href="/en_US/Content/Pages/learn-to-ride/search-riders-edge.html?expLvl=skilled&dealerid='
									+ secureId
									+ '&dlr_loc=true">'
									+ this.languageData.dealerOverlay_searchForClassesLabel
									+ '</a>.</div>';
				}
			}
			if(ridersEdgeInfo.PM && ridersEdgeInfo.PM != '') {
				riderEdgeData += '<br/><strong>'
									+ this.languageData.dealerOverlay_ridersEdgeManagerLabel
									+ ':</strong><br/>'
									+ ridersEdgeInfo.PM
									+ '<br/><br/>';
			}
			if(ridersEdgeInfo.email && ridersEdgeInfo.email != '') {
				riderEdgeData += '<strong>'
									+ this.languageData.dealerOverlay_ridersEdgeEmailLabel
									+ ':</strong><br/><a href="mailto:'
									+ ridersEdgeInfo.email
									+ '">'
									+ ridersEdgeInfo.email
									+ '</a>';
			}
			riderEdgeData += '</div>'; 
		}
		
		return riderEdgeData;
	
	},

	/**
	 * Returns the Rentals information
	 */
	getRentalsInfo: function(dealerData) {
		
		var secureId = dealerData.id * 29;
		var rentalsInfo = dealerData.rentalsInfo ? dealerData.rentalsInfo : [];
		var rentalsData = '';
		
		if(rentalsInfo.manager && rentalsInfo.manager != '') {
			rentalsData += '<strong>'
								+ this.languageData.dealerOverlay_rentalManager
								+ ':</strong><br/>'
								+ rentalsInfo.manager
								+ '<br/><br/>';
		}
		if(rentalsInfo.email && rentalsInfo.email != '') {
			rentalsData += '<strong>'
								+ this.languageData.dealerOverlay_rentalEmail
								+ ':</strong><br/><a href="mailto:'
								+ rentalsInfo.email
								+ '">'
								+ rentalsInfo.email
								+ '</a><br/>';
		}

		//Adjust the rental links for US/Canada and non-US/Canada locations
		var locale = HD.util.Localization.getLocale();
		var rentalUrl = 'https://websolutions.tsd-inc.com/Harley-Davidson/frmRateQuote.aspx?locale=' + locale + '&PickupLoc=';
		if(dealerData.contact.country != "USA" && dealerData.contact.country != "CAN") {
			rentalUrl = 'https://www2.rentcentric.com/Client4317/webcustomer/harleydavidson.aspx?locale=' + locale + '&PickupLoc=';
		}
		//Add reservation link if applicable
		if(dealerData.onlineRental) {
			rentalsData += '<a target="_blank" class="bookOnlineBtn cufon" href="'
								+ rentalUrl
								+ secureId
								+ '">'
								+ this.languageData.dealerOverlay_rentalBookOnline
								+ '</a>';
		}
		
		rentalsData += '<div id="rentalsDisclaimer" class="serviceIcon">'
						+ this.languageData.dealerOverlay_rentalRequirementsLinks
						+ '</div>';
		return rentalsData; 
		
	},
	
	/**
	 * Returns the H.O.G. information
	 */
	getHOGInfo: function(dealerData) {
		
		var HOGInfo = '';
		
		if(dealerData.hogInfo.chapterName) {
			HOGInfo += '<strong>'
				+ this.languageData.dealerOverlay_hogChapterName
				+ ':</strong><br/>'
				+ dealerData.hogInfo.chapterName
				+ '<br/>';
		}
		if(dealerData.hogInfo.chapterLink) {
			HOGInfo += '<br/><strong>'
				+ this.languageData.dealerOverlay_hogChapterWebsite
				+ ':</strong><br/><a href="'
				+ dealerData.hogInfo.chapterLink
				+ '">'
				+ dealerData.hogInfo.chapterLink
				+ '</a>';
		}

		return HOGInfo; 
	
	},
	
	/**
	 * Initialize/reset the directions map
	 */
	displayDirectionsMap: function(latitude,longitude, containerId) {

		if(latitude != null && longitude != null) {
			this.myLatLng = new google.maps.LatLng(latitude, longitude);
		}

		var myOptions = {
			      zoom: 12,
			      mapTypeId: google.maps.MapTypeId.ROADMAP,
			      center: this.myLatLng
		};
		var map = new google.maps.Map(document.getElementById(containerId), myOptions);
		
		var markerIcon = new google.maps.MarkerImage('/en_US/Media/images/dealer-locator/directionsMarker-single.png');
		var marker = new google.maps.Marker({
			position: this.myLatLng,
		    map: map,
            icon: markerIcon
		});
		
		return map;

		
	},
	
	/**
	 * Display directions
	 */
	displayDirections: function(latitude,longitude) {
		
		HD.get('dealerDirectionsContainer').className = 'directionsResults';
		
		//Check if scrollbar already setup and destroy
		var directionsResultsBox = HD.getByClass('jspPane', '*', 'hdDirections');
		if(directionsResultsBox) {
			$('#hdDirections').jScrollPane().data().jsp.destroy();					
		}
		
		//Clear old results				
		HD.get('hdDirections').innerHTML = '';
		
		//Set up map and direction steps
		var rendererOptions = {
				draggable: false,
				suppressMarkers: true
		};
		var directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);;
		var directionsService = new google.maps.DirectionsService();
		var destination = new google.maps.LatLng(latitude, longitude);
		var myOptions = {
			      zoom: 7,
			      mapTypeId: google.maps.MapTypeId.ROADMAP,
			      center: destination
		};
		var map = new google.maps.Map(document.getElementById("hdDirectionsMap"), myOptions);

		directionsDisplay.setMap(map);
	    directionsDisplay.setPanel(document.getElementById("hdDirections"));
		
	    google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {
	    	setTimeout("$('#hdDirections').jScrollPane()",1000);
	    });
	    
	    var origin = HD.get('origin').value;
	    var request = {
	      origin: origin,
	      destination: destination,
	      travelMode: google.maps.DirectionsTravelMode.DRIVING
	    };
	    
	    var startIcon = new google.maps.MarkerImage('/en_US/Media/images/dealer-locator/directionsMarker-A.png');
	    var endIcon = new google.maps.MarkerImage('/en_US/Media/images/dealer-locator/directionsMarker-B.png');
	    
	    var self = this;
	    directionsService.route(request, function(response, status) {
			  if (status == google.maps.DirectionsStatus.OK) {

				//Cache origin lat/lng for print
				self.directionsOrigin = response.routes[0].legs[0].start_location.lat() + ',' + response.routes[0].legs[0].start_location.lng();

				//Display directions
				directionsDisplay.setDirections(response);
			    
			    //Set markers for start and end
			    var startMarker = new google.maps.Marker({
			        position: response.routes[0].legs[0].start_location,
			        map: map,
			        icon: startIcon
			    });
			    var endMarker = new google.maps.Marker({
			        position: response.routes[0].legs[0].end_location,
			        map: map,
			        icon: endIcon
			    });
			    
			  } else {
				  var message = HD.get('notFoundMessage').innerHTML;
				  HD.get('hdDirections').innerHTML = '<div class="addressError">'
			  								 + message
			  								 + '</div>';
			  }
	    });
	    
	    //Trigger tracking
		var documentPath = window.location.pathname;
		var pageNameTracking = documentPath.substring(documentPath.lastIndexOf('/') + 1);
		var trackingString = '/Locators/Dealer+Locator/Dealer+Info/Directions+Tab/View+Directions/' + HD.util.Dealer.View.prototype.dealerId;
		
		_hbPageView(pageNameTracking, trackingString);
		
	},
	
	/**
	 * Setup the services tooltip
	 */
	setupServicesTooltip: function() {
		
		var self = this.languageData;

		//Tooltip content
		$("#hasMotorCycles").attr("title", self.dealerOverlay_serviceTipMotorcycles);
		$("#hasHDService").attr("title", self.dealerOverlay_serviceTipService);
		$("#hasMotorClothes").attr("title", self.dealerOverlay_serviceTipMotorclothes);
		$("#hasAccessories").attr("title", self.dealerOverlay_serviceTipAccessories);
		$("#hasECommerce").attr("title", self.dealerOverlay_serviceTipEccommerce);
		$("#hasRentals").attr("title", self.dealerOverlay_serviceTipRentals);
		$("#hasOnlineRentals").attr("title", self.dealerOverlay_serviceTipOnlineRentals);
		$("#hasRidersEdge").attr("title", self.dealerOverlay_serviceTipRidersEdge);
		$("#hasHOGChapter").attr("title", self.dealerOverlay_serviceTipHOGChapter);

		var disclaimerTipContent = '<div class="disclaimer">\
										<div class="inner">\
											<p><strong>'
											+ self.dealerOverlay_disclaimerRequirementsLabel
											+ '</strong></p>'
											+ self.dealerOverlay_disclaimerRequirementsContent
											+ '<p><strong>'
											+ self.dealerOverlay_disclaimerBenefitsLabel
											+ '</strong></p>'
											+ self.dealerOverlay_disclaimerBenefitsContent
							  	    + '</div></div>';
		
		$("#rentalsDisclaimer").attr("title", disclaimerTipContent);

		$("#hasMotorCycles[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasHDService[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasMotorClothes[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasAccessories[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasECommerce[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasRentals[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasOnlineRentals[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasRidersEdge[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#hasHOGChapter[title]").tooltip({effect: 'slide', tipClass: 'dealerTip'});
		$("#rentalsDisclaimer[title]").tooltip({effect: 'slide', position: 'top center', tipClass: 'dealerTipLarge'});
		
	},
	
	/**
	 * Change tab
	 */
	changeTab: function(id, cssClass) {
		
		HD.get(id).className = cssClass;
		
		if(cssClass == 'dealerDirections') {
			
			if(!this.directionsMapReady) {
				this.directionsMap = this.displayDirectionsMap(this.dealerLatLng.Lat, this.dealerLatLng.Lng, 'hdDirectionsMap');
				this.directionsMapReady = true;
			}
			
			//Trigger tracking
			var documentPath = window.location.pathname;
			var pageNameTracking = documentPath.substring(documentPath.lastIndexOf('/') + 1);
			var trackingString = '/Locators/Dealer+Locator/Dealer+Info/Directions+Tab/' + HD.util.Dealer.View.prototype.dealerId;
			_hbPageView(pageNameTracking, trackingString);
		}
		
	},
	
	//Print directions
	printDirections: function() {
		
		//Set URL
		var url = '/en_US/Content/Pages/dealer-locator/dealer-print.html?dealer=' + this.dealerId + '&language=' + this.language;
		
		//Check active tab
		var currentTab = HD.get('dealerInfoContainer').className;
		
		//Add directions if needed
		if(this.directionsOrigin && currentTab == 'dealerDirections') {
			url += '&directionsTo=' + this.directionsOrigin;
		}
		
		//Open print
		window.open(url,'','toolbar=no,scrollbars=yes,status=no,width=750,height=450');
		
	}
	
};

HD.extend(HD.util.Dealer.View, [HD.Widget]);

/**
 * The controller for HD.util.Dealer
 * @param {object}	model The data model for the player
 * @param {object}	view The view for the player
 */
HD.util.Dealer.Controller = function(model, view){
	this.model = model;
	this.view = view;
};

HD.util.Dealer.Controller.prototype = {
		
};

HD.register("hd_dealer", HD.util.Dealer, {version: "1.0", build: "1"});
