YAHOO.namespace("cmsIT");

if (!YAHOO.cmsIT.utils)
{
	YAHOO.cmsIT.utils = function()
	{
		// Private
		var baseCMSPath = null,
			debugMode = true;




		// Public
		return {
			CreateCallBack: function(callbackMethod, callbackArguments, scope, timeout, failureMethod) 
			{
				if (timeout == undefined || timeout == null)
				{
					timeout = 30000;	
				}

				var callback = 
				{
					success: function(obj)
					{
						if (callbackMethod != undefined && callbackMethod != null)
						{
							// Parse for JSON response
							try
							{
								var response = YAHOO.lang.JSON.parse(obj.responseText);
							}
							catch (e)
							{
								var msg = "There is an error in the data format returned from the server. Operation ceased.";
								alert(msg);

								if (debugMode)
								{
									var tmp = window.open();
									tmp.document.write(obj.responseText);
								}
							}


							// Check for error message from the server
							if (
									YAHOO.cmsIT.utils.ObjectExists(response.error) && 
									YAHOO.cmsIT.utils.ObjectExists(response.error.occurred) && 
									YAHOO.cmsIT.utils.IsBoolean(response.error.occurred) &&
									YAHOO.cmsIT.utils.ToBoolean(response.error.occurred)
								)
							{
								var msg = response.error.message;
								response.result._error = response.error;

								if (YAHOO.cmsIT.alertBox && YAHOO.cmsIT.alertBox.alertExists("errorAlert"))
								{
									YAHOO.cmsIT.alertBox.openAlert("errorAlert", "Error!", msg);
								}
								else
								{
									alert(msg);
								}
							}


							// use 'call()' or 'apply()' to set the scope back correctly
							callbackMethod.apply(this, [response.result, obj.argument]);
							// callbackMethod(response, obj.argument);
						}
					},

					failure: function(obj)
					{
						if (failureMethod)
						{
							failureMethod.apply(this, [obj]);
						}
						else
						{
							var msg = "An error occurred while trying to retrieve data from the server.";

							alert(msg);

							if (debugMode)
							{
								var tmp = window.open();
								tmp.document.write(obj.responseText);
							}
						}
					},
		
					timeout: timeout,
					argument: callbackArguments,
					scope: scope
				};

				return callback;
			},


			// Required for IE bug
			CreateInput: function(name)
			{
				var element = null;
		
		
				// First try IE way
				try
				{
					element = document.createElement("<input name='" + name + "' />");
				}
				catch(e)
				{
					element = document.createElement("input");
					element.name = name;
				}
		
				return element;
			},


			CreateRequestJSONPacket: function(factoryObjectName, methodName, methodArguments)
			{
				var packet = 
				{
					"factoryObjectName": factoryObjectName,
					"methodName": methodName,
					"arguments": methodArguments
				};

				var packetJSON = YAHOO.lang.JSON.stringify(packet);

				return packetJSON;
			},


			Dump: function(variable, showValue, showFunctions, showFunctionValues)
			{
				if (showValue == null || showValue == undefined)
				{
					showValue = true;
				}

				if (showFunctions == null || showFunctions == undefined)
				{
					showFunctions = true;
				}

				if (showFunctionValues == null || showFunctionValues == undefined)
				{
					showFunctionValues = false;
				}


				var keyString = "";
				var keyValue = "";
				for (var key in variable)
				{
					keyValue = String(variable[key]);

					if (YAHOO.cmsIT.utils.Left(keyValue.toLowerCase(), 8) != "function" || showFunctions)
					{
						keyString += key;
						
						if (showValue)
						{
							if (YAHOO.cmsIT.utils.Left(keyValue.toLowerCase(), 8) == "function" && !showFunctionValues)
							{
								keyValue = "[function]";
							}

							keyString += ":" + keyValue;
						}

						keyString += "\n";
					}
				}

				alert(keyString);
			},


			FormatCurrency: function(currencyValue)
			{
				currencyValue = String(currencyValue).replace(/[^0-9\.]/g,"");

				if (this.IsNumber(String(currencyValue)))
				{
					if (this.IsInteger(String(currencyValue)) && String(currencyValue).length > 0)
					{
						currencyValue = currencyValue + ".00";
					}
					else if (this.IsInteger(String(currencyValue)) && String(currencyValue).length == 0)
					{
						currencyValue = currencyValue + "0.00";
					}
					
					else if (String(currencyValue).length - String(currencyValue).lastIndexOf(".") - 1 == 0)
					{
						currencyValue = currencyValue + "00";
					}
					else if (String(currencyValue).length - String(currencyValue).lastIndexOf(".") - 1 == 1)
					{
						currencyValue = currencyValue + "0";
					}
					
					else if (String(currencyValue).length - String(currencyValue).lastIndexOf(".") - 1 > 2)
					{
						var cutoff = String(currencyValue).length - String(currencyValue).lastIndexOf(".") - 1 - 2;
						
						currencyValue = String(currencyValue).substr(0,String(currencyValue).length - cutoff);
					}
				}

				return currencyValue;
			},


			FormatTelephone: function(value, removeCountryCode)
			{
				var countryCode = "";

				if (removeCountryCode == undefined)
				{
					removeCountryCode = true;
				}

				value = value.replace(/\D/g, "");

				if (removeCountryCode && Number(this.Left(value, 1)) == 1)
				{
					value = this.Right(value, value.length - 1);
				}
				else if (!removeCountryCode && Number(this.Left(value, 1)) == 1)
				{
					value = this.Right(value, value.length - 1);
					countryCode = "1-";
				}


				if (value.length == 7)
				{
					value = this.Insert(value, "-", 3);
				}
				else if (value.length >= 10)
				{
					if (value.length > 10)
					{
						value = this.Insert(value, " x", 10);
					}


					value = this.Insert(value, "-", 6);
					value = this.Insert(value, "-", 3);
					
					
					if (countryCode.length > 0)
					{
						value = countryCode + value;	
					}
				}


				return value;
			},


			GetCMSBasePath: function()
			{
				if (baseCMSPath == null)
				{
					var scripts = document.getElementsByTagName("script");
				
					for (var i = 0; i < scripts.length; i++)
					{
						if (scripts[i].src.search(/js\/utils.js/) > -1)
						{
							var tmpArray = scripts[i].src.split(location.host);

							for (var i = 0; i < tmpArray.length; i++)
							{
								if (tmpArray[i].search(/js\/utils.js/) > -1)
								{
									var tmpURL = tmpArray[i];
									break;
								}
							}

							tmpArray = tmpURL.split("js/utils.js");
							baseCMSPath = tmpArray[0];
							break;	
						}
					};					 	
				}

				return baseCMSPath;
			},


			GetFieldValue: function(field, isChecked)
			{
				var fieldValue = "";
				var fieldValueArray = [];


				if (isChecked == undefined || isChecked == null)
				{
					isChecked = false;	
				}


				// Checkbox or Radio group passed in
				if (field.nodeName == undefined && field.length != undefined)
				{
					for (var i = 0; i < field.length; i++)
					{
						if (field[i].checked)
						{
							fieldValueArray.push(field[i].value);
						}
					}

					fieldValue = fieldValueArray.join(",");
				}


				// Indiviual field passed in
				else
				{
					var fieldType = field.nodeName.toLowerCase();


					if (fieldType == "input")
					{
						if (field.type == "checkbox" || field.type == "radio")
						{
							if (isChecked && field.checked || !isChecked)
							{
								fieldValue = field.value;
							}
						}
						else if (field.type == "text" || field.type == "hidden" || field.type == "password")
						{
							fieldValue = field.value;
						}
					}
					else if (fieldType == "select" && field.length > 0)
					{
						fieldValue = field[field.selectedIndex].value;
					}
					else if (fieldType == "textarea")
					{
						fieldValue = field.value;
					}
				}


				return fieldValue;
			},


			GetFormValues: function(form)
			{
				var formStructure = {};
				var formElements = form.elements;

				for (var i = 0; i < formElements.length; i++)
				{
					if (("name" in formElements[i]) && formElements[i].name.length > 0 && formStructure[formElements[i].name] == undefined && !formElements[i].disabled)
					{
						formStructure[formElements[i].name] = this.GetFieldValue(form[formElements[i].name], true);
					}
				}

				return formStructure;
			},


			Insert: function(value, insertValue, position)
			{
				value = value.substr(0, position) + insertValue + value.substr(position);

				return value;
			},


			IsArray: function(obj)
			{
				if (obj == undefined || obj == null || obj.constructor.toString().indexOf("Array") == -1)
				{
					return false;
				}
				else
				{
					return true;
				}
			},


			IsAnchor: function(element)
			{
				if (element.nodeName.toLowerCase() == "a")
				{
					return true;
				}

				return false;
			},


			IsBoolean: function(value)
			{
				var stringValue = String(value).toLowerCase();

				switch(stringValue)
				{
					case "true": case "yes": case "1": return true;
					case "false": case "no": case "0": return true;
				}

				return false;
			},


			IsCreditCard: function(value, required)
			{
				//trim whitespace before we validate
				value = this.Trim(value);


				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}


				var white_space = " -";
				var creditcard_string="";
				var check_char;


				for (var i = 0; i < value.length; i++)
				{
					check_char = white_space.indexOf(value.charAt(i));
					
					if (check_char < 0)
					{
						creditcard_string += value.substring(i, (i + 1));
					}
				}


				if (creditcard_string.length < 13 || creditcard_string.length > 19)
				{
					return false;
				}


				if (creditcard_string.charAt(0) == "+")
				{
					return false;
				}


				if (!this.IsInteger(creditcard_string))
				{
					return false;
				}


				var doubledigit = creditcard_string.length % 2 == 1 ? false : true;
				var checkdigit = 0;
				var tempdigit;


				for (var i = 0; i < creditcard_string.length; i++)
				{
					tempdigit = eval(creditcard_string.charAt(i));

					if (doubledigit)
					{
						tempdigit *= 2;
						checkdigit += (tempdigit % 10);

						if ((tempdigit / 10) >= 1.0)
						{
							checkdigit++;
						}
			
						doubledigit = false;
					}
					else
					{
						checkdigit += tempdigit;
						doubledigit = true;
					}
				}	

				return (checkdigit % 10) == 0 ? true : false;
			},


			IsDate: function(value, required)
			{
				// Returns true if value is a date format
				// otherwise returns false
				value = this.Trim(value);

				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}


				// Determine if the splitting character is: 
				// "/" - mm/dd/yyyy  -or-
				// "." - mm.dd.yyyy  -or-
				// "-" - mm-dd-yyyy
				var isplit = value.indexOf('/');
				var splitchr = "/";

				if (isplit == -1)
				{
					isplit = value.indexOf('.');
					splitchr = ".";
				}

				if (isplit == -1)
				{
					isplit = value.indexOf('-');
					splitchr = "-";
				}

				if (isplit == -1 || isplit == value.length)
				{
					return false;
				}

				var element1 = value.substring(0, isplit);


				// check for yyyy-mm-dd format
				if (element1.length == 4)
				{
					var sYear = value.substring(0, isplit);
					isplit = value.indexOf(splitchr, isplit + 1);

					if (isplit == -1 || (isplit + 1 ) == value.length)
					{
						return false;
					}

					var sMonth = value.substring((sYear.length + 1), isplit);
					var sDay = value.substring(isplit + 1);
				
				} 
				else
				{
					var sMonth = value.substring(0, isplit);
					isplit = value.indexOf(splitchr, isplit + 1);

					if (isplit == -1 || (isplit + 1 ) == value.length)
					{
						return false;
					}

					var sDay = value.substring((sMonth.length + 1), isplit);
					var sYear = value.substring(isplit + 1);
				}


				// check month
				if (!this.IsInteger(sMonth) || !this.IsInRange(sMonth, 1, 12))
				{
					return false;
				}


				// check year
				else if (!this.IsInteger(sYear) || (sYear.length != 1 && sYear.length != 2 && sYear.length != 4) || !this.IsInRange(sYear, 0, 9999))
				{
					return false;	
				}


				// check day
				else if (!this.IsInteger(sDay) || !this.IsDay(sYear, sMonth, sDay))
				{
					return false;	
				}


				else
				{
					return true;	
				}
			},


			IsDay: function(year, month, day)
			{
				var maxDay = 31;

				if (month == 4 || month == 6 || month == 9 || month == 11)
				{
					maxDay = 30;
				}
				else if (month == 2)
				{
					if (year % 4 > 0)
					{
						maxDay = 28;
					}
					else if (year % 100 == 0 && year % 400 > 0)
					{
						maxDay = 28;
					}
					else
					{
						maxDay = 29;
					}
				}

				return this.IsInRange(day, 1, maxDay);
			},


			// this method doesn't except commas, dollar signs
			IsDBDollarFormat: function(dollar_value)
			{
				var regex = /^([1-9]{1}\d*|0){0,1}\.\d{2}$/;
				var retval = regex.test(dollar_value);
				return retval;	
			},


			// must have commas but doesn't need $
			IsDollarFormat: function(dollar_value)
			{
				var regex = /^\${0,1}(([1-9]{1}\d{0,2}){1}(\,\d{3}){0,}|0){0,1}\.\d{2}$/;
				var retval = regex.test(dollar_value);
				return retval;
			},


			IsEmail: function(value, required)
			{
				//trim whitespace before we validate
				value = this.Trim(value);


				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}

				return this.IsValidRegex(value, /^[a-zA-Z_0-9-]+(\.[a-zA-Z_0-9-]+)*@([a-zA-Z_0-9-]+\.)+[a-zA-Z]{2,7}$/, required);
			},


			IsImg: function(element)
			{
				if (element.nodeName.toLowerCase() == "img")
				{
					return true;
				}

				return false;
			},


			IsInput: function(element)
			{
				if (element.nodeName.toLowerCase() == "input")
				{
					return true;
				}

				return false;
			},


			IsForm: function(element)
			{
				if (element.nodeName.toLowerCase() == "form")
				{
					return true;
				}

				return false;
			},


			IsInNumberRange: function(value, min_value, max_value)
			{
				if (!this.IsNumber(value) || !this.IsNumber(value) || !this.IsNumber(value))
				{
					return false;	
				}

				value = Number(value);
				min_value = Number(min_value);
				max_value = Number(max_value);

				if (min_value != null)
				{
					if (value < min_value)
					{
						return false;
					}
				}
			
				if (max_value != null)
				{
					if (value > max_value)
					{
						return false;
					}
				}
			
				return true;
			},


			IsInRange: function(value, min_value, max_value)
			{
				return this.IsInNumberRange(value, min_value, max_value);
			},


			IsInteger: function(value)
			{
				value = String(value);

				if (value.length == 0)
				{
					return true;
				}

				var decimal_format = ".";
				var check_char = value.indexOf(decimal_format);

				if (check_char == -1)
				{
					return this.IsNumber(value);
				}
				else
				{
					return false;
				}
			},


			IsMonthDate: function(value, required)
			{
				var monthPattern = /^[0-9]{1,2}\/[0-9]{4}$/;
				// var datePattern = "/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/";

				if (this.IsValidRegex(value, monthPattern, required))
				{
					var dateArray = value.split("/");
					dateArray.splice(1, 0, "1");

					value = dateArray.join("/");
				}

				return this.IsDate(value, required);
			},



			IsNumber: function(value)
			{
				if (value.length == 0)
				{
					return false;
				}


				var start_format = " .+-0123456789";
				var number_format = " .0123456789";
				var check_char;
				var decimal = false;
				var trailing_blank = false;
				var digits = false;


				check_char = start_format.indexOf(value.charAt(0));


				if (check_char == 1)
				{
					decimal = true;
				}
				else if (check_char < 1)
				{
					return false;
				}


				for (var i = 1; i < value.length; i++)
				{
					check_char = number_format.indexOf(value.charAt(i));

					if (check_char < 0)
					{
						return false;
					}
					else if (check_char == 1)
					{
						if (decimal)
						{
							return false;
						}
						else
						{
							decimal = true;
						}
					}
					else if (check_char == 0)
					{
						if (decimal || digits)
						{
							trailing_blank = true;
						}
					}
					else if (trailing_blank)
					{
						return false;
					}
					else
					{
						digits = true;
					}
				}	
			
				return true;
			},


			IsRomanNumeral: function(value)
			{
				var romanNumeralPattern = /^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$/;

				value = value.toUpperCase();

				return this.IsValidRegex(value, romanNumeralPattern, true);
			},


			/**
			 * validate that the value is formatted as a telephone correctly
			 * This pattern matches any US Telephone Number.
			 * This regular expression excludes the first number, after the area code,from being 0 or 1;
			 * it also allows an extension to be added where it does not have to be prefixed by 'x'.
			 *
			 * Matches: 
			 * 617.219.2000 
			 * 219-2000
			 * (617)283-3599 x234
			 * 1(222)333-4444
			 * 1 (222) 333-4444
			 * 222-333-4444
			 * 1-222-333-4444
			 * Non-Matches: 
			 * 44-1344-458606
			 * +44-1344-458606
			 * +34-91-397-6611
			 * 7-095-940-2000
			 * +7-095-940-2000
			 * +49-(0)-889-748-5516
			*/
			IsPhone: function(value, required)
			{
				//trim whitespace before we validate
				value = this.Trim(value);

				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}

				if (value.length == 0)
				{
					return true;
				}

				return this.IsValidRegex(value, /^(((1))?[ ,\-,\.]?([\\(]?([1-9][0-9]{2})[\\)]?))?[ ,\-,\.]?([^0-1]){1}([0-9]){2}[ ,\-,\.]?([0-9]){4}(( )((x){0,1}([0-9]){1,5}){0,1})?$/, required);
			},


			IsSelect: function(element)
			{
				if (element.nodeName.toLowerCase() == "select")
				{
					return true;
				}

				return false;
			},


			IsSpan: function(element)
			{
				if (element.nodeName.toLowerCase() == "span")
				{
					return true;
				}

				return false;
			},


			IsSSN: function(value, required)
			{
				//trim whitespace before we validate
				value = this.Trim(value);

				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}


				// Old Pattern allowed XXX XX XXXX, but we only want XXX-XX-XXXX
				// return this.IsValidRegex(value, /^[0-9]{3}(-| )[0-9]{2}(-| )[0-9]{4}$/, required);
				return this.IsValidRegex(value, /^[0-9]{3}(-)[0-9]{2}(-)[0-9]{4}$/, required);
			},


			IsTable: function(element)
			{
				if (element.nodeName.toLowerCase() == "table")
				{
					return true;
				}

				return false;
			},


			IsTextarea: function(element)
			{
				if (element.nodeName.toLowerCase() == "textarea")
				{
					return true;
				}

				return false;
			},


			IsTime: function(value, required)
			{
				value = value.replace(/^\s+/,'').replace(/\s+$/,'');
				// replace the {t'..'} format around the timestamp if it exists
				value.replace(/{t \'/, '').replace(/'}/, '');

				if (required) 
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}

				return this.IsValidRegex(value, /^(([0-1]?[0-9]|[2][1-4]):([0-5]?[0-9])(:[0-5]?[0-9])?).?([AP]M|[AP]m|[ap]m|[ap]M)?$/, required);
			},


			IsURL: function(value, required)
			{
				//trim whitespace before we validate
				value = this.Trim(value);
			
				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}


				var regexPattern = "^((http|https|ftp|file)\:\/\/([a-zA-Z0-0]*:[a-zA-Z0-0]*(@))?";
				regexPattern += "[a-zA-Z0-9-\.]+(\.[a-zA-Z]{2,3})?(:[a-zA-Z0-9]*)?\/?";
				regexPattern += "([a-zA-Z0-9-\._\?\,\'\/\+&amp;%\$#\=~])*)";
				regexPattern += "|((mailto)\:[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,7})|((news)\:[a-zA-Z0-9\.]*)$";
				regexPattern = new RegExp(regexPattern);

				return this.IsValidRegex(value.toLowerCase(), regexPattern, required);
			},


			/*
			* A string UUID value is required. A UUID is a string
			* of length 35 formatted as XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX, where X is a
			* hexadecimal digit (0-9 or A-F).
			*/
			IsUUID: function(value, required)
			{
				value = this.Trim(value);

				if (required)
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}

				return this.IsValidRegex(value, /[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{16,16}/, required);
			},


			IsValidRegex: function(value, regexPattern, required)
			{
				if (required) 
				{
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0) 
					{
						return true;
					}
				}

				return regexPattern.test(value);
			},


			IsZip: function(value, required)
			{
				//trim whitespace before we validate
				value = this.Trim(value);
			
				if (required) {
					if (value.length == 0)
					{
						return false;
					}
				}
				else
				{
					if (value.length == 0)
					{
						return true;
					}
				}

				return this.IsValidRegex(value, /^([0-9]){5,5}$|(([0-9]){5,5}(-| ){1}([0-9]){4,4}$)/, required);
			},


			Left: function(value, count)
			{
				return value.substr(0, count);
			},


			ObjectExists: function(obj)
			{
				if (obj != null && obj != undefined)
				{
					return true;
				}
				
				return false;
			},


			ProcessRequest: function(factoryObjectName, methodName, methodArguments, callback)
			{
				var basePath = this.GetCMSBasePath();
				var packet = this.CreateRequestJSONPacket(factoryObjectName, methodName, methodArguments);

				return YAHOO.util.Connect.asyncRequest("POST", basePath + "cfcs/cmsIT/baseComponents/proxy.cfc", callback, "method=ProcessRequest&packet=" + packet);
			},


			ProcessURLRequest: function(url, callback)
			{
				return YAHOO.util.Connect.asyncRequest("GET", url, callback);
			},


			Right: function(value, count)
			{
				var start = String(value).length - count;

				return value.substr(start, count);
			},


			RoundNumber: function(value, decimals)
			{
				return (Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals));
			},


			SetDebugMode: function(value)
			{
				if (this.IsBoolean(value))
				{
					debugMode = value;
				}
			},


			TitleCase: function(value, minWordLength)
			{
				if (minWordLength == undefined)
				{
					minWordLength = 3;	
				}


				// Clean up string
				value = this.Trim(value);
				value = value.replace(/\s/, " ");

				while (value.search(/  /) > -1)
				{
					value = value.replace(/  /, " ");	
				}


				// Loop through the words in the string
				var word = "";
				var wordArray = value.split(" ");
				var hyphenWord = "";
				var hyphenWordArray = [];
				var titleCasedString = "";


				for (var i = 0; i < wordArray.length; i++)
				{
					word = wordArray[i];


					// Minimum length is 1
					if (minWordLength == 1 && word.length == 1)
					{
						word = word.toUpperCase();	
					}


					// Word must meet minimum length requirement (except JR and SR)
					// Word can only be Letters and Hyphens
					else if (
							 	(word.length >= minWordLength && word.search(/[^a-zA-Z\-]/) == -1) ||
								word.toLowerCase() == "jr" ||
								word.toLowerCase() == "sr"
							)
					{
						word = this.Left(word, 1).toUpperCase() + this.Right(word, word.length - 1).toLowerCase();

						// Check for word with Hyphen
						if (word.search(/-/) > -1)
						{
							hyphenWord = "";
							hyphenWordArray = word.split("-");

							for (var j = 0; j < hyphenWordArray.length; j++)
							{
								// Append a hyphen before each word, after the 1st word has been added
								if (hyphenWord.length > 0)
								{
									hyphenWord += "-";
								}


								// If the word is long enough, title case it
								if (hyphenWordArray[j].length > 1)
								{
									hyphenWord += this.Left(hyphenWordArray[j], 1).toUpperCase() + this.Right(hyphenWordArray[j], hyphenWordArray[j].length - 1).toLowerCase();
								}
								else
								{
									hyphenWord += hyphenWordArray[j];	
								}
							}

							word = hyphenWord;
						}
					}


					if (titleCasedString.length > 0)
					{
						titleCasedString += " ";	
					}

					titleCasedString += word;
				}

				return titleCasedString;
			},


			TitleCaseName: function(value, minWordLength)
			{
				var name = value.replace(/[^0-9a-zA-Z\s-]/g, "");

				name = this.TitleCase(name, minWordLength);


				var wordArray = name.split(" ");


				// Roman Numeral is upper cased, if it is the last word
				if (wordArray.length > 1 && this.IsRomanNumeral(wordArray[wordArray.length - 1]))
				{
					wordArray[wordArray.length - 1] = wordArray[wordArray.length - 1].toUpperCase();
				}

				name = wordArray.join(" ");

				return name;
			},


			ToBoolean: function(value)
			{
				var stringValue = String(value).toLowerCase();

				switch(stringValue)
				{
					case "true": case "yes": case "1": return true;
					case "false": case "no": case "0": return false;
					default: return Boolean(stringValue);
				}
			},


			Trim: function(value)
			{
				return value.replace(/^\s*/, "").replace(/\s*$/, "");
			}
		};
	}();
}
