function CDEValidator(pFormName, pSingleAlert, pErrorMessageContainer, pElementIDToAppendFormTo) {
	this._validationMethod = 'form';
	if (pFormName != 'ajax') {
		this._form = document.forms[pFormName];
		if (!this._form) {
			throw new Error('Error: could not find Form named ' + pFormName + '.');
			return;
		}
		if (this._form.onsubmit) {
			this._form._onsubmitOld = this._form.onsubmit;
			this._form.onsubmit = null;
		} else {
			this._form._onsubmitOld = null;
		}
		this._form.onsubmit = CDEValidator.prototype.submitHandler;
	} else {
		this._validationMethod = 'ajax';
	}
	this._aryElements = new Array();
	this._singleAlert = false;
	if (typeof(pSingleAlert) == 'boolean') this._singleAlert = pSingleAlert;
	else {
		alert('Warning: 2nd parameter for CDEValidator is not of type boolean, setting singleAlert method to true.');
		this._singleAlert = true;
	}
	this._radioInputLength = 0;
	this._errorMessage = '';
	this._hasErrors = false;
	this._useIconFlag = false;
	this._iconFlagContainer = null;
	this._iconFlagUsingShadow = false;
	this._shadowColor = '';
	this._shadowDistance = 0;
	this._shadowDegrees = 0;
	this._shadowSteps = 0;
	this._shadowStartOpacity = 0;
	this._shadowEndOpacity = 0;
	this._cdeShadow = new Array();
	this._aryErrorElements = new Array();
	this._aryErrorElementsDesc = new Array();
	this._aryErrorElementsMessage = new Array();
	this._submitting = false;
	this._combinedErrorMessage = '';
	this._iconFlagContainerClassName = '';
	this._iconFlagMessageClassName = '';
	this._offsetStart = 'right';
	this._flagOffsetX = 0;
	this._flagOffsetY = 0;
	this._errorMessageContainer = 'javascript';
	this.addValidation = CDEValidator.prototype.addValidation;
	this.onBeforeValidate = CDEValidator.prototype.onBeforeValidate;
	this.onAfterValidate = CDEValidator.prototype.onAfterValidate;
	this.addSubmitControl = CDEValidator.prototype.addSubmitControl;
	this.clearAllValidations = CDEValidator.prototype.clearAllValidations;
	if (pFormName != 'ajax') this._form._this = this;
	else this._this = this;
}

CDEValidator.prototype.setErrorMessageContainer = function(pErrorMessageContainer) {
	if (pErrorMessageContainer != 'null') {
		var _errorMessageContainerElement = document.getElementById(pErrorMessageContainer);
		if (_errorMessageContainerElement != null) this._errorMessageContainer = _errorMessageContainerElement;
	} else {
		this._errorMessageContainer = 'javascript';
	}
}

CDEValidator.prototype.showErrorMessageContainer = function() {if (this._errorMessageContainer != 'javascript') if (this._errorMessageContainer) this._errorMessageContainer.style.display = 'block';}
CDEValidator.prototype.hideErrorMessageContainer = function() {if (this._errorMessageContainer != 'javascript') if (this._errorMessageContainer) this._errorMessageContainer.style.display = 'none';}
CDEValidator.prototype.onBeforeValidate = function(pFunctionName) {this._onBeforeValidation = pFunctionName;}
CDEValidator.prototype.onAfterValidate = function(pFunctionName) {this._onAfterValidation = pFunctionName;}
CDEValidator.prototype.addSubmitControl = function(pFunctionName) {this._addSubmitControl = pFunctionName;}

CDEValidator.prototype.clearAllValidations = function() {
	for (var i=0; i<this._aryElements.length; i++) {
		this._aryElements[i].validationset = null;
	}
}


CDEValidator.prototype.setSubmitController = function(pElementID, pEvent) {
	if (!document.getElementById(pElementID)) {
		alert('Could not find element with id ' + pElementID);
		return;
	}
	document.getElementById(pElementID)._this = this;
	eval('document.getElementById("' + pElementID + '").' + pEvent + ' = CDEValidator.prototype.submitHandler;');
}

