var isIE = (/MSIE/.test(navigator.userAgent));
var slideShowTimer = null;

/*******************************************************/
/*************  GENERAL CODE FOR HANDLING  *************/
/**************  PAGE INITIAL LOADING  *****************/
/*******************************************************/

	


/*******************************************************/
/********** BEHAVIOUR CODE FOR ATTACHING JSCRIPT *******/
/**********  TO HTML WITH SPECIAL FUNCTIONALITY	********/
/*******************************************************/
//Examples:	<IMG src="images/test.jpg" class="rolloverImage"/>
//			<A href="/some/test/page.htm" class="siteNavigationLink">Click Me</A>

var websiteRules = {
	'IMG.rolloverImage': function(image){
		image.onmouseover = function(){turnImageOn(image);};
		image.onmouseout = function(){turnImageOff(image);};				
	},	
	
	'IMG.rolloverHoverImage': function(image){
		image.onmouseover = function(){turnImageOn(image);setHoverTimer(image);};
		image.onmouseout = function(){turnImageOff(image);removeHoverTimer(image);};
	},
	
	'IMG.rolloverClickImage': function(image){
		image.onmouseover = function(){turnImageOn(image);};
		image.onmouseout = function(){turnImageOff(image);};
		if(isIE){
			image.attachEvent('onclick', function(){turnImageClickOn(image);});
		}else{
			image.addEventListener('click', function(){turnImageClickOn(image);}, false);
		}				
	},	
	
	'IMG.rolloverAreaImage': function(image){
		var mapAreas = $(image.useMap.replace('#', '')).getElementsByTagName('area');
		for(var i = 0; i < mapAreas.length; i++){
			if(isIE){
				mapAreas[i].onmouseover = function(){showImageWithKey(image, window.event);};
				mapAreas[i].onmouseout = function(){showImageWithKey(image, window.event);};
			}else{
				mapAreas[i].addEventListener('mouseover', function(e){showImageWithKey(image, e);}, false);
				mapAreas[i].addEventListener('mouseout', function(e){showImageWithKey(image, e);}, false);
			}
		}		
	},		
	
	'.siteNavLink': function(link){
		link.onclick = function(){
			if(link.target != ''){return;}
			var destinationHREF = (link.href.indexOf(document.location.hostname) && link.href.indexOf(':') == -1)?link.href.substr(link.href.indexOf(document.location.hostname)+document.location.hostname.length):link.href;
			if(window.top.header == null){
				window.top.processNavigationRequest(destinationHREF);
			}else{
				window.top.header.processNavigationRequest(destinationHREF);
			}
			return false;};
	},
	
	'#menuGalleryContainer': function(gallery){
		try{
			var largeImage = document.getElementById('galleryLargeImage');
			var largeImageDescription = document.getElementById('largeGalleryImageDescription');
			var galleryToolbox = document.getElementById('galleryToolbox');
			var backButton = document.getSubElementsByClassName(galleryToolbox, 'backButton')[0];
			var nextButton = document.getSubElementsByClassName(galleryToolbox, 'nextButton')[0];
			var playButton = document.getSubElementsByClassName(galleryToolbox, 'playButton')[0];
			var pauseButton = document.getSubElementsByClassName(galleryToolbox, 'pauseButton')[0];	
			var galleryImageIndex = document.getElementById('currentGalleryImageIndex');
			
			var imagesList = document.getElementById('galleryImagesList');
			var galleryImages = document.getSubElementsByClassName(imagesList, 'galleryImage');
			
			//Attach events to the next and back buttons
			var contextObject = {galleryImages:galleryImages, currentImage:largeImage, currentDescription:largeImageDescription, imageIndex:galleryImageIndex};
			if(document.attachEvent){
				nextButton.attachEvent('onclick', showNextGalleryImage.bindWithArguments(this, contextObject));
				backButton.attachEvent('onclick', showPreviousGalleryImage.bindWithArguments(this, contextObject));
				playButton.attachEvent('onclick', startGallerySlideshow.bindWithArguments(this, contextObject));
				pauseButton.attachEvent('onclick', pauseGallerySlideshow.bindWithArguments(this, contextObject));
			}else{
				nextButton.addEventListener('click', showNextGalleryImage.bindWithArguments(this, contextObject), false);
				backButton.addEventListener('click', showPreviousGalleryImage.bindWithArguments(this, contextObject), false);
				playButton.addEventListener('click', startGallerySlideshow.bindWithArguments(this, contextObject), false);
				pauseButton.addEventListener('click', pauseGallerySlideshow.bindWithArguments(this, contextObject), false);
			}			
		}catch(e){
			alert('Failed to load the Photo Gallery because an expected object was not present in the HTML.' + e.message);
			throw(e);
		}		
	}
	
};



