/* Author information for master.js
---------------------------------------------------
   Version 1.00 | Monday, October 19, 2009
   Script file by Keith W Bell
   www.december14.biz
--------------------------------------------------- */


/*global DOMReady, elm, addEvent, addClass, removeClass, elmsByClass, document, cancelBubbling, clearInterval, event, alert, screen */


/* Global test object
--------------------------------------------------- */

var D14 = {

	isMSIE : /*@cc_on!@*/false,

	isDOM : function() {
		if (!document.getElementById || !document.getElementsByTagName || !document.createTextNode) {
			return false;
		}
	},

	isClass : function(testClass, elm) {
		return new RegExp('\\b' + testClass + '\\b').test(elm.className);
	}

};


/* Add mobile style sheet
---------------------------------------------------
   If device screen width is 480px or less, adds
   the handheld stylesheet to the document HEAD
   with no declared media type, and removes the
   other existing stylesheet references.
--------------------------------------------------- */

var addMobileStyles = {

	init : function() {

		if (!D14.isDOM) {return false;}

		if (screen.width < 481) {
//		if (screen.width < 1281) {

		//	Config vars
			var oHead			= elm('head');
			var oPrint			= elm('css-print');
			var oScreen		= elm('css-screen');
			var oMobile		= elm('css-mobile');
			var oHandheld		= elm('css-handheld');
			var oIE6			= elm('css-ie6');

			if (oHead) {

				var oLink = document.createElement('link');

				oLink.setAttribute('type','text/css');
				oLink.setAttribute('rel','stylesheet');
			// Full URL to accommodate news.scottish-investigators.org.uk subdomain
//				oLink.setAttribute('href','http://www.scottish-investigators.org.uk/shared/handheld.css');
				oLink.setAttribute('href','/shared/handheld.css');

				oHead.removeChild(oPrint);
				oHead.removeChild(oScreen);
				oHead.removeChild(oMobile);
				oHead.removeChild(oHandheld);
				oHead.appendChild(oLink);

				if (D14.isMSIE) {
					oHead.removeChild(oIE6);
				}
			}
		}
	}
};


/* Make anti-spam email links
---------------------------------------------------
   Finds A elements with defined class name and
   converts them to 'mailto' links with optional
   help text. Style rules in base.css.
--------------------------------------------------- */

var makeMailto = {

//	Config properties
	sMailtoClass	: 'postlink',			//  The class name of the A tags to make mailto links
	sHelpClass		: 'posthelp',			//  The class name of the optional elements containing help text
	sHelpTag		: 'em',					//  The tag name of the optional elements containing help text

	init : function() {

		if (!D14.isDOM) {return false;}
	
		var aMailtoLinks	= elmsByClass(makeMailto.sMailtoClass, 'a');
		var aHelpTexts		= elmsByClass(makeMailto.sHelpClass, makeMailto.sHelpTag);

		for (var i=0; i<aMailtoLinks.length; i++) {

			var oMailtoLink = aMailtoLinks[i];

			if (oMailtoLink) {

				var oLinkText = oMailtoLink.firstChild;
				var sLinkText = oLinkText.nodeValue;

				if (sLinkText) {

					sLinkText = sLinkText.replace(/\[at\]/i, '@');
					sLinkText = sLinkText.replace(/\[dot\]/ig, '.');
					sLinkText = sLinkText.replace(/\s/g, '');

					var oNewLinkText = document.createTextNode(sLinkText);
					oMailtoLink.replaceChild(oNewLinkText, oLinkText);
				}
				oMailtoLink.href = 'mailto:' + sLinkText;
				removeClass(oMailtoLink, makeMailto.sMailtoClass);
			}
		}

		for (var j=0; j<aHelpTexts.length; j++) {

			var oHelpText = aHelpTexts[j];

			if (oHelpText) {
				oHelpText.parentNode.removeChild(oHelpText);
			}
		}
	}
};


/* Do form processing stuff
---------------------------------------------------
   D14 all-purpose form handler. Autopopulation &
   label hiding features not used on this site.
--------------------------------------------------- */