CDEValidator.prototype.submitHandler = function() {
	if (this._onBeforeValidation) {
		str = ' var _beforeValidation = ' + this._onBeforeValidation + '()';
		eval(str);
		if(!_beforeValidation) return _beforeValidation;
	}
	CDEValidator.prototype.testValidation(this._this, this);
	if (!this._this._singleAlert) if (this._this._hasErrors) return false;
	if (this._onAfterValidation) {
		str = ' var _afterValidation = ' + this._onAfterValidation + '()';
		eval(str);
		if(!_afterValidation) return _afterValidation;
	}
	return true;
}

CDEValidator.prototype.testValidation = function(pThis, pFormThis) {
	if (pThis._validationMethod == 'form') var mElements = pFormThis.elements;
	else var mElements = pThis._this._aryElements;
	pThis._submitting = true;
	pThis._combinedErrorMessage = '';
	pThis._errorMessage = '';
	// remove any shadows
	for (x in pThis._cdeShadow) {try {pThis._cdeShadow[x].removeShadows();} catch(e) {}}
	pThis._cdeShadow.length = 0;
	// remove any flags
	removeAllFlags();
	pThis._aryErrorElements.length = 0;
	pThis._aryErrorElementsDesc.length = 0;
	pThis._aryErrorElementsMessage.length = 0;
	pThis._hasErrors = false;
	for (var i=0; i<mElements.length; i++) {
		if (mElements[i].validationset && !mElements[i].validationset.validate()) {
			if (pThis._singleAlert) {
				if (pThis._addSubmitControl) {
					str = ' var _addSubmitControl = ' + pThis._addSubmitControl + '(' + pThis._hasErrors + ', "' + mElements[i].name + '")';
					eval(str);
					if(!_addSubmitControl) return pThis._hasErrors;
				}
				if (pThis._errorMessageContainer == 'javascript') alert(pThis._errorMessage);
				else pThis._errorMessageContainer.innerHTML = pThis._errorMessage;
				if (pThis._useIconFlag && (pThis._errorMessageContainer != 'javascript' || pThis._errorMessageContainer != '')) CDEValidator.prototype.buildFlag(pThis, mElements[i], mElements[i].desc, pThis._errorMessage, pThis._iconFlagContainer, pThis._iconFlagUsingShadow, pThis._cdeShadow, pThis._shadowColor, pThis._shadowDistance, pThis._shadowDegrees, pThis._shadowSteps, pThis._shadowStartOpacity, pThis._shadowEndOpacity);
				if (pThis._hasErrors) {
					pThis._submitting = false;
					return false;
				}
			} else {
				pThis._combinedErrorMessage += pThis._errorMessage;
				pThis._aryErrorElements.push(mElements[i]);
				pThis._aryErrorElementsDesc.push(mElements[i].desc);
				pThis._aryErrorElementsMessage.push(pThis._errorMessage);
			}
		}
	}
	if (!pThis._singleAlert) {
		if (pThis._addSubmitControl) {
			var _aryInputsParam = new Array();
			for (var i=0; i<pThis._aryErrorElements.length; i++) {
				_aryInputsParam.push(pThis._aryErrorElements[i].name);
			}
			str = ' var _addSubmitControl = ' + pThis._addSubmitControl + '(' + pThis._hasErrors + ', "' + _aryInputsParam + '")';
			eval(str);
			if(!_addSubmitControl) return true;
		}
		if (pThis._hasErrors) {
			if (pThis._errorMessageContainer != '') {
				if (pThis._errorMessageContainer == 'javascript') alert(pThis._combinedErrorMessage);
				else pThis._errorMessageContainer.innerHTML = pThis._combinedErrorMessage;
			}
			// loop through the combinedErroredElements array and build the flag
			if (pThis._useIconFlag && (pThis._errorMessageContainer != 'javascript' || pThis._errorMessageContainer != '')) for (var i=0; i<pThis._aryErrorElements.length; i++) CDEValidator.prototype.buildFlag(pThis, pThis._aryErrorElements[i], pThis._aryErrorElementsDesc[i], pThis._aryErrorElementsMessage[i], pThis._iconFlagContainer, pThis._iconFlagUsingShadow, pThis._cdeShadow, pThis._shadowColor, pThis._shadowDistance, pThis._shadowDegrees, pThis._shadowSteps, pThis._shadowStartOpacity, pThis._shadowEndOpacity);
			pThis._submitting = false;
			return false;
		} else pThis._errorMessageContainer.innerHTML = '';
	}
	return true;
}

