/*
 * Common Site JavaScript Library
 * Author: Peter Torpey (www.petertorpey.com)
 */

if (typeof Array.prototype.indexOf != 'function') {
	Array.prototype.indexOf = function(value, start, strict){
		start = start || 0;
		for (var i = start; i < this.length; i++) {
			var item = this[i];
			if (strict ? item === value : isRegexp(value) ? value.test(item) : isFunction(value) ? value(item) : item == value) return i;
		}
		return -1;
	}
}

if (typeof Array.prototype.contains != 'function') {
	Array.prototype.contains = function(value, strict) {
 	   return this.indexOf(value, 0, strict) !== -1;
	}
}

var PT = new Object(); // Namespace

//// Events ////

PT.Events = (function () {

	var DOMLoadEvents = new Array();

	function addEvent(obj, type, handler) {
		if (type == "DOMContentLoaded" || type == "domload") {
			addDOMLoadEvent(handler);
			return;
		}
		if (obj.addEventListener) {
			obj.addEventListener(type, handler, false);
		}
		else if (obj.attachEvent) {
			obj["e" + type + handler] = handler;
			obj[type + handler] = function() { obj["e" + type + handler](window.event); }
			obj.attachEvent("on" + type, obj[type + handler]);
		}
	}

	function removeEvent(obj, type, handler) {
		if (type == "DOMContentLoaded" || type == "domload") {
			removeDOMLoadEvent(handler);
			return;
		}
		if (obj.removeEventListener) {
			obj.removeEventListener(type, handler, false);
		}
		else if (obj.detachEvent) {
			obj.detachEvent("on" + type, obj[type + handler]);
			obj[type + handler] = null;
			obj["e" + type + handler] = null;
		}
	}

	// Export into global namespace
	window.addEvent = addEvent;
	window.removeEvent = removeEvent;

	function DOMContentLoaded() {
		// quit if this function has already been called
		if (arguments.callee.done) return;

		// flag this function so we don't do the same thing twice
		arguments.callee.done = true;

		// kill the timer
		if (_timer) clearInterval(_timer);

		for (var i = 0; i < DOMLoadEvents.length; i++) {
			var handler = DOMLoadEvents[i];
			if (typeof handler == 'function') {
				handler();
			}
			DOMLoadEvents[i] = null;
		}
	}

	function addDOMLoadEvent(handler) {
		if (DOMContentLoaded.done) {
			return handler();
		}

		DOMLoadEvents[DOMLoadEvents.length] = handler;

		return null;
	}

	function removeDOMLoadEvent(handler) {
		for (var i = 0; i < DOMLoadEvents.length; i++) {
			if (DOMLoadEvents[i] === handler) {
				DOMLoadEvents[i] = null;
			}
		}
	}

	/* for Mozilla/Opera9 */
	if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", DOMContentLoaded, false);
	}

	/* for Internet Explorer */
	/*@cc_on
		var readyNode = document.createElement('document:ready');
		(function() {
			try {
				if (document.readyState != 'complete') return setTimeout(arguments.callee, 0);
				readyNode.doScroll('left');
				DOMContentLoaded();
				readyNode = null;
			}
			catch (err) {
				setTimeout(arguments.callee, 100);
			}
		})();
	@*/

	/* for Safari */
	if (/WebKit/i.test(navigator.userAgent)) { // sniff
		var _timer = setInterval(function() {
			if (/loaded|complete/.test(document.readyState)) {
				DOMContentLoaded(); // call the onload handler
			}
		}, 10);
	}

	/* for other browsers */
	addEvent(window, 'load', DOMContentLoaded);

	// Public Object Methods
	return {
		"addEvent": addEvent,
		"removeEvent": removeEvent
	};

})();


//// DOM ////

PT.DOM = (function () {

	return {
		getElementsByClassName: function (oElm, strTagName, strClassName){
			var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
			var arrReturnElements = new Array();
			strClassName = strClassName.replace(/\-/g, "\\-");
		//	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
			var oRegExp = new RegExp("\\b" + strClassName + "\\b");
			var oElement;
			for (var i = 0; i < arrElements.length; i++) {
				oElement = arrElements[i];
				if (oRegExp.test(oElement.className)) {
					arrReturnElements.push(oElement);
				}
			}
			return arrReturnElements;
		},

		createElement: function (element) {
			if (typeof document.createElementNS != 'undefined') {
				return document.createElementNS('http://www.w3.org/1999/xhtml', element);
			}
			if (typeof document.createElement != 'undefined') {
				return document.createElement(element);
			}
			return false;
		},

		addClassName: function (oElm, strClassName) {
			var strCurrentClass = oElm.className;
			if(!new RegExp(strClassName, "i").test(strCurrentClass)){
				oElm.className = strCurrentClass + ((strCurrentClass.length > 0) ? " " : "") + strClassName;
			}
		},

		removeClassName: function (oElm, strClassName) {
			var oClassToRemove = new RegExp((strClassName + "\s?"), "i");
			oElm.className = oElm.className.replace(oClassToRemove, "").replace(/^\s?|\s?$/g, "");
		},

		getStyle: function (x, styleProp) {
			var y;
			if (x.currentStyle)
				y = x.currentStyle[styleProp];
			else if (window.getComputedStyle)
				y = document.defaultView.getComputedStyle(x, null).getPropertyValue(styleProp);
			return y;
		}

	}
})();

//// Ajax ////