var processForms = {

	hideLabelFor : function(id) {
		var aLabels = document.getElementsByTagName('label');

	//	Config vars
		var sInitialLabelClass	= 'access';
		var sHiddenLabelClass		= 'replaced';

		for (var i=0; i<aLabels.length; i++) {
			var oLabel = aLabels[i];
			if (oLabel.htmlFor === id) {
				if (D14.isClass(sInitialLabelClass, oLabel)) {
					addClass(oLabel, sHiddenLabelClass);
					removeClass(oLabel, sInitialLabelClass);
				}
			return true;
			}
		}
	},

	clearDefault : function() {
		if (this.nodeName === 'TEXTAREA') {
			if (this.value === this.title) {
				this.value = '';
			}
		}

		if (this.value === this.defaultValue) {
			this.value = '';
		}
	},

	setDefault : function() {
		if (this.nodeName === 'TEXTAREA') {
			if (this.value === '' && this.title !== '') {
				this.value = this.title;
			}
		}

		if (this.value === '') {
			this.value = this.defaultValue;
		}
	},

	resetInputs : function(form) {
		for (var i=0; i<form.elements.length; i++) {
			var oField = form.elements[i];

		//	Config vars
			var sAutoPopulateClass = 'auto';

			if (oField.nodeName === 'TEXTAREA') {
				if (D14.isClass(sAutoPopulateClass, oField)) {
					if (oField.value === '' && oField.title !== '') {
						oField.value = oField.title;
						processForms.hideLabelFor(oField.id);
					}
					addEvent(oField, 'focus', processForms.clearDefault);
					addEvent(oField, 'blur', processForms.setDefault);
				}
			}

			if (oField.type !== 'text') {
				continue;
			}

			if (D14.isClass(sAutoPopulateClass, oField)) {
				if (oField.defaultValue === '' && oField.title !== '') {
					oField.defaultValue = oField.title;
					oField.value = oField.defaultValue;
					processForms.hideLabelFor(oField.id);
				}
			}

			if (!oField.defaultValue) {
				continue;
			}

			addEvent(oField, 'focus', processForms.clearDefault);
			addEvent(oField, 'blur', processForms.setDefault);
		}
	},

	isRequiredOK : function(field) {
		var bResult = (field.value.length < 1 || field.value === field.defaultValue || field.value === field.title) ? false : true;
		return bResult;
	},

	isEmailOK : function(field) {
		var sRegX = /^(([^@\s()\[\]<>\\.,;:\"]+(\.[^@\s()\[\]<>\\.,;:\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,6}))$/;
		var bResult = field.value.match(sRegX) ? true : false;
		return bResult;
	},

	validateForm : function(form) {

	//	Config vars
		var sRequiredFieldClass	= 'required';
		var sEmailFieldClass		= 'email';

		for (var i=0; i<form.elements.length; i++) {
			var oField = form.elements[i];

			if (D14.isClass(sRequiredFieldClass, oField)) {
				if (!processForms.isRequiredOK(oField)) {
					var sFieldName = (oField.title) ? oField.title : oField.name;
					alert('Please enter the required details in the "' + sFieldName + '" field.');
					oField.focus();
					return false;
				}
			}

			if (D14.isClass(sEmailFieldClass, oField)) {
				if (!processForms.isEmailOK(oField)) {
					var sEmailFieldName = (oField.title) ? oField.title : oField.name;
					alert('You appear to have entered an invalid address in the "' + sEmailFieldName + '" field. Please try again.');
					oField.focus();
					return false;
				}
			}

			if (oField.nodeName === 'TEXTAREA' || oField.type === 'text') {
				if (oField.nodeName === 'TEXTAREA') {
					if (oField.value === oField.title) {
					oField.value = '';
					}
				}
				if (oField.value === oField.defaultValue) {
					oField.value = '';
				}
			}
		}

		return true;
	},

init : function() {

	//	Config var
		var formIdToValidate = 'sai-cf';

		var oForm = elm(formIdToValidate);

		if (!D14.isDOM || !formIdToValidate) {return false;}

		else {
			processForms.resetInputs(oForm);
			oForm.onsubmit = function() {
					return processForms.validateForm(this);
			};
		}
	}
};


/* Register events
--------------------------------------------------- */

var eMakeMailto			= new DOMReady(makeMailto.init);
var eProcessForms		= new DOMReady(processForms.init);
var eAddMobileStyles	= new DOMReady(addMobileStyles.init);