CDEValidator.prototype.vlidateInput = function(pInput, pThis, pFormThis) {
	var _errorMessage = '';
	var _findString = '';
	if (pThis._validationMethod == 'form') var mElements = pFormThis.elements;
	else var mElements = pThis._this._aryElements;
	if (pThis._submitting) return;
	pThis._combinedErrorMessage = pThis._errorMessageContainer.innerHTML;
	var _thisErrorMessage = pThis._errorMessage;
	if (pThis._singleAlert) _thisErrorMessage = _thisErrorMessage.replace('\n', '');
	else _thisErrorMessage = _thisErrorMessage.replace('<br />', '');
	pThis._hasErrors = false;
	for (var i=0; i<mElements.length; i++) if (mElements[i].name == pInput.name) var mInput = mElements[i];
	var pElementID = mInput.name + 'CDEIcon';
	for (i=0; i<pInput.validationset.vSet.length; i++) {
		var _thisError = pInput.validationset.vSet[i].error;
		if (mInput.validationset) {
			if (!CDEValidator.prototype.validateData(pThis, pInput.validationset.vSet[i].desc, pInput, pInput.validationset.vSet[i].error)) {
				var _replace = mInput.validationset.vSet[i].error.replace('<br />', '');
				if (pThis._errorMessageContainer != 'javascript') _findString = pThis._combinedErrorMessage.indexOf(_replace);
				if (document.getElementById(pElementID)) {
					if (pThis._iconFlagUsingShadow) {
						for (x in pThis._cdeShadow) {
							if (pThis._cdeShadow[x]._id.id == pElementID) {
								pThis._cdeShadow[x].removeShadows();
								pThis._cdeShadow.splice(x, 1);
							}
						} 
					}
					document.body.removeChild(document.getElementById(pElementID));
				}
				if (pThis._errorMessageContainer == 'javascript') alert(pThis._errorMessage);
				else {
					if (_findString == -1) _errorMessage = pThis._errorMessage;
					pThis._errorMessageContainer.innerHTML = pThis._combinedErrorMessage + _errorMessage;
					if (pThis._useIconFlag) CDEValidator.prototype.buildFlag(pThis, mInput, mInput.desc, pThis._errorMessage, pThis._iconFlagContainer, pThis._iconFlagUsingShadow, pThis._cdeShadow, pThis._shadowColor, pThis._shadowDistance, pThis._shadowDegrees, pThis._shadowSteps, pThis._shadowStartOpacity, pThis._shadowEndOpacity);
				}
				if (pThis._hasErrors) return false;
			}
		}
	}

	if (pThis._errorMessageContainer == 'javascript') var _reNewLine = '\n';
	else var _reNewLine = new RegExp(_thisError + '<br*>');
	pThis._combinedErrorMessage = pThis._combinedErrorMessage.replace(_reNewLine, '');
	pThis._errorMessageContainer.innerHTML = pThis._combinedErrorMessage;
	return true;
}

