/**
 * Miscellaneous browser utilities
 */
com_pagasg_www_validate = new es_lang.Package(true,
	/*Title*/   'Form Validation Package',
	/*Docs */   '-- none --',
	/*Package*/ function() {
		// Imports
		var LANG = es_lang;
		var LOG = es_util_logging;
		var NET = es_net;
		var WU = com_pagasg_www_util;

		var Strings = WU.Strings;
		var Elements = WU.Elements;
		var Inputs = WU.Inputs;

		// ****** Validator ******
		Validator = {
			getLogger: function() {
				return LOG.Logger.getLogger('com.pagasg.www.validate.Validator');
			},
			validateForm: function(frm) {
				var prompt;
				var promptId;
				var name;
				var inputElm;
				var promptElm;
				var elm;
				var fn;
				var validator;
				var promptText
				var required;
				var empty;
				var messages = [];
				var errors = [];
				var validators = [];
				var formId = frm.id; 
				var validateRegEx = new RegExp(/\.validation$/);
				var requiredRegEx = new RegExp(/(\b|^)required(\b|$)/);
				
				for (var i = 0; i < frm.elements.length; i++) {
					elm = frm.elements[i];
					if (elm.name && elm.name.match(validateRegEx)) {
						name = elm.name.replace(validateRegEx, '');
						inputElm = frm[name];
						//label = this.buildPromptName(frm, validator.id);
						//promptId = this.buildPromptName(formId, )
						promptId = formId + '-' + name + '.prompt';
						promptElm = document.getElementById(promptId) 
						validators.push({ name: name, validation: elm.value, elm: inputElm, prompt: promptElm});
					}
				};

				//alert ('validators: ' + validators.length);
				for (var i = 0; i < validators.length; i++) {
					try {
						validator = validators[i];
						elm = validator.elm;
						prompt = validator.prompt;
						promptText = (prompt) ? WU.Elements.getContents(prompt) : elm.name;
						
						if (elm) {
							required = WU.Elements.hasClassname('required', elm);
							empty = Inputs.isEmpty(elm);
							
							fnName = this.prefixFunctionName(validator.validation);
							fn = new Function('return ' + fnName)();
							//alert ('fnName: ' + fnName);
							//fn = new Function('return ' + fnName)();
							
							//fn = new Function('return ' + validator.validation)();
							if (required && empty && fn) {
								messages.push(promptText + ' (required field)');
								Elements.addClassname('invalid', elm, prompt);
							} else if (!empty) {
								if (fn && !fn(elm)) {
									messages.push(promptText + ' (not formatted correctly)');
									Elements.addClassname('invalid', elm, prompt);
								} else {
									Elements.removeClassname('invalid', elm, prompt);
								} 
							} else {
								Elements.removeClassname('invalid', elm, prompt);
							}
						} else {
							errors.push('Input: ' + validator.name + ' not found');
						}
					} catch (e) {
						errors.push(WU.Objects.display(e, 2));
					}
				}

				/*if (errors.length > 0) {
					alert("Errors occurred during processing: \r\n" + errors.join('\r\n'));
					return false;
				} else if (messages.length > 0) {
					alert("Please complete the following fields:\r\n - " + messages.join('\r\n - '));
					return false;
				}*/
				if (errors.length > 0 || messages.length > 0) {
					alert("The form had some errors. Please fix and re-submit.");
					return false;
				}
				return true;
			},
			buildPromptName: function(frm, field, suffix) {
				var labelName;
				promptName = frm.id + '-' + field + '.prompt';
				return promptName;
			},
			prefixFunctionName: function(fn) {
				var validatorRegEx = new RegExp(/WVAL\.Validator\./);
				
				
				if (fn.match(validatorRegEx)) {
					//alert ('in if fn');
					return fn;
				} else {
					//alert ('in else fn');
					return 'WVAL.Validator.' + fn;
				}
			},
			checkPostalcode: function(elm) {
				var str;

				if (elm) {
					str = new String(elm.value);
					str = str.replace(/[^0-9]/g, '');
					
//					str = str.replace(/[^a-zA-Z0-9\- ]/g, '');

					if (str.length == 5) {
						elm.value = str;
						return true;
					}
				}
				return false;
			},
			checkWords: function(elm) {
				var str;
				
				if (elm) {
					str = new String(elm.value);
					str = str.replace(/\s+/g, '');
					
					if (str != null && str.Length != 0 && str != '') {
						return true;
					}
				}
				return false;
			},
			checkPassword: function(elm) {
				var regExpSpaces = /\s/g;
				var str;
				
					
				if (elm) {
					str = new String(elm.value);
					
					if (!str.match(regExpSpaces)) {
						
						if (str != null && str.Length != 0 && str != '') {
							return true;
						}
					}
				}
				return false;
			},
			checkPhone: function(elm) {
				var str;
				var regExpPhone1 = /^\d{7}$/;
				var regExpPhone2 = /^\d{10}$/;
				var str0;

				if (elm) {
					str = new String(elm.value);
					
					str = str.replace(/[^0-9]/g, '');
					if (Strings.isEmpty(str)) {
						return true;
					} else if (str.match(regExpPhone1)) {
						return true;
					} else if (str.match(regExpPhone2)) {
						return true;
					}
				}
				return false;
			},
			checkCheckbox: function(elm) {
				if ("true" == Strings.toLower(elm.type)) {
					if (elm.checked) {
						return true;
					}
				}
				return false;
			},
			checkWords1: function(elm) {
				var str;

				if (elm) {
					str = new String(elm.value);
					str = str.replace(/[^A-Za-z0-9.\-_,:;\/ ]/g, '');
					str = str.replace(/^\s+/g, '');
					str = str.replace(/\s+$/g, '');
					str = str.replace(/\s\s+/g, ' ');

					if (str.length > 0) {
						elm.value = str;
						return true;
					}
				}
				return false;
			},
			checkEmail: function(elm){
				elm.value = Strings.trim(elm.value);
				
				var str = elm.value;
				var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
				if (emailPattern.test(str)) {
					return true;
				}
			   return false;
			 },
			checkCCN: function(elm) {
				var ccn;
				var count;

				if (elm) {
					try {
						ccn = new String(elm.value);

						ccn = ccn.replace(/[^0-9]/g, ' ');
						ccn = ccn.replace(/\s+/g, ' ');
						ccn = ccn.replace(/\s+$/, '');
						ccn = ccn.replace(/^\s+/, '');

						count = 0;
						for (var i = 0; i < ccn.length; i++) {
							if ("0123456789".indexOf(ccn.charAt(i)) >= 0) {
								count++;
							}
						}

						if (count > 14) {
							elm.value = ccn;
							return true;
						}
					} catch (e) {
						alert("Error " + e.message);
					}
				}
				return false;
			},
			checkCCSecurity: function(elm) {
				var str;

				str = new String(elm.value);
				str = str.replace(/[^A-Za-z0-9]/g, '');

				if (str.length >= 3) {
					elm.value = str.toUpperCase();
					return true;
				}
				return false;
			},
			checkMatch: function(list) {
				var value;
				var currentElm;
				if (list) {
					for (var i=0; i < list.length; i++) {
						currentElm = list[i].value;
						if (i == 0) {
							value = currentElm;
						} else {
							if (currentElm.match(value)) {
							} else {
								return false;
							}
						}
					}
					return true;
				}
			}
		}
		// ****** PUBLIC ******
		this.Validator = Validator;
		// ****** PUBLIC ******
	}
);









