CMP_STRING = "CMP_STRING";
CMP_NUMBER = "CMP_NUMBER";
LT = "LT";
LTE = "LTE";
GT = "GT";
GTE = "GTE";
EQ = "EQ";
			
function IsEmpty(value) {
	return (trim(value).length == 0);
}
function IsAlphaNumeric(value) {
	for (i=0; i < value.length; i++) {
		ch = value.charCodeAt(i);
		if (!((ch >= 97) && (ch <= 122)) && 
				!((ch >= 65) && (ch <= 90)) && 
				!((ch >= 48) && (ch <= 57))) {
			return false;
		}
	}
	return true;
}
function IsNumeric(value) {
	return !isNaN(value);
}
function IsValidUserID(value) {
	if (IsEmpty(value)) return false;
	if (value.indexOf(" ") != -1) return false;
	if (!IsAlphaNumeric(value)) return false;
	return true;
}
function IsValidEmail(value) {
	var at = '@';
	var dot = '.';
	var lat  = parseInt(value.indexOf(at), 10);
	var ldot = parseInt(value.lastIndexOf(dot), 10);
	var lstr = parseInt(value.length, 10);
	
	//no '@' or '@' is first character or '@' is the last character
	if ((lat <= 0) || (lat == parseInt(lstr - 1, 10))) return false;
	//no '.' or '.' is first character or '.' is the last character
	if ((ldot <= 0) || (ldot == parseInt(lstr - 1, 10))) return false;
	//presence of another '@'
	if (value.indexOf(at, parseInt(lat + 1, 10)) != -1) return false;
	//presence of '.' before or after '@'
	if ((value.substr(parseInt(lat - 1, 10), 1) == dot) || (value.substr(parseInt(lat + 1, 10), 1) == dot)) return false;
	//check '.' is at least one character after '@'
	if (value.indexOf(dot, parseInt(lat + 2, 10)) == -1) return false;
	//check for blank
	if (value.indexOf(" ") != -1) return false;
	//check the length after the last '.' is not less than 2 characters
	if (value.substr(parseInt(ldot + 1, 10)).length < 2) return false;
	if (!IsAlphaNumeric(value.substr(ldot + 1))) return false;
	return true;
}
function IsValidNRIC(value) {
	var p, f;
	var n = 0;
	var c = new Array();
	var w = [2,7,6,5,4,3,2];
	var re = /^[FGST][0-9]{7}[A-Z]$/;
	c["S"] = 0; c["T"] = 11; c["F"] = 22; c["G"] = 33;
	cs = "JZIHGFEDCBAGFEDCBAJZIHXWUTRQPNMLKRQPNMLKXWUT";
	if (value.length && value.toUpperCase().search(re) != -1) {
		p = value.substr(0, 1).toUpperCase();
		f = value.substr(8, 1).toUpperCase();
		for (var i=1; i<8; i++) n += value.charAt(i) * w[i - 1];
		n = n % 11;
		return (cs.charAt(c[p] + n) == f);
	}
	return false;
}	
function CheckLength(value, length) {
	return (trim(value).length == length);
}
function CheckMinLength(value, length) {
	return (trim(value).length >= length);
}
function CheckRange(value, minRange, maxRange) {
	return (trim(value).length >= minRange && trim(value).length <= maxRange);
}
function RequiredRichText(controlID, errorMessage) {
	var oEditor = FCKeditorAPI.GetInstance(controlID);
	var oDOM = oEditor.EditorDocument;
	var strFCKEditorText = "";
	if (document.all) {
		strFCKEditorText = oDOM.body.innerText;
	}
	else {
		var r = oDOM.createRange();
		r.selectNodeContents(oDOM.body);
		strFCKEditorText = r.toString();
	}
		
	if (IsEmpty(strFCKEditorText)) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus(controlID); } catch(err) {  }
		}
		return false;
	}
	else
		return true;
}
function RequiredField(controlID, errorMessage) {
	var control = findObj(controlID);
	
	if (IsEmpty(control.value)) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus(controlID); } catch(err) {  }
		}
		return false;
	}
	else
		return true;
}
function RequiredOption(controlID, errorMessage) {
	index = 1;
	while (findObj(controlID + index)) {
		if (findObj(controlID + index).checked) return true;
		index++;
	}
	if (errorMessage) {
		alert(errorMessage);
		try { setFocus(controlID + "1"); } catch(err) {  }
	}
	return false;
}
function RequiredCheckbox(controlID, errorMessage) {
	var control = findObj(controlID);
	
	if (control.checked == false) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus(controlID); } catch(err) {  }
		}
		return false;
	}
	else
		return true;
}
function RequiredDate(controlID, errorMessage) {
	d = findObj("d" + controlID);
	m = findObj("m" + controlID);
	y = findObj("y" + controlID);
		
	if (IsDate(m.value + "/" + d.value + "/" + y.value)) {
		findObj(controlID).value =  m.value + "/" + d.value + "/" + y.value;
		return true;
	}
	else {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus("d" + controlID); } catch(err) {  }
		}
		return false;
	}
}
function RequiredTime(controlID, errorMessage) {
	h = findObj("h" + controlID);
	m = findObj("m" + controlID);
	
	if (IsEmpty(h.value) || IsEmpty(m.value)) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus("h" + controlID); } catch(err) {  }
		}
		return false;
	}
	else {
		findObj(controlID).value =  h.value + ":" + m.value;
		return true;
	}
}
function CompareTimeValidator(controlToValidateID, controlToCompareID, compareType, errorMessage) {
	var controlToValidate = findObj(controlToValidateID);
	var controlToCompare = findObj(controlToCompareID);
	var valid = false;
	var time_validate = new Date("1 Jan 2010 " + controlToValidate.value);
	var time_compare = new Date("1 Jan 2010 " + controlToCompare.value);
	switch (compareType) {
		case LT:
			valid = (time_validate < time_compare);
			break;
		case LTE:
			valid = (time_validate <= time_compare);
			break;
		case GT:
			valid = (time_validate > time_compare);
			break;
		case GTE:
			valid = (time_validate >= time_compare);
			break;
		case EQ:
			valid = (time_validate - time_compare == 0);
			break;
	}
	if (!valid) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus("h" + controlToValidateID); } catch(err) {  }
		}
	} 
	return valid;
}
function CompareDateValidator(controlToValidateID, controlToCompareID, compareType, errorMessage) {
	var controlToValidate = findObj(controlToValidateID);
	var controlToCompare = findObj(controlToCompareID);
	var valid = false;
	var date_validate = new Date(controlToValidate.value);
	var date_compare = new Date(controlToCompare.value);
	switch (compareType) {
		case LT:
			valid = (date_validate < date_compare);
			break;
		case LTE:
			valid = (date_validate <= date_compare);
			break;
		case GT:
			valid = (date_validate > date_compare);
			break;
		case GTE:
			valid = (date_validate >= date_compare);
			break;
		case EQ:
			valid = (date_validate - date_compare == 0);
			break;
	}
	if (!valid) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus("d" + controlToValidateID); } catch(err) {  }
		}
	} 
	return valid;
}
function CompareValidator(controlToValidateID, controlToCompareID, compareType, errorMessage) {
	var controlToValidate = findObj(controlToValidateID);
	var controlToCompare = findObj(controlToCompareID);
	var valid = false;
	switch (compareType) {
		case CMP_STRING:
			valid = (controlToValidate.value == controlToCompare.value);
			break;
		case CMP_NUMBER:
			valid = (parseInt(controlToValidate.value, 10) == parseInt(controlToCompare.value, 10));
			break;
	}
	if (!valid) {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus(controlToValidateID); } catch(err) {  }
		}
	} 
	return valid;
}
function CustomValidator(controlID, clientFunction) {
	var control = findObj(controlID);
	var args = [];
	// add the control value as the first array value
	args.push(control.value);
	// copy all other arguments we want to "pass through"
	for (var i = 2; i < arguments.length; i++)
		args.push(arguments[i]);
	
	errorMessage = arguments[arguments.length - 1];
	if (clientFunction.apply(this, args))
		return true;
	else {
		if (errorMessage) {
			alert(errorMessage);
			try { setFocus(controlID); } catch(err) {  }
		}
		return false;
	}
}
function ShowError(control, text, offsetX, offsetY, labelWidth) {
	if ($("div" + control)) $("div" + control).remove();
	var element = $(control);
	var container = new Element("div", { id: "div" + control }); container.addClassName("red_label_arrow");
	
	if (offsetX == undefined) offsetX = 460;
	if (offsetY == undefined) offsetY = 1;
	var left = new Element("div"); left.addClassName("left");
	var center = new Element("div"); center.addClassName("center");
	var right = new Element("div"); right.addClassName("right");
	container.appendChild(left); container.appendChild(center); container.appendChild(right);
	
	container.style.left = $("form").cumulativeOffset().left + offsetX + "px";
	container.style.top  = $(element.parentNode).cumulativeOffset().top + offsetY + "px";
	
	center.innerHTML = text;
	if (labelWidth != undefined) center.style.width = labelWidth + "px";
	element.insert({ after: container });
}