CDEValidator.prototype.addValidation = function(pInputName, pDescription, pErrorString) {
	if (this._validationMethod != 'ajax') {
		if (!this._form) {
			throw new Error('Error: the form object is not set properly.');
			return;
		}
	}
	var _inputSplitter = pInputName.split(';');
	_inputArraySplitter = _inputSplitter[0].split(':');
	item_splitterEQ = _inputArraySplitter[1];
	var _descriptionSplitter = pDescription.replace(/^\s*$/, '').split(';');
	if (window.pErrorString != undefined) var _errorStringSplitter = '';
	else var _errorStringSplitter = pErrorString.replace(/^\s*$/, '').split(';');
	for (i=0; i<_inputArraySplitter.length; i++) {
		if (this._validationMethod == 'form') {
			var _inputObject = this._form[_inputArraySplitter[i]];
		} else {
			var _inputObject = document.getElementById(_inputArraySplitter[i]);
		}
		if(!_inputObject) {
			throw new Error('Error: Could not get the input object named: ' + _inputArraySplitter[i]);
			return;
		}
		if (pDescription.indexOf('radio') != -1) {
			this._radioInputLength = _inputObject.length;
			if(!_inputObject[0].validationset) {
				if (this._validationMethod == 'ajax') this._aryElements.push(document.getElementById(_inputObject.name));
				_inputObject[0].validationset = new ValidationSet(this, _inputObject[0]);
			}
			_inputObject[0].validationset.add(pDescription, pErrorString);
		} else {
			if (_inputObject.length != undefined) {
				if (_inputObject.nodeName == 'SELECT') {
					for (j=0; j<_descriptionSplitter.length; j++) {
						if(!_inputObject.validationset) {
							if (this._validationMethod == 'ajax') this._aryElements.push(document.getElementById(_inputObject.name));
							_inputObject.validationset = new ValidationSet(this, _inputObject);
						}
						if (_errorStringSplitter.length > 1) _inputObject.validationset.add(_descriptionSplitter[j], _errorStringSplitter[j]);
						else _inputObject.validationset.add(_descriptionSplitter[j], pErrorString);
					}
				} else {
					for (j=0; j<_inputObject.length; j++) {
						if (j == item_splitterEQ) {
							for (k=0; k<_descriptionSplitter.length; k++) {
								if(!_inputObject[j].validationset) {
								if (this._validationMethod == 'ajax') this._aryElements.push(document.getElementById(_inputObject.name));
									_inputObject[j].validationset = new ValidationSet(this, _inputObject[j]);
								}
								if (_errorStringSplitter.length > 1) _inputObject[j].validationset.add(_descriptionSplitter[k], _errorStringSplitter[j]);
								else _inputObject[j].validationset.add(_descriptionSplitter[k], pErrorString);
							}
						}
					}
				}
			} else {
				for (j=0; j<_descriptionSplitter.length; j++) {
					if(!_inputObject.validationset) {
						if (this._validationMethod == 'ajax') this._aryElements.push(document.getElementById(_inputObject.name));
						_inputObject.validationset = new ValidationSet(this, _inputObject);
					}
					if (_errorStringSplitter.length > 1) _inputObject.validationset.add(_descriptionSplitter[j], _errorStringSplitter[j]);
					else _inputObject.validationset.add(_descriptionSplitter[j], pErrorString);
				}
			}
		}
	}
}

function ValidationDesc(pThis, inputitem, desc, error) {
	this.desc = desc;
	this.error = error;
	this._inputObject = inputitem;
	this.validate = vdesc_validate;
	this._this = pThis;
	this._inputObject.desc = desc;
	this._error = error;
}

function vdesc_validate() {
	if (!CDEValidator.prototype.validateData(this._this, this.desc, this._inputObject, this.error)) return false;
	return true;
}

function ValidationSet(pThis, inputitem) {
	this.vSet = new Array();
	this.add = add_validationdesc;
	this.validate = vset_validate;
	this._inputObject = inputitem;
	this._this = pThis;
}

function add_validationdesc(desc, error) {
	this.vSet[this.vSet.length] = new ValidationDesc(this._this, this._inputObject, desc, error);
}

function vset_validate() {
	for (var i=0; i<this.vSet.length; i++) if(!this.vSet[i].validate()) return false;
	return true;
}

