

if(!FV) {
	var FV = new Object(); // FV stands for Form Validation.
}

/*
	Usage:

	The FV object is an extensible [F]orm [V]alidation object, designed to validate (at present) the following properties in forms:

	* Required (not empty) fields

		FV.check_fields(form_name, 'required');

	* Fields with a minimum length of 'n' characters

		FV.check_fields(form_name, 'minChars', n);

	* Fields with values identical to other fields.

		FV.check_fields(form_name, 'sameas');

	To use this library, your HTML must minimally conform to the following constraints:

	* each form field requiring validation must have its associated text wrapped in a label element
	* each label element must have its 'for' attribute set, 
	* each label element must have a class attribute containing one or more of the following values:
		* required
		* minChars 
		* sameas
	
	Example:

	<form action="" method="" name="registration" id="registration">
		<label for="pword" class="required minChars sameas">Password:</label><input type="password" name="pword" value="" />
		<label for="pword2" class="required minChars sameas">Again:</label><input type="password" name="pword2" value="" />
	</form>

	When you're ready to validate this, simply call the following lines:

		var form_name = 'registration';

		if ( FV.check_fields(form_name, 'required')
			&& FV.check_fields(form_name, 'minChars', 5)
			&& FV.check_fields(form_name, 'sameas') ) {
				$(form_name).submit();
				}

	*/

FV['check_fields'] = function (form_name, type) {
	FV.form = $(form_name);
	var collected_fields = $$('#'+form_name+ ' .' + type )

	var extra_args = new Array();

	for(var i=2; i< arguments.length; i++) { 
		extra_args.push(arguments[i]) 
	}

	return FV[type]( collected_fields, extra_args );
}

FV['required'] = function (collected_fields) {
	var test = true;
	var pass = true;
	collected_fields.each( function (e) {
		var element = e.readAttribute("for")

		test = (FV.get_value(element) != "");

		if( !test ) {
			pass = false;
			$(e).addClassName('error');

			$("errormsg").show();
			window.scrollTo(0, 0);
		}
	});
	return pass;
}

FV['minChars'] = function (collected_fields, extra_args) { 
	var test = true;
	var pass = true;
	var len = extra_args[0];
	collected_fields.each( function (e) {
		var element = e.readAttribute("for")

		test = (FV.get_value(element).length >= len);

		if( !test ) {
			pass = false;
			$(e).addClassName('error');
			$("errormsg").show();
			window.scrollTo(0, 0);
			$("errormsg_" + element ).show();
		}
	});

	return pass;
}

FV['sameas'] = function (collected_fields) { 
	var test = true;
	var pass = true;

	var seed_val = ""
	collected_fields.each( function (e) {
		var element = e.readAttribute("for")

		if( seed_val == "" ) {
			seed_val = FV.get_value(element)
		}

		test = ( FV.get_value(element) == seed_val );
		

		if( !test ) {
			pass = false;
			$(e).addClassName('error');

			$("errormsg").show();
			window.scrollTo(0, 0);
			$("errormsg_" + element ).show();
		}
	});

	return pass;
}

FV['get_value'] = function (element) {
	var val;
	try {
		val = $F(FV.form[element]);
	} catch ( e ) {
		if(typeof(FV.form.getInputs('radio',element).find(function(radio) { return radio.checked; })) == "undefined") {
			if(typeof(FV.form.getInputs('checkbox',element).find(function(checkbox) { return checkbox.checked; })) == "undefined") {
				val = "";
			} else {
				val = FV.form.getInputs('checkbox',element).find(function(checkbox) { return checkbox.checked; }).value;
			}
		} else {
			val = FV.form.getInputs('radio',element).find(function(radio) { return radio.checked; }).value;
		}
	}

	return val;
}

/* END FV namespace */


var PF = new Object(); // PF stands for Populate Form

/*
	Usage: the PF object (for [P]opulate [F]orm) is designed to take a hash, iterate through it and prepopulate the form for you.

	Set up the hash thus:

		data = new Hash();
		data.set(fieldname, fieldvalue);
		...
		data.set(fieldname, fieldvalue);

	where fieldname is the form field's name attribute value, and fieldvalue is the value you want to set in the form.

	calling PF.start(form_name, data) will take the entire hash, and systematically fill in the form 'form_name'

	There's no HTML requirements if you're following best practices (using the name attribute in form fields, for example)

*/

PF['start'] = function (form_name, data ) {
	var f = $(form_name);
	data.each( function (pair) {

			if(f[pair.key].length) { // this hack helps us inspect radio/checkboxes
				tag = f[pair.key][0].nodeName.toLowerCase();
			} else {
				tag = f[pair.key].nodeName.toLowerCase();
			}
			switch (tag) {
			case 'select' : PF.selectlist(f, pair.key, pair.value);
			case 'option' : PF.selectlist(f, pair.key, pair.value);
			case 'input' : PF.inputDispatcher(f, pair.key, pair.value);
			case 'textarea' : PF.textfield(f, pair.key, pair.value);
			}
		})
}

