/**
	@copyright (C)  2007 - 2008 Rhino Maeo LC
	@author: James Oldham
*/

function onEnter(
	e,
	functionObject)
{
	var characterCode, windowEvent = false;
	
	if (e && e.which)
	{
		characterCode = e.which;
	}
	else
	{
		if (window.event)
		{
			e = window.event;
			windowEvent = true;
		}
		
		characterCode = e.keyCode;
	}
	
	if (characterCode == 13)
	{
		if (windowEvent)
		{
			window.event.returnValue = false;
		}
		
		executeFunction(functionObject);
	}
}


/**
	This is the Array objects indexOf function prototype.
	We have put it here for ie6 and ie7 which don't have an indexOf function for the Array object.
*/
if (!Array.prototype.indexOf)
{
	Array.prototype.indexOf = function (elt /*, from*/)
	{
		var len  = this.length;
		var from = Number(arguments[1]) || 0;
		
		from = (from < 0) ? Math.ceil(from) : Math.floor(from);
		
		if (from < 0)
		{
			from += len;
		}
		
		for (; from < len; from++)
		{
			if (from in this && this[from] === elt)
			{
				return from;
			}
		}
		
		return -1;
	};
}


/**
	@Description         - Gets an array of all the dom elements with the given class names.
			Possible Uses:
				To get all anchor elements in the document with a "class_name" class - getElementsByClassName(document, "a", "class_name");
				To get all div elements within the element named "container", with a "col" or a "left" class - getElementsByClassName(document.getElementById("container"), "div", ["col", "left"]);
	@param oElm          - Either the document object or the element of the outermost dom object you want to search inside of.
	@param strTagName    - The name of the type of elements you want to find ie - div. Can be set to * for all.
	@param arrClassNames - The name or names (if names must be an array) of the classes you are looking for.
	@return              - An array of all elements with the specified parameters.
*/
function getElementsByClassName(oElm, strTagName, arrClassNames)
{
	var arrElements       = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	
	if (typeof arrClassNames != "object")
	{
		arrClassNames = [arrClassNames];
	}
	
	for (var j = 0; j < arrElements.length; j++)
	{
		if (arrClassNames.indexOf(arrElements[j].className) !== -1)
		{
			arrReturnElements.push(arrElements[j]);
		}
	}
	
	return arrReturnElements;
}


function addActiveClass(
	targetElement)
{
	var className = targetElement.className;
	
	if (className.indexOf(' active') === -1)
	{
		targetElement.className = className + ' active';
	}
}


function setActiveByClass(
	targetElement,
	searchContainer,
	tagType,
	classNames,
	subTagType)
{
	if (tagType == null)
	{
		tagType = '*';
	}
	
	if (classNames == null)
	{
		classNames = [targetElement.className];
	}
	else if (typeof classNames != "object")
	{
		classNames = [classNames];
	}
	
	var activeClass      = 'active';
	var arrClassElements = new Array();
	
	if (subTagType == null)
	{
		var className, activeClassNames = new Array();
		
		activeClass = ' ' + activeClass;
		
		for (var i = 0; i < classNames.length; i++)
		{
			className = classNames[i];
			
			if (className.indexOf(activeClass) === -1)
			{
				activeClassNames.push(className + activeClass);
			}
			else
			{
				activeClassNames.push(className);
			}
		}
		
		arrClassElements = getElementsByClassName(searchContainer, tagType, activeClassNames);
		
		for (var i = 0; i < arrClassElements.length; i++)
		{
			arrClassElements[i].className = arrClassElements[i].className.replace(activeClass, '');
		}
		
		addActiveClass(targetElement);
	}
	else
	{
		var subTags = new Array();
		
		arrClassElements = getElementsByClassName(searchContainer, tagType, classNames);
		
		for (var i = 0; i < arrClassElements.length; i++)
		{
			subTags = arrClassElements[i].getElementsByTagName(subTagType);
			
			for (var j = 0; j < subTags.length; j++)
			{
				subTags[j].className = '';
			}
		}
		
		if (! targetElement.className || targetElement.className.indexOf(activeClass) === -1)
		{
			targetElement.className = activeClass;
		}
	}
}


function removeActiveClass(
	targetElement)
{
	var className = targetElement.className;
	
	if (className.indexOf(' active') !== -1)
	{
		targetElement.className = className.substr(0, className.indexOf(' active'));
	}
}


function toggleActiveClass(
	targetElement,
	replacementClass)
{
	var className    = targetElement.className;
	
	if (replacementClass == null)
	{
		if (className.indexOf(' active') === -1)
		{
			targetElement.className = className + ' active';
		}
		else
		{
			targetElement.className = className.substr(0, className.indexOf(' active'));
		}
	}
	else
	{
		replacementClass = ' ' + replacementClass;
		
		if (className.indexOf(' active') === -1)
		{
			targetElement.className = className.substr(0, className.indexOf(replacementClass)) + ' active';
		}
		else
		{
			targetElement.className = className.substr(0, className.indexOf(' active')) + replacementClass;
		}
	}
}