CDEValidator.prototype.useIconFlag = function(pIconFlagContainerID, pOffsetStart, pOffsetX, pOffsetY, pUseShadow, pColor, pDistance, pDegrees, pSteps, pStartOpacity, pEndOpacity) {
	if (document.getElementById(pIconFlagContainerID)) {
		this._iconFlagContainer = document.getElementById(pIconFlagContainerID);
		this._useIconFlag = true;
		this._iconFlagUsingShadow = false;
		if (typeof(pOffsetStart) != 'string') pOffsetStart = 'right';
		if (pOffsetStart != 'left')
			if (pOffsetStart != 'right') pOffsetStart = 'right';
		this._offsetStart = pOffsetStart;
		this._flagOffsetX = pOffsetX;
		this._flagOffsetY = pOffsetY;
		if (typeof(pUseShadow) == 'boolean') {
			this._iconFlagUsingShadow = pUseShadow;
			this._shadowColor = pColor;
			this._shadowDistance = pDistance;
			this._shadowDegrees = pDegrees;
			this._shadowSteps = pSteps;
			this._shadowStartOpacity = pStartOpacity;
			this._shadowEndOpacity = pEndOpacity;
			// pull in cde_dropshadow js
			var _allScriptFiles = document.getElementsByTagName('script');
			for (var i=0; i<_allScriptFiles.length; i++) if (_allScriptFiles[i].src.indexOf('cde_validator.js') != -1) var _shadowJSSrc = _allScriptFiles[i].src.substring(0, _allScriptFiles[i].src.lastIndexOf('/'));
			var oShadowJS = document.createElement('script');
			oShadowJS.id = 'oShadowJS';
			oShadowJS.type = 'text/javascript';
			oShadowJS.language = 'javascript';
			oShadowJS.src = _shadowJSSrc + '/cde_dropshadow.js';
			document.getElementsByTagName('head')[0].appendChild(oShadowJS);
		}
	} else alert('Error: could not find element with ID: ' + pIconFlagContainerID);
}

CDEValidator.prototype.closeIconFlag = function(pElementID) {
	if (this._iconFlagUsingShadow) {
		for (x in this._cdeShadow) {
			if (this._cdeShadow[x]._id.id == pElementID) {
				this._cdeShadow[x].removeShadows();
				this._cdeShadow.splice(x, 1);
			}
		} 
	}
	if (document.getElementById(pElementID)) document.body.removeChild(document.getElementById(pElementID));
}

CDEValidator.prototype.createErrorMessage = function(pThis, pErrorString, pDefaultMessage) {
	if (!pErrorString || pErrorString.length == 0) pErrorString = pDefaultMessage;
	if (pThis._errorMessageContainer == 'javascript') _appendText = '\n';
	else _appendText = '<br />';
	pThis._errorMessage = pErrorString + _appendText;
	pThis._hasErrors = true;
}