PF['inputDispatcher'] = function (f, name, value) {

	if(f[name].length) { // this hack helps us inspect radio/checkboxes
		type = f[name][0].getAttribute('type');
	} else {
		type = f[name].getAttribute('type');
	}

	switch (type) {
		case 'text' : PF.textfield(f, name, value);
		case 'password' : PF.textfield(f, name, value);
		case 'hidden' : PF.textfield(f, name, value);
		case 'radio' : PF.radioOrCheckbox(f, name, value);
		case 'checkbox' : PF.radioOrCheckbox(f, name, value);
	}
}

PF['textfield'] = function (f, name, value) {
	f[name].value = value;
}

PF['radioOrCheckbox'] = function (f, name, value) {
	var items = f[name];
	for(var i=0; i < items.length; i++) {
		if(items[i].value == value) {
			items[i].checked = true;
		}
	}
}

PF['selectlist'] = function (f, name, value) {
	var opts = f[name].options;
	for(var i=0; i < opts.length; i++) {
		if(opts[i].value == value) {
			opts[i].selected = true;
		}
	}
}

/* END PF namespace */

/* Begin ProvState namespace */
ProvState = new Object(); // ProvState is for modifying our province/state lists based on a country selection.

ProvState['UpdateStateList'] = function (countrylist, statelist) {
	ProvState.DeleteList(statelist)
   
				if (countrylist.options[countrylist.selectedIndex].value == 'CA') {
				
				ProvState.AddToList(statelist, 'Alberta', 'AB');
				
				ProvState.AddToList(statelist, 'British Columbia', 'BC');
				
				ProvState.AddToList(statelist, 'Labrador', 'LB');
				
				ProvState.AddToList(statelist, 'Manitoba', 'MB');
				
				ProvState.AddToList(statelist, 'New Brunswick', 'NB');
				
				ProvState.AddToList(statelist, 'Newfoundland', 'NF');
				
				ProvState.AddToList(statelist, 'Northwest Territories', 'NT');
				
				ProvState.AddToList(statelist, 'Nova Scotia', 'NS');
				
				ProvState.AddToList(statelist, 'Nunavut', 'NU');
				
				ProvState.AddToList(statelist, 'Ontario', 'ON');
				
				ProvState.AddToList(statelist, 'Prince Edward Island', 'PE');
				
				ProvState.AddToList(statelist, 'Quebec', 'PQ');
				
				ProvState.AddToList(statelist, 'Saskatchewan', 'SK');
				
				ProvState.AddToList(statelist, 'Yukon', 'YT');
				}
				if (countrylist.options[countrylist.selectedIndex].value == 'US') {
				
				ProvState.AddToList(statelist, 'Alabama', 'AL');
				
				ProvState.AddToList(statelist, 'Alaska', 'AK');
				
				ProvState.AddToList(statelist, 'Arizona', 'AZ');
				
				ProvState.AddToList(statelist, 'Arkansas', 'AR');
				
				ProvState.AddToList(statelist, 'California', 'CA');
				
				ProvState.AddToList(statelist, 'Colorado', 'CO');
				
				ProvState.AddToList(statelist, 'Connecticut', 'CT');
				
				ProvState.AddToList(statelist, 'Delaware', 'DE');
				
				ProvState.AddToList(statelist, 'District of Columbia', 'DC');
				
				ProvState.AddToList(statelist, 'Florida', 'FL');
				
				ProvState.AddToList(statelist, 'Georgia', 'GA');
				
				ProvState.AddToList(statelist, 'Hawaii', 'HI');
				
				ProvState.AddToList(statelist, 'Idaho', 'ID');
				
				ProvState.AddToList(statelist, 'Illinois', 'IL');
				
				ProvState.AddToList(statelist, 'Indiana', 'IN');
				
				ProvState.AddToList(statelist, 'Iowa', 'IA');
				
				ProvState.AddToList(statelist, 'Kansas', 'KS');
				
				ProvState.AddToList(statelist, 'Kentucky', 'KY');
				
				ProvState.AddToList(statelist, 'Louisiana', 'LA');
				
				ProvState.AddToList(statelist, 'Maine', 'ME');
				
				ProvState.AddToList(statelist, 'Maryland', 'MD');
				
				ProvState.AddToList(statelist, 'Massachusetts', 'MA');
				
				ProvState.AddToList(statelist, 'Michigan', 'MI');
				
				ProvState.AddToList(statelist, 'Minnesota', 'MN');
				
				ProvState.AddToList(statelist, 'Mississippi', 'MS');
				
				ProvState.AddToList(statelist, 'Missouri', 'MO');
				
				ProvState.AddToList(statelist, 'Montana', 'MT');
				
				ProvState.AddToList(statelist, 'Nebraska', 'NE');
				
				ProvState.AddToList(statelist, 'Nevada', 'NV');
				
				ProvState.AddToList(statelist, 'New Hampshire', 'NH');
				
				ProvState.AddToList(statelist, 'New Jersey', 'NJ');
				
				ProvState.AddToList(statelist, 'New Mexico', 'NM');
				
				ProvState.AddToList(statelist, 'New York', 'NY');
				
				ProvState.AddToList(statelist, 'North Carolina', 'NC');
				
				ProvState.AddToList(statelist, 'North Dakota', 'ND');
				
				ProvState.AddToList(statelist, 'Ohio', 'OH');
				
				ProvState.AddToList(statelist, 'Oklahoma', 'OK');
				
				ProvState.AddToList(statelist, 'Oregon', 'OR');
				
				ProvState.AddToList(statelist, 'Pennsylvania', 'PA');
				
				ProvState.AddToList(statelist, 'Puerto Rico', 'PR');
				
				ProvState.AddToList(statelist, 'Rhode Island', 'RI');
				
				ProvState.AddToList(statelist, 'South Carolina', 'SC');
				
				ProvState.AddToList(statelist, 'South Dakota', 'SD');
				
				ProvState.AddToList(statelist, 'Tennessee', 'TN');
				
				ProvState.AddToList(statelist, 'Texas', 'TX');
				
				ProvState.AddToList(statelist, 'Utah', 'UT');
				
				ProvState.AddToList(statelist, 'Vermont', 'VT');
				
				ProvState.AddToList(statelist, 'Virginia', 'VA');
				
				ProvState.AddToList(statelist, 'Washington', 'WA');
				
				ProvState.AddToList(statelist, 'West Virginia', 'WV');
				
				ProvState.AddToList(statelist, 'Wisconsin', 'WI');
				
				ProvState.AddToList(statelist, 'Wyoming', 'WY');
				}   
}

