/*************
 * Script file of useful utility functions
 */
function addEvent(elm, evType, fn, useCapture)
{
	if(elm.addEventListener)
	{
		elm.addEventListener(evType, fn, useCapture);
	}
	else if(elm.attachEvent)
	{
		var r = elm.attachEvent('on'+evType, fn);
		return r;
	}
	else
	{
		elm['on'+evType] = fn;
	}
}

function getEventCallerElement(e)
{
	var el = false;
	
	//Do a test for IE and mozilla event objects
	if(window.event && window.event.srcElement)
	{
		el = window.event.srcElement;
	}
	if(e && e.target)
	{
		el = e.target;
	}
	
	return el;
}

function getEventCaller(e)
{
	var el;
	var ev = YAHOO.util.Event;
	//Do a test for IE and mozilla event objects
	if(window.event && window.event.srcElement)
	{
		el = window.event.srcElement;
	}
	if(e && e.target)
	{
		el = e.target;
	}
	
	if(!el) return false;
	
	while(!el.getAttribute('id') && el.nodeName.toLowerCase() != 'body')
	{
		el = el.parentNode;
	}
	
	return el;

}

function getEventCallerId(e)
{
	var el = getEventCaller(e);
	
	if(el)
	{
		return el.getAttribute('id');
	}
	else
	{
		return false;
	}

}

function stopPropagation(e)
{
	if(window.event && window.event.cancelBubble)
	{
		window.event.cancelBubble = true;
	}
	
	if(e && e.stopPropagation)
	{
		e.stopPropagation();
	}
	
	if(window.event && window.event.returnValue)
	{
		window.event.returnValue = false;
	}
	
	if(e && e.preventDefault)
	{
		e.preventDefault();
		
	}
}

function DisplayGroup()
{
	this.current = null;
	this.elements = new Array();
	
	this.addElement = function(keyElem, elem)
	{
		if(elem)
		{
			elem.style.display = 'none';
			this.elements[keyElem.getAttribute('id')] = elem;
			this.elements.push(elem);
		}
	}
	
	this.addElementById = function(searchElem, keyElem, elemId)
	{
		var elem = searchElem.getElementById(elemId);
		if(elem)
		{
			elem.style.display = 'none';
			this.elements[keyElem.getAttribute('id')] = elem;
			this.elements.push(elem);
		}
	}
	

	
	this.showElement = function(keyElem)
	{
		
		if(this.current != keyElem.getAttribute('id'))
		{
			if(this.elements[keyElem.getAttribute('id')])
			{
				for( var i = 0; i < this.elements.length; i++)
				{
					this.elements[i].style.display  = 'none';
				}
				this.elements[keyElem.getAttribute('id')].style.display = 'block';
				var blind = new Spry.Effect.Blind(this.elements[keyElem.getAttribute('id')].getAttribute('id'), {duration: 500, from:  '0%', to:  '100%', toggle: true});
				blind.start();
				
				this.current = keyElem.getAttribute('id');
			}
			
		}
	}
}

//Button Image
function ButtonImage(elem)
{
	this.elem = elem;
	
	
}