CDEValidator.prototype.validateData = function(pThis, strValidate, _inputObject, pErrorString) {
	var _appendText = '';
	var epos = strValidate.search('=');
	var command  = '';
	var cmdvalue = '';
	if(epos >= 0) {
		command  = strValidate.substring(0, epos);
		cmdvalue = strValidate.substr(epos + 1);
	} else command = strValidate;
	switch(command) {
		case 'req':
		case 'required': {
			if (eval(_inputObject.value.length) == 0 || _inputObject.value.toLowerCase() == 'required') {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : Required Field.');
				return false;
			}
			break;
		}
		case "compare":
		case "comp": {
			if(_inputObject.value != eval("document." + pThis._form.name + "." + cmdvalue + ".value")) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : Required Field.');
				return false;
			}
			break;
		}
		case 'maximum_length':
		case 'maxlen': {
			if (eval(_inputObject.value.length) >  eval(cmdvalue)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : ' + cmdvalue + ' characters maximum.');
				return false;
			}
			break;
		}
		case 'minimum_length':
		case 'minlen': {
			if (eval(_inputObject.value.length) <  eval(cmdvalue)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : ' + cmdvalue + ' characters minimum.');
				return false;
			}
			break;
		}
		case 'alnum':
		case 'alpha_numeric': {
			var charpos = _inputObject.value.search('[^A-Za-z0-9]');
			if (_inputObject.value.length > 0 &&  charpos >= 0) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Only alpha-numeric characters allowed.');
				return;
			}
			break;
		}
		case 'num':
		case 'numeric': {
			var charpos = _inputObject.value.search('[^0-9]');
			if (_inputObject.value.length > 0 &&  charpos >= 0) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Only digits allowed.');
				return;
			}
			break;
		}
		case 'numhyphen':
		case 'numeric_hyphen': {
			var charpos = _inputObject.value.search('[^0-9\-]');
			if (_inputObject.value.length > 0 &&  charpos >= 0) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Only digits and hyphens allowed.');
				return;
			}
			break;
		}
		case 'alphabetic':
		case 'alpha': {
			var charpos = _inputObject.value.search('[^A-Za-z]');
			if (_inputObject.value.length > 0 &&  charpos >= 0) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Only alphabetic characters allowed.');
				return;
			}
			break;
		}
		case 'alpha_numeric_hyphen':
		case 'alnumhyphen': {
			var charpos = _inputObject.value.search('[^A-Za-z0-9\-_]');
			if (_inputObject.value.length > 0 &&  charpos >= 0) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': characters allowed are A-Z,a-z,0-9,- and _.');
				return;
			}
			break;
		}
		case 'email':
		case 'email_address': {
			if (!validateEmail(_inputObject.value)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Enter a valid Email address.');
				return;
			}
			break;
		}
		case 'phone':
		case 'phone_number': {
			if(!validatePhone(_inputObject.value, cmdvalue)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Enter a valid Phone Number.');
				return;
			}
			break;
		}
		case 'lt':
		case 'less_than': {
			if (isNaN(_inputObject.value)) {
				alert(_inputObject.name + ': Should be a number ');
				return false;
			}
			if (eval(_inputObject.value) >=  eval(cmdvalue)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : value should be less than ' + cmdvalue + '.');
				return;
			}
			break;
		}
		case 'gt':
		case 'greater_than': {
			if(isNaN(_inputObject.value)) {
				alert(_inputObject.name + ': Should be a number ');
				return false;
			}
			if(eval(_inputObject.value) <=  eval(cmdvalue)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : value should be greater than ' + cmdvalue + '.');
				return;
			}
			break;
		}
		case 'regexp':
		case 'regular_expression': {
			if(_inputObject.value.length > 0) {
				if(!_inputObject.value.match(cmdvalue)) {
					CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Invalid characters found.');
					return;
				}
			}
			break;
		}
		case 'selectreq':
		case 'select_required': {
			if(_inputObject.selectedIndex == null) {
				throw new Error('Error: ' + command + ' command for non-select Item');
				return false;
			}
			if(_inputObject.selectedIndex == eval(cmdvalue)) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ': Please Select one option.');
				return;
			}
			break;
		}
		case 'radioreq':
		case 'radio_required': {
			var chosen = false;
			for (i=0; i<pThis._radioInputLength; i++) {
				if (eval('document.' + pThis._form.name + '.' + _inputObject.name + '[' + i + '].checked')) chosen = true;
			}
			if (!chosen) {
				CDEValidator.prototype.createErrorMessage(pThis, pErrorString, _inputObject.name + ' : Required Field.');
				return;
			}
			break;
		}
	}
	return true;
}

