function Form_Init(sFormId) {
	var oForm = document.getElementById(sFormId);
	var i, ii, oField, oInputBase;
	
	for ( i = 0; i < oForm.childNodes.length; i++ ) {
		oField = oForm.childNodes[i];
		sFieldId = oField.getAttribute('fieldId');
		oInputBase = oField.childNodes[1];
		
		switch (oInputBase.getAttribute('inputType')) {
		case 'multiple' :
			// adds default multiple minimum
				oMulBase = oInputBase.childNodes[0];
				for ( ii = oMulBase.childNodes.length; ii < oMulBase.getAttribute('multipleMinimumItems'); ii = oMulBase.childNodes.length ) {
					Form_MultipleAdd(sFieldId);
				}
			//
		break;
		default :
		break;
		}
	}
}

function Form_ValidateField(sFieldId) {
	var oField = document.getElementById("Form_" + sFieldId);
	var oInputBase = oField.childNodes[1];
	var aInvalid = new Array();
	var i, aRes;
	
	switch ( oField.getAttribute('fieldType') ) {
		case 'base' :
			aRes = Form_ValidateInput(sFieldId);
			if ( aRes.length ) aInvalid = aInvalid.concat(aRes);
		break;
		case 'fieldGroup' :
			for ( i = 0; i < oInputBase.childNodes.length; i++ ) {
				aRes = Form_ValidateField(oInputBase.childNodes[i].getAttribute('fieldId'));
				if ( aRes.length ) aInvalid = aInvalid.concat(aRes);
			}
		break;
		case 'multiple' :
			var oMulBase = oInputBase.childNodes[0];
			for ( i = 0; i < oMulBase.childNodes.length; i++ ) {
				aRes = Form_ValidateField(oMulBase.childNodes[i].childNodes[0].getAttribute('fieldId'));
				if ( aRes.length ) aInvalid = aInvalid.concat(aRes);
			}
		break;
		default :
		break;
	}
	return aInvalid;
}

function Form_ValidateInput(sInputId) {
	var i;
	var oInput = document.getElementById(sInputId);
	var oField = oInput.parentNode.parentNode;
	
	var oLabel = oField.childNodes[0];
	var oInvalidMsg = oField.childNodes[2];
	
	var aReturn = new Array();
	
	var sInvalidMsg = '';
	if ( oLabel.childNodes[0].childNodes[0] )
		sInvalidMsg = oLabel.childNodes[0].childNodes[0].nodeValue;
	
	if ( ! oField.getAttribute('validPattern') ) return aReturn;
	if ( oField.getAttribute('invalidMsg') ) sInvalidMsg += ' '+oField.getAttribute('invalidMsg');
	
	eval('var pValidPattern = ' + oField.getAttribute('validPattern') + ';');
	var sValue = new String(oInput.value);
	
	if ( 0 > sValue.search(pValidPattern) ) {
		aReturn.push(sInputId);
		if ( oField.getAttribute('originalClass') )
			oField.className = oField.getAttribute('originalClass');
		oField.setAttribute('originalClass', oField.className);
		oField.className += ' invalid';
		if ( ! oInvalidMsg.childNodes[0] )
			oInvalidMsg.insertBefore(document.createTextNode(sInvalidMsg),null)
	} else {
		if ( oField.getAttribute('originalClass') ) {
			oField.className = oField.getAttribute('originalClass');
			oField.setAttribute('originalClass', null);
		}
		if ( oInvalidMsg.childNodes.length ) oInvalidMsg.removeChild(oInvalidMsg.childNodes[0]);
	}
	
	return aReturn;
}

function Form_MultipleAdd(sInputId) {
	var oFieldDiv = document.getElementById("Form_" + sInputId);
	var oInputBase = oFieldDiv.childNodes[1];
	
	var oMulBase = oInputBase.childNodes[0];
	var oMulTemplate = oInputBase.childNodes[1];
	
	var oNode = oMulTemplate.cloneNode(true);
	var oInput;
	
	if ( oMulBase.childNodes.length == oMulBase.getAttribute('multipleMaximumItems') )
		return;
	
	oNode.className = null;
	oMulBase.insertBefore(oNode,null);
	
	if ( oFieldDiv.getAttribute('fieldOnchange') )
		eval(oFieldDiv.getAttribute('fieldOnchange'));
}

function Form_MultipleRemoveLast(sInputId) {
	var oFieldDiv = document.getElementById("Form_" + sInputId);
	var oInputBase = oFieldDiv.childNodes[1];
	
	var oMulBase = oInputBase.childNodes[0];
	
	if ( oMulBase.childNodes.length == oMulBase.getAttribute('multipleMinimumItems') ) {
		//alert('minimum reached');
		return;
	}
	
	oMulBase.removeChild(oMulBase.childNodes[oMulBase.childNodes.length -1]);
	
	if ( oFieldDiv.getAttribute('fieldOnchange') )
		eval(oFieldDiv.getAttribute('fieldOnchange'));
}

function Form_Submit(sFormId) {
	var oForm = document.getElementById(sFormId);
	var bInvalidForm = false;
	var i;
	var oNode, oInput;
	var aInvalid = new Array();
	
	for ( i = 0; i < oForm.childNodes.length; i++ ) {
		aInvalid = aInvalid.concat(Form_ValidateField(oForm.childNodes[i].getAttribute('fieldId')));
	}
	
	if ( aInvalid.length ) {
		document.getElementById(aInvalid[0]).focus();
	} else {
		oForm.submit();
	}
}