PT.Ajax = (function () {

	var READY_STATE_UNINITIALIZED = 0;
	var READY_STATE_LOADING = 1;
	var READY_STATE_LOADED = 2;
	var READY_STATE_INTERACTIVE = 3;
	var READY_STATE_COMPLETE = 4;

	var XMLHttpFactories = [
		function () {return new XMLHttpRequest()},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	];

	function createXMLHTTPObject() {
		var xmlhttp = false;
		for (var i = 0; i < XMLHttpFactories.length; i++) {
			try {
				xmlhttp = XMLHttpFactories[i]();
			}
			catch (e) {
				continue;
			}
			break;
		}
		return xmlhttp;
	}

	return {

		sendRequest: function (url, callback, postData) {
			var req = createXMLHTTPObject();
			if (!req) return;
			var method = (postData) ? "POST" : "GET";
			req.open(method, url, true);
			req.setRequestHeader('User-Agent', 'XMLHTTP/1.0');
			if (postData)
				req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			req.onreadystatechange = function () {
				if (req.readyState != READY_STATE_COMPLETE) return;
				if (!req || req.status != 200 && req.status != 304) {
		//			alert('HTTP error ' + req.status);
					return;
				}
				callback(req);
			}
			if (req.readyState == READY_STATE_COMPLETE) return;
			req.send(postData);
		}

	};

})();


//// Cookies ////

PT.Cookies = (function () {

	return {

		createCookie: function (name, value, days) {
			if (days) {
				var date = new Date();
				date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
				var expires = "; expires=" + date.toGMTString();
			}
			else var expires = "";
			document.cookie = name + "=" + value + expires + "; path=/";
		},

		readCookie: function (name) {
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0; i < ca.length; i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1, c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
			}
			return null;
		},

		eraseCookie: function (name) {
			createCookie(name, "", -1);
		}

	}

})();


//// Validation ////

PT.Validation = (function () {

	var emailRe = /[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+/;
	var phoneRe = /(?:1[ .-])?[(]?\d{3}[) .-]\d{3}[ .-]\d{4}/;
	var zipRe = /\d{5}(?:[ .-]?\d{4})/;

	// validation class callbacks
	function isValidRequired(e) {
		return (e.value && e.value != "");
	}

	function isValidUInt(e) {
		return (e.value && e.value.parseInt() >= 0);
	}

	function isValidInt(e) {
		return (e.value && e.value.parseInt() != NaN);
	}

	function isValidEmail(e) {
		return (e.value && emailRe.test(e.value));
	}

	function isValidPhone(e) {
		return (e.value && phoneRe.test(e.value));
	}

	function isValidZip(e) {
		return (e.value && zipRe.test(e.value));
	}

	function isValid(e, fn, req) {
		var valid = (req) ? isValidRequired(e) && fn(e) : fn(e);
		if (valid) {
			PT.DOM.removeClassName(e, 'error');
		}
		else {
			PT.DOM.addClassName(e, 'error');
		}
		return valid;
	}

	// go through form and find validation classes and assign callbacks
	return {
		initValidator: function (eForm) {
			var inputs = eForm.getElementsByTagName("input");
			for (var i = 0; i < inputs.length; i++) {
				var cur = inputs[i];
				var classes = cur.className.split(' ');
				if (classes.contains("email")) {
					PT.Event.addEvent(cur, 'change', function () {
						isValid(this, isValidEmail, classes.contains('required'));
					});
				}
				else if (classes.contains("phone")) {
					PT.Event.addEvent(cur, 'change', function () {
						isValid(this, isValidPhone, classes.contains('required'));
					});
				}
				else if (classes.contains("zip")) {
					PT.Event.addEvent(cur, 'change', function () {
						isValid(this, isValidZip, classes.contains('required'));
					});
				}
				else if (classes.contains("int")) {
					PT.Event.addEvent(cur, 'change', function () {
						isValid(this, isValidInt, classes.contains('required'));
					});
				}
				else if (classes.contains("uint")) {
					PT.Event.addEvent(cur, 'change', function () {
						isValid(this, isValidUInt, classes.contains('required'));
					});
				}
			}
		}
	}

})();

PT.Util = (function () {
	return {
		writeEmail: function (location, domain, u1, tld, u2, label, subject, cls) {
			if (document.createElement) {
				var elem = document.createElement('a');
				elem.setAttribute('href', 'mailto:' + u1  + u2 + '@' + domain + '.' + tld + ((subject) ? ('?subject=' + subject) : ''));
				elem.appendChild(document.createTextNode((label) ? label : (u1 + u2 + '@' + domain + '.' + tld)));
				if (cls) {
					elem.setAttribute('class', cls);
				}
				elem.setAttribute('rel', 'nofollow');
				var locElem = document.getElementById(location);
				locElem.parentNode.insertBefore(elem, locElem);
			}
			else if (document.write) {
				document.write('<a ' + ((cls) ? ('class="' + cls + '" ') : '') + 'rel="nofollow" href="' + 'mailto:' + u1  + u2 + '&#64;' + domain + '.' + tld + ((subject) ? ('?subject=' + subject) : '') + '">' + ((label) ? label : (u1 + '<span>' + u2 + '&#64;' + domain + '&#x2E;</span>' + tld)) + '</a>');
			}
		}
	}
})();

//// External Links
PT.Events.addEvent(window, 'load', function () {
	if (document.getElementsByTagName) {
		var anchors = document.getElementsByTagName('a');
		var anchor, relattr;
		for (var i = 0; i < anchors.length; i++) {
			anchor = anchors[i];
			relattr = anchor.getAttribute('rel');
			if (anchor.getAttribute('href') && relattr && relattr.indexOf('external') != -1) {
				anchor.target = "_blank"; // Debate about whether to use this DOM support for target on a simple onclick handler
			}
		}
	}
});