CDEValidator.prototype.buildFlag = function(pThis, pElement, pElementDesc, pFieldError, pIconFlagContainerID, pUsingShadow, pAryCDEShadow, pColor, pDistance, pDegrees, pSteps, pStartOpacity, pEndOpacity) {
	var oContainer = document.createElement(pIconFlagContainerID.nodeName.toLowerCase());
	oContainer.id = pElement.name + 'Icon';
	for (var i=0; i<pIconFlagContainerID.attributes.length; i++) {
		if (pIconFlagContainerID.attributes.item(i).nodeName == 'class') oContainer.className = pIconFlagContainerID.attributes.item(i).nodeValue;
		else {
			var _nodeName = pIconFlagContainerID.attributes.item(i).nodeName;
			var _nodeValue = pIconFlagContainerID.attributes.item(i).nodeValue;
			oContainer._nodeName = _nodeValue;
		}
	}
	oContainer.id = pElement.name + 'CDEIcon';
	oContainer.style.position = 'absolute';
	var _zIndex = 0;
	var _theHighestZIndex = parseInt(getHighestZIndex());
	if (_theHighestZIndex == 0) _zIndex = (_theHighestZIndex + 100) * 101;
	else _zIndex = _theHighestZIndex + 1;
	oContainer.style.zIndex = _zIndex;
	// set the innerHTML
	var _innerHTML = pIconFlagContainerID.innerHTML;
	_innerHTML = _innerHTML.replace(/\[ErrorMessage\]/g, pFieldError.replace('<br />', ''));
	_innerHTML = _innerHTML.replace(/\[this\]/g, pElement.name + 'CDEIcon');
	oContainer.innerHTML = _innerHTML;
	document.body.appendChild(oContainer);
	var mOffY = 0;
	var mOffX = 0;
	var _offsetWidth = 0;
	if (pThis._offsetStart == 'right') {
		if (pElementDesc.indexOf('radio') != -1) {
			// loop through the doc and find the last array of this radio in group
			var allThisRadioGroup = document.getElementsByTagName('input');
			for (i=0; i<allThisRadioGroup.length; i++) {
				if (allThisRadioGroup[i].name == pElement.name) {
					var mObjText = allThisRadioGroup[i].nextSibling.nodeValue;
					mObjText = mObjText.replace(/\t/g, '');
					mObjText = mObjText.replace(/\n/g, '');
					pElement = allThisRadioGroup[i];
				}
			}
		}
		_offsetWidth = parseInt(pElement.offsetWidth);
	}
	setLyr(pElement, oContainer, _offsetWidth + pThis._flagOffsetX, pThis._flagOffsetY);
	if (pUsingShadow) pAryCDEShadow.push(new CDEShadow(oContainer, pColor, pDistance, pDegrees, pSteps, pStartOpacity, pEndOpacity));
}

function removeAllFlags() {
	var _allElements = document.body.getElementsByTagName('div');
	var _aryElements = new Array();
	for (var i=_allElements.length-1; i>0; i--) if (_allElements[i].id.indexOf('CDEIcon') != -1) _aryElements.push(_allElements[i]);
	for (x in _aryElements) document.body.removeChild(_aryElements[x]);
}

function getHighestZIndex() {
	var allElements = document.getElementsByTagName('*');
	var mZindices = new Array();
	mZindices[0] = 0;
	for (var i=0; i<allElements.length; i++) {
		if (allElements[i].nodeType == 1) {
			if (document.all) {
				if (allElements[i].currentStyle) {
					mZIndex = allElements[i].currentStyle['zIndex'];
					if (!isNaN(mZIndex)) mZindices.push(mZIndex);
				} else if (window.getComputedStyle) {
					mZIndex = document.defaultView.getComputedStyle(allElements[i], null).getPropertyValue('zIndex');
					if (!isNaN(mZIndex)) mZindices.push(mZIndex);
				}
			} else {
				if (allElements[i].currentStyle) {
					mZIndex = allElements[i].currentStyle['z-index'];
					if (!isNaN(mZIndex)) mZindices.push(mZIndex);
				} else if (window.getComputedStyle) {
					mZIndex = document.defaultView.getComputedStyle(allElements[i], null).getPropertyValue('z-index');
					if (!isNaN(mZIndex)) mZindices.push(mZIndex);
				}
			}
		}
	}
	mZindices = mZindices.sort(sortZindex);
	return mZindices[mZindices.length - 1];
}

function sortZindex(a, b) {
	return a - b;
}

function validateEmail(pInputValue) {
	if(pInputValue.length <= 0) return true;
	var splitted = pInputValue.match('^(.+)@(.+)$');
	if(splitted == null) return false;
	if(splitted[1] != null) {
		var regexp_user = /^\"?[\w-_\.]*\"?$/;
		if(splitted[1].match(regexp_user) == null) return false;
	}
	if(splitted[2] != null) {
		var regexp_domain = /^[\w-\.]*\.[A-Za-z]{2,4}$/;
		if(splitted[2].match(regexp_domain) == null) {
			var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
			if(splitted[2].match(regexp_ip) == null) return false;
		}
		return true;
	}
	return false;
}

