/*  Generic functions for all MW site pages */

function openContactInfo(contactInfo)
{
	// Makes the contact form open if the user clicks on a link with href="#contactInfo" on the same page.
	var areaToShow=contactInfo.nextSibling; // object that gets hidden and shown

	while(areaToShow.nodeType!==1)
	{
		// Makes sure the next node is a element object, not text
		areaToShow=areaToShow.nextSibling;
	}
	
	contactInfo.areaToShow=areaToShow;
	
	if(cssjs('check',contactInfo.areaToShow,'closed'))
	{
		contactInfo.innerHTML = contactInfo.innerHTML.replace('view','hide'); // change the instructions

		// Change the classes on the elements so they will be styled correctly by the class selectors in screen.css
		cssjs('swap',contactInfo,'closed','open');			
		cssjs('swap',contactInfo.areaToShow,'closed','open');		
	}
}

function expandCollapse()
{
	if(!document.createTextNode){return;} // if the browser does not support this, then don't add these functions
		
	for(var j=0;j<2;j++)
	{
		var heads;
		if (j===0) {heads=document.getElementsByTagName('h2');}
		if (j===1) {heads=document.getElementsByTagName('h3');}
		
		for(var i=0;i<heads.length;i++)
		{
			// Headers (h2, h3) need to have the .expand class for function to be added
			if(heads[i].className.indexOf("expand") !== -1)
			{			
				
				var tohide=heads[i].nextSibling; // object that gets hidden and shown
				
				while(tohide.nodeType!==1)
				{
					// Makes sure the next node is a element object, not text
					tohide=tohide.nextSibling;
				}
				
				if (heads[i].className.indexOf('open') === -1) 
				{
					// close the current header unless class="open" and next div class="shown"
					cssjs('add',tohide,'closed');
					cssjs('add',heads[i],'closed');
				}
				
				
				if (heads[i].className.indexOf('open') !== -1)
				{
					// add this bit of instruction onto each header when open
					heads[i].innerHTML += '<span class="instructions"> - (click to hide)</span>'; 
				}
				else
				{
					// add this bit of instruction onto each header when closed
					heads[i].innerHTML += '<span class="instructions"> - (click to view)</span>';
				}

				heads[i].tohide=tohide;
	
				heads[i].onclick=function()
				{
					if(cssjs('check',this.tohide,'closed'))
					{
						this.innerHTML = this.innerHTML.replace('view','hide'); // change the instructions

						// Change the classes on the elements so they will be styled correctly by the class selectors in screen.css
						cssjs('swap',this,'closed','open');			
						cssjs('swap',this.tohide,'closed','open');		
					}
					else
					{
						this.innerHTML = this.innerHTML.replace('hide','view'); // change the instructions
						
						// Change the classes on the elements so they will be styled correctly by the class selectors in screen.css
						cssjs('swap',this,'open','closed');			
						cssjs('swap',this.tohide,'open','closed');
					}
				};
			}
		}
	}
}