//IMAGE CAROUSEL
function ImageCarousel(containerId)
{
	//Gets the main container
	this.conId = containerId;
	this.con = document.getElementById(this.conId);
	
	//Init variables
	this.images = new Array();
	this.imgElems = new Array();
	this.goToPage = 1;
	this.animateId = null;
	this.animationInterval = 15;
	this.animationDelay = 2;
	
	//Location of images
	this.rightArrow = "siteimgs/rightArrow.jpg";
	this.rightArrowHover = "siteimgs/rightArrowHover.jpg";
	this.rightArrowDisable = "siteimgs/rightArrowDisable.jpg";
	this.leftArrow = "siteimgs/leftArrow.jpg";
	this.leftArrowHover = "siteimgs/leftArrowHover.jpg";
	this.leftArrowDisable = "siteimgs/leftArrowDisable.jpg";
	this.imgRightArrow = new Image();
	this.imgRightArrow.src = this.rightArrow;
	this.imgLeftArrow = new Image();
	this.imgLeftArrow.src = this.leftArrow;
	
	
	//Shorthand to use yahoo event
	this.Event = YAHOO.util.Event;

	
	//Builds a very large scroll div 
	this.scrollDiv = document.createElement('div');
	this.scrollDiv.style.width = '99999px';
	
	
	
	
	//Find top margins for the buttons
	var h = (this.con.clientHeight - this.imgRightArrow.height) /2;
	
	//Actual image display
	this.imgDisplayTemplate = document.createElement('div'); 
	this.imgDisplayTemplate.style.cssFloat= "left";
	this.imgDisplayTemplate.style.styleFloat = "left";

	this.con.innerHTML = "<img id='leftNavElem' src='siteimgs/leftArrow.jpg' style='float: left; margin-top: 44px;'/><div id='imageContainerDiv' style='overflow: hidden; height: 120px; width: 559px; float: left; margin-left: 10px;'></div><img id='rightNavElem' src='siteimgs/rightArrow.jpg' style='float: left; margin-top: 44px; margin-left: 10px;'/>";
	this.imgContainerDiv = document.getElementById('imageContainerDiv');
	this.rightNav = document.getElementById('rightNavElem');
	this.leftNav = document.getElementById('leftNavElem');
	this.imgContainerDiv.appendChild(this.scrollDiv);

	
	this.preloadImages = function()
	{
		this.lhover = new Image();
		this.lhover.src = this.leftArrowHover;
		this.rhover = new Image();
		this.rhover.src = this.rightArrowHover;
	}
	
	
	this.pageWidth = function(){
		return this.imgContainerDiv.clientWidth;
	}
	
	this.picsWidth = function(){
		var width = this.imgElems.length * this.imgElems[0].clientWidth;
//		for( i = 0; i < this.imgElems.length; i ++)
//		{
//			width += this.imgElems[i].clientWidth;
//		}
		return width;
	}
	
	this.noOfElems = function(){
		return this.images.length;
	}
	
	this.getPagePos = function(page)
	{
		var elemWidth = this.picsWidth()/this.noOfElems() ;
		var elemPerPage = Math.floor(this.pageWidth() / elemWidth);
		return (page - 1) * elemWidth * elemPerPage;
		
	}
	
	this.maxPage = function(){
		var elemWidth = this.picsWidth()/this.noOfElems() ;
		var elemPerPage = Math.floor(this.pageWidth() / elemWidth);
		return Math.ceil(this.noOfElems()/elemPerPage);
	}
	
	
	
	this.addPicture = function( location, url, description, imgClass)
	{
		var a = document.createElement('a');
		a.href = url;
		a.alt = description;
		a.title = description;
		var i = document.createElement('img');
		i.src = location;
		i.alt = description;
		i.title = description;
		i.style.border = "none";
		i.className = imgClass;
		var d = this.imgDisplayTemplate.cloneNode(true);
		d.style.cssFloat= "left";
		d.style.styleFloat = "left";
		
		this.scrollDiv.appendChild(d);
		d.appendChild(a);
		a.appendChild(i);

		
		this.images.push(i);
		this.imgElems.push(d);
		
		
		
	
	}
	
	this.setAnimationInterval = function(interval)
	{
		this.animationInterval = interval;
	}
	
	this.setAnimationDelay = function(delay)
	{
		this.animationDelay = delay;
	}
	
	this.animateToPage = function()
	{
		var carousel = this;
		function animate(entry) {
			//var finalDest = carousel.pageWidth() * (carousel.goToPage -1 );
			var finalDest = carousel.getPagePos(carousel.goToPage);
			var currentPos = carousel.imgContainerDiv.scrollLeft;

			if(currentPos != finalDest)
			{
				if(currentPos > finalDest)
				{
					if(currentPos - carousel.animationInterval < finalDest)
					{
						carousel.imgContainerDiv.scrollLeft = finalDest;
					}
					else
					{
						carousel.imgContainerDiv.scrollLeft -= carousel.animationInterval;
					}
				} 
				else
				{
					if(currentPos + carousel.animationInterval > finalDest)
					{
						carousel.imgContainerDiv.scrollLeft = finalDest;
					}
					else
					{
						carousel.imgContainerDiv.scrollLeft += carousel.animationInterval;
					}
				} 
				
				carousel.animateId = setTimeout(animate, carousel.animationDelay);
			}
			else
			{
				carousel.animateId = null;
			}
			
		}
		animate();
		
	}
	
	this.switchImg = function(elem, url)
	{
		return function()
		{
			elem.src = url;
		}
		
	}
	
	this.enbleNav = function( navElem, isEnabled, carousel, nextpageFn, imgUrl, imgHoverUrl, imgDisUrl)
	{
		if(isEnabled){
			navElem.src = imgUrl;
			this.Event.addListener(navElem, "mouseover", this.switchImg(navElem, imgHoverUrl) );
			this.Event.addListener(navElem, "mouseout", this.switchImg(navElem, imgUrl) );
			this.Event.addListener(navElem, "click", nextpageFn, carousel);
		}
		else{
			navElem.src = imgDisUrl;
			this.Event.removeListener(navElem, "mouseover");
			this.Event.removeListener(navElem, "mouseout");
			this.Event.removeListener(navElem, "click");
		}
	}
	
	this.enableLeftNav = function(isEnabled)
	{
		this.enbleNav(this.leftNav, isEnabled, this, this.previousPage(this), this.leftArrow, this.leftArrowHover, this.leftArrowDisable );
	}
	
	this.enableRightNav = function(isEnabled)
	{
		this.enbleNav(this.rightNav, isEnabled, this, this.nextPage(this), this.rightArrow, this.rightArrowHover, this.rightArrowDisable);
	}
	
	this.nextPage = function(carousel)
	{
		return function()
		{

			if( carousel.goToPage + 1 == carousel.maxPage())
			{
				//If next this moves to the last page then...
				carousel.goToPage += 1;
				//need to disable button
				//carousel.enableRightNav(false);
				
			}
			else if(carousel.goToPage + 1 < carousel.maxPage())
			{
				carousel.goToPage += 1;
			}
			
			//need to enable opposite btn
			if(carousel.goToPage > 1)
			{
				//carousel.enableLeftNav(true);
			}
			
			//Animates the scrolling action
			carousel.animateToPage();
		}
		
	}
	
	this.previousPage = function(carousel)
	{
		return function()
		{
			if( carousel.goToPage - 1 > 1)
			{
				carousel.goToPage -= 1;
			}
			else if(carousel.goToPage -1 > 0)
			{
				carousel.goToPage -= 1;
				//need to disable button
				//carousel.enableLeftNav(false);
			}
			
			//need to enable opposite btn
			if(carousel.goToPage < carousel.maxPage())
			{
				//carousel.enableRightNav(true);
			}
			
			carousel.animateToPage();
		}
		
	}
	
	//Disabled the left button for starters
	this.enbleNav(this.rightNav, true, this, this.nextPage(this), this.rightArrow, this.rightArrowHover, this.rightArrowDisable);
	this.enbleNav(this.leftNav, true, this, this.previousPage(this), this.leftArrow, this.leftArrowHover, this.leftArrowDisable);
	
	
	
}