/*
// This version of the executeFunction allows for objects as parameters but only works in Mozilla based browsers.
function executeFunction(
	functionObject)
{
	var functionString = functionObject.functionName + "(";
	
	if (!(functionObject.parameters == 'undefined' || functionObject.parameters == null) && functionObject.parameters.length)
	{
		functionString += typeof functionObject.parameters[0] === "object" ? functionObject.parameters[0].toSource(0) : "'"+functionObject.parameters[0]+"'";
		
		for (var i = 1; i < functionObject.parameters.length; i++)
		{
			functionString += typeof functionObject.parameters[i] === "object" ? ", "+functionObject.parameters[i].toSource(0) : ", '"+functionObject.parameters[i]+"'";
		}
	}
	
	functionString += ");";
	
	eval(functionString);
}
*/
function executeFunction(
	functionObject)
{
	var functionString = functionObject.functionName + "(";
	
	if (!(functionObject.parameters == 'undefined' || functionObject.parameters == null) && functionObject.parameters.length)
	{
		functionString += ToString(functionObject.parameters[0]);
		
		for (var i = 1; i < functionObject.parameters.length; i++)
		{
			functionString += ", " + ToString(functionObject.parameters[i]);
		}
	}
	
	functionString += ");";
	
	eval(functionString);
}


function ToString(
	objectParam)
{
	var tmpString = '';
	
	switch (typeof(objectParam))
	{
		case 'string':
			tmpString += "'" + objectParam + "'";
			break;
		case 'object':
			tmpString += "[";
			
			if (objectParam.length > 0)
			{
				tmpString += ToString(objectParam[0]);
				
				for (var i = 1; i < objectParam.length; i++)
				{
					tmpString += ", " + ToString(objectParam[i]);
				}
			}
			
			tmpString += "]";
			break;
		default:
			tmpString += objectParam;
	}
	
	return tmpString;
}


function urlStringToObject(
	urlString)
{
	var urlObject = new Object;
	var tmpArray  = new Array();
	
	tmpArray = urlString.split("?");
	
	urlObject["uri"]    = tmpArray[0];
	urlObject["params"] = new Array();
	
	if (tmpArray[1])
	{
		var paramsString = urlString.substr(urlString.indexOf("?") + 1);
		var paramsArray  = paramsString.split("&");
		
		if (paramsArray.length)
		{
			for (var i = 0; i < paramsArray.length; i++)
			{
				tmpArray = paramsArray[i].split("=");
				
				urlObject.params[i] = {"name":tmpArray[0], "value":tmpArray[1]};
			}
		}
	}
	
	return urlObject;
}


function urlObjectToString(
	urlObject)
{
	var urlString = urlObject.uri;
	
	if (urlObject.params.length)
	{
		var urlParams = urlObject.params;
		urlString += "?";
		
		urlString += urlParams[0].name;
		
		if (urlParams[0].value)
		{
			urlString += "=" + urlParams[0].value;
		}
		
		for (var i = 1; i < urlParams.length; i++)
		{
			urlString += "&" + urlParams[i].name;
			
			if (urlParams[i].value)
			{
				urlString += "=" + urlParams[i].value;
			}
		}
	}
	
	return urlString;
}


function removeParamFromURL(
	urlString,
	paramName)
{
	var urlObject = urlStringToObject(urlString);
	var urlParams = urlObject.params;
	var counter   = 0;
	var tmpParam;
	
	while (counter < urlParams.length)
	{
		tmpParam = urlParams[counter];
		
		if (tmpParam.name == paramName)
		{
			urlObject.params.splice(counter,1);
			counter = urlParams.length;
		}
		else
		{
			counter++;
		}
	}
	
	return urlObjectToString(urlObject);
}


/**
	@Description     - Uses the built in replace function to replace every instance of a string with a new one.
	@param oldString - string we are replacing.
	@param newString - string we are replacing with.
	@return          - the changed string.
*/
String.prototype.replaceAll = function(
	oldString,
	newString)
{
	return this.split(oldString).join(newString);
};


/**
	Checks if supplied password meets certain requirements.
	@param password [string] the password to validate
	@param username [string] username associated with the password
	@return [bool] true(valid) : false(invalid);
*/
function IsValidPassword(
	password,
	username)
{
	var valid = true;
	
	// Password can not match username
	if (password == username)
	{
		valid = false;
	}
	
	// Password must be at least 6 characters in length
	if (valid && password.length < 6)
	{
		valid = false;
	}
	
	// Password must contain at least 1 non-alphabetic character
	if (valid && password.match(/^[a-zA-Z]+$/))
	{
		valid = false;
	}
	
	// Password can not be entirely numeric
	if (valid && ! isNaN(password))
	{
		valid = false;
	}
	
	// Password must contain at least 3 unique characters
	var tmpPassword = password.countChars(3);
	if (valid && tmpPassword.length < 3)
	{
		valid = false;
	}
	
	return valid;
}