var Browser = {
	IE: (document.all ? true : false),
	getVersion: function(){
		return parseFloat(navigator.appVersion.split('MSIE')[1]);
	},
	Safari:((navigator.userAgent.indexOf('Safari')!= -1)? true : false),
	Firefox:((!document.all&&window.XMLHttpRequest)? true : false),
	Opera:((typeof window.opera != 'undefined')? true : false),
	scrollbarWidth: function(){
		if(typeof this.scrollbarWidthStored != 'undefined'){
			return this.scrollbarWidthStored;
		}
		var wNoScroll = 0;
	    var wScroll = 0;

	    // Outer scrolling div, Start with no scrollbar
	    var a = $$.create('div');
		$$.style(a, 'position', 'absolute', 'top', '-1000px', 'left', '-1000px','width', '100px', 'height', '50px', 'overflow', 'hidden');
	    
	    // Inner content div
	    var b = $$.create('div');
		$$.style(b, 'width', '100%', 'height', '200px');

	    // Put the inner div in the scrolling div
	    $$.addChild(a, b);
	    // Append the scrolling div to the doc
	    $$.addChild(document.body, a);

	    // Width of the inner div sans scrollbar
	    wNoScroll = b.offsetWidth;
	    // Add the scrollbar
	    a.style.overflow = 'auto';
	    // Width of the inner div width scrollbar
	    wScroll = b.offsetWidth;

	    // Remove the scrolling div from the doc
	    document.body.removeChild(a);

	    // Pixel width of the scroller
		this.scrollbarWidthStored = wNoScroll - wScroll;
	    return this.scrollbarWidthStored;
	},
	windowSize: function(){
		//Firefox, mozilla, safari, opera, netscape
		var w = window.innerWidth;
		var h = window.innerHeight;

		if(typeof w == 'undefined'){
			try{
				w = document.documentElement.clientWidth;
				h = document.documentElement.clientHeight;
			}catch(e){
				w = document.body.clientWidth;
				h = document.body.clientHeight;
			}
		}
		return {x: w, y: h};
	},
	pngfix: function (img,w,h){
		if(Browser.IE && (Browser.getVersion() >= 5.5) && (Browser.getVersion() < 7) && (document.body.filters)){
			//only IE less than version 7
			var src = $$.getA(img, 'src');
			img.onload = null;
			if(!w && !h){
				w = parseInt(img.currentStyle.width);
				h = parseInt(img.currentStyle.height);
			}
			$$.style(img, 'width', w + 'px', 'height', h + 'px');
			var fimg = img.cloneNode(true);
			$$.setA(fimg, 'src', WPThemePath + 'images/blank.gif');
			$$.style(fimg, 'filter', "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', sizingMethod='scale')");
			img.parentNode.replaceChild(fimg, img);
		}
	}
};

