if (typeof HD == "undefined" || !HD) {

	/**
	 * The HD global namespace object.  If HD is already defined, the
	 * existing HD object will not be overwritten so that defined
	 * namespaces are preserved.
	 * 
	 * @class HD
	 * @static
	 */
	var HD = {
		/** Temporarily holds events event listeners until YUI is loaded */
		onLoadQueue : [],
		/** Whether YUI has been loaded */
		isYuiLoaded : false,
		/** Placeholder namespace for HD.util.* */
		util : {},
		/** YAHOO.util.YUILoader for loading YUI components */
		loader : null,
		/** A cache of child HD classes */
		classMap : {},
		
		/**
		 * Retrieves an element based on an ID or reference
		 * @param {string|HTMLElement} identifier The ID or reference of the element to grab
		 * @returns {HTMLElement}
		 */
		get : function(identifier) {
			return YAHOO.util.Dom.get(identifier);
		},
		
		/**
		 * Retrieves an collection of elements based on the class name and node type
		 * Overriding scope isn't available in the YUI version included.
		 * @param {string} className The class to finding matching elements for
		 * @param {string} elementType The node type to limit matching elements by ('*' for all)
		 * @param {HTMLElement} containerEl The element to look within for matching children
		 * @param {function} apply A function to apply to all matching elements, example:
		 *                         function(element) { element.innerHTML = ''; }
		 * @returns {array} An array of matching elements
		 */
		getByClass : function(className, elementType, containerEl, apply /*, o, overrides*/) {
			return YAHOO.util.Dom.getElementsByClassName.apply(YAHOO.util.Dom, arguments);
		},
		
		/**
		 * Adds active modules to the specified loader
		 * @param {YAHOO.util.YUILoader} loader
		 */
		addModules : function(loader) {
			for(var key in this.modules) {
				loader.addModule(this.modules[key]);
			}
		},
		
		/**
		 * Inserts a config into the YUI loader
		 * @param {object} config YUI component config
		 */
		insert : function(config) {
			var loader = this.getLoader();
			if(loader !== null) {
				loader.insert(config);
			}
		},
		
		/**
		 * Returns the singleton YUI loader
		 * @returns {YAHOO.util.YUILoader}
		 */
		getLoader : function() {
			if(this.loader === null) {
				this.loader = new YAHOO.util.YUILoader();
				this.addModules(this.loader);
			}
			return this.loader;
		},
		
		/**
		 * Enhances a class with a collection of other classes.
		 * Essentially, this provides the ability to inherit/mixin 
		 * abilities from a generic class to a specific one.
		 * @param {function} subClass The class that will inherit the super classes
		 * @param {array} superClasses An array of classes (functions) that the subClass will inherit from
		 */
		extend : function(subClass, superClasses) {
			/*
			if(typeof YAHOO != "undefined" && !!YAHOO) {
				YAHOO.lang.extend(subClass, superClass);
			}
			*/
			for(var i = 0, len = superClasses.length; i < len; i++) {
				var superClass = superClasses[i];
				for(var a in superClass.prototype) {
					if(!subClass.prototype[a]) {
						subClass.prototype[a] = superClass.prototype[a];
					}
				}
			}
			//return subClass;
		},
			
		/**
		 * Clone an object (deep cloning will break with object instances).
		 * @param {object} source The object to clone
		 * @param {boolean} [deep] Whether to recursively clone the object (follow the tree and clone children)
		 * @returns {object} The cloned object
		 */
		clone : function(source, deep) {
			var result = {};
			for (var prop in source) {
				if (deep && typeof source[prop] == 'object') {
					result[prop] = this.clone(source[prop], deep);
				}
				else {
					result[prop] = source[prop];
				}
			}
			return result;
		},
			
		/**
		 * Merges the content of two separate objects
		 * @param {object} source The object to merge into
		 * @param {object} override The object containing override or new properties to merge into the source
		 * @param {boolean} [deep] Whether to recursively clone the object (follow the tree and clone children)
		 * @returns {object} The cloned object
		 */
		merge : function(source, override, deep) {
			for (var prop in override) {
				source[prop] = override[prop];
			}
			return source;
		},
		
		/** 
		 * Registers a class in the local cache
		 * @param {string} name The internal name for the class
		 * @param {string} className The class including namespace to reference the class (i.e. eval(className) === class)
		 * @param {object} info Additional information about the class (like the version)
		 */
		register : function(name, className, info) {
			/*
			if(typeof YAHOO != "undefined" && !!YAHOO) {
				YAHOO.register(name, className, info);
			}
			*/
			HD.classMap[name] = className;
		},
		
		/**
		 * Adds a function that should be called when the page is ready
		 * @param {function} callback The callback function to be executed on page load (actually onDOMReady)
		 */
		onLoad : function(callback) {
			if(typeof YAHOO != "undefined") {
				YAHOO.util.Event.onDOMReady(callback);
			} else {
				this.onLoadQueue.push(callback);
			}
		},
		
		/**
		 * Adds a class to a given element
		 * @param {HTMLElement} element The element to add a class to
		 * @param {string} className The class to add to the element
		 */
		addClass : function(element, className) {
			YAHOO.util.Dom.addClass(element, className);
		},
		
		/**
		 * Removes a class from a given element
		 * @param {HTMLElement} element The element to remove a class from
		 * @param {string} className The class to remove from the element
		 */
		removeClass : function(element, className) {
			YAHOO.util.Dom.removeClass(element, className);
		},
		
		/**
		 * Replaces a class for a given element
		 * @param {HTMLElement} element The element to replace a class for
		 * @param {string} oldClassName The class to remove from the element
		 * @param {string} className The class to add to the element
		 */
		replaceClass : function(element, oldClassName, className) {
			YAHOO.util.Dom.replaceClass(element, oldClassName, className);
		},
		
		/**
		 * Checks whether a given element has a specific class
		 * @param {HTMLElement} element The element to check for a class with
		 * @param {string} className The class to search for
		 * @returns {boolean} Whether the element has the class
		 */
		hasClass : function(element, className) {
			return YAHOO.util.Dom.hasClass(element, className);
		},
		
		/**
		 * Shows a given element (by removing the "hdHidden" class)
		 * @param {HTMLElement} element The element to show
		 */
		show : function(element) {
			HD.removeClass(element, HD.CSS_CLASSES.HIDDEN);
		},
		
		/**
		 * Hides a given element (by adding the "hdHidden" class)
		 * @param {HTMLElement} element The element to hide
		 */
		hide : function(element) {
			HD.addClass(element, HD.CSS_CLASSES.HIDDEN);
		},
			
		/**
		* Asynchronously include a JavaScript in the page.
		* @param {string} url The URL to the script to download.
		* @param {function} callback The function to call when the script has been loaded.
		*/
		includeJs : function(url, callback) {
			var cb = callback;
			var script = document.createElement("script");
			script.type = "text/javascript";
			script.language = "javascript";
			script.src = url;
				
			if(navigator.userAgent.indexOf("IE")>=0) {
				script.onreadystatechange = function(){
					if(script && ("loaded" == script.readyState || "complete" == script.readyState)) {
						script.onreadystatechange=null;
						cb();
					}
				};
			} else {
				script.onload=function(){
					script.onload=null;
					cb();
				};
			}
			
			document.getElementsByTagName("head")[0].appendChild(script);
		},
		
		/** 
		 * Called when YUI is finished loading to execute onLoad callbacks
		 */
		yuiLoaded : function() {
			for(var i = 0, len = HD.onLoadQueue.length; i < len; i++) {
				HD.onLoad(HD.onLoadQueue[i]);
			}
		},
		
		/** 
		 * Checks for the existence of substring within a string
		 * @param {string} string The string to check
		 * @param {string} text The substring to search for
		 * @returns {boolean} Whether the substring exists within the string
		 */
		containsText : function(string, text) {
			if(string === null) {
				return false;
			}
			return string.indexOf(text) > -1;
		},
		
		/**
		 * Removes a specific object from an array if it exists within the array
		 * @param {array} array The array to remove an object from
		 * @param {object} element The object to remove from the array
		 */
		pluck : function(array, element) {
			var tempArray = [];
			for(var i = 0, len = array.length; i < len; i++) {
				var tempElement = array[i];
				if(tempElement != element) {
					tempArray.push(tempElement);
				}
			}
			array = tempArray;
		},

		/**
		* Logs a message (placeholder).
		* @param {string} message The message string to be logged.
		* @param {string} severity The severity of the event being logged.
		*/
		log : function(message, severity) {
			// TODO use YUI logger
		}
	};
}

