/**
 * @class HD.SendFriendWidget
 * @description The purpose of SendFriendWidget is to provide a mechanism for users to 
 * 				email page content to others
 * 				Registered as hd_send_friend_widget.
 * @constructor
 * @extends HD.Widget
 * @see HD.SendFriendWidget.hooks
 * @see HD.SendFriendWidget.templates
 * @property {object} 	config
 *                    	The configuration for the widget.
 * @property {object} 	[config.hooks=HD.SendFriend.hooks]
 *                 		Customized subset of hooks (merged with the defaults).
 * @property {boolean} 	config.embedMode
 *                    	TBD
 *                    	Default is false.
 * @property {boolean} 	config.standaloneMode
 *                    	Whether the send friend widget should not be dependent on retrieving content
 *                    	Default is false.
 * @property {boolean} 	config.showTooltop
 *                    	Whether the send friend widget should show a tooltip like share widget 
 *                    	Default is false.
 * @property {boolean} 	config.sendAnother
 *                    	Whether confirmation overlay button should reopen the send form
 *                    	Default is false.
 * @property {method}	config.callback
 * 						Code to be executed when the button is clicked
 * @property {object} 	config.submission
 *                 		Submission configuration
 * @property {string} 	config.submission.url
 *                 		URL to submit entry form to
 *                 		Default is 'http://hdonline.rsys1.net/servlet/campaignrespondent'
 * @property {string}	config.submission.id
 * 						Submission id for form submission
 * 						Default is 'hdm.526'
 * @property {string}	config.submission.community
 * 						Community for form submission
 * 						Default is 'Harley-Davidson'
 * @property {string}	config.submission.media
 * 						Media ID of the content to be sent
 * 						Default is null
 * @property {string}	config.overlayHeight
 * 						Height of the overlay
 * 						Default is 290px
 * @property {string}	config.overlayWidth
 * 						Width of the overlay
 * 						Default is 425px
 * @property {method}	config.submission.getParams
 * 						Returns additional params for submission
 * 				         
 */
HD.SendFriendWidget = function(config) {
    this.config = config || {};
	this.config.embedMode = this.config.embedMode || false;
	this.config.standaloneMode = this.config.standaloneMode || false;
	this.config.showTooltip = this.config.showTooltip || false;
	this.config.sendAnother = this.config.sendAnother || false;
	this.config.callback = this.config.callback || function(media, shareUrl) {};
	this.config.submission = this.config.submission || {};
	this.config.submission.url = this.config.submission.url || 'http://hdonline.rsys1.net/servlet/campaignrespondent';
	this.config.submission.id = this.config.submission.id || 'hdm.526';
	this.config.submission.community = this.config.submission.community || window.comSiteName || 'Harley-Davidson';
	this.config.submission.media = null;
	this.config.overlayHeight = this.config.overlayHeight || "290px";
	this.config.overlayWidth = this.config.overlayWidth || "425px";
	this.config.getParams = this.config.getParams || function(params, media) {
		params.view = 'detail';
		// params.param1 = 'some value 1';
		// params.param2 = 'some value 2';
		// params.param3 = 'some value 3';
		return params;
	};
	
	/** Observer collection */
    this.observers = [];
	this.loadTemplates(arguments.callee);
};

/**
 * The collection of default templates.
 * @fieldOf HD.SendFriendWidget
 */
