

// this allows us to load multiple functions at window.onload without conflicts
// http://www.sitepoint.com/blogs/2004/05/26/closures-and-executing-javascript-on-page-load/
function addLoadEvent(func) { 
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
} 

addLoadEvent(screens);
addLoadEvent(quickview);
addLoadEvent(gallery);
addLoadEvent(teamNav);
//addLoadEvent(headerCart);
addLoadEvent(desktop);



// screens()

function screens() {
	var screens_navs = getElementsByClassName('screens_nav');
	for (var i=0,j=screens_navs.length; i<j; i++) {
		var nav = screens_navs[i];
		var navLinks = nav.getElementsByTagName('a');
		nav.screen_max_height = '0';
		nav.screens = [];
		for (var i=0,j=navLinks.length; i<j; i++) {
			var id = navLinks[i].href.replace(/.*#(.+)/,'$1');
			if (document.getElementById(id)) {
				nav.screens[i] = document.getElementById(id);
				var screen = nav.screens[i];
				screen.nav = nav;
				screen.id = id;
				screen.navLink = navLinks[i];
				screen.links = [];
				var links = document.getElementsByTagName('a');
				for (var l=0,m=links.length; l<m; l++) {
					var hash = links[l].href.replace(/.*#(.+)/,'$1');
					if (hash == id) {
						screen.links[l] = links[l];
						screen.links[l].screen = screen;
						screen.links[l].onclick = function() {
							screens_switch(this.screen);
							return false;
						}
					}
				}
				screen.height = screen.offsetHeight;
				if (screen.height > nav.screen_max_height) {
					nav.screen_max_height = screen.height;
				}
			}
			else {
				navLinks[i].className += ' screens_nav_noScreen';
			}
		}
		for (var i=0,j=nav.screens.length; i<j; i++) {
			if (nav.screens[i].height <= nav.screen_max_height) {
				nav.screens[i].style.height = nav.screen_max_height + 'px';
			}
		}
		var startScreen = 0;
		if (nav.className.match(/\bscreens_nav_random\b/)) {
			startScreen = Math.floor(Math.random()*nav.screens.length);
		}
		screens_switch(nav.screens[startScreen]);
	}
	
	if (document.location.hash) {
		var id = document.location.hash.substring(1);
		if (document.getElementById(id) && document.getElementById(id).nav) {
			var screen = document.getElementById(id);
			screens_switch(screen);
		}
	}
}

function screens_switch(screen) {
	var nav = screen.nav;
	for (var i=0,j=nav.screens.length; i<j; i++) {
		if (nav.screens[i] == screen) {
			screens_show(nav.screens[i]);
		}
		else {
			screens_hide(nav.screens[i]);
		}
	}
}

function screens_show(screen) {
	screen.style.display = 'block';
	screen.navLink.className = screen.navLink.className.replace(/ ?\bscreens_selected\b/,'');
	screen.navLink.className += ' screens_selected';
}

function screens_hide(screen) {
	screen.style.display = 'none';
	screen.navLink.className = screen.navLink.className.replace(/ ?\bscreens_selected\b/,'');
}







// Quickview

function quickview() {
	var quickviews = [];
	for (i=0, j=document.links.length; i<j; i++) {
		if (document.links[i].href.indexOf('#qv_') != -1) {
			document.links[i].qv = document.links[i].href.replace(/.*#(qv_.+)/gi,'$1');
			quickviews[quickviews.length] = document.getElementById(document.links[i].qv);
			document.links[i].onclick = function() {
				if (document.getElementById(this.qv)) {
					for (i=0, j=quickviews.length; i<j; i++) {
						quickviews[i].style.display = 'none';
						if (quickviews[i].defaultMarginTop) {
							quickviews[i].style.marginTop = quickviews[i].defaultMarginTop;
						}
					}
					
					var qvLayer = document.getElementById(this.qv);
					qvLayer.style.display = 'block';
					
					
					var layerMargin = 20;
					var qvTop = qvLayer.offsetTop;
					var viewportTop = f_scrollTop();
					
					var dimensions = viewportDimensions();
					var viewportHeight = dimensions[1];
					var qvHeight = qvLayer.offsetHeight;
					
					var qvBottom = (qvTop + qvHeight);
					
					if (qvTop < (viewportTop + layerMargin)) {
						var qvMarginTop = getStyle(qvLayer,'margin-top').replace(/(\d+).*/,'$1');
						qvLayer.defaultMarginTop = getStyle(qvLayer,'margin-top');
						qvLayer.style.marginTop = qvMarginTop * 1 + (viewportTop - qvTop) + layerMargin + 'px';
					}
					else if (qvHeight < viewportHeight + (layerMargin * 2) && qvBottom > (viewportTop + viewportHeight - layerMargin)) {
						var qvMarginTop = getStyle(qvLayer,'margin-top').replace(/(\d+).*/,'$1');
						qvLayer.defaultMarginTop = getStyle(qvLayer,'margin-top');
						qvLayer.style.marginTop = qvMarginTop * 1 - (qvBottom - viewportTop - viewportHeight) - layerMargin + 'px';
					}
					
					
				}
				return false;
			}
		}
		else if (document.links[i].href.indexOf('close_qv_') != -1) {
			document.links[i].qv = document.links[i].href.replace(/.*#.*(qv_.+)/gi,'$1');
			document.links[i].onclick = function() {
				if (document.getElementById(this.qv)) {
					for (i=0, j=quickviews.length; i<j; i++) {
						quickviews[i].style.display = 'none';
					}
					document.getElementById(this.qv).style.display = 'none';
				}
				return false;
			}
		}
	}
}






// product viewer

var galleries;

function gallery() {
	galleries = getElementsByClassName('gallery');
	if (galleries.length > 0) {
		
		var overlay;
		if (!document.getElementById('overlay')) {
			overlay = document.createElement('div');
			overlay.id = 'overlay';
			document.getElementsByTagName('body')[0].appendChild(overlay);
			overlay.onclick = function() {
				gallery_hide();
			}
		}
		else {
			overlay = document.getElementById('overlay');
		}
		
		
		for (var i=0,j=galleries.length;i<j;i++) {
			var gallery = galleries[i];
			gallery.style.display = 'none';
			
			var mainImageLink = document.getElementById(gallery.id + '-mainImageLink');
			var mainImage = mainImageLink.getElementsByTagName('img')[0];
			mainImageLink.mainImage = mainImage;
			mainImageLink.gallery = gallery;
			mainImageLink.onclick = function() {
				gallery_show(this);
				return false;
			}
			
			var buttonP = document.createElement('p');
			buttonP.className = 'gallery-button';
			gallery.parentNode.insertBefore(buttonP,gallery);
			
			var buttonLink = document.createElement('a');
			buttonLink.href = mainImageLink.href;
			buttonLink.innerHTML = 'Click to Zoom';
			buttonP.appendChild(buttonLink);
			buttonLink.mainImageLink = mainImageLink
			buttonLink.onclick = function() {
				gallery_show(this.mainImageLink);
				return false;
			}
			
			if (gallery.getElementsByTagName('a').length > 1) {
				buttonP.className += ' gallery-button-more';
				buttonLink.innerHTML = 'Zoom/More Views';
			}
			
		}
	}
}


function gallery_show(link) {
	var mainImageLink = link;
	var gallery = mainImageLink.gallery;
	var mainImage = link.mainImage;
	var overlay = document.getElementById('overlay');
	overlay.style.display = 'block';

	if(!gallery.viewer) {
		var viewer = document.createElement('div');
		viewer.className = 'gallery-viewer';
		document.getElementsByTagName('body')[0].appendChild(viewer);
		gallery.viewer = viewer;
	
		var viewerCloseP = document.createElement('p');
		viewerCloseP.className = 'gallery-viewer-close';
		viewer.appendChild(viewerCloseP);
		var viewerClose = document.createElement('a');
		viewerClose.href = '#gallery-viewer-close';
		viewerClose.innerHTML = 'Close';
		viewerClose.onclick = function() {
			gallery_hide();
			return false;
		}
		viewerCloseP.appendChild(viewerClose);
		
		var viewerTitle = document.createElement('h3');
		viewerTitle.innerHTML = mainImage.alt;
		viewer.appendChild(viewerTitle);
	
		var viewerImgCont = document.createElement('div');
		viewerImgCont.className = 'gallery-viewer-imageContainer';
		viewer.appendChild(viewerImgCont);
		
		var viewerImage = document.createElement('img');
		viewerImage.src = mainImageLink.href;
		viewerImage.alt = mainImageLink.title;
		viewerImgCont.appendChild(viewerImage);
		
		galleryThumbnails = gallery.getElementsByTagName('a');
		
		if (galleryThumbnails.length > 1) {
			var viewerThumbnailsContainer = document.createElement('div');
			viewerThumbnailsContainer.className = 'gallery-viewer-thumbnails';
			if (galleryThumbnails.length > 6) {
				viewerThumbnailsContainer.className += ' gallery-viewer-thumbnails-scroll';
			}
			viewer.appendChild(viewerThumbnailsContainer);
			
			var viewerThumbnails = document.createElement('ul');
			viewerThumbnailsContainer.appendChild(viewerThumbnails);
			
			for (var i=0,j=galleryThumbnails.length;i<j;i++) {
				var galThumbnailLink = galleryThumbnails[i];
				var galThumbnail = galThumbnailLink.getElementsByTagName('img')[0];
				
				var li = document.createElement('li');
				if (i+1==j) {
					li.className = 'gallery-viewer-thumbnails-last';
				}
				viewerThumbnails.appendChild(li);
				
				var a = document.createElement('a');
				a.href = galThumbnailLink.href;
				a.title = galThumbnailLink.title;
				a.viewerImage = viewerImage;
				a.onclick = function() {
					this.viewerImage.src = this.href;
					return false;
				}
				li.appendChild(a);
				
				var img = document.createElement('img');
				img.src = galThumbnail.src;
				img.alt = galThumbnail.alt;
				a.appendChild(img);
			}
		}
		
	}
	
	gallery.viewer.style.display = 'block';
}


function gallery_hide() {
	document.getElementById('overlay').style.display = 'none';
	for (var i=0,j=galleries.length;i<j;i++) {
		galleries[i].viewer.style.display = 'none';
	}
}




var viewer;

function productViewer(mainImageLink) {
	var zoomers = getElementsByClassName('product-image-zoom');
	if (zoomers.length > 0) {
		var body = document.getElementsByTagName('body')[0];
		var classname = 'overlay-show';
		var re = new RegExp(' ?\\b' + classname + '\\b','g');
		var viewerID = 'product-image-viewer';
		
		for (var i=0,j=zoomers.length; i<j; i++) {
			var zoomer = zoomers[i];
			zoomer.onclick = function() {
				productViewer_zoom(this,this.href,this.title);
				return false;
			}
		}
		
		function productViewer_zoom(element,href,title) {
			if (!document.getElementById('overlay')) {
				var overlay = document.createElement('div');
				overlay.id = 'overlay';
				body.appendChild(overlay);
				overlay.onclick = function() {
					productViewer_hide();
				}
			}
			
			if (document.getElementById(viewerID)) {
				viewer = document.getElementById(viewerID);
			}
			else {
				viewer = document.createElement('div');
				viewer.id = viewerID;
/*				element.parentNode.insertBefore(viewer,element.nextSibling);*/
				body.appendChild(viewer);
				
				var closeP = document.createElement('p');
				closeP.className = 'product-image-close';
				viewer.appendChild(closeP);
				var close = document.createElement('a');
				close.href = '#close-viewer';
				close.innerHTML = 'Close';
				close.onclick = function() {
					return false;
				}
				closeP.appendChild(close);
				
				var titleH = document.createElement('h3');
				titleH.innerHTML = title;
				viewer.appendChild(titleH);
				
				var imgCont = document.createElement('div');
				imgCont.className = 'product-image-container';
				viewer.appendChild(imgCont);
				var img = document.createElement('img');
				img.src = href;
				img.className = 'product-image-large';
				imgCont.appendChild(img);
		
				viewer.onclick = function() {
					productViewer_hide();
				}
			}
			viewer.style.display = 'block';
			
			body.className = body.className.replace(re,'');
			body.className += ' ' + classname;
		}
		
		function productViewer_hide() {
			viewer.style.display = 'none';
			body.className = body.className.replace(re,'');
		}
		
	}
}






// team navigation

function teamNav() {
	var openClass = 'teamNav_show';
	var openRe = '/' + openClass + '/gi';
	if (document.getElementById('team_nav')) {
		var nav = document.getElementById('team_nav');
		var list = document.getElementById('team_nav_list');
		$(list).hide();
		for (var i=0,j=document.links.length; i<j; i++) {
			document.links[i].innerHTMLdefault = document.links[i].innerHTML;
			if (document.links[i].href.indexOf('#team_nav') != -1) {
				document.links[i].onclick = function() {
					if (nav.className.indexOf(openClass) == -1) {
						nav.className = nav.className.replace(/teamNav_show/,'');
						nav.className += ' ' + openClass;
						this.innerHTML = 'Close';
						
						$(list).show('fast');
					}
					else {
						nav.className = nav.className.replace(/teamNav_show/,'');
						this.innerHTML = this.innerHTMLdefault;
						
						$(list).hide('fast');
					}
					return false;
				}
			}
		}
	}
}






// header cart

function headerCart() {
	var cart = document.getElementById('headerCart');
	$(cart).hide();
	cart.className = cart.className.replace(/(^|\s)headerCart_loading(\s|$)/,'');
	var headerCart_links = getElementsByClassName('headerCart_link');
	for (var i=0,j=headerCart_links.length; i<j; i++) {
		headerCart_links[0].onclick = function() {
			headerCart_showHide();
			return false
		}
	}
}

function headerCart_showHide() {
	var cart = document.getElementById('headerCart');
	$(cart).toggle();
}




// desktop

function desktop() {
	var forms = document.getElementsByTagName('form');
	for (var i=0,j=forms.length;i<j;i++) {
		var form = forms[i];
		var action = form.action.replace(document.location,'');
		if (action == 'desktops') {
			var desc = form.name;
			var thumb;
			if (thumb = document.getElementById(desc + '_thumb')) {
				for (var i=0,j=form.os.length;i<j;i++) {
					var osOpt = form.os[i];
					osOpt.thumb = thumb;
					osOpt.desc = desc;
					osOpt.thumbSwitch = function() {
						var os = this.value;
						var desc = this.desc;
						var re = new RegExp('(.*desktops/' + desc + '/)' + '.+' + '(/' + desc + '_)' + '.+' + '(_thumb.jpg)','gi');
						this.thumb.src = this.thumb.src.replace(re,'$1' + os + '$2' + os + '$3');
					}
					osOpt.onclick = function() {
						this.thumbSwitch();
					}
					if (osOpt.checked == true) {
						osOpt.thumbSwitch();
					}
				}
				thumb.form = form;
				thumb.onclick = function() {
					this.form.submit();
				}
			}
			
			if (screen.width && screen.height) {
				form.resolution[0].selected = true;
				for (var i2=1,j2=form.resolution.length;i2<j2;i2++) {
					var resOpt = form.resolution[i2];
					resOpt.width = parseFloat(resOpt.value.replace(/(\d+)_\d+/,'$1'));
					resOpt.height = parseFloat(resOpt.value.replace(/\d+_(\d+)/,'$1'));
					
					if (screen.width == resOpt.width) {
						resOpt.selected = true;
						if (screen.height <= resOpt.height) {
							break;
						}
					}
					else if (screen.width > resOpt.width) {
						resOpt.selected = true;
					}
					
				}
			}
			
		}
	}
}






// parseQuery returns an assocaitive array of the name=value pairs in a query string (or a hash formatted as a query) of a URL
// if no string is passed, it uses the current has of the url
function parseQuery(query) {
	
	if (!query) {
		query = window.location.hash;
	}
	
	query = query.replace(/.*(#|\?)(.+)/,'$2');
	
	values = new Array();
	
	params = query.split('&');
	
	for (var q=0; q<params.length; q++) {
		var pos = params[q].indexOf('=');
		name = params[q].substring(0,pos);
		value = params[q].substring(pos+1);
		
		values[name] = value;
		
	}
	
	return values;
	
}


// returns value of a rendered style attribute of an element
// http://www.robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/
function getStyle(oElm, strCssRule){
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if(oElm.currentStyle){
		strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
			return p1.toUpperCase();
		});
		strValue = oElm.currentStyle[strCssRule];
	}
	return strValue;
}


// http://snipplr.com/view/1696/get-elements-by-class-name/
function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('(^| )' + classname + '( |$)');
	var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className))a.push(els[i]);
	return a;
}


// http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/
function viewportDimensions() {
	var viewportwidth;
	var viewportheight;
	// the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
	if (typeof window.innerWidth != 'undefined') {
		viewportwidth = window.innerWidth,
		viewportheight = window.innerHeight
	}
	// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
	else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
		viewportwidth = document.documentElement.clientWidth,
		viewportheight = document.documentElement.clientHeight
	}
	// older versions of IE
	else {
		viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
		viewportheight = document.getElementsByTagName('body')[0].clientHeight
	}
	
	var dimensions = new Object();
	return [viewportwidth,viewportheight];
}

// http://www.softcomplex.com/docs/get_window_size_and_scrollbar_position.html
function f_clientWidth() {
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function f_clientHeight() {
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}