try{
	Behaviour.register(websiteRules);
}catch(e){
	//Happened because the behaviour script is not loaded yet
	//Attempt to register after the page finishes loading
	if(document.attachEvent){
		document.attachEvent('onload', new Function('try{Behaviour.register(websiteRules);}catch(e){}'));
	}else{
		document.addEventListener('load', new Function('try{Behaviour.register(websiteRules);}catch(e){}'), true);
	}
}
	



/*******************************************************/
/**************** DOM EXTENSION FUNCTIONS  *************/
/*******************************************************/
document.getElementsByClassName = function(className){return document.getSubElementsByClassName(document, className);}
			
document.getSubElementsByClassName = function(parentElement, className){
			var returnElements = new Array();
			var classExpression = new RegExp('\\b'+className+'\\b');
			var pageElements = parentElement.getElementsByTagName('*');

			for(var i = 0; i < pageElements.length; i++){
				var currentClassName = pageElements[i].className;
				if(classExpression.test(currentClassName)){returnElements.push(pageElements[i]);}
			}
			return returnElements;}
			
document.getElementsByName = function(name){
			var returnElements = new Array();
			var nameExpression = new RegExp('\\b'+name+'\\b');
			var pageElements = document.getElementsByTagName('*');

			for(var i = 0; i < pageElements.length; i++){
				var currentName = pageElements[i].getAttribute('name');
				if(nameExpression.test(currentName)){returnElements.push(pageElements[i]);}
			}
			return returnElements;}

document.deepAppendChildNode = function(destContainingNode, srcNode){
	var newNode = destContainingNode.ownerDocument.createElement(srcNode.nodeName);
	if(srcNode.selectSingleNode("text()") != null){
		newNode.text = srcNode.selectSingleNode("text()").nodeValue;}
	destContainingNode.appendChild(newNode);
	if(srcNode.childNodes.length > 0){
		for(var i = 0; i < srcNode.childNodes.length; i++){
			if(srcNode.childNodes[i].nodeName != "#text"){deepAppendChildNode(newNode, srcNode.childNodes[i]);}
		}
	}			
}

document.loadXMLContent = function(xmlContent){
	if(isIE){    
		var xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
    	xmlDocument.async = false;
    	xmlDocument.loadXML(xmlContent);
    	return xmlDocument;
	}else{   
		var xmlParser = new DOMParser();
    	var xmlDocument = xmlParser.parseFromString(xmlContent, 'text/xml');
    	return xmlDocument;
	}
}


document.getStyleSheetRule = function(sheetName, ruleName){
	for(var i = 0; i < window.document.styleSheets.length; i++){
		if(window.document.styleSheets[i].href.indexOf(sheetName) > -1){				
			var selectedSheet = window.document.styleSheets[i];	
			var rules = (isIE) ? selectedSheet.rules : selectedSheet.cssRules;
			for(var j = 0; j < rules.length; j++){
				if(rules[j].selectorText == ruleName){return rules[j];}					
			}				
		}
	}
}
			


/*******************************************************/
/**********   EVENT EXTENSION FUNCTIONS  ***************/
/*******************************************************/
if(!(/MSIE/.test(navigator.userAgent))){
	Event.prototype.__defineSetter__("cancelBubble", function (b) {
	if (b) this.stopPropagation();
	});

	Event.prototype.__defineSetter__("returnValue", function (b) {
	if (!b) this.preventDefault();
	});
}


/*******************************************************/
/**********   ARRAY EXTENSION FUNCTIONS  ***************/
/*******************************************************/
Array.prototype.resizeArray = function(array, removalStartIndex, itemsToRemove){
	var returnArray = new Array();
	
	//Duplicate everything before the removal index
	for(var i = 0; i < removalStartIndex; i++){returnArray[i] = array[i];}
	
	//Duplicate everything after the removal index + the removal item count
	for(var i = (removalStartIndex + itemsToRemove); i < array.length; i++){returnArray[returnArray.length] = array[i];}
	
	return returnArray;
}




