﻿var cs = {};
cs.isElementFilled = function(strID){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return false;
    else
    {
        var strValue = ele.value;
        if (strValue != undefined && strValue.length > 0)
        {
            return true;
        }
        return false;
    }
};
cs.isElementPatternFilled = function(strID, rePattern){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return false;
    else
    {
        return rePattern.test(ele.value);
    }
};
cs.writeElementValue = function(strID, strValue){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return false;
    else
    {
        ele.value = strValue;
    }
};
cs.writeElementInnerText = function(strID, strValue){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return false;
    else
    {
        ele.innerHTML = strValue;
	return true;
    }
};
cs.insertAdjacentElement = function(strID, strNewID){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return false;
    else
    {
        var eleNew = document.createElement("SPAN");
        eleNew.id = strNewID;
        ele.parentNode.insertBefore(eleNew, ele.nextSibling);
	return true;
    }
};
cs.writeAdjacentElement = function(strID, strNewID, strValue)
{
	if (!cs.writeElementInnerText(strNewID, strValue))
	{
		if (cs.insertAdjacentElement(strID, strNewID))
			return cs.writeElementInnerText(strNewID, strValue);
		else
			return false;
	}
	else
		return true;

};
cs.focusElement = function(strID){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return false;
    else
    {
        ele.focus();
    }
};
cs.getCheckBoxStatus = function(strID){
    var ele = document.getElementById(strID);
    if (ele == undefined)
        return null;
    else
    {
        return ele.checked;
    }
};

cs.AppendElementID = function(ele, strSuffix)
{
	// My self
	switch (ele.nodeType)
	{

		case 1:
			if (ele.id != "")
			{
				ele.id = ele.id + strSuffix;
				ele.name = ele.id;
			}
			break;

		case 3:
			// Replace the content #RowNo# with strSuffix
			var re = new RegExp("#RowNo#", "gi");
			ele.nodeValue = ele.nodeValue.replace(re, strSuffix);
			break;
	}

	if (ele.hasChildNodes())
	{
		for (var intChild=0; intChild < ele.childNodes.length; intChild++)
		{
			cs.AppendElementID(ele.childNodes[intChild], strSuffix);
		}
	}

}

cs.CloneInto = function(strCloneNode, strContainer, strRowIdentifier){

	var eleCloneNode = document.getElementById(strCloneNode);
	var eleContainer = document.getElementById(strContainer);
	var eleRowCount = document.getElementById(strRowIdentifier);

	if (eleRowCount==undefined)
	{
		alert("Error in script in checking row number.");
		return;
	}
	
	if (eleRowCount.value=="" || isNaN(eleRowCount.value))
	{
		eleRowCount.value = 0;
	}

	var intRowID = parseInt(eleRowCount.value) + 1;
	eleRowCount.value = intRowID;

	// Iterate thru the eleSampleRow and add it to eleSampleForm
	var eleNewRow = document.createElement(eleCloneNode.tagName);
	for (var strName in eleCloneNode.childNodes)
	{
		var eleOriginal = eleCloneNode.childNodes[strName];
		switch(eleOriginal.nodeType)
		{
			case 1:
				var ele = eleOriginal.cloneNode(true);
				cs.AppendElementID(ele, intRowID);
				eleNewRow.appendChild(ele);
				break;

			case 3:
				eleNewRow.appendChild(document.createTextNode(eleOriginal.nodeValue));	
				break;

		}
	}
	if (eleContainer.tagName == "TABLE")
	{
		if (eleContainer.tBodies.length==0)
			eleContainer.appendChild(document.createElement("tbody"));
		eleContainer.tBodies[0].appendChild(eleNewRow);
	}
	else
		eleContainer.appendChild(eleNewRow);
}

cs.ValidateForm = function(vConfig, strSuffix, strMessageDivID){

	var res = cs.ValidateForm_Helper(vConfig, strSuffix);
	if (res.faultelement.length > 0)
		cs.focusElement(res.faultelement[0]);

	var eleMessage = document.getElementById(strMessageDivID);
	if (eleMessage != undefined)
	{
		// Remove the empty messages
		for (var i=0; i<res.message.length; i++)
		{
			if (res.message[i]=="" || res.message[i]==undefined)
				res.message.splice(i,1);
		}
		eleMessage.innerHTML = res.message.join("<br/>");
	}

	return res.valid;
}

cs.ValidateForm_Helper = function(vConfig, strSuffix){

	var bValid = true;
	var strV = "_v";
	var aMessage = new Array();
	var aFaultElement = new Array();

	for (strField in vConfig)
	{
		var cField = vConfig[strField];
		var strFieldID = strField + strSuffix;
		var bFieldValid = true;

		if (cField.required==true)
		{
			if (!cs.isElementFilled(strFieldID))
			{
				cs.writeAdjacentElement(strFieldID, strFieldID + strV, cField.hint);
				aMessage.push(cField.message);
				aFaultElement.push(strFieldID);
				bValid = false;
				bFieldValid = false;
			}
			else
			{
				cs.writeElementInnerText(strFieldID + strV, "");	
			}
		}

		if (bFieldValid)
		{
			switch (cField.type)
			{
				case "email":
					if (!cs.isElementPatternFilled(strFieldID, /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/))
					{
						cs.writeAdjacentElement(strFieldID, strFieldID + strV, cField.hint);
						aMessage.push(cField.message);
						aFaultElement.push(strFieldID);
						bValid = false;
					}
					else
					{
						cs.writeElementInnerText(strFieldID + strV, "");	
					}
				break;

				case "row":
					var intRowCount = document.getElementById(strField).value;
				for (var intRowNo=1; intRowNo<=intRowCount; intRowNo++)
				{
					var tmp = cs.ValidateForm_Helper(cField.template, intRowNo);
					if (bValid) bValid = tmp.valid;
					aMessage = aMessage.concat(tmp.message);
					aFaultElement = aFaultElement.concat(tmp.faultelement);
				}
				break;

				case "text":
					// Nothing to validate
					break;
			}
		}

	}

	return {valid:bValid, message:aMessage, faultelement:aFaultElement};
}

