﻿/* --------------------- */
/* General Use Functions */
/* --------------------- */

// For use with <select> element "Other" case
function togglediv(dname,sname,sval)
{
	var sel = getObj(sname);
	var d = getObj(dname);
	if (sel.options[sel.options.selectedIndex].value == sval) {
		d.style.visibility = "visible";
		d.style.display = "block";
	} else {
		d.style.visibility = "hidden";
		d.style.display = "none";
	}
}

// For use with stopover <div>s
// 'inc' argument will prepopulate specified div with previous div's amenities
function toggleandpop(dname,alink,inc)
{
	var d = getObj(dname);
	var al = getObj(alink);
	if (d.style.visibility == "visible") {
		d.style.visibility = "hidden";
		d.style.display = "none";
		al.style.visibility = "visible";
		al.style.display = "inline";
	} else {
		d.style.visibility = "visible";
		d.style.display = "block";
		al.style.visibility = "hidden";
		al.style.display = "none";
	}

	if (inc) {
		var elem,ne,ao,nao;
		for (var i=0; i<amenities.length; i++){
			elem = amenities[i] + "_" + (inc-1);
			ne = amenities[i] + "_" + inc;
			ao = getObj(elem);
			nao = getObj(ne);
			switch (ao.type) {
				case "text":
					nao.value = ao.value;
					break;
				case "select-one":
					nao.selectedIndex = ao.selectedIndex;
					break;
				case "radio":
					fao = eval("document.forms['form_request']." + elem);
					fnao = eval("document.forms['form_request']." + ne);
					setRadioValue(fnao,getRadioValue(fao));
					break;
			}
		}				
	}
}

// Browser-agnostic element finder
function getObj(name)
{
	var returned;
	if (document.getElementById) {
		returned = document.getElementById(name);
	}
	else if (document.all) {
		returned = document.all[name];
	}
	else if (document.layers) {
		returned = document.layers[name];
	}
	return returned;
}

// Fetch radio series value :: requires an object
function getRadioValue(radioObj)
{
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

// Set radio series value :: requires an object
function setRadioValue(radioObj, newValue)
{
	if(!radioObj)
		return;
	var radioLength = radioObj.length;
	if(radioLength == undefined) {
		radioObj.checked = (radioObj.value == newValue.toString());
		return;
	}
	for(var i = 0; i < radioLength; i++) {
		radioObj[i].checked = false;
		if(radioObj[i].value == newValue.toString()) {
			radioObj[i].checked = true;
		}
	}
}



/* -------------------- */
/* Validation Functions */
/* -------------------- */


function isValid (tval, pattern)
{
	if ( tval.search(pattern) == -1 ) {
		return false;
	} else
		return true;
}

function fieldExists (fieldname)
{
	if ( getObj(fieldname) )
		return true;
	else
		return false;
}

// Validate request forms
function validate (fname)
{
	var errMsgs = new Array();
	var ec = 0;
	var els = document.forms[fname].elements;
	
	// All fields may not be present if user is signed in
	for (var i=0; i<els.length; i++){
		switch ( els[i].name ) {
			case 'your_name':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please provide your name.";
					ec++;
				}
				break;
			case 'address_1':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please provide your street address.";
					ec++;
				}
				break;
			case 'city':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please include your city.";
					ec++;
				}
				break;
			case 'state':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please include your state.";
					ec++;
				}
				break;
			case 'zip_1':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please include your zip code.";
					ec++;
				}
				else if ( els[i].value.length < 5 ) {
					errMsgs[ec] = "Please include a valid zip code.";
					ec++;
				}
				break;
			case 'group_name':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please tell us your group name.";
					ec++;
				}
				break;
			case 'group_type':
				if ( els[i].value == "" ){
					errMsgs[ec] = "Please choose a group type.";
					ec++;
				} else if ( els[i].value == "Other" ){
					if ( (els['group_type_other'].value == "Please explain...") || (els['group_type_other'].value == "") ) {
						errMsgs[ec] = "Please describe your group.";
						ec++;
					}
				}
				break;	
			default:
				break;
		}
	}
	
	// Pattern matching
	if ( fieldExists('phone') ) {
		var phone_number = els['phone'].value;
		var ppat = /^\d\d\d-\d\d\d-\d\d\d\d$/;
		if ( !isValid(phone_number,ppat) ) {
			errMsgs[ec] = "Please provide a valid phone number (xxx-xxx-xxxx).";
			ec++;
		}
	}
	if ( fieldExists('fax') ) {
		var fax_number = els['fax'].value;
		var fpat = /^\d\d\d-\d\d\d-\d\d\d\d$/;
		if ( !isValid(fax_number,fpat) ) {
			errMsgs[ec] = "Please provide a valid fax number (xxx-xxx-xxxx).";
			ec++;
		}
	}
	if ( fieldExists('email') ) {
		var email = els['email'].value;
		var epat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/;
		if ( !isValid(email,epat) ) {
			errMsgs[ec] = "Please provide a valid email address.";
			ec++;
		}
	}
	
	// Conditional validation for stopovers
	var dname,stopc=1;
	for (var i=1; i<=5; i++) {
		dname = "stopover_" + i;
		divo = getObj(dname);
		if ( (divo.style.visibility == 'visible') || (i == 1) ) {
			if ( els["stay_city_state_"+i].value == "" ){
				errMsgs[ec] = "Please enter a destination for Stopover #" + i;
				ec++;
			}
			if ( els["stay_city_state_"+i].value == "Other" ){
				if ( (els["stay_city_"+i].value == "Enter a city...") || (els["stay_city_"+i].value == "") ){
					errMsgs[ec] = "Please enter a destination city for Stopover #" + i;
					ec++;
				}
				if ( els["stay_state_"+i].value == "" ){
					errMsgs[ec] = "Please enter a destination state for Stopover #" + i;
					ec++;
				}
			}
			if ( els["stay_arrival_date_"+i].value == "" ){
				errMsgs[ec] = "Please enter an arrival date for Stopover #" + i;
				ec++;
			}
			if ( els["stay_departure_date_"+i].value == "" ){
				errMsgs[ec] = "Please enter an departure date for Stopover #" + i;
				ec++;
			}
			if ( fieldExists('stay_event_type_'+i) ) {
				if ( els["stay_event_type_"+i].value == "" ){
					errMsgs[ec] = "Please select an event type for Stopover #" + i;
					ec++;
				} else if ( els["stay_event_type_"+i].value == "Other" ) {
					if ( (els["stay_event_type_other_"+i].value == "") || (els["stay_event_type_other_"+i].value == "Please explain...") ) {
						errMsgs[ec] = "Please describe your event for Stopover #" +i;
						ec++;
					}
				}
			}
		}
	}
	
	if ( errMsgs.length != 0 ) {
		var output="<strong>The following problems have been detected:</strong><br><br>";
		
		for (var i in errMsgs){
			output += errMsgs[i] + "<br>\n";
		}
		output += "<br><br>\n";
		errd = getObj('errors');
		errd.innerHTML = output;
		window.scroll(0,0);
		return false;
	} else {
		document.forms[fname].submit();
		return true;
	}
	
}

