var elementMethods = {
	hackFocus: function(element) {
		element = $(element)
		if (element.focus) {
			var t = window.setTimeout(function () {
				element.focus()
			},1)
		}
		return element
	},
	stripeTable: function(element) {
		element = $(element)
		if (element.nodeName != "TBODY") { element = element.down("TBODY") }
		var bOdd = true
		var a = $(element).childElements()
		a.each(
			function (oTR) {
				if (!Element.hasClassName(oTR,"hidden")) {
					Element.removeClassName(oTR,"stripedEven")
					Element.removeClassName(oTR,"stripedOdd")
					if (bOdd) {				
						Element.addClassName(oTR,"stripedOdd")
					} else {
						Element.addClassName(oTR,"stripedEven")
					}
					bOdd = !bOdd
				}
			}
		)
		return element
	},
	flashBorder: function (element) {
		element = $(element)
		if (element) { 
			if (element.flashTimer) { clearTimeout(element.flashTimer) }

			if (element.flashCount % 2 != 1) {
				element.style.borderColor = "red"
				element.style.borderStyle = "solid"
			} else {
				element.style.borderColor = ""
				element.style.borderStyle = ""
			}
			
			if (!element.flashCount) {
				element.flashCount = 1
				element.flashTimer = setTimeout(function () { element.flashBorder(element) }, 500)
				//element.focus()
			} else {
				if (element.flashCount < 5) {
					element.flashCount = element.flashCount +1
					element.flashTimer = setTimeout(function () { element.flashBorder(element) }, 500)
				} else {
					element.flashCount = null
					element.flashTimer = null
				}
			}
		}
		return element
	},
	catchImgErr: function (element) {
		// if image fails to load then loads a blank image
		element = $(element)
		if (element.nodeName != "IMG") { return element }
		element.observe("error", function (event) {
			element.src = "images/trans.gif"
			return element
		})
	},
	isEmail: function (element) {
		element = $(element)
				
		if (element.nodeName == "INPUT") {
			var sEmail = $F(element)
			
			var bRet = false
			if (sEmail && sEmail.length > 4) {
				var re = /^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$/i
				if (re.test(sEmail)) { bRet = element }
			}
			return bRet
		}
	},
	isUKPhone:function (element) {
		element = $(element)
		
		if (element.nodeName == "INPUT") {
			var uPhone = $F(element)
			
			var bRet = false
			if (uPhone && uPhone.length > 4) {
				var re = /^((\(?0\d{4}\)?\s?\d{3}\s?\d{3})|(\(?0\d{3}\)?\s?\d{3}\s?\d{4})|(\(?0\d{2}\)?\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$/i
				if (re.test(uPhone)) { bRet = element }
			}
			return bRet
		}
	},
	isUKMobile: function (element) {
		element = $(element)
		
		if (element.nodeName == "INPUT") {
			var uMobile = $F(element)

			var bRet = false
			if (uMobile && uMobile.length > 4) {
				var re = /^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/i
				if (re.test(uMobile)) { bRet = element }
			}
			return bRet
		}
	},
	isUKPostcode: function (element) {
		element = $(element)

		if (element.nodeName == "INPUT") {		
			sPostcode = $F(element)
			
			var bRet = false
			if (sPostcode && sPostcode.length > 4) {
				var re = /[a-zA-Z][a-zA-Z]?[0-9][0-9]? ?[0-9][a-zA-Z][a-zA-Z]/i
				if (re.test(sPostcode)) { bRet = element }
			}
			return bRet
		}
	},
	isDate: function (element) {
		element = $(element)
		
		if (element.nodeName == "INPUT") {
			var dtStr = $F(element)

			// helpers
			function DaysArray(n) {
				for (var i = 1; i <= n; i++) {
					this[i] = 31
					if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
					if (i==2) {this[i] = 29}
				}
				return this
			} 
			function daysInFebruary (year){
				// February has 29 days in any year evenly divisible by four,
				// EXCEPT for centurial years which are not also divisible by 400.
				return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
			}
			function isInteger(s){
				var i;
				for (i = 0; i < s.length; i++){   
					// Check that current character is number.
					var c = s.charAt(i);
					if (((c < "0") || (c > "9"))) return false;
				}
				// All characters are numbers.
				return true;
			}

			function stripCharsInBag(s, bag){
				var i;
				var returnString = "";
				// Search through string's characters one by one.
				// If character is not in bag, append to returnString.
				for (i = 0; i < s.length; i++){   
					var c = s.charAt(i);
					if (bag.indexOf(c) == -1) returnString += c;
				}
				return returnString;
			}
			
			var dtCh= "/";
			var minYear=1900;
			var maxYear=2100;

			var daysInMonth = DaysArray(12)
			var pos1=dtStr.indexOf(dtCh)
			var pos2=dtStr.indexOf(dtCh,pos1+1)
			var strDay=dtStr.substring(0,pos1)
			var strMonth=dtStr.substring(pos1+1,pos2)
			var strYear=dtStr.substring(pos2+1)
			strYr=strYear
			if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
			if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
			for (var i = 1; i <= 3; i++) {
				if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
			}
			month=parseInt(strMonth)
			day=parseInt(strDay)
			year=parseInt(strYr)
			if (pos1==-1 || pos2==-1){
				return false
			}
			if (strMonth.length<1 || month<1 || month>12){
				return false
			}
			if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
				return false
			}
			if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
				return false
			}
			if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
				return false
			}
			return element
		}
	}
}
