// this array is populated at runtime.  Manually adding to the array could
// could cause horrific problems.
var FRL_hide_submit = Array();

// The rules used to validate a field.  These rules should be
// populated when the page is loaded, not at runtime.  The rules should 
// be entered with the format:
// FRL_field_rules['id'][rule] = value;
// Known rules: 
// 	char_min  - integer, minimum number of characters, -1 to disable
// 	char_max  - integer, maximum number of characters, -1 to disable
//  required  - boolean, true if required, false if not
//  format    - string, label for regular expression from FRL_valid_re[]
//  num_min   - number, minimum value for a number field
//  num_max   - number, maximum value for a number field
//  date_min  - yyyy/mm/dd, minimum value for a date field
//  date_max  - yyyy/mm/dd, maximum value for a date field
var FRL_field_rules = Array();

//Regular expressions for validating data types
var FRL_valid_re = Array();
FRL_valid_re['alpha']     = /^[a-zA-Z]*$/; 
// the 'any' case is just for consistancy. it allows for anyting
FRL_valid_re['any']       = /^.*$/;
FRL_valid_re['node']      = /^[a-zA-Z0-9_-]*$/; 
FRL_valid_re['char']      = /^\w*$/;
FRL_valid_re['card']      = /^[cdeCDE]\d+$/;
FRL_valid_re['date']      = /^\d+-\d+-\d\d\d\d$/;
FRL_valid_re['datetime']  = /^[\da-zA-Z-:/]*$/;
FRL_valid_re['dollar']    = /^[-+(]?\$?\d*\.?\d*[)]?$/;
FRL_valid_re['elid']      = /^[a-zA-Z]{2}\d{6}$/; 
FRL_valid_re['int']       = /^[+-]?\d*$/;
FRL_valid_re['float']     = /^[(+-]?\d*\.?\d*\)?$/;
FRL_valid_re['number']    = /^\d*$/;
FRL_valid_re['email']     = /^[a-zA-Z0-9_\.@-]*$/;
FRL_valid_re['password'] = /^[a-zA-Z0-9_.,!?@$%&+-/():]*$/;
FRL_valid_re['paragraph'] = /^[a-zA-Z0-9_ \s\t\n.,!?@$%&+-/():'"]*$/;
FRL_valid_re['percent']   = /^[-+(]?\d*\.?\d*\%?\)?$/;
FRL_valid_re['phone']      = /^[0-9-]*$/; 
FRL_valid_re['string']    = /^[a-zA-Z0-9_ .,!?@$%&+-/():'"]*$/;
FRL_valid_re['time']      = /^[\d:]*$/;

var FRL_valid_note = Array();
FRL_valid_note['alpha']     = 'Valid Characters: a-zA-Z'; 
FRL_valid_note['node']      = 'Valid Characters: 0-9 a-z A-Z -_'; 
FRL_valid_note['char']      = 'Valid Characters: 0-9 a-z A-Z _';
FRL_valid_note['card']      = 'Valid Characters: [CDE]0-9';
FRL_valid_note['date']      = 'Valid Format: dd-mm-yyyy';
FRL_valid_note['datetime']  = 'Valid Format: yyyy-mm-dd hh:mm:ss';
FRL_valid_note['dollar']    = '(0-9 .$)';
FRL_valid_note['elid']      = 'Valid Format: XX999999'; 
FRL_valid_note['int']       = 'Valid Characters: 0-9 +-';
FRL_valid_note['float']     = 'Valid Characters: 0-9 .+-';
FRL_valid_note['number']    = 'Valid Characters: 0-9';
FRL_valid_note['paragraph'] = 'Valid Characters: 0-9 a-z A-Z [white space] [.,!?@$%&+-/():\'"]';
FRL_valid_note['password']  = 'Valid Characters: 0-9 a-z A-Z [.,!?@$%&+-/():])';
FRL_valid_note['string']    = 'Valid Characters: 0-9 a-z A-Z [space] [.,!?@$%&+-/():\'"]';
FRL_valid_note['phone']     = 'Valid Format: 999-999-9999'; 
FRL_valid_note['percent']   = 'Valid Characters: 0-9 .%';
FRL_valid_note['time']      = 'Valid Format: hh:mm:ss';
FRL_valid_note['email']     = 'Valid Characters: 0-9 a-z A-Z @-_.';


function FRL_is_blank(s) {
  for(var i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if((c != ' ') && (c != '\n') && (c != '')) return false;
  }
  return true;
}


function FRL_validate_field(f) {
	if(f.type == 'radio' || f.type == 'checkbox') {
		var n = document.getElementsByName(f.name);
		return FRL_validate_fieldset(n[0]);
	}

	if(!FRL_field_rules[f.id]) {
		//If there are no rules there is nothing to check
		return;
	}

	var o = document.getElementById('FRL_validate_' + f.id);
  if (! o) {
		var is_set = /\[\]$/;
		if(is_set.test(f.name)) {
			alert(f.name);
			o = document.getElementById('FRL_validate_' + 'lbl_' + f.name.substr(0,f.name.length - 2));
		}
		else {
	    o = document.getElementById('FRL_validate_' + f.name);	  
		}
  }

	var msg  = false;
	var re   = FRL_field_rules[f.id]['format'] ? FRL_field_rules[f.id]['format'] : 'any';
	var len  = f.value.length;
	
	if (FRL_field_rules[f.id]['date_max']) {
		dmax = FRL_field_rules[f.id]['date_max'].split("-");
		if(dmax[1].length == 1){ dmax[1] = '0' + dmax[1]};
		if(dmax[2].length == 1){ dmax[2] = '0' + dmax[2]};
		dmax = dmax.join('');
	}
	if (FRL_field_rules[f.id]['date_min']) {
		dmin = FRL_field_rules[f.id]['date_min'].split("-");
		if(dmin[1].length == 1){ dmin[1] = '0' + dmin[1]};
		if(dmin[2].length == 1){ dmin[2] = '0' + dmin[2]};
		dmin = dmin.join('');
	}
	if (FRL_field_rules[f.id]['date_max'] || FRL_field_rules[f.id]['date_min']) {
		dt = f.value.split("-");
		if(dt.length == 3){
			if(dt[1].length == 1){ dt[1] = '0' + dt[1]};
			if(dt[2].length == 1){ dt[2] = '0' + dt[2]};
			dt = dt.join('');
		}
		else {
			dt = null;
		}
	}
	if(FRL_field_rules[f.id]['required'] && !FRL_has_value(f)) {
		msg = '&nbsp;Value is required&nbsp;';
	}
	else if (!FRL_is_blank(f.value) && !FRL_valid_re[re].test(f.value)) {
		// set global match and remove anchors from the original pattern
		var pat = RegExp(FRL_valid_re[re].toString().slice(2,-2), 'g');
		// removing the valid characters leaves the invalid characters
		var bad_chars = f.value.replace(pat, "").split("");
		if(FRL_field_rules[f.id]['format'] == 'date') {
			msg = '&nbsp;Invalid Format:&nbsp;[' + FRL_valid_note['date'] + ']'; 
		}
		else {
			msg = '&nbsp;Illegal Character(s):&nbsp;[' + bad_chars.join("") + ']'; 
		}
  }
	else if (FRL_field_rules[f.id]['char_min'] >= 0 && 
					 FRL_field_rules[f.id]['char_min'] > len) {
		msg = FRL_field_rules[f.id]['char_min'] - len;
		msg += ' too few characters'
	}
	else if (FRL_field_rules[f.id]['char_max'] > 0 && 
					 FRL_field_rules[f.id]['char_max'] < len) {
		msg = len - FRL_field_rules[f.id]['char_max'];
		msg += ' too many characters'
	}
	else if (FRL_field_rules[f.id]['num_min'] != null && 
					 FRL_field_rules[f.id]['num_min'] > f.value) {
		msg = ' Preceeds Lower Limit: ' + FRL_field_rules[f.id]['num_min'];
	}
	else if (FRL_field_rules[f.id]['num_max'] != null &&
					 FRL_field_rules[f.id]['num_max'] < f.value) {
		msg = ' Exceeds Upper Limit: ' + FRL_field_rules[f.id]['num_max'];
	}
	else if ((FRL_field_rules[f.id]['date_min'] || 
						FRL_field_rules[f.id]['date_max']) &&
           f.value && dt == null) { 
		msg = ' Use date format yyyy/mm/dd'	;
	}
	else if (FRL_field_rules[f.id]['date_min'] && dt != null && dmin > dt) {
		msg = ' Preceeds Minimum Date: ' + FRL_field_rules[f.id]['date_min'];
	}
	else if (FRL_field_rules[f.id]['date_max'] && dt != null && dmax < dt) {
		msg = ' Exceeds Maximum Date: ' + FRL_field_rules[f.id]['date_max'];
	}

	if (msg) {
		if (o) {
			o.innerHTML = msg;
			FRL_strip_class(o, 'FRL_hide_me');
			FRL_append_class(o, 'FRL_validate_err');
		}
		//set the global status for the field and disable submit button(s)
		FRL_hide_submit[f.name] = 1;
		FRL_disable_submit();
	}
	else {
		delete FRL_hide_submit[f.name];
		if (o) {
			FRL_append_class(o, 'FRL_hide_me');
			FRL_strip_class(o, 'FRL_validate_err');
		}
		for (e in FRL_hide_submit) {
			FRL_disable_submit();
			return false;
		}
		FRL_enable_submit();
		return true;
	}

}

function FRL_validate_fieldset(f) {
	var is_set = /\[\]$/;
	if(is_set.test(f.name)) {
		o = document.getElementById('FRL_validate_' + f.name.substr(0,f.name.length - 2));
	}
	else {
		o = document.getElementById('FRL_validate_' + f.name);	  
	}

	//var o = document.getElementById('FRL_validate_' + f.name);	  

	var msg  = false;
	if(!FRL_field_rules[f.name]) {
		return;
	}
	if(FRL_field_rules[f.name]['required'] && !FRL_has_value(f)) {
		msg = '&nbsp;Value is required&nbsp;';
	}

	if (msg) {
		if (o) {
			o.innerHTML = msg;
			FRL_strip_class(o, 'FRL_hide_me');
			FRL_append_class(o, 'FRL_validate_err');
		}
		//set the global status for the field and disable submit button(s)
		FRL_hide_submit[f.name] = 1;
		FRL_disable_submit();
	}
	else {
		delete FRL_hide_submit[f.name];
		if (o) {
			FRL_append_class(o, 'FRL_hide_me');
			FRL_strip_class(o, 'FRL_validate_err');
		}
		for (e in FRL_hide_submit) {
			FRL_disable_submit();
			return false;
		}
		FRL_enable_submit();
		return true;
	}
}

function FRL_validate_form (){
  for (e in FRL_field_rules) {
		var f = document.getElementById(e)
		var n = document.getElementsByName(e);
		if(f) {
			FRL_validate_field(f);
		}
		else if(n && (n[0].type == 'radio' || n[0].type == 'checkbox')) {
			FRL_validate_fieldset(n[0]);
		}
  }
	for (e in FRL_hide_submit) {
		FRL_disable_submit();
		return false;
	}
	return true;
}

function FRL_has_value (f){
	if(f.type == 'checkbox' || f.type == 'radio') {
		var os = document.getElementsByName(f.name);
		for (var i = 0; i < os.length; i++){
			// if any one of a radio or checkbox group is "checked" the group passes
			if(os[i].checked) {
				return true
			}
		}
	}
  else if(!FRL_is_blank(f.value)) {
		return true;
	}
	return false
}

function FRL_register_field(id, required, format, char_min, char_max, date_min, date_max, num_min, num_max) {
	FRL_field_rules[id] = Array();
	FRL_field_rules[id]['required'] = required;
	FRL_field_rules[id]['format'] = format;
	FRL_field_rules[id]['char_min'] = char_min;
	FRL_field_rules[id]['char_max'] = char_max;
	FRL_field_rules[id]['date_min'] = date_min;
	FRL_field_rules[id]['date_max'] = date_max;
	FRL_field_rules[id]['num_min'] = num_min;
	FRL_field_rules[id]['num_max'] = num_max;
}

function FRL_disable_submit() {
  var submits = document.getElementsByTagName('input');
	for (i = 0; i < submits.length; i++) {
		if('submit' == submits[i].type) {
			submits[i].disabled = true;
			FRL_append_class(submits[i], 'FRL_btn_disabled');
		}
	}
}
function FRL_enable_submit() {
  var submits = document.getElementsByTagName('input');
	for (i = 0; i < submits.length; i++) {
		if('submit' == submits[i].type) {
			submits[i].disabled = false;
			FRL_strip_class(submits[i], 'FRL_btn_disabled');
		}
	}
}



function FRL_register_forms () {
	var f = document.getElementsByTagName('form');
	for(var i=0; i < f.length; i++) {
			f[i].onsubmit = FRL_validate_form;
	}
	
	var has_note = {'text': true, 
									'password' : true,
									'textarea' : true};

	for (id in FRL_field_rules) {
		var is_set = /\[\]$/;
		var lid = '';
		if(is_set.test(id)) {
			lid = 'lbl_' + id.substr(0,id.length - 2);
		}
		else {
			lid = 'lbl_' + id;
		}
		var lbl = document.getElementById(lid);
		if (FRL_field_rules[id]['required'] && lbl) {
			FRL_strip_class(lbl, 'FRL_optional');
			FRL_append_class(lbl, 'FRL_required');
		}
		else if(lbl) {
			FRL_strip_class(lbl, 'FRL_required');
			FRL_append_class(lbl, 'FRL_optional');
		}
	}
}

function FRL_note_here(neighbor) {
	if(!neighbor.id || !FRL_field_rules[neighbor.id] || !FRL_field_rules[neighbor.id]['format']) {
		return;
	}
	var format = FRL_field_rules[neighbor.id]['format'];
	var n = document.getElementById('FRL_format_note');
	if(!n) {
		var tmp = document.createElement('div');
		tmp.setAttribute('id', 'FRL_format_note');
		document.getElementsByTagName('body')[0].appendChild(tmp);
		n = document.getElementById('FRL_format_note');
	}
	n.innerHTML = FRL_valid_note[format];
	FRL_strip_class(n, 'FRL_hide_me');
	n.style.position = 'absolute';

	// find the position of the neighbor.  Note: Using just
	// the offsets has unpredictable results.
	var pos = FRL_find_position(neighbor);
	
	// Locate the popup to the top right of the neighbor
	n.style.top  = pos['top'] + neighbor.offsetHeight + 'px';
	n.style.left = pos['left'] +'px';

}
function FRL_note_hide() {
	var n = document.getElementById('FRL_format_note');
	if(!n){
		return;
	}
	FRL_append_class(n, 'FRL_hide_me');
}

window.onload = FRL_register_forms;