HD.SendFriendWidget.templates = {
		
	/**
	 * Label for the widget
	 * @memberOf HD.SendFriendWidget
	 */
	sendFriendLabel             : "Send to a Friend",
	
	/**
	 * Error instructional text for required fields
	 * @memberOf HD.SendFriendWidget
	 */
	errorInstrText           : "Fields in bold with an asterisk (*) are required.<br /><br />",
	
	/**
	 * Error text for required sender name
	 * @memberOf HD.SendFriendWidget
	 */
	errorUserNameText           : "- Your Name",
	
	/**
	 * Error text for required friend name
	 * @memberOf HD.SendFriendWidget
	 */
	errorFriendNameText         : "- Friend's Name",
	
	/**
	 * Error text for required friend email
	 * @memberOf HD.SendFriendWidget
	 */
	errorFriendEmailText        : "- Friend's Email Address",
	
	/**
	 * Error text for invalid friend email
	 * @memberOf HD.SendFriendWidget
	 */
	errorFriendEmailInvalidText : "Your Friend's Email address is not valid",
	
	/**
	 * Error text for required sender email
	 * @memberOf HD.SendFriendWidget
	 */
	errorYourEmailText          : "- Your Email Address",
	
	/**
	 * Error text for invalid sender email
	 * @memberOf HD.SendFriendWidget
	 */
	errorYourEmailInvalidText   : "Your Email address is not valid",
	
	/**
	 * Instructional text for overlay
	 * @memberOf HD.SendFriendWidget
	 */
	sendFriendInstructionalText : "<p>Send your friend a link to this page so they can become involved in the community.</p><p>Enter the name and Email address of your friend below. We will not use this information for any other purposes. Review our <a onclick=\"javascript:window.open('http://www.harley-davidson.com/wcm/Content/Pages/Utility/privacy_policy.jsp?locale=en_US', '', 'width=598,height=540,scrollbars=yes,resizable=yes,toolbar=no,location=no,menubar=no,directories=no,status=no')\" href=\"javascript:void(0)\">Privacy Policy</a> for more details.</p><p>* Indicates required fields</p>",
	
	/**
	 * Overlay: Title for the overlay
	 * @memberOf HD.SendFriendWidget
	 */
	overlayTitle: 'SEND TO A FRIEND',
	
	/**
	 * Overlay: Success title for the overlay
	 * @memberOf HD.SendFriendWidget
	 */
	overlaySuccessTitle: 'THANK YOU',
	
	/**
	 * Overlay: Friend's name
	 * @memberOf HD.SendFriendWidget
	 */
	friendsNameText: "Friend's Name",
	
	/**
	 * Overlay: Friend's email
	 * @memberOf HD.SendFriendWidget
	 */
	friendsEmailText: "Friend's Email Address",
	
	/**
	 * Overlay: User's name
	 * @memberOf HD.SendFriendWidget
	 */
	yourNameText: 'Your Name',
	
	/**
	 * Overlay: User's email
	 * @memberOf HD.SendFriendWidget
	 */
	yourEmailText: 'Your Email Address',
	
	/**
	 * Overlay: Cancel overlay label
	 * @memberOf HD.SendFriendWidget
	 */
	cancelLabel: 'CANCEL',
	
	/**
	 * Overlay: Close overlay after success label
	 * @memberOf HD.SendFriendWidget
	 */
	closeLabel: 'CLOSE',
	
	/**
	 * Overlay: Send label
	 * @memberOf HD.SendFriendWidget
	 */
	sendLabel: 'SEND',
	
	/**
	 * Overlay: Success text
	 * @memberOf HD.SendFriendWidget
	 */
	successText: 'Your email was sent successfully. Thanks for sharing with your fellow riding enthusiasts.',
	
	/**
	 * Overlay: Formats an error message
	 * @memberOf HD.SendFriendWidget
	 */
	errorMessage: '<div class="hdwcErrorOverlayLarge">${error}</div>',
	
	/**
	 * @constant
	 * @return {string} Overlay: Title for the overlay
	 * @memberOf HD.SendFriendWidget
	 */
	getOverlayTitle : function(){
		return this.overlayTitle;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Success title for the overlay
	 * @memberOf HD.SendFriendWidget
	 */
	getOverlaySuccessTitle : function(){
		return this.overlaySuccessTitle;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Friend's name
	 * @memberOf HD.SendFriendWidget
	 */
	getFriendsNameText : function(){
		return this.friendsNameText;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Friend's email
	 * @memberOf HD.SendFriendWidget
	 */
	getFriendsEmailText : function(){
		return this.friendsEmailText;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: User's name
	 * @memberOf HD.SendFriendWidget
	 */
	getYourNameText : function(){
		return this.yourNameText;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: User's email
	 * @memberOf HD.SendFriendWidget
	 */
	getYourEmailText : function(){
		return this.yourEmailText;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Cancel overlay label
	 * @memberOf HD.SendFriendWidget
	 */
	getCancelLabel : function(){
		return this.cancelLabel;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Close overlay after success label
	 * @memberOf HD.SendFriendWidget
	 */
	getCloseLabel : function(){
		return this.closeLabel;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Send label
	 * @memberOf HD.SendFriendWidget
	 */
	getSendLabel : function(){
		return this.sendLabel;
		
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Success text
	 * @memberOf HD.SendFriendWidget
	 */
	getSuccessText : function(recipient){
		return this.successText.replace(/\$\{recipient\}/, recipient);
	},
	
	/**
	 * @constant
	 * @return {string} Overlay: Formats an error message
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorMessage : function(error){
		return this.errorMessage.replace(/\$\{error\}/, error);
	},

	/**
	 * @constant
	 * @return {string} Label for the widget: sendFriendLabel
	 * @memberOf HD.SendFriendWidget
	 */
	getSendFriendLabel : function(){
		return this.sendFriendLabel;
	},
	
	/**
	 * @constant
	 * @return {string} Error instructional text for required fields: errorInstrText
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorInstrText : function(){
		return this.errorInstrText;
	},

	/**
	 * @constant
	 * @return {string} Error text for required sender name: errorUserNameText
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorUserNameText : function(){
		return this.errorUserNameText;
	},

	/**
	 * @constant
	 * @return {string} Error text for required friend name: errorFriendNameText 
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorFriendNameText : function(){
		return this.errorFriendNameText;
	},

	/**
	 * @constant
	 * @return {string} Error text for required friend email: errorFriendEmailText  
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorFriendEmailText : function(){
		return this.errorFriendEmailText;
	},

	/**
	 * @constant
	 * @return {string} Error text for invalid friend email: errorFriendEmailInvalidText  
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorFriendEmailInvalidText : function(){
		return this.errorFriendEmailInvalidText;
	},

	/**
	 * @constant
	 * @return {string} Error text for required sender email: errorYourEmailText   
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorYourEmailText : function(){
		return this.errorYourEmailText;
	},

	/**
	 * @constant
	 * @return {string} Error text for invalid sender email: errorYourEmailInvalidText   
	 * @memberOf HD.SendFriendWidget
	 */
	getErrorYourEmailInvalidText : function(){
		return this.errorYourEmailInvalidText;
	},
	
	/**
	 * @constant
	 * @return {string} Instructional text for overlay: sendFriendInstructionalText 
	 * @memberOf HD.SendFriendWidget
	 */
	getInstructionalText : function(){
		return this.sendFriendInstructionalText;
	},
	
	/**
	 * @constant
	 * @return {string} Main template for the widget
	 * @memberOf HD.SendFriendWidget
	 */
	getHtml : function() {
		return this.html;
	},
	
	/**
	 * @constant
	 * @return {string} Overlay template for the widget
	 * @memberOf HD.SendFriendWidget
	 */
	getOverlayHtml : function() {
		return this.overlayHtml;
	},
	
	/** 
	 * Main template for the widget
	 * @memberOf HD.SendFriendWidget
	 * @type jst_template
	 */	
	html :  '\
		<div class="${classes.SEND_FRIEND} ${classes.WIDGET}">\
			<span class="${hooks.SENDBUTTON}">${templates.getSendFriendLabel()}</span>\
			<div class="${hooks.SENDBUTTON_TOOLTIP}">${templates.getSendFriendLabel()}</div>\
		</div>',
		
	/** 
	 * Overlay template for the widget
	 * @memberOf HD.SendFriendWidget
	 * @type jst_template
	 */	
	overlayHtml :  '\
		{if !url}\
		    <div id="hdwcShareFriendOverlay">\
		    	<div class="dblRuleBtm">\
		    		<div class="head">${templates.getOverlayTitle()}</div>\
		    	</div>\
				<div id="hdwcBody" style="{if siteName != "Dark Custom"}height:225px;{/if}overflow-y:auto;overflow-x:hidden;">\
				    <div id="submissionInstructions">\
		    			<div id="${hooks.INSTRUCTIONS}" class="hdSendFriendBox ${hooks.INSTRUCTIONS}"></div>\
					</div>\
		 	    	<div>\
			        	<div>\
				        	<form name="${hooks.FORM}" id="${hooks.FORM}" class="${hooks.FORM}">\
								<table width="100%"><tr><td>\
									<div>\
										<span id="${hooks.FORM_FRIEND_NAME_LABEL}" class="${hooks.FORM_FRIEND_NAME_LABEL}">${templates.getFriendsNameText()} <span class="reqIndicator">*</span></span>\
										<input type="text" name="friendName" class="${hooks.FORM_FRIEND_NAME}"></input>\
									</div>\
									<div>\
										<span id="${hooks.FORM_USER_NAME_LABEL}" class="${hooks.FORM_USER_NAME_LABEL}">${templates.getYourNameText()} <span class="reqIndicator">*</span></span>\
										<input type="text" name="userName" class="${hooks.FORM_USER_NAME}"></input>\
									</div>\
								</td><td>\
									<div>\
										<span id="${hooks.FORM_FRIEND_EMAIL_LABEL}" class="${hooks.FORM_FRIEND_EMAIL_LABEL}">${templates.getFriendsEmailText()} <span class="reqIndicator">*</span></span>\
										<input type="text" name="friendEmail" class="${hooks.FORM_FRIEND_EMAIL}"></input>\
									</div>\
									<div>\
										<span id="${hooks.FORM_USER_EMAIL_LABEL}" class="${hooks.FORM_USER_EMAIL_LABEL}">${templates.getYourEmailText()} <span class="reqIndicator">*</span></span>\
										<input type="text" name="userEmail" class="${hooks.FORM_USER_EMAIL}"></input>\
									</div>\
								</td></tr></table>\
								<div class="hdwcMedPadBtm">\
					        		<input type="submit" value="${templates.getSendLabel()}" id="sendFriendButton" style="display:none;"/>\
					        		<div class="btnOrange">\
			                       		<a href="javascript:void(0)" onclick="document.getElementById(\'sendFriendButton\').click();">${templates.getSendLabel()}</a>\
			                    	</div>\
					            	<div class="btnDarkGrey hdClose">\
					            		<a href="javascript:void(0)">${templates.getCancelLabel()}</a>\
									</div>\
					        	</div>\
							</form>\
			        	</div>\
					</div>\
				</div>\
		    </div>\
		{else}\
		    <div id="hdwcShareFriendSuccessOverlay">\
			   	<div class="dblRuleBtm">\
		    		<div class="head">${templates.getOverlaySuccessTitle()}}</div>\
		    	</div>\
				<div id="hdwcBody">\
		 	       <div>\
			        	<div>\
							<div class="hdwcMedPadBtm">\
								{if siteName == "Dark Custom"}\
									<p class="hdTitle">The Internet Loves You</p>\
									<p>Your email to ${recipient} was sent successfully. Feel it?</p>\
								{else}\
									<p>${templates.getSuccessText(recipient)}</p>\
								{/if}\
								<div class="btnOrange hdClose">\
				            		<a href="javascript:void(0)">${templates.getCloseLabel()}</a>\
								</div>\
				        	</div>\
							<iframe src="${url}" style="height: 1px; width: 1px; visibility: hidden;"></iframe>\
			        	</div>\
					</div>\
				</div>\
		    </div>\
		{/if}'
};

(function() {
	var classes = HD.CSS_CLASSES;
	
	/**
	 * The collection of hooks
	 */
	HD.SendFriendWidget.hooks = {
		
		/**
		 * Standalone: (1)<br />
		 * Use: Button to launch send to friend overlay<br />
		 * @memberOf HD.SendFriendWidget
		 */
		SENDBUTTON : classes.SEND_FRIEND + '-button',
		
		/**
		 * Standalone: (1)<br />
		 * Use: Tooltip for button<br />
		 * @memberOf HD.SendFriendWidget
		 */
		SENDBUTTON_TOOLTIP : classes.SEND_FRIEND + '-tooltip',
		
		/**
		 * Standalone: 1<br />
		 * Use: Instructions container<br />
		 * @memberOf HD.SendFriendWidget
		 */
		INSTRUCTIONS : 'sendFriendInstructions',
		
		/**
		 * Standalone: 1<br />
		 * Type: FORM <br/>
		 * Use: Send to a friend submission form<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM : 'hdSendToFriendForm',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Use: Friend's name label, displays errors<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_FRIEND_NAME_LABEL : classes.SEND_FRIEND + '-FriendName',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Use: Friend's email label, displays errors<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_FRIEND_EMAIL_LABEL : classes.SEND_FRIEND + '-FriendEmail',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Use: User's name label, displays errors<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_USER_NAME_LABEL : classes.SEND_FRIEND + '-UserName',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Use: User's email label, displays errors<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_USER_EMAIL_LABEL : classes.SEND_FRIEND + '-UserEmail',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Type: INPUT <br/>
		 * Use: Friend's name field<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_FRIEND_NAME : classes.SEND_FRIEND + '-form-friend-name',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Type: INPUT <br/>
		 * Use: Friend's email field<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_FRIEND_EMAIL : classes.SEND_FRIEND + '-form-friend-email',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Type: INPUT <br/>
		 * Use: User's name field<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_USER_NAME : classes.SEND_FRIEND + '-form-user-name',
		
		/**
		 * Dependencies: 1: FORM<br />
		 * Type: INPUT <br/>
		 * Use: User's email field<br />
		 * @memberOf HD.SendFriendWidget
		 */
		FORM_USER_EMAIL : classes.SEND_FRIEND + '-form-user-email',
		
		/**
		 * Dependencies: 1: INSTRUCTIONS<br />
		 * Use: Dynamically injected after INSTRUCTIONS whenever there are errors<br />
		 * @memberOf HD.SendFriendWidget
		 */
		ERRORS : 'hdValidationErrors'
		
	};
})();

HD.SendFriendWidget.prototype = {
    
	/**
	 * Sets event listeners for the widget.
	 * @param {object} [data]
	 *                 Event data from the render phase
	 */
    setListeners : function(media) {
		if (!media) {
			return;
		}
		
		var self = this;
		// Add click events.
		this.getByHook('SENDBUTTON', function(sendFriendEl) {
			self.getByHook('SENDBUTTON_TOOLTIP', function(tooltipEl) {
				sendFriendEl.onmouseover = function() {
					HD.addClass(tooltipEl, HD.CSS_CLASSES.SHARE+'Hover');
				};
				sendFriendEl.onmouseout = function() {
					HD.removeClass(tooltipEl, HD.CSS_CLASSES.SHARE+'Hover');
				};
			});
			sendFriendEl.onclick = function() {
				self.openForm(media);
			};
		});
    },
    
    /**
	 * Monitors events by HD.SendFriendWidget.
	 * @param {string} eventName
	 *                 The name of the event
	 * @param {object} [eventData]
	 *                 Data for the event
	 */
    update : function(eventName, eventData) {
		if (!this.config.embedMode) {
			if (this.config.standaloneMode){
	    		if(eventName == "loadSTAF_Start") {
	    			this.render(eventData);
	    		}
	    	}
	    	else if(eventName == "getMedium_Start") {
	    		this.loading(true);
	    	} else if(eventName == "getMedium_Finish") {
	    		this.loading(false);
	    		this.render(eventData);
	    	} else if(eventName == "activeItem_Change") {
	    		this.render(eventData);
	    	}
		}
    },
    
    /**
	 * Renders the HTML for the widget based on dynamic data.
	 * @param {object} [data]
	 *                 Event data from the render phase
	 * @returns {string} HTML for the widget
	 */
    getHtml : function(media) {
		if (!media) {
			return;
		}
		
		return this.processTemplate(this.config.templates.getHtml(), {});
    },
    
    /**
	 * Opens the form overlay.
	 * @param {object} [data]
	 *                 Event data from the render phase
	 */
    openForm : function(media){
    	var self = this;
    	self.config.callback(media);
		HD.util.Analytics.track(self.analyticsSendFriendString(media));
		var overlayEl = HD.util.Common.showOverlay(this.processTemplate(this.config.templates.getOverlayHtml(), {
			siteName: comSiteName,
			recipient: null,
			url: null
		}), this.config.templates.getSendFriendLabel().toUpperCase(), self.config.overlayWidth, self.config.overlayHeight);
		
		// Add instructional text
		this.getByHook('INSTRUCTIONS', function(instructionalEl) {
			instructionalEl.innerHTML = self.config.templates.getInstructionalText();
		}, null, overlayEl);
		
		// Handle form submission.
		this.getByHook('FORM', function(formEl) {
			formEl.onsubmit = function() {					
				self.handleSubmit(formEl, media, overlayEl);				
				return false;
			};
		}, 'form', overlayEl);
    },

    /**
	 * Submits the form.
	 * @param {HTMLElement} form
	 *                 		The form containing the input fields
	 * @param {object} 		[eventData]
	 *                 		Data for the event
	 */
	handleSubmit : function (form, media, overlay) {
    	var errorText = '';
		var emailValidate = /.+@.+\..+/;
		var self = this;
		// Gather the data
		var userName = (this.getByHook('FORM_USER_NAME', null, 'input', form)[0] || {}).value || '';
		var userEmail = (this.getByHook('FORM_USER_EMAIL', null, 'input', form)[0] || {}).value || '';
		var friendName = (this.getByHook('FORM_FRIEND_NAME', null, 'input', form)[0] || {}).value || '';
		var friendEmail = (this.getByHook('FORM_FRIEND_EMAIL', null, 'input', form)[0] || {}).value || '';
		var templates = this.config.templates;
		
		if (!friendName || !userName || !friendEmail || !userEmail) {
			errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorInstrText());
		}
		
		// Handle errors
		this.getByHook('FORM_FRIEND_NAME_LABEL', function(el) {
			HD.removeClass(el, 'hdwcValidationError');
			if (!friendName) {
				errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorFriendNameText());
				HD.addClass(el, 'hdwcValidationError');
			}
		}, null, form);
		this.getByHook('FORM_USER_NAME_LABEL', function(el) {
			HD.removeClass(el, 'hdwcValidationError');
			if (!userName) {
				errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorUserNameText());
				HD.addClass(el, 'hdwcValidationError');
			}
		}, null, form);
		this.getByHook('FORM_FRIEND_EMAIL_LABEL', function(el) {
			HD.removeClass(el, 'hdwcValidationError');
			if (!friendEmail) {
				errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorFriendEmailText());
				HD.addClass(el, 'hdwcValidationError');
			}
			else if (!friendEmail.match(emailValidate)) {
				HD.addClass(el, 'hdwcValidationError');
			}
		}, null, form);
		this.getByHook('FORM_USER_EMAIL_LABEL', function(el) {
			HD.removeClass(el, 'hdwcValidationError');
			if (!userEmail) {
				errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorYourEmailText());
				HD.addClass(el, 'hdwcValidationError');
			}
			else if (!userEmail.match(emailValidate)) {
				HD.addClass(el, 'hdwcValidationError');
			}
		}, null, form);
		
		if(errorText && (!friendEmail.match(emailValidate) || !userEmail.match(emailValidate))){				
			errorText += '<br />';
		}
		
		if (friendEmail && !friendEmail.match(emailValidate)) {
			errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorFriendEmailInvalidText());
		}
		
		if (userEmail && !userEmail.match(emailValidate)) {
			errorText += self.config.templates.getErrorMessage(self.config.templates.getErrorYourEmailInvalidText());
		}
		
		
		
		// Inject errors.
		var errorsEl = this.getByHook('ERRORS', null, null, overlay)[0] || null;
		if (errorText) {
			if (!errorsEl) {
				errorsEl = document.createElement('div');
				errorsEl.id = this.config.hooks.ERRORS;
				errorsEl.className = this.config.hooks.ERRORS;
				this.getByHook('INSTRUCTIONS', function(instructionsEl) {
					instructionsEl.parentNode.insertBefore(errorsEl, instructionsEl.nextSibling);
				}, null, overlay);
			}
			errorsEl.innerHTML = errorText;
		}
		// Submit the form.
		else {
			if (errorsEl) {
				errorsEl.parentNode.removeChild(errorsEl);
			}
			
			// Retrieve context parameters.
			this.config.submission.media = media.mediaId || '';
			var params = this.config.getParams(this.config.submission, media) || this.config.submission;
			var url = [
				params.url,
				'?_ID_=', encodeURIComponent(params.id || ''),
				'&YOURNAME=', encodeURIComponent(userName),
				'&YOUREMAIL=', encodeURIComponent(userEmail),
				'&FRIENDNAME=', encodeURIComponent(friendName),
				'&FRIENDEMAIL=', encodeURIComponent(friendEmail),
				'&communityID=', encodeURIComponent(params.community || ''),
				'&mediaID=', encodeURIComponent(params.media || ''),
				'&viewID=', encodeURIComponent(params.view || '')
			];
			for (var prop in params) {
				if (!prop.match(/^(id|community|media|view|url)$/)) {
					url.push('&', prop, '=', encodeURIComponent(params[prop]));
				}
			}
			
			// Send the request to the friend.
			HD.util.Analytics.track(this.analyticsSendFriendConfirmationString(media));
			var overlayEl = HD.util.Common.showOverlay(this.processTemplate(this.config.templates.getOverlayHtml(), {
				siteName: comSiteName,
				recipient: friendEmail,
				url: url.join('')
			}), this.config.templates.getSendFriendLabel().toUpperCase(), self.config.overlayWidth, self.config.overlayHeight);

			// Change button behavior if sendAnother is enabled
			if(self.config.sendAnother){
				var closeEls = HD.getByClass("hdClose", "*", overlayEl);
				if(closeEls.length > 0) {
					closeEls[0].onclick = function() {
						self.openForm(media);
					};
				}
			}
		}
	},
	
    /**
	 * Analytics event for when the STAF overlay is opened.
	 * @param {object} [data]
	 *                 Media data
	 * @returns {string} Analytics string
	 */
	analyticsSendFriendString : function(data) {
		return "default_analyticsSendFriendString";
	},
	
    /**
	 * Analytics event for when the STAF is completed.
	 * @param {object} [data]
	 *                 Media data
	 * @returns {string} Analytics string
	 */
	analyticsSendFriendConfirmationString : function(data) {
		return "default_analyticsSendFriendConfirmationString";
	}
};

HD.extend(HD.SendFriendWidget, [HD.Widget]);

HD.register("hd_send_friend_widget", 'HD.SendFriendWidget', {version: "1.0", build: "1"});