/** 
 * A local cache of possible HD modules so that they can be included via scripting instead of a normal include
 */
HD.modules = {
	'hd' : {
		'name' : 'hd',
		'type' : 'js',
	    'path' : 'hd.js',
	    'requires' :[],
	    'skinnable' : true
	},

	'hd_common' : {
		'name' : 'hd_common',
		'type' : 'js',
	    'path' : 'hd_common/hd_common.js',
	    'requires' :[]
	},
	
	'hd_dwr' : {
		'name' : 'hd_dwr',
		'type' : 'js',
	    'path' : 'hd_dwr/hd_dwr.js',
	    'requires' :[]
	},
	
	'hd_event' : {
		'name' : 'hd_event',
		'type' : 'js',
	    'path' : 'hd_event/hd_event.js',
	    'requires' :[]
	},
	
	'hd_paging' : {
		'name' : 'hd_paging',
		'type' : 'js',
	    'path' : 'hd_paging/hd_paging.js',
	    'requires' :['hd_event'],
	    'skinnable' : true
	},
		
	'hd_widget' : {
		'name' : 'hd_widget',
		'type' : 'js',
	    'path' : 'hd_widget/hd_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},
	
	'hd_widget_cluster' : {
		'name' : 'hd_widget',
		'type' : 'js',
	    'path' : 'hd_widget/hd_widget.js',
	    'requires' :['hd_event'],
	    'skinnable' : true
	},
	
	'hd_gallery_widget' : {
		'name' : 'hd_gallery_widget',
		'type' : 'js',
	    'path' : 'hd_gallery_widget/hd_gallery_widget.js',
	    'requires' :['hd_paging'],
	    'skinnable' : true
	},
	
	'hd_detail_widget' : {
		'name' : 'hd_detail_widget',
		'type' : 'js',
	    'path' : 'hd_detail_widget/hd_detail_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},
	
	'hd_upload_widget' : {
		'name' : 'hd_upload_widget',
		'type' : 'js',
	    'path' : 'hd_upload_widget/hd_upload_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},
		
	'hd_comments_widget' : {
		'name' : 'hd_comments_widget',
		'type' : 'js',
	    'path' : 'hd_comments_widget/hd_comments_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},
	
	'hd_most_popular_widget' : {
		'name' : 'hd_most_popular_widget',
		'type' : 'js',
	    'path' : 'hd_most_popular_widget/hd_most_popular_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},

	'hd_monthly_widget' : {
		'name' : 'hd_monthly_widget',
		'type' : 'js',
	    'path' : 'hd_monthly_widget/hd_monthly_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},
	
	'hd_member_widget' : {
		'name' : 'hd_member_widget',
		'type' : 'js',
	    'path' : 'hd_member_widget/hd_member_widget.js',
	    'requires' :[],
	    'skinnable' : true
	},
	
	'hd_email' : {
		'name' : 'hd_email',
		'type' : 'js',
		'path' : 'hd_email/hd_email.js',
		'requires' :[],
		'skinnable' : true
	}
};

/** An enumeration of data sorting methods */
HD.SORTS = {
	NEW_TO_OLD : "newToOld",
	OLD_TO_NEW : "oldToNew",
	HIGHEST_RATED : "highestRated",
	MOST_POPULAR : "mostPopular",
	MOST_VOTED : "mostVoted",
	MOST_VIEWED : "mostViewed",
	MOST_COMMENTED : "mostCommented"
};

/** An enumeration of classes used within the hd.js and community.js widget platform */
HD.CSS_CLASSES = {
	WIDGET : "hdWidget",
	GALLERY : "hdGallery",
	MINI_GALLERY : "hdMiniGallery",
	DETAIL : "hdDetail",
	UPLOAD : "hdUpload",
	HANDLE : "hdHandle",
	CONTROL : "hdControl",
	CONTROL_PANEL : "hdControlPanel",
	CONTENT_PANEL : "hdContentPanel",
	SORT : "hdSort",
	MORE : "hdMore",
	LESS : "hdLess",
	PAGING : "hdPaging",
	PAGING_ARROW : "hdPagingArrow",
	PAGING_NONE : "hdNoPaging",
	NEXT : "hdNext",
	CURRENT : "hdCurrent",
	PREVIOUS : "hdPrevious",
	TITLE : "hdTitle",
	AUTHOR : "hdAuthor",
	LABEL : "hdLabel",
	VALUE : "hdValue",
	THUMB : "hdThumb",
	SMALL_THUMB : "hdSmallThumb",
	LARGE_THUMB : "hdLargeThumb",
	SMALL_THUMB_WRAPPER : "hdSmallThumbWrapper",
	LARGE_THUMB_WRAPPER : "hdLargeThumbWrapper",
	THUMB_OVERLAY : "hdThumbOverlay",
	DESCRIPTION : "hdDescription",
	COMMENTS : "hdComments",
	SUBMIT_COMMENT : "hdSubmitComment",
	COMMENT : "hdComment",
	CONSENT : "hdConsent",
	ITEM : "hdItem",
	DATE : "hdDate",
	SHARE : "hdShare",
	SEND_FRIEND : "hdSendFriend",
	SUBSCRIBE : "hdSubscribe",
	LOADING : "hdLoading",
	TOOL_TIP : "hdToolTip",
	HIDDEN : "hdHidden",
	WRAPPER : "hdWrapper",
	EMAIL : "hdEmail",
	EMAIL_FORM : "hdEmailForm",
	BLOG : "hdBlog",
	PHOTO : "hdPhoto",
	VIDEO : "hdVideo",
	VIDEO_PLAYER : "hdVideoPlayer",
	RATING : "hdRating",
	TAG_CLOUD : "hdTagCloud",
	TAG_LIST : "hdTagList",	
	CATEGORIES : "hdCategories",
	CATEGORY : "hdCategory",	
	TAG : "hdTag",	
	TAGS : "hdTags",
	PREVIEW : "hdPreview",
	FULL : "hdFull",
	SHORT : "hdShort",
	MOST_POPULAR : "hdMostPopular",
	MONTHLY_BREAKDOWN : "hdMonthlyBreakdown",
	AUTHOR_BREAKDOWN : "hdAuthorBreakdown",
	STAR_ON : "hdStarOn",
	STAR_OFF : "hdStarOff",
	STAR_OVER: "hdStarOver",
	STAR_HALF : "hdStarHalf",
	SUBMIT : "hdSubmit",
	FIRST : "hdFirst",
	LAST : "hdLast",
	LEFT : "hdLeft",
	RIGHT : "hdRight",
	CENTER : "hdCenter",
	AGREEMENT : "hdAgreement",
	RATED : "hdRated",
	UNRATED : "hdUnrated",
	STATIC : "hdStatic",
	EMPTY : "hdEmpty",
	ERROR: "hdError",
	NAVIGATION : "hdNavigation",
	BACK : "hdBack",
	ACTIVE : "hdActive",
	LIST : "hdList",
	FEATURE_STORIES : "hdFeatureStories",
	CAROUSEL : "hdCarousel",
	EVENTS : "hdEvents",
	EVENT : "hdEvent",
	EVENT_RSVP : "hdEventRSVP",
	RIDES : "hdRides",
	RIDE : "hdRide",
	LOCATION : "hdLocation",
	VIEW_ALL : "hdViewAll",
	VIEW : "hdView",
	CONFIRMATION : "hdConfirmation",
	MEMBER : "hdMember",
	CLOSE : "hdClose",
	ACTION : "hdAction",
	RIDE_PLANNER : "hdRidePlanner",
	SHOW_VIEW : "hdShowView",
	SHOW_ALL : "hdShowAll",
	SHOW_MAX : "hdShowMax",
	SHOW_DEFAULT : "hdShowDefault",
	NO_FLASH : "hdNoFlash",
	MEDIA : "hdMedia",
	TYPE : "hdType",
	CONTEXT : "hdContext",
	SEPARATOR : "hdSeparator",
	TWEET : "hdTweet",
	RETWEET : "hdReTweet",
	REPLY : "hdReply",
	FACEOFF : "hdFaceoff",
	TASKS : "hdTasks",
	FAQ : "hdFAQ",
	POLL : "hdPoll",
	PRINTABLE : "hdPrintable",
	PRINT : "hdPrint",
	PRINT_EXCLUDE_LINK : "hdPrintableLink",
	DISABLED : "hdDisabled"
};

/** A collection of error message overriding abilities for community services */	
HD.ERRORS = {
    /**
	 * Retrieve an error message.
	 * @param {string|object} error
	 *                 An error type or error object
	 * @param {boolean} noDefaults
	 *                 Whether to return the passed in error as the default value
	 */
	getMessage: function(error, noDefaults) {
		if (typeof error == 'object') {
			error = error.errorType;
		}
		error = (error + '').replace(/\./g,'_');
		return HD.ERRORS[error] || (!noDefaults && error) || '';
	},
		
    /**
	 * Retrieve and generate an error.
	 * @param {object} error
	 *                 An error object
	 */
	getError: function(error) {
		// Grab the error message from HD.ERRORS if it exists.
		var message = this.getMessage(error, true);
		
		// If the message cannot be found, return the errorMessage property or the error type.
		if (!message) {
			return error.errorMessage || '';
		}
		// An error message was found...
		else {
			// If the error message is a function, apply it.
			if (typeof message == 'function') {
				message = message(error);
			}
			
			// Run a string replacement.
			var params = error.errorArguments || [];
			for (var i = 0; i < params.length; i++) {
				// Retrieve the param value is it is an error, otherwise keep the existing value.
				message = message.replace(new RegExp('\\{'+i+'\\}', 'g'), this.getMessage(params[i]));
			}
			// Return the generated text.
			return message;
		}
	},
		
    /**
	 * Sort an array of errors according to errorTypes and fieldNames.
	 * @param {array}  errors
	 *                 An array of error objects
	 * @param {array}  [errorTypeOrder]
	 *                 An array of ordered errorType strings (types not within the ordering will be moved to the end)
	 * @param {array}  [fieldNameOrder]
	 *                 An array of ordered fieldName strings (fields not within the ordering will be moved to the end)
	 * @return {array} A sorted array of error objects
	 */
	sortErrors: function(errors, errorTypeOrder, fieldNameOrder) {
		errorTypeOrder = errorTypeOrder || [];
		fieldNameOrder = fieldNameOrder || [];
		var sort = {}, fields = {};
		for (var i = 0; i < errorTypeOrder.length; i++) {
			sort[errorTypeOrder[i]] = i + 1;
		}
		for (var i = 0; i < fieldNameOrder.length; i++) {
			fields[fieldNameOrder[i]] = i + 1;
		}
		return errors.sort(function(a, b) {
			if ((!sort[a.errorType] && sort[b.errorType]) || (sort[a.errorType] && sort[b.errorType] && sort[a.errorType] > sort[b.errorType])) return 1;
			else if ((!sort[b.errorType] && sort[a.errorType]) || (sort[a.errorType] && sort[b.errorType] && sort[a.errorType] < sort[b.errorType])) return -1;
			else {
				if (!fields[a.fieldName] && !fields[b.fieldName]) return 0;
				else if (!fields[a.fieldName]) return 1;
				else if (!fields[b.fieldName]) return -1;
				else if (fields[a.fieldName] < fields[b.fieldName]) return -1;
				else if (fields[a.fieldName] > fields[b.fieldName]) return 1;
				else return 0;
			}
		});
	},
	
    /**
	 * Select a subset of errors according to errorTypes and fieldNames.
	 * @param {array}  errors
	 *                 An array of error objects
	 * @param {array}  [errorTypeOrder]
	 *                 An array of ordered errorType strings (types not within the ordering will be moved to the end)
	 * @param {array}  [fieldNameOrder]
	 *                 An array of ordered fieldName strings (fields not within the ordering will be moved to the end)
	 * @param {number} [limit]
	 *                 An optional limit to the number of results that can be returned.
	 * @return {array} A subset array of error objects
	 */
	selectErrors: function(errors, errorTypeOrder, fieldNameOrder, limit) {
		var subset = [];
		errors = errors || [];
		// Simplify selection by using quick regular expression checks.
		var matchErrorType = new RegExp('^(' + (errorTypeOrder || ['.*']).join('|') + ')$');
		var matchFieldName = new RegExp('^(' + (fieldNameOrder || ['.*']).join('|') + ')$');
		
		// Check for matches.
		for (var i = 0; i < errors.length; i++) {
			if (errors[i].errorType.match(matchErrorType) && errors[i].fieldName.match(matchFieldName)) {
				subset.push(errors[i]);
				if (limit && subset.length == limit) {
					return subset;
				}
			}
		}
		return subset;
	},
	
    /**
	 * Retrieve and generate an error.
	 * @param {array}  errors
	 *                 An array of error objects
	 * @param {string} [errorType]
	 *                 The error type to search for
	 * @param {string} [fieldName]
	 *                 A specific field name to search for
	 * @return {object} Returns the first matching error, otherwise null.
	 *                 Matching is considered both errorType/fieldName if both are specified, but otherwise whichever is specified.
	 */
	hasError: function(errors, errorType, fieldName) {
		errors = errors || [];
		for (var i = 0; i < errors.length; i++) {
			if ((typeof errorType !== 'undefined' && errors[i].errorType == errorType && typeof fieldName !== 'undefined' && errors[i].fieldName == fieldName) || (typeof errorType !== 'undefined' && !fieldName && errors[i].errorType == errorType) || (typeof fieldName !== 'undefined' && !errorType && errors[i].fieldName == fieldName)) {
				return true;
			}
		}
		return false;
	},
	
	/**
	 * This is an example for setting an error message to a function.<br/>
	 * This is useful when an error argument has to be modified contextually (i.e. capitalization).
	 * @param {object} error
	 *                 An error object
  	 * @return {string} The message template string
	error_function: function(error) {
		// Modify the error object contextually.
		if (error.fieldName == 'user.userName') {
			error.errorArguments[0] = 'username';
		}
		return "{0} is invalid.";
	},
	*/
	
	// The error messages for the Validation Actions
	error_required : "{0}",
	error_email_invalid : "{0} is invalid, please enter a valid {0}.",
	error_noProfanity : "The {0} cannot contain profanities.",
	error_empty : "The {0} cannot be empty.",
	error_maxlength : "The {0} cannot exceed {1} characters.",
	error_minlength : "The {0} must be at least {1} characters long.",
	error_numbersOnly : "{0} must contain only numbers.",
	error_isDate : "{0} must be a valid date.",
	error_birthdateNumbers : "Please provide a {0}. It must contain only numbers.",
	error_birthdateMinAge : "You are not allowed to have a profile if you are younger than {0} years of age.",
	error_passwordsDoNotMatch : "Password and Verify Password must match.",
	error_validZip : "{0} must contain only numbers and be 5 digits long.",
	error_photoEmpty : "You must submit a photo.",
	error_videoEmpty : "You must submit a video.",
	error_mediaEmpty : "You must submit a photo or video.",
	error_photoExt : "Photo must use the following format: (.jpg, .gif)",
	error_videoExt : "Video must use the following format: (.flv, .wmv, .asf, .avi, .mov, .3gp, .mpg, .mpeg, .mp4)",
	error_mediaExt : "Photo must use the following format: (.jpg, .gif)<br/>Video must use the following format: (.flv, .wmv, .asf, .avi, .mov, .3gp, .mpg, .mpeg, .mp4)",
	error_alphaNumeric : "{0} may only contain letters, numbers, and underscores with no spaces.",

	// The formatted names of the properties
	registerForm_username_displayname : "Username",
	registerForm_password_displayname : "Password",
	registerForm_passwordConfirm_displayname : "Verify Password",
	registerForm_firstname_displayname : "First Name",
	registerForm_lastname_displayname : "Last Name",
	registerForm_email_displayname : "Email Address",
	registerForm_dob_displayname : "Birthdate",
	registerForm_screenName_displayname : "Screen Name",
	registerForm_captcha_displayname : "Challenge",
	registerForm_zip_displayname : "ZIP",
	loginForm_email_displayname : "Email Address",
	loginForm_password_displayname : "Password",
	resetPasswordForm_password_displayname : "Password",
	resetPasswordForm_passwordConfirm_displayname : "Verify Password",
	submitComment_commentbody_displayname : "comment body",
	registerForm_gender_displayname : "Gender",
	registerForm_ownABike_displayname : "Are you a current or previous owner of a motorcycle?",
	registerForm_haveMotorcycleLicense_displayname : "Do you have your motorcycle license?",
	registerForm_makeOfBikeOwnedOrOwn_displayname : "Motorcycle Brand",

	// Upload forms names
	upload_story_displayname : "Story",
	upload_title_displayname : "Title",
	upload_photo_displayname : "Photo",
	upload_video_displayname : "Video",
	upload_media_displayname : "Media",
	upload_category_displayname : "Category"
};