// Takes an array of field name:value pairs and sets
// the value of form elements with the same names
function popFieldsFromArray(fields,prefix,suffix)
{
	var fo;
	for (var i in fields) {
		if ( fo = getObj(prefix + i + suffix) ) {
			fo.value = fields[i];
		}
	}
}

// Pre-populates amenities when user_amenities cookie is present
function popAmenities()
{
	var amlist = assocArrayFromCookie('user_amenities');
	var suf = "_1";
	var fo;
	
	for (var i in amlist) {
		if ( fo = getObj(i + suf) ) {
			switch (fo.type) {
				case "text":
					fo.value = amlist[i];
					break;
				case "select-one":
					for (var j=0; j<fo.options.length; j++) {
						if ( fo.options[j].value == amlist[i] )
							fo.selectedIndex = j;
					}
					break;
				case "radio":
					ho = eval("document.forms['form_request']." + i + suf);
					setRadioValue( ho, amenityLookup(amlist[i]) );
					break;
			}
		}
	}
}

// Pre-populates fields from user_ContactInfo cookie
function popContactInfo(suffix)
{
	var clist = assocArrayFromCookie('user_contactinfo');
	var fo;
	for (var i in clist) {
		if ( fo = getObj(i + suffix ) ) {
			switch (fo.type) {
				case "text":
					fo.value = clist[i];
					break;
				case "select-one":
					for (var j=0; j<fo.options.length; j++) {
						if ( fo.options[j].value == clist[i] )
							fo.selectedIndex = j;
					}
					break;
				case "radio":
					ho = eval("document.forms['form_request']." + i + suf);
					setRadioValue( ho, amenityLookup(clist[i]) );
					break;
			}
		}
	}
}

// Lookup table for common amenities values
function amenityLookup(val)
{
	var ret;
	switch(val) {
		case "1":
			ret = "Must Have";
			break;
		case "2":
			ret = "Nice to Have";
			break;
		case "3":
			ret = "Not Required";
			break;
		default:
			ret = val;
			break;
	}
	return ret;
}

function popFromQueryString( fname )
{
	var qs = window.top.location.search.substring(1);
	qs = unescape(qs);
	var qa = qs.split('&');
	var fels = document.forms[fname].elements;
	var pfields = new Array();
	var eh = new Array();
	
	for ( var i in qa ) {
		eh = qa[i].split('=');
		pfields[eh[0]] = eh[1];
	}
	for (var j in pfields ) {
		switch (j) {
			case "city_state":
				fels['stay_city_state_1'].value = pfields[j];
				if ( pfields[j] == "Other" )
					togglediv('stay_city_state_other_1','stay_city_state_1','Other');
				break;
			case "city":
				fels['stay_city_1'].value = pfields[j];
				break;
			case "state":
				fels['stay_state_1'].value = pfields[j];
				break;
			case "search_surrounding":
				if ( pfields[j] == "on" )
					fels['stay_search_surrounding_1'].checked = true;
				break;
			default:
				break;
		}
	}
}

