/////////////////////////////////////////////////////////////////////
//	Form functions - Mark Thomas 2001
//	Version 2.2
//	formObjName as string
//	functions automatically find form elements within divs for NS4 
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
// Valid Form
// checks multiple form elements simultaneously
// returns true if all valid
// eg validForm('email','email','invalid email','subject','select','select a subject','tel','tel','enter tel num')
// elem type can be  email, tel, fax, postcode, select, else checks if empty
// if select checks that first option is NOT selected
/////////////////////////////////////////////////////////////////////

function validForm(formElements,elemTypes,errorMsgs){

	var a = arguments, i;
	for(i=0; i < (a.length-2); i+=3){
		if(a[i+1] == "email"){if(!validEmail(a[i])){if(!isEmpty(getValue(a[i]))){alert(getValue(a[i])+" is not a valid email address")}else{alert(a[i+2]);}a[i].f;giveFocus(a[i]);return false}}
		else if(a[i+1] == "tel" || a[i+1] == "fax"){if(!validTel(a[i])){ alert(a[i+2]);giveFocus(a[i]);return false}}
		if(a[i+1] == "postcode"){if(!validPostcode(a[i])){if(!isEmpty(getValue(a[i]))){alert(getValue(a[i])+" is not a valid postcode")}else{alert(a[i+2]);}a[i].f;giveFocus(a[i]);return false}}
		else if(a[i+1] == "select"){if(selectboxIndex(a[i]) == 0){ alert(a[i+2]);giveFocus(a[i]);return false}}
		else if(isEmpty(getValue(a[i]))){ alert(a[i+2]);giveFocus(a[i]);return false}
	}
	return true
}

function giveFocus(formObjName){
	find(formObjName).focus()
	scrollBy(0,-20)
}
/////////////////////////////////////////////////////////////////////
// General
/////////////////////////////////////////////////////////////////////


function getValue(formObjName){
	if(find(formObjName).type.indexOf('select') != -1){
		return find(formObjName)[selectboxIndex(formObjName)].value
	}else{
		return find(formObjName).value
	}
}

function clearFormElement(formObjName){
	if(find(formObjName).type == "select-multiple" || find(formObjName).type == "select-one"){
		find(formObjName).length = 0
	}else{
		find(formObjName).value = ""
	}
}

function formReset(formName){	// doesn't clear hidden elements or select boxes
	formName = find(formName)
	for(var i=0; i<formName.length; i++){
		if(formName[i].type == "text" || formName[i].type == "password" || formName[i].type == "textarea")formName[i].value = ""
		else if(formName[i].type == "checkbox" || formName[i].type == "radio")formName[i].checked = false
		else if(formName[i].type == "select-one")formName[i].selectedIndex = 0
		else if(formName[i].type == "select-multiple")formName[i].selectedIndex = 0
	}
}
/////////////////////////////////////////////////////////////////////
//	Text boxes and Textareas
/////////////////////////////////////////////////////////////////////

function copyFormValue(fromformObjName,toformObjName){
	find(toformObjName).value = find(fromformObjName).value
}

function validEmail(formObjName){//contains @ and .
	return isEmail(find(formObjName).value)
}

function validTel(formObjName){// numbers only more than 7 digits spaces ok
	if(isInteger(stripWhitespace(find(formObjName).value)) && stripWhitespace(find(formObjName).value).length > 6)return true
	else return false
}

function validPostcode(formObjName){
	return isPostcode(find(formObjName).value)
}

function validNumber(formObjName){// Integer OR floating point
	if(isInteger(find(formObjName).value) || isFloat(find(formObjName).value)){ return true
	}else{return false}
}

function validInteger(formObjName){
	return isInteger(find(formObjName).value)
}

function validFloat(formObjName){//floating point
	return isFloat(find(formObjName).value)
}

function validWord(formObjName){//alphabetical chars only
	return isAlphabetic(find(formObjName).value)
}

function validWordOrNumber(formObjName){	//letters OR numbers
	if(validWord(find(formObjName).value) || validNumber(find(formObjName).value)){ return true
	}else{return false}
}