function validatePhone(pInputValue, pValidationMethod) {
	// ^[0-9]{3}-?[0-9]{3}-?[0-9]{4}$
	// 10:-?()
	// 7-
	// 10()-
	// 1-(888)-777-6666
	pInputValue = pInputValue.replace(/ /g, '');
	var splitted = pValidationMethod.split(':');
	var _num = parseInt(splitted[0]);
	var _exp = '';
	var _regExp = null;
	if (isNaN(_num)) _regExp = '^[0-9]+$';
	if (splitted.length == 1) {
		if (isNaN(_num)) _regExp = '^[0-9\\(\\)-.]+$';
		else _regExp = '^[0-9]{' + _num + '}$';
	} else {
		_exp = splitted[1];
		var isOptional = false;
		var _nonOptional = '';
		var _optional = '';
		var _one = '';
		var _areaCode = '';
		var _prefix = '[0-9]{3}';
		var _exchange = '[0-9]{4}';
		var _period = '';
		var _hyphen = '';
		var _openParen = '';
		var _closeParen = '';
		var optionalPosition = _exp.indexOf('?');
		if (optionalPosition != -1) isOptional = true;
		if (isOptional) {
			_optional = _exp.split('?')[1];
			if (optionalPosition > 0) _nonOptional = _exp.split('?')[0];
		} else _nonOptional = _exp;
		if (_nonOptional != '') {
			for (var i=0; i<_nonOptional.length; i++) {
				if (_nonOptional[i] == '.') _period = '.';
				if (_nonOptional[i] == '-') _hyphen = '-';
				if (_nonOptional[i] == '(') _openParen = '\\(';
				if (_nonOptional[i] == ')')	_closeParen = '\\)';
			}
		}
		if (_optional != '') {
			for (var i=0; i<_optional.length; i++) {
				if (_optional[i] == '.') _period = '.?';
				if (_optional[i] == '-') _hyphen = '-?';
				if (_optional[i] == '(') _openParen = '\\(?';
				if (_optional[i] == ')') _closeParen = '\\)?';
			}
		}
		if (_num > 7) _areaCode = _openParen + '\\d{3}' + _closeParen + _hyphen + _period;
		if (_num > 10) _one = '[1]' + _hyphen + _period;
		_regExp = '^' + _one + _areaCode + _prefix + _hyphen + _period + _exchange + '$';
	}
	if(pInputValue.length <= 0) return false;
	if (_regExp == null) return false;
	if(pInputValue.match(_regExp)) return true;
	return false;
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function setLyr(obj, lyr, offX, offY) {
	var coors = findPos(obj);
	var x = lyr;
	x.style.top = coors[1] + offY + 'px';
	x.style.left = coors[0] + offX + 'px';
}

function centerDiv(element) {
    try {element = document.getElementById(element);} catch(e) {return;}
    var my_width  = 0;
    var my_height = 0;
    if (typeof(window.innerWidth) == 'number') {
        my_width = window.innerWidth;
        my_height = window.innerHeight;
    } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        my_width = document.documentElement.clientWidth;
        my_height = document.documentElement.clientHeight;
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        my_width = document.body.clientWidth;
        my_height = document.body.clientHeight;
    }
    element.style.position = 'absolute';
    element.style.zIndex   = 100000;
    var scrollY = 0;
	if (document.documentElement && document.documentElement.scrollTop) scrollY = document.documentElement.scrollTop;
	else if (document.body && document.body.scrollTop) scrollY = document.body.scrollTop;
	else if (window.pageYOffset) scrollY = window.pageYOffset;
	else if (window.scrollY) scrollY = window.scrollY;
    var setX = (my_width - element.offsetWidth) / 2;
    var setY = (my_height - element.offsetHeight) / 2 + scrollY;
    setX = (setX < 0) ? 0 : setX;
    setY = (setY < 0) ? 0 : setY;
    element.style.left = setX + 'px';
    element.style.top = setY + 'px';
}