function ImagePreloader(elementId, waitElementId)
{
	this.elementId = elementId;
	this.waitElementId = waitElementId;
	this.imgElem = document.getElementById(this.elementId);
	this.imgCache = new Image();
	this.waitElem = document.getElementById(this.waitElementId);
	
	this.waitElem.style.zIndex = 9999999;
	this.waitElem.style.visibility = 'hidden';
	
	this.picFader = new Spry.Effect.Fade(elementId,{duration: 1500,from: 0, to: 100,toggle: false});
	
	
	this.positionLoadingGraphic = function(centeringElem)
	{
		var loadImg = centeringElem;
		var loadElem = this.waitElem;
		
		var width = loadImg.width;
		var height = loadImg.height;
		
		var offsetX = Math.floor( (width/2) - (loadElem.offsetWidth/2));
		var offsetY = Math.floor( (height/2) - (loadElem.offsetHeight/2));
		loadElem.style.marginLeft = offsetX+'px';
		loadElem.style.marginTop = offsetY+'px';
	}
	
	this.imgLoading = function(preloader)
	{
		return function()
		{
			preloader.picFader.start();
			preloader.imgElem.style.visibility = 'hidden';
			preloader.imgElem.src = preloader.imgCache.src;
			preloader.positionLoadingGraphic(preloader.imgCache);
			function turnoffPreload()
			{
				preloader.waitElem.style.visibility = 'hidden';
				preloader.imgElem.style.visibility = 'visible';
				
			}
			setTimeout(turnoffPreload, 10);4
		}
	}
	
	this.loadImg = function(imgLoc)
	{
		this.positionLoadingGraphic(this.imgElem);
		this.imgCache.src = imgLoc;
		this.waitElem.style.visibility = 'visible';
		
	}
	
	
	
	this.positionLoadingGraphic(this.imgElem);
	addEvent(this.imgCache, 'load', this.imgLoading(this), false )
	
}

function HashArray()
{
	this.keys = new Array() ; 
	this.values = new Array();
	this.valueKeys  = new Array();
	
	
	this.put = function(key, item)
	{
		this.keys.push(key);
		this.values.push(item);
		this.valueKeys[key] = item;
	}
	
	this.get = function(key)
	{
		return this.valueKeys[key];
	}
	
	this.getValues = function()
	{
		return this.values;
	}
	
	this.getKeys = function()
	{
		return this.keys;
	}
	
	
}

function SimplePopup()
{
	this.timerRef;
	this.menuElems = new HashArray();
	
	this.popup = function(id)
	{
		popupObj = this;
		allElems = this.menuElems;
		return function()
		{
			clearTimeout(popupObj.timerRef);
			
			//Make all the others disappear first
			var keys = allElems.getKeys();
			for(i = 0; i < keys.length; i++)
			{
				if(keys[i] != id)
				{
					allElems.get(keys[i]).style.display = 'none';
				}
			}
			
			//Then make menu popup
			popupObj.timerRef = setTimeout(function(){
				allElems.get(id).style.display = 'block';	}, 200);
		}
	}
	
	this.disappear = function(id)
	{
		popupObj = this;
		allElems = this.menuElems;
		return function()
		{
			clearTimeout(popupObj.timerRef);
			
			//Make all the others disappear first
			var keys = allElems.getKeys();
			for(i = 0; i < keys.length; i++)
			{
				if(keys[i] != id)
				{
					allElems.get(keys[i]).style.display = 'none';
				}
			}
			
			//Then make menu popup
			popupObj.timerRef = setTimeout(function(){
				allElems.get(id).style.display = 'none';	}, 200);
			
			
		}
		
	}
	
	this.addMenuElem = function(id)
	{
		this.menuElems.put(id, document.getElementById(id));
		this.attachElemToPopup(id, id);
	}
	
	this.attachElemToPopup = function(elemId, popupMenuId)
	{
		var attachElem = document.getElementById(elemId);
		addEvent(attachElem, 'mouseover', this.popup(popupMenuId)  , false);
		addEvent(attachElem, 'mouseout', this.disappear(popupMenuId)  , false);
		
		
	}
}