/*******************************************************/
/**************  TAB PAGE CONTROLS *********************/
/*******************************************************/
function showTabPage(e){
	if(e == null){e = window.event;}
	
	var currentTab = (e.srcElement) ? e.srcElement : e.currentTarget;
	
	//The tabPageControl is always 2 elements removed from the tab
	var tabPageControl = currentTab.parentNode.parentNode;
	
	//Deselect all tabs
	for(var i = 0; i < tabPageControl.childNodes.length; i++){
		if(tabPageControl.childNodes[i].nodeType == 1){
			if(tabPageControl.childNodes[i].className == 'selectedTabPage'){
				tabPageControl.childNodes[i].className = 'tabPage';
			}
		}
	}
	
	//Select the current tab
	currentTab.parentNode.className = 'selectedTabPage';	
}




/*******************************************************/
/***************  PHOTO GALLERY FUNCTIONS **************/
/*******************************************************/

function showPreviousGalleryImage(contextObject){
	for(var i = 0; i < contextObject.galleryImages.length; i++){
		var galleryImageSource = document.getSubElementsByClassName(contextObject.galleryImages[i], 'image')[0].getElementsByTagName('IMG')[0].src;
		if(galleryImageSource == contextObject.currentImage.src){
			var newIndex = (i == 0) ? contextObject.galleryImages.length - 1 : i-1;
			contextObject.currentImage.src = document.getSubElementsByClassName(contextObject.galleryImages[newIndex], 'image')[0].getElementsByTagName('IMG')[0].src;
			contextObject.currentDescription.innerHTML = document.getSubElementsByClassName(contextObject.galleryImages[newIndex], 'description')[0].innerHTML;
			
			contextObject.imageIndex.innerHTML = newIndex+1 + ' of ' + contextObject.galleryImages.length;
			return;
		}
	}	
}

function showNextGalleryImage(contextObject){
	for(var i = 0; i < contextObject.galleryImages.length; i++){
		var galleryImageSource = document.getSubElementsByClassName(contextObject.galleryImages[i], 'image')[0].getElementsByTagName('IMG')[0].src;
		if(galleryImageSource == contextObject.currentImage.src){
			var newIndex = (i == contextObject.galleryImages.length - 1) ? 0 : i+1;
			contextObject.currentImage.src = document.getSubElementsByClassName(contextObject.galleryImages[newIndex], 'image')[0].getElementsByTagName('IMG')[0].src;
			contextObject.currentDescription.innerHTML = document.getSubElementsByClassName(contextObject.galleryImages[newIndex], 'description')[0].innerHTML;
			
			contextObject.imageIndex.innerHTML = newIndex+1 + ' of ' + contextObject.galleryImages.length;
			return;
		}
	}	
}

function startGallerySlideshow(contextObject){
	if(slideShowTimer == null){
		slideShowTimer = window.setInterval(function(){showNextGalleryImage(contextObject);}, 5000);
		showNextGalleryImage(contextObject);
	}	
}
function pauseGallerySlideshow(contextObject){
	if(slideShowTimer !== null){
		window.clearInterval(slideShowTimer);
		slideShowTimer = null;
	}
}




/*******************************************************/
/**************  COOKY HANDLING FUNCTIONS **************/
/*******************************************************/
function setDocumentCookie( oDoc, sName, sValue ){
    if(sName.length < 1){return;}

    if(0 < sValue.length){
        var expDate = new Date();
        expDate.setTime(expDate.getTime() + 365*24*60*60*1000);
        oDoc.cookie = ""+sName+"="+sValue+"; path=/; "+"expires="+expDate.toGMTString();                        
    }else{oDoc.cookie = sName + "=";}
}

function setNamedCookie(sName, sValue){setDocumentCookie(document,sName,sValue);}
function deleteDocumentCookie(oDoc, sName){oDoc.cookie = sName+"=";}
function deleteCookie(sName){deleteDocumentCookie(document, sName);}

function fetchNamedCookie(sName){return fetchDocumentCookie(document, sName);}
function fetchDocumentCookie(oDoc, sName){
    var sValue = "";
    var index = 0;
    
    if(oDoc.cookie){index = oDoc.cookie.indexOf(sName+"=");
    }else{index = -1;}
    
    if(index < 0){sValue = "";
    }else{
        var countbegin = (oDoc.cookie.indexOf("=", index) + 1);
        if(0 < countbegin){
            var countend = oDoc.cookie.indexOf(";", countbegin);
            if(countend < 0){countend = oDoc.cookie.length;}
            sValue = oDoc.cookie.substring(countbegin, countend);
        }else{sValue = "";}
    }
    return sValue;
}




/*******************************************************/
/********** IMAGE SWAPPING-ROLLOVER FUNCTIONS **********/
/*******************************************************/
			