ProvState['DeleteList'] = function (list) {
   for(i=list.length-1;i>=0;i--) {
     list.options[i] = null;
   }
}

ProvState['AddToList'] = function (list, item, value) {
   var optionnew = new Option(item, value);
   eval(list.options[list.length] = optionnew);
}

/* END ProvState namespace */

/* Set up Observers */

Event.observe(window, 'load', function() {
	// register the form validation logic once the page has been loaded.

	if($('validate_form')) {
		Event.observe('validate_form', 'click', function(e){ 

			var form_name;

			Event.element(e).ancestors().each( function (i) { if( i.nodeName.toLowerCase() == "form" ){ form_name = i.getAttribute('id') } } );

			$$('#'+form_name + ' .errormsg').invoke('hide'); // hide all error messages.
			$$('#'+form_name + ' .error').each(function(e) {
				e.removeClassName('error');
			}); // remove error class

			if ( FV.check_fields(form_name, 'required')
				&& FV.check_fields(form_name, 'minChars', 5)
				&& FV.check_fields(form_name, 'sameas') ) {
					$(form_name).submit();
					}

		});
	}
});


/* main menu navigation */

Event.observe(window, 'load', function() {
	$$('#mainnav li').each( function  (e) {
		submenu = e.className
		if (!submenu.blank()) {
			observe_menu_item(e, submenu);
		} else {
			e.observe( 'mouseover', function () {
				$$('#subnav ul').each( function (item) {
					item.hide();
				});
			});
		}
	});
});

var h = $$('html')[0];
Event.observe(h, 'click', function () {
	$$('#subnav ul').each( function (e) {
		e.hide();
	});
});

function observe_menu_item(e, submenu) {
	e.observe( 'mouseover', function () {
		$$('#subnav ul').each( function (item) {
			item.hide();
		});

		if($$( '#subnav .' + submenu )[0]) {
			$$( '#subnav .' + submenu )[0].show(); 
		}
	});

}

/* accordian code (Sub Conference Homepage)*/
Event.observe(window, 'load', function() {
	$$('#accordion h2 a').each( function  (e) {
		e.observe( 'click', function () {
			$$('#accordion h2 a').each( function (item) {
				item.removeClassName('expanded');
			});
			$$('#accordion .content').each( function (item) {
				item.hide();
			});
			Effect.BlindDown(e.up().next(), { duration: 0.2 });
			e.addClassName('expanded');
		});
	});
});

/* accordian code (Conference Homepage)*/
Event.observe(window, 'load', function() {
	$$('#accordionHome h2 a').each( function  (e) {
		e.observe( 'click', function () {
			$$('#accordionHome h2 a').each( function (item) {
				item.removeClassName('expanded');
			});
			$$('#accordionHome .contentHome').each( function (item) {
				item.hide();
			});
			Effect.BlindDown(e.up().next(), { duration: 0.2 });
			e.addClassName('expanded');
		});
	});
});

function setActiveStyleSheet(title) {
	  var i, a, main;
		for (i=0; (a = document.getElementsByTagName("link")[i]); i++) {
			if (a.getAttribute("rel") && a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
	      a.disabled = true;
	      if(a.getAttribute("title") == title) a.disabled = false;
	    }
	  }
	}
	
/***********************************************
Set maximum lengths for <textarea> fields. 
Add... maxlength="xxx" onkeyup="return textmaxlength(this)" ...to your tag.
Insert the required character limit in the maxlength parameter.
***********************************************/
function textmaxlength(obj){
	var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
		if (obj.getAttribute && obj.value.length>mlength)
		obj.value=obj.value.substring(0,mlength)
}
