function HTML_Form_Do(formName, action)
{
	document.forms[formName].elements['DO'].value = action;
	document.forms[formName].submit();	
	return true;
}

function HTML_Form_SubmitDo(formName, action, params)
{
	if (document.forms[formName].onsubmit()) HTML_Form_Do(formName, action);
}

function HTML_Form_Submit(formName, validate)
{
	if (document.forms[formName].name) form = document.forms[formName];
	else if (arguments.length > 2 && arguments[2] && document.forms[formName][arguments[2]]) form = document.forms[formName][arguments[2]];
	else if (document.forms[formName][0]) form = document.forms[formName][arguments[2]];
	else return;
	if (!validate || form.onsubmit()) form.submit();
}

function HTML_Form_Field(fieldName)
{
	if (arguments.length > 1 && arguments[1]) form = arguments[1];
	else form = self.document.forms[HTML_Form_Fields[fieldName]['Form']];
	if (!form.name) form = form[0];
	if (!form.name) return false;
	if (form.elements[fieldName]) {
		if (form.elements[fieldName].type) return form.elements[fieldName];
		if (form.elements[fieldName][0].type == 'radio') return form.elements[fieldName];
		if (form.elements[fieldName][0].type) return form.elements[fieldName][0];
		return form.elements[fieldName];
	}
	if (form.elements[fieldName+'[]']) return form.elements[fieldName+'[]'];
	return false;
}

function HTML_Form_Value(field, asArray)
{
	if (typeof(field) == "string") field = HTML_Form_Field(field);
	if (!field) return null;
	var result = Array();

	// Check for various field types and return values
	if (!field.options && field.length) {
		for (var i = 0; i < field.length; i++)
			if (field[i] && field[i].checked) result[result.length] = field[i].value;			
	} else if (field.type == 'select-one' || field.type == 'select') {
		if (field.selectedIndex >= 0) result[result.length] = field.options[field.selectedIndex].value;
	} else if (field.type == 'select-multiple') {
		for (var o = 0; o < field.options.length; o++)
			if (field.options[o].selected) result[result.length] = field[o].value;
	} else if (field.type == 'button' || field.type == 'checkbox') {
		if (field.checked) result[result.length] = field.value;
	} else if (field.type == 'text' || field.type == 'textarea' || field.type == 'password' || field.type == 'file' || field.type == 'radio' || field.type == 'hidden') {
		 result[result.length] = field.value;
	} else {
		 result[result.length] = '';
	}

	// Return single item if not more than one, else return array
    if (asArray) return result;
	if (result.length == 0) return '';
	if (result.length == 1) return result[0];
	return result;
}

function HTML_Form_Error()
{
	var fieldName = arguments[0];
	var error = arguments[1];
	var errorText = error;
	var item = /%s/;

	if (HTML_Forms[HTML_Form_Fields[fieldName]['Form']]['Errors'][error]) errorText = HTML_Forms[HTML_Form_Fields[fieldName]['Form']]['Errors'][error];
	if (HTML_Form_Fields[fieldName]['Errors'][error]) errorText = HTML_Form_Fields[fieldName]['Errors'][error];
	for (var i = 2; i < arguments.length; i++) errorText = errorText.replace(item, arguments[i]);
	return errorText;	
}

function HTML_Form_Validate(form)
{
	if (!HTML_Form_Field_Validate) return true;
	var formInfo = HTML_Forms[form.name];
	var fieldName;
	if (!formInfo['Validate']) return true;
	self.status = "Validating Input...";
	for (fieldName in HTML_Form_Fields) {
		if (!HTML_Form_Fields[fieldName]) continue;
		if (!HTML_Form_Fields[fieldName]['Form'] == form.name) continue;
		if (!HTML_Form_Field_Validate(fieldName, form)) {
			self.status = "";
			return false;
		}
	}
	self.status = "";
	return true;
}


function isAlien(v) { return isObject(v) && typeof v.constructor != 'function'; }
function isArray(v) { return isObject(v) && v.constructor == Array; }
function isBoolean(v) { return typeof v == 'boolean'; }
function isFunction(v) { return typeof v == 'function'; }
function isNull(v) { return typeof v == 'object' && !v; }
function isNumber(v) { return typeof v == 'number' && isFinite(v); }
function isObject(v) { return (v && typeof v == 'object') || isFunction(v); }
function isString(v) { return typeof v == 'string'; }
function isUndefined(v) { return typeof v == 'undefined'; } 
function isDefined(v) { return typeof v != 'undefined'; } 
function isEmpty(v) {
    if (!isObject(v)) return (!v);
	if (!isArray(v)) return false;
	for (var i in v) if (!isFunction(v[i]) && v[i]) return false;
    return true;
}

function equals(v1, v2) { if (isObject(v1) && isFunction(v1.equals)) return v1.equals(v2); else return (v1 == v2); }
String.prototype.trim = function () { return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"); };
String.prototype.toHtml = function () { return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"); };
Array.prototype.add = function(o){ this.push(o) } ;
Array.prototype.clear = function() { this.splice(0, this.length) ; } ;
Array.prototype.contains = function(o) { return (this.indexOf(o) >= 0); } ;
Array.prototype.indexOf = function(o) {
	for (var i = 0; i < this.length; i++) if (equals(this[i], o)) return i;
	return -1 ;
};
Array.prototype.insert = function(i, o) { this.splice(i,0,o) ; } ;
Array.prototype.remove = function(o) {
	var i = this.indexOf(o) ;
	if (i >= 0) return this.splice(i,1) ;
};
Array.prototype.removeAt = function(i) { this.splice(i,1) ; } ;
Array.prototype.equals = function(a) {
	if (!isArray(a) || a.length != this.length) return false;
	for (var i = 0; i < this.length; i++) if (!equals(this[i], a[i])) return false;
	return true;	
}
Array.prototype.copy = function() { return this.slice(0); }