function toggleImage(image){
	try{
		var source = new String(image.src);

		if(source.indexOf('_over') > 0){
			turnImageOff(image);
		}else if(!(source.indexOf('_over') > 0)){
			turnImageOn(image);}	
	}catch(e){
		alert('There was an error while swapping the image for an element. \n ' + e.message);}
}

function turnImageOff(image){
	try{
		var source = new String(image.src);
		if(!(source.indexOf('_over') > 0) || source.indexOf('_click') > 0){return;}
		var extension = new String(source.substring(source.lastIndexOf('.'), source.length));
		image.src = source.substring(0, source.indexOf('_over')) + extension;
	}catch(e){
		alert('There was an error while swapping the image for an element. \n ' + e.message);}
}

function turnImageOn(image){
	try{		
		var source = new String(image.src);
		if(source.indexOf('_over') > 0 || source.indexOf('_click') > 0){return;}
		var extension = new String(source.substring(source.lastIndexOf('.'), source.length));
		image.src = source.substring(0, source.indexOf(extension)) + '_over' + extension;
	}catch(e){
		alert('There was an error while swapping the image for an element. \n ' + e.message);}
}

function turnImageClickOn(image){
	try{		
		var source = new String(image.src);		
		if(source.indexOf('_click') > 0){
			//image.src = source.replace('_click', '_over');
		}else if(source.indexOf('_over') > 0){
			image.src = source.replace('_over', '_click');
		}else{
			var extension = new String(source.substring(source.lastIndexOf('.'), source.length));
			image.src = source.substring(0, source.indexOf(extension)) + '_click' + extension;}
	}catch(e){
		alert('There was an error while swapping the image for an element. \n ' + e.message);}
}

function showImageWithKey(image, evt){
	try{
		var source = new String(image.src);
		var key = (evt.type == 'mouseover') ? '-' + ((isIE)?evt.srcElement.title:evt.target.title) : '';
		
		if((source.lastIndexOf('-') < source.lastIndexOf('/')) && key == ''){return;}
		
		var extension = new String(source.substring(source.lastIndexOf('.'), source.length));
		var prefix = (source.lastIndexOf('-') > source.lastIndexOf('/')) ? new String(source.substring(0, source.lastIndexOf('-'))) : new String(source.substring(0, source.lastIndexOf('.')));
		
		image.src = prefix + key + extension;
	}catch(e){
		alert('There was an error while swapping the image for an element. \n ' + e.message);}
}




/*******************************************************/
/****** SPECIAL IMAGE HOVER ACTUATION FUNCTIONS ********/
/*******************************************************/

var hoverTimers = new Array();

function setHoverTimer(image){
	hoverTimers[hoverTimers.length] = new HoverTimer(image);}

function removeHoverTimer(image){
	for(var i = 0; i < hoverTimers.length; i++){
		if(hoverTimers[i].image == image){			
			window.clearTimeout(hoverTimers[i].timer);
			hoverTimers = hoverTimers.resizeArray(hoverTimers, i, 1);
						
			var source = image.src;
			if(image.src.indexOf('_over') > -1){source = image.src.replace('_over', '');}
			source = source.substring(source.lastIndexOf('/')+1, source.lastIndexOf('.'));
			if(document.getElementById('largeHoverImageContainer').src.indexOf(source) > -1){return;}
			
			document.getElementById('largeHoverImageContainer').style.display='none';
			return;
		}
	}
}

function executeHoverTimer(timerID){
	for(var i = 0; i < hoverTimers.length; i++){
		if(hoverTimers[i].id == timerID){
			var source = new String(hoverTimers[i].image.src);
			var largeSource = source.replace('_over', '_large');			
			var largeImage = document.getElementById('largeHoverImageContainer');
			
			largeImage.src = largeSource;
			largeImage.style.display = 'block';
			largeImage.parentNode.href = hoverTimers[i].image.parentNode.href;
			largeImage.parentNode.target = hoverTimers[i].image.parentNode.target;
			largeImage.onmouseout = function(){document.getElementById('largeHoverImageContainer').style.display = 'none';};
		}
	}
}


function HoverTimer(image){
	this.id = (new Date()).getMilliseconds();
	this.image = image;
	this.timer = window.setTimeout('executeHoverTimer(' + this.id + ');', 1000);
	document.getElementById('largeHoverImageContainer').src = image.src.replace('_over', '_large');
}