// DOM object reference
function $$$(id){return (typeof id == 'string')? document.getElementById(id) : id;}
function $tag(x, tag){return x.getElementsByTagName(tag);}
function checkNum(num){v = '0123456789';for (var i=0; i < num.length ; i++){if (v.indexOf(num.charAt(i)) == -1){return false;}}return true;}
function setColors(elem,bg,fg){if(elem){elem.style.backgroundColor = bg; elem.style.color = fg;}}
function trim(str){return str.replace(/^\s*|\s*$/g,'');}
function addslashes(str,dbl){return (dbl)? str.replace('"','\\"'): str.replace('\'','\\\'');}
function deg2rad(deg){this.pd=Math.PI/180; return deg*this.pd;}
function encode(str){var result = '';for (i = 0; i < str.length; i++) {if (str.charAt(i) == ' '){result += '+';}else{ result += str.charAt(i);}}return escape(result);}
function escapeDblQuote(str){return str.replace(/"/g,'&quot;')}

//DOM global object
var $$ = {
	create: function(t){
		var a = document.createElement(t);
		for(var i=1; i<arguments.length; i+=2){
			switch(arguments[i]){
				case 'class': $$.setClass(a,arguments[i+1]);break;
				case 'valign': a.vAlign=arguments[i+1];break;
				case 'align': a.align=arguments[i+1];break;
				case 'colspan': a.colSpan=arguments[i+1];break;
				case 'rowspan': a.rowSpan=arguments[i+1];break;
				case 'cellpadding': a.cellPadding=arguments[i+1];break;
				case 'cellspacing': a.cellSpacing=arguments[i+1];break;
				case 'valign': a.vAlign=arguments[i+1];break;
				case 'innerText': $$.text(a,arguments[i+1]);break;
				default: $$.setA(a, arguments[i], arguments[i+1]);break;
			}
		}
		return a;
	},
	show: function(){
		var s = '';
		var n = null;
		for(var i=0; i < arguments.length; i++){
			n = $$$(arguments[i]);
			switch(n.tagName){
				case 'DIV': case 'UL': s = 'block';break;
				case 'TABLE': s = 'table';break;
				case 'TR': s = 'table-row';break;
				case 'TD': s = 'table-cell';break;
				case 'TABLE': s = 'table';break;
				case 'TBODY': case 'THEAD': s = 'table-row-group';break;
				default:
					s = 'inline';
			}
			try{n.style.display = s;}catch(e){n.style.display = 'block';}
		}
	},
	hide: function(){
		for(var i = 0; i < arguments.length; i++){
			$$$(arguments[i]).style.display = 'none';
		}
	},
	chop: function(){
		var n = '';
		for(var i = 0; i < arguments.length; i++){
			n = $$$(arguments[i]);
			n.parentNode.removeChild(n);
		}
	},
	toggle: function(n, os, oh){
		//node, onShow, onHide
		n = $$$(n);
		if(n.style.display == 'none'){
			$$.show(n);
			if(os){os();}
		}else{
			$$.hide(n);
			if(oh){oh();}
		}
	},
	toggleForce: function(n, tf){
		if(tf){
			$$.show(n);
		}else{
			$$.hide(n);
		}
	},
	opacity: function(n, o){
		n = $$$(n);
		n.style.opacity = o;
		if(Browser.IE){
			n.style.filter = 'alpha(opacity='+(o*100)+')';
			n.style.zoom = "1";//to force hasLayout
		}else{
			n.style.MozOpacity = o;
			n.style['-moz-opacity'] = o;
		}
	},
	setClass: function(n, c){
		$$.setA(n, 'class', c);
		$$.setA(n, 'className', c);
	},
	addClass: function(n, c){
		n = $$$(n);
		var cs = n.className.split(' ');
		var nc = '';
		for(var i in cs){
			//check if this class is already added
			if(c == cs[i]){
				return;
			}
			nc += cs[i] + ' ';
		}
		$$.setClass(n, nc + ' ' + c);
	},
	removeClass: function(n, c){
		n = $$$(n);
		var cs = n.className.split(' ');
		var cn = '';
		for(var i in cs){
			if(c !== cs[i]){//check if this class is NOT being removed
				cn += cs[i] + ' ';
			}
		}
		$$.setClass(n, cn);
	},
	replaceClass: function (n, classToRemove, classToAdd){
		n = $$$(n);
		classToAdd = (classToAdd) ? classToAdd : '';
		var currClasses = n.className.split(' ');
		var newClasses = '';
		var repl = false;
		var numClasses = currClasses.length;
		for(var i = 0; i < numClasses; i++){
			var currClass = '';
			if (currClasses[i] != classToRemove) {
				if(currClasses[i] == classToAdd){
					currClass = classToAdd;
					repl = true;
				}else{
					currClass = currClasses[i];
				}
			}else{
				currClass = classToAdd;
				repl = true;
			}
			newClasses += currClass + ' ';
		}
		if (!repl){ newClasses += classToAdd;}
		$$.setClass(n, newClasses);
	},
	style: function(n){
		n = $$$(n);
		var l = arguments.length;
		for(var i=1; i < l; i += 2){
			n.style[arguments[i]] = arguments[i + 1];
		}
	},
	addChild: function(n){
		n = $$$(n);
		var t = false;
		for(var i=1; i<arguments.length; i++){
			var t = arguments[i];
			if(typeof(t) == 'string'){
				n.appendChild(document.createTextNode(t));
			}else{
				n.appendChild(t);
			}
		}
	},
	text: function(n, t){
		n = $$$(n);
		while(n.childNodes.length){
			n.removeChild(n.firstChild);
		}
		if(typeof(t) == 'string'){
			n.appendChild(document.createTextNode(t));
		}else{
			n.appendChild(t);
		}
	},
	size: function(n){
		n = $$$(n);
		return {x: n.offsetWidth, y: n.offsetHeight};
	},
	position: function(n){
		n = $$$(n);
		var dx = n.offsetLeft;
		var dy = n.offsetTop;
		if(n.offsetParent){
			while( n = n.offsetParent){
				dx += n.offsetLeft;
				dy += n.offsetTop;
			}
		}
		return{x: dx, y: dy};
	},
	scrollTo: function(n, pos){
		n = $$$(n);
		var p = n.parentNode;
		var a = n.offsetTop + n.offsetHeight;
		var b = p.scrollTop + p.offsetHeight;
		var c = (n.offsetTop > p.scrollTop);
		switch(pos){
			case 'bot':
				if (c && a < b) return;
				var newScroll = p.offsetTop - p.offsetHeight + a;
				break;
			case 'top':
				if (c && a < b) return;
			default:
				var newScroll = n.offsetTop - p.offsetTop;
		}
		p.scrollTop = newScroll;		
	},
	//get attribute
	getA: function(n, a){
		return $$$(n).getAttribute(a);
	},
	//set attribute
	setA: function(n, a, v){
		$$$(n).setAttribute(a, v);
	},
	//get value
	getV: function(n){
		n = $$$(n);
		if(n.placeholder && n.value == n.placeholder){
			return '';
		}
		return n.value;
	},
	//set value
	setV: function(n, v){
		n = $$$(n);
		n.value = v;
		if(n.placeholder){
			Placeholder.blur(n);
		}
	},
	event:{
		parse: function(e){
			if(!e){e = window.event;}
			var t = false;
			if (e.target){
				t = e.target;
			}else if (e.srcElement){
				t = e.srcElement;
			}
			if (t.nodeType == 3){ // defeat Safari bug
				t = t.parentNode;
			}
			return {event:e, target:t};
		},
		cancel: function(e){
			e = e ? e : window.event;
			if(e.stopPropagation){e.stopPropagation();}
			e.cancelBubble = true;
			return true;
		}
	}
};

// Placeholder Text
var Placeholder = {
	init: function(){
		var is;
		if(arguments.length){
			//setup only the passed in nodes
			is = arguments;
			for(var i = 0; i < is.length; i++){
				Placeholder.addHandlers($$$(is[i]));
			}
		}else{
			//setup all nodes on page
			is = $tag(document, 'INPUT');
			var t = '';
			for(var i = 0; i < is.length; i++){
				t = is[i];
				if(t.type.toLowerCase() != 'text'){
					continue;		
				}else{
					Placeholder.addHandlers(t);
				}
			}
			is = $tag(document, 'TEXTAREA');
			for(var i=0; i < is.length; i++){
				t = is[i];
				Placeholder.addHandlers(t);
			}
		}
	},
	addHandlers: function(n){
		try{
			var ph = $$.getA(n, 'ph');
			if(ph && ph !== ''){
				//store placeholder on node
				n.placeholder = ph;
				if(!n.value || n.value == n.placeholder){
					n.value = '';
					//show placeholder if input has empty value
					Placeholder.blur(n);
				}
				//set up event handlers
				var of = n.onfocus;
				n.onfocus = function(){
					Placeholder.focus(n);
					//if(of){of();}
				};
				//var ob = n.onblur;
				n.onblur = function(){
					Placeholder.blur(n);
					//if(ob){ob();}
				};
			}
		}catch(e){}
	},
	focus: function(a){
		if(a.showingPH){
			a.value = '';
			a.style.color = 'black';			
		}
	},
	blur: function(a){
		//if(!trim(a.value)){
		if(!trim(a.value)){
			//input is empty or just whitepsace
			a.style.color = '#bbb';
			a.value = a.placeholder;
			a.showingPH = true;
		}else{
			a.style.color = 'black';
			a.showingPH = false;
		}
	}
};

var Form = {
	//return false if there's an empty required input
	check:function(inputs, splitName, email){
		//give inputs as an array of inputs, each one like this [id,label]
		//give splitname like this ['IDofFirstnameinput, IDoflastnanmeinput]
		
		var errors = '';
		
		//check for empty values
		for(var i=0; i < inputs.length; i++){
			if($$.getV(inputs[i][0]) == ''){
				errors += '- '+inputs[i][1]+' cannot be empty.\n';
			}
		}
		
		if(email){
			if($$.getV(email) == ''){
				//we're already catching this error above
			}else if(!Form.checkemail($$.getV(email))){
				errors += '- Your email address is not valid. Please correct it.\n';
			}			
		}
		
		if(errors != ''){
			alert('Please fix these errors before submitting:\r\n'+errors);
			return false;
		}
		
		//prepare submission names, if needed
		this.splitName(splitName);
		
		return true;
	},
	splitName: function(splitName){
		//prepare submission names, if needed
		if(splitName){
			//grab fullname from firstname box (just in case there's no javscript enabled, we don't lose this data)
			var fullname = trim($$.getV(splitName[0]));
			
			if(fullname.lastIndexOf(' ') != -1){
				//compute last name from last space, if there is one
				var lastname = fullname.substr(fullname.lastIndexOf(' ') + 1);//so we don't include the space in the lastname				
				var firstname = fullname.replace(' ' + lastname, '');//remove lastname from fullname
				
				$$.setV(splitName[0], firstname);//firstname box
				$$.setV(splitName[1], lastname);//lastname box
			}
		}
	},
	checkemail: function(e){
		if (!e || e.length > 320)
			return false;
		e = trim(e);
		var atpos = e.lastIndexOf('@');
		if (atpos<=0||atpos>=e.length-1)
			return false;
		var localPart = e.substr(0,atpos);
		var uriPart = e.substr(atpos+1);
		if (localPart.length>64)
			return false;
		if (localPart.charAt(0)=='"') {
			if (localPart.length > 1 && localPart.charAt(localPart.length-1)=='"') {
				if (localPart.length > 2 && localPart.substring(1,localPart.length-2).indexOf('"')>-1) return false;
			}
			else return false;
		}
		else {
			for (var i=0;i<localPart.length;++i) {
				var chCode = localPart.charCodeAt(i);
				if (chCode > 128) {
					return false;
				}
				var valid = false;
				if (chCode >= 65 && chCode <= 90)
					valid = true;
				else if (chCode >= 97 && chCode <= 122)
					valid = true;
				else if (chCode >= 48 && chCode <= 57)
					valid = true;
				else switch (localPart.charAt(i))
				{
					case '!':
					case '#':
					case '$':
					case '%':
					case '&':
					case '\'':
					case '*':
					case '+':
					case '-':
					case '/':
					case '=':
					case '?':
					case '^':
					case '_':
					case '`':
					case '.':
					case '{':
					case '|':
					case '}':
					case '~':
						valid = true;
						break;
					default:
						break;
				}
				if(!valid) return false;
			}
		}
		if((e.length < 6)||(e.indexOf('@',0) < 1)||(e.lastIndexOf('@') != e.indexOf('@',0))||(e.lastIndexOf('@') > (e.length - 5))||(e.lastIndexOf('.') > (e.length - 3))||(e.lastIndexOf('.') < (e.length - 4))||(e.indexOf('..',0) > -1) ||(e.indexOf('@.',0) > -1)||(e.indexOf('.@',0) > -1)||(e.indexOf(',',0) > -1)){
			return false;
		}
		
		return true;
	}
};