function validAlphanumeric(formObjName){	//only letters and numbers
	return isAlphanumeric(find(formObjName).value)
}

function urlEncode(formObjName){
	find(formObjName).value = escape(find(formObjName).value)
}

function urlDecode(formObjName){
	find(formObjName).value = unescape(find(formObjName).value)
}

/////////////////////////////////////////////////////////////////////
//	select boxes
/////////////////////////////////////////////////////////////////////

function selectMenu(targ,selectName,resetSelect){// takes value of select option as url
	selectName = find(selectName)
	eval(targ+".location='"+selectName.options[selectName.selectedIndex].value+"'");
	if (resetSelect) selectName.selectedIndex = 0;
}

function selectboxIndex(formObjName){//returns index of current selected option
	return find(formObjName).selectedIndex
}

function addOption(formObjName,newValue,newText){//adds new option to end of select box
	formObjName = find(formObjName)
	formObjName.length += 1
	formObjName[formObjName.length - 1].value = newValue
	formObjName[formObjName.length - 1].text = newText
}

function removeOptionByName(formObjName,oldText){//removes option from select box
	formObjName = find(formObjName)
	for(var i=0; i<formObjName.length; i++){
		if(formObjName[i].text == oldText){
			formObjName[i].value = formObjName[i+1].value
			formObjName[i].text = formObjName[i+1].text
			formObjName.length -= 1
			return
		}
	}
}

function removeOptionByValue(formObjName,oldValue){//removes option from select box
	formObjName = find(formObjName)
	for(var i=0; i<formObjName.length; i++){
		if(formObjName[i].value == oldValue){
			formObjName[i].value = formObjName[i+1].value
			formObjName[i].text = formObjName[i+1].text
			formObjName.length -= 1
			return
		}
	}
}

function otherTitle(formObjName){	// adds "other" to a title select box
	formObjName = find(formObjName)
	if(formObjName.value=="Other"){
		var newtitle = prompt('Please enter your title','');
		if(newtitle==null||newtitle==""){
			formObjName.blur();
			return;
		}else{
			formObjName.options[formObjName.selectedIndex].text = newtitle;
			formObjName.options[formObjName.selectedIndex].value = newtitle;
			formObjName.length += 1;
			formObjName.options[formObjName.length-1].text = "Other...";
			formObjName.options[formObjName.length-1].value = "Other";
			formObjName.blur();
		}
	}
}
////////////////////////////////////////////////////////////////////////
//	Check boxes
////////////////////////////////////////////////////////////////////////

function isChecked(formObjName){
	return (find(formObjName).checked)
}

/////////////////////////////////////////////////////////////////////
// Radio
/////////////////////////////////////////////////////////////////////

function validradio(formObjName){
	realformObj=find(formObjName)
	for(i=0; i<=realformObj.length-1; i++)if (realformObj[i].checked==true)return realformObj[i].value 
	return false;
}

////////////////////////////////////////////////////////////////////////
//	Cookie Functions
////////////////////////////////////////////////////////////////////////

function getCookieValue(which){
	var cookieVal = "";
	which = which + "=";
	var cookieStr = document.cookie
	var cookieLen = cookieStr.length
	var valueLen = which.length
	var startCookie = cookieStr.indexOf(which)
	if (startCookie != -1){
		tempStr = rightStr(cookieStr, cookieLen - (startCookie + valueLen))
		var endCookie = tempStr.indexOf(";")
		if (endCookie == -1) retVal = tempStr
		else cookieVal = leftStr(tempStr, endCookie)
		}
	return cookieVal
}

function setCookieValue(CookieName,ValueString){
	now = new Date()
	years = now.getYear()+1910
	Expire = new Date(years,11,31);
	ValueString = escape(ValueString);
	document.cookie = CookieName+"="+ValueString+"; expires="+Expire.toGMTString();
}

////////////////////////////////////////////////////////////////////////
//	Check strings - required for above functions
////////////////////////////////////////////////////////////////////////

function rightStr(InString, num)  {
	OutString=InString.substring (InString.length-num, InString.length);
	return (OutString);
}

function leftStr(InString, num){
	OutString=InString.substring (InString, num);
	return (OutString);
}

function In(String1,String2){
	if (String1.indexOf(String2) != -1) return true 
	else return false
}

function stripChars(s, chars){
	var i;
	var returnString = "";
	for(i = 0; i < s.length; i++){
        var c = s.charAt(i);
        if(chars.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}
function stripCharsExcept (s, chars){
	var returnString = "";
	for(var i = 0; i < s.length; i++){
        var c = s.charAt(i);
        if(chars.indexOf(c) != -1) returnString += c;
    }
    return returnString;
}
function stripWhitespace (s){
	return stripChars (s, whitespace)
}
function isWhitespace(s){
    if(isEmpty(s)) return true;
    for(var i = 0; i < s.length; i++){
        var c = s.charAt(i);
        if(whitespace.indexOf(c) == -1) return false;
    }    
	return true;
}
function isEmpty(s){
	return ((s == null) || (s.length == 0))
}
function isInteger(s){
    if(isEmpty(s)) return false
    for(var i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if(!isDigit(c)) return false;
    }
    return true;
}
function isFloat(s){
	var seenDecimalPoint = false;
	if(isEmpty(s)) return false
	if(s == decimalPointDelimiter) return false;
	for(var i = 0; i < s.length; i++){
		var c = s.charAt(i);
		if((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
		else if(!isDigit(c)) return false;
    }
    return true;
}
function isAlphabetic(s){
    if(isEmpty(s)) return false		
    for(var i = 0; i < s.length; i++){
        if(!isLetter(s.charAt(i)))
        return false;
    }
	return true;
}
function isAlphanumeric(s){
    if(isEmpty(s)) return false
	for(var i = 0; i < s.length; i++){
			var c = s.charAt(i);
        if(! (isLetter(c) || isDigit(c) ) )
        return false;
    }
    return true;
}
function isPostcode(s){
    if(isEmpty(s)) return false
	s = stripWhitespace(s)
	var pcLength = (isLetter(s.charAt(1))) ? 7 : 6
	if(s.length !=  pcLength) return false
	for(var i = 0; i < s.length; i++){
		var c = s.charAt(i);
		if(i == 0 && !isLetter(c)) return false
		if(i == 2 && !isDigit(c)) return false
		if((i == s.length-1 || i == s.length-2) && !isLetter(c)) return false
        if(! (isLetter(c) || isDigit(c)) )return false;
	}
	return true;
}
function isLetter(c){
	return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}
function isDigit(c){
	return ((c >= "0") && (c <= "9"))
}
function isLetterOrDigit(c){
	return (isLetter(c) || isDigit(c))
}
function isEmail(s){
	if(isEmpty(s)) return false
	if(isWhitespace(s)) return false;
    var i = 1;
    while ((i < s.length) && (s.charAt(i) != "@")){i++}
    if ((i >= s.length) || (s.charAt(i) != "@")) return false;
    else i += 2;
    while ((i < s.length) && (s.charAt(i) != ".")){i++}
    if ((i >= s.length - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}
////////////////////////////////////////////////////////////////////////
//	global variables
////////////////////////////////////////////////////////////////////////
var whitespace = " \t\n\r";
var decimalPointDelimiter = "."
////////////////////////////////////////////////////////////////////////

function find(objName,doc) {// gets ref to nested objects in divs or frames
	var i,realObjref;
	if(!doc) doc=document;	// ns4 on second go
	if(!(realObjref = doc[objName]) && doc.all) realObjref = doc.all[objName]; //ie
	for (i = 0; !realObjref && i < doc.forms.length; i++) realObjref = doc.forms[i][objName];
	for(i = 0; !realObjref && doc.layers && i < doc.layers.length; i++) realObjref = find(objName,doc.layers[i].document);//ns4
	if(!realObjref && document.getElementById) realObjref = document.getElementById(objName);//ie 5.5 and ns6
	return realObjref;
}
////////////////////////////////////////////////////////////////////////