// adds classes onto elements
function cssjs(a,o,c1,c2)
{
	switch (a)
	{
		case 'swap':
			o.className=!cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
		break;
		case 'add':
			if(!cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
		break;
		case 'remove':
			var rep=o.className.match(' '+c1)?' '+c1:c1;
			o.className=o.className.replace(rep,'');
		break;
		case 'check':
			return new RegExp('\\b'+c1+'\\b').test(o.className);
		//break;
	}
}

function checkSpecialLinks()
{
	// grab all links and loop through them checking for anchors that need special functions
	var as = document.getElementsByTagName("a");
	for(var i=0;i<as.length;i++)
	{
		//Popup Windows. Rel attribute for anchor must be set to "popup" 
		if ((as[i].getAttribute("rel")) && (as[i].getAttribute("rel").indexOf("popup") !== -1))
		{
			// anchor tag must look like this: <a href="../foo.bar" rel="popup,window name,height,width">Link</a>
			as[i].onclick=function(){return(popup(this));};
		}

		//Close Window. Rel attribute for anchor must be set to "close"
		if (as[i].getAttribute("rel") === "close")
		{
			// close popup window buttons. This script will put the text into the anchor if the browser can use the script. If not, then there will be not button visible.
			as[i].innerHTML = "Close Window";
			as[i].className=as[i].className+ "closeWindow";
			as[i].onclick=function(){return(closePopup(this));};
		}
		
		// Contact Form links. Any link going to the anchor #contactForm will open the form up (calls openContactInfo()).
		if ((as[i].getAttribute("href")) && (as[i].getAttribute("href").indexOf("#contactInfo") !== -1))
		{
			as[i].onclick=function(){return(openContactInfo(document.getElementById("contactInfo")));};
		}
	}
}

function popup(anchorTag)
{
	var rel = anchorTag.getAttribute("rel").split(",");
	var windowAttributes = "height=" + rel[2] + ",width=" + rel[3] + ",menubar,resizable,scrollbars";
	window.open(anchorTag.getAttribute("href"),rel[1],windowAttributes);
	return false;
}

function closePopup(windowName)
{
	window.close(windowName);
}

function removeErrorMessages(formElement)
{
	// clear a single error message
	if (formElement)
	{
		spanElements = formElement.parentNode.getElementsByTagName("SPAN");
		
		for (var i=0; i<spanElements.length; i++)
		{
			if ((spanElements[i].className) && (spanElements[i].className==="validationError"))
			{
				spanElements[i].parentNode.removeChild(spanElements[i]);
			}
		}
		
	}
	
	// clear all error messages
	else 
	{

		var thisFormElement = document.getElementsByTagName("FORM");
		
		// loop through all forms
		for (var j=0; j<thisFormElement.length; j++)
		{
			// find all <span> tags within this form
			spanElements = thisFormElement[j].getElementsByTagName("SPAN");
			
			// loop through all the <span> tags
			for (var k=0; k<spanElements.length; k++)
			{
				if ((spanElements[k].className) && (spanElements[k].className==="validationError"))
				{
					// remove the <span> with the validation error message inside it
					spanElements[k].parentNode.removeChild(spanElements[k]);
				}
			}
			
		}
		
	}
}

// Validation of contact forms throughout all MW pages. All forms should have an id="contactForm"
function addContactFormValidation()
{
	//adds validation to any form called #contactForm
	if (document.getElementById("contactForm"))
	{
		document.getElementById("contactForm").onsubmit = function () {
			return (validateContactForm()); 
		};
	}
}

function validateContactForm()
{
	//Must run removeErrorMessages() a couple times to get rid off all the messages for some reason...
	removeErrorMessages();
	removeErrorMessages();
	removeErrorMessages();
	removeErrorMessages();

	var form = document.getElementById("contactForm");
	var isError = false;

	//A bit of clean up. Add any fields here to be cleaned up of weird punctuation or white space. Run through cleanOutJunk()
	form.message.value = cleanOutJunk(form.message.value); // without this the form can be submitted with a blank message (mainly if the user accidentally adds one space)

	//Check if all the required fields are filled in
	//****************************************************************************************************

	if (form.name.value === "")
	{
		addErrorMessage(form.name, "Please add your name.");
		isError = true;
	}

	
	
	if ((form.phone.value === "") && (form.email.value === ""))
	{
		addErrorMessage(form.phone, "Please enter a phone number (or email address).");
		addErrorMessage(form.email, "Please enter an email address (or phone number).");
		isError = true;
	}	
	else 
	{
		if (form.phone.value && (!checkInternationalPhone(form.phone.value)))
		{
			addErrorMessage(form.phone, "This phone number does not appear to be in an appropriate format.");
			isError = true;
		}
		if (form.email.value && ((form.email.value === "") || (!isEmail(form.email.value))))
		{
			addErrorMessage(form.email, "This email is not in the proper format (name@provider.com).");
			isError = true;
		}
	}
	
	if (form.message.value === "")
	{
		addErrorMessage(form.message, "Please let us know what we can do for you.");
		isError = true;
	}


	//End checking for filled in fields
	//****************************************************************************************************

	// if there are any errors, then don't send the info...
	if (isError === true) 
	{
		document.getElementById("errorMessageSection").innerHTML = '<p class="validationError">There were some problems with the info you provided. Please review all the fields with red text below them.</p>';
		return false;
	}
	
	// form is valid! Send info on to the PHP!
	form.validated.value = "true";
	return true;
}

// cleans any string of unwanted junk input and also changes certain characters to words
function cleanOutJunk(str)
{
	if(str !== "")
	{
		str = str.replace(/\s+|^\s|\s$/g," "); //remove multiple white spaces
		str = str.replace(/&/g," and "); //replaces & with and
		str = str.replace(/'/g,"`"); //replaces ' with `
		str = str.replace(/\.+/g,"."); //replaces multiple . with only one
		str = str.replace(/\s+,/g,","); //replaces ' ,'  with ','
		str = str.replace(/\s+\./g,"."); //replaces ' .' with '.'
		str = str.replace(/,+/g,","); //replaces multiple , characters with only one
		str = str.replace(/,\b/g,", "); //replaces , with no space after it with , with a space after it
		str = str.replace(/^\s+|\s+$|^,+|,+$|^\.|^\b\s+|\.$/g,""); //removes white space at beginning and end along with commas at the beginning.
		str = str.replace(/^\s+|\s+$|^,+|,+$|^\.|^\b\s+/g,""); //removes white space at beginning and end along with commas at the beginning.
		str = str.replace(/\s+|^\s|\s$/g," "); //remove multiple white spaces
	}
	return str;
}

//checks if the email address is proper format
function isEmail(str)
{
	var regex =/^[\-_.a-z0-9]+@(([\-_a-z0-9]+\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i;
	return regex.test(str);
}

// Phone number validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
//****************************************************************************************************
// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- .";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone number.
var minDigitsInIPhoneNumber = 10;

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++)
   {   
   	// Check that current character isn't whitespace.
   	var c = s.charAt(i);
   	if (bag.indexOf(c) === -1){returnString += c;}
   }
   return returnString;
}

function checkInternationalPhone(strPhone)
{
	var s=stripCharsInBag(strPhone,validWorldPhoneChars);
	return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}

// adds error messages to fields that have filed validation.
function addErrorMessage(field, message)
{
	// create error message inside a <span> for the given field and apply class="validationError"
	var errorMessage=document.createElement("span");
	var text = document.createTextNode(message);
	errorMessage.appendChild(text);		
	errorMessage.className="validationError";
	field.parentNode.insertBefore(errorMessage, null);
}


// Rollover JavaScript.
// Any img tag on the page with class="rollover" will be change to a rollover. Make sure you have
// a file with _over for the over state. So if you're rollover image is logo.gif make sure you have a logo_over.gif.

function findRollovers() 
{
	var imgs = document.getElementsByTagName("img");
	
	for(var i=0;i<imgs.length;i++)
	{
		if ((imgs[i].getAttribute("class")) && (imgs[i].getAttribute("class").indexOf("rollover") !== -1))
		{
			imgs[i].onmouseover=function(){this.src=this.src.replace(extension(this),"_over"+extension(this));};
			imgs[i].onmouseout=function(){this.src=this.src.replace("_over"+extension(this),extension(this));};			
			
			//preload - loads the over images. The over states must have _over before the extension. e.g. logo.jpg and logo_over.jpg//
			var overImage = new Image();
			var overImageSrc = imgs[i].src.replace(extension(imgs[i]),"_over"+extension(imgs[i]));
			overImage.src=overImageSrc;	
		}
	}
}
// finds the extention of any tag passed to this function.
function extension(tag)
{
	var extension=tag.src.split(".");
	extension="."+extension[extension.length-1];
	return extension;
}








// addLoadEvent()
// Adds event to window.onload without overwriting currently assigned onload functions.
// Function found at Simon Willison's weblog - http://simon.incutio.com/
function addLoadEvent(func)
{	
	var oldonload = window.onload;
	if (typeof window.onload !== 'function')
	{
    	window.onload = func;
	} 
	else 
	{
		window.onload = function(){oldonload();func();};
	}
}
addLoadEvent(addContactFormValidation);
addLoadEvent(checkSpecialLinks);
addLoadEvent(expandCollapse);
addLoadEvent(findRollovers);