/*******************************************************
	Form validation and form data manipulation functions
********************************************************/
function toggleContactUsFormInputs(){							
	//Only show the form inputs if it was requested
	//if(document.getElementById('formInputs').style.display == 'none')
	if(document.getElementById('formVisibilitySelector').checked == true){
		showFormInputs();
		
		try{
			document.getElementById('formVisibilitySelector').scrollIntoView(true);
		}catch(e){}
	}else{
		hideFormInputs();
		
		try{
			document.getElementById('formVisibilitySelector').scrollIntoView(false);
		}catch(e){}
	}		
}

function showFormInputs(){document.getElementById('formInputs').style.display = 'block';}

function hideFormInputs(){document.getElementById('formInputs').style.display = 'none';}

function auditForm(){ 
	var requiredFields = document.getElementsByClassName('requiredField');
	if(requiredFields.length == 0){
		requiredFields = document.getElementsByName('requiredField');
	}

	//Loop through all the fields in the formInputs searching for elements that are tagged as required
	for(var i = 0; i < requiredFields.length; i++){	
		//Identify the input field to validate in the required field holder
		var inputs = requiredFields[i].getElementsByTagName('INPUT');
		var textAreas = requiredFields[i].getElementsByTagName('TEXTAREA');
		for(var k = 0; k < textAreas.length; k++){inputs[inputs.length] = textAreas[k];}
		
InnerSearchLoop:					
		
		for(var j = 0; j < inputs.length; j++){
			var currentField = inputs[j];
			if(currentField.nodeName.toLowerCase() == 'textarea' || currentField.nodeName.toLowerCase() == 'select' || currentField.nodeName.toLowerCase() == 'input'){
			
				//window.status += currentField.name;
				switch(currentField.nodeName.toLowerCase()){
					case 'input':
						switch(currentField.type.toLowerCase()){
							case 'radio':
								var radioItemSelected = false;
								for(var k = 0; k < document.getElementsByName(currentField.name).length; k++){
									if(document.getElementsByName(currentField.name)[k].checked){
										radioItemSelected = true;
										break;}
								}
								
								if(!radioItemSelected){
									alert('You must select an option for the following field: ' + currentField.name);
									return false;}									
								break;
							default:
								if(!isFilled(currentField, true, true)){return false;}		
								break;
						}									
					
						break;	
					case 'textarea':
						if(!isFilled(currentField, true, true)){return false;}								
						break;
					case 'select':
						if(!isFilled(currentField, true, true)){return false;}								
						break;						
				}
				
				break InnerSearchLoop;
			}
		}		
	}
	
	//If we made it this far, submit the form for the form we are auditing
	//form.submit();
	return true;			
}




/*
	isFilled
	
	Function used to validate if an element has input or not and can alert and set focus if it is not filled

	@element the element to check
	@throwAlertOnFailure flag to throw an alert that the method failed
	@setFocusOnFailure flag to set the current focus on the element after method failure
*/

function isFilled(element, throwAlertOnFailure, setFocusOnFailure){
	try{
		if(element != undefined){			
			switch(element.nodeName.toLowerCase()){
				case 'input':
					switch(element.type){
						case 'checkbox':
							if(element.checked){return true;}													
							break;
						default:
							if(element.value != ''){return true;}						
							break;					
					}							
					break;					
				case 'textarea':
					if(element.value != ''){return true;}				
					break;
				case 'select':
					if(element.selectedIndex > -1){return true;}					
					break;		
			}			
		}else{
			alert('The item to be validated is undefined.');
			return true;
		}				
		
		if(throwAlertOnFailure){alert('You are required to fill the field named ' + element.name + '.');}
		if(setFocusOnFailure){element.focus();}
		
		return false;
	}catch(e){
		alert('Failed to validate a fields contents.  :  ' + e.message);}
}





/*
	setAsCurrency
	
	Function used to format an expression as currency.   

	@expression the element to format as money
*/

function setAsCurrency(expression){
	try{
		var returnValue = "";
		
		for(var i = expression.length - 3; i > -3; i -= 3){
			returnValue = ',' + expression.substring(i, i + 3) + returnValue;}
		
		if(returnValue.indexOf(',') == 0){
			returnValue = returnValue.substr(1);}
		
		return returnValue;	
	}catch(e){
		alert('Failed to convert an expression to a currency format.  :  ' + e.message);}
}



/*
	stripCommas
	
	Function used to remove commas from numbers that are strings
	
	@number
*/

function stripCommas(number){
	var re = /[,]/;				
	return number.replace(re, '');}
	
	
/*	setDropDownDefault */

function setDropDownDefault(dropDown, defaultValue){
	for(var i = 0; i < dropDown.options.length; i++){
		if(dropDown.options[i].value == defaultValue){
			dropDown.selectedIndex = i;
			break;}		
	}
}
	

