/*
 * Jonathan Howard's
 * jQuery Pause plugin
 * version 0.2
 *
 * pause() will hold everything in the queue for a given number of milliseconds, or 1000 milliseconds if none is given.
 * unpause() will clear the queue of everything of a given type, or 'fx' if no type is given.
 */
$.fn.pause = function(milli,type) {
	milli = milli || 1000;
	type = type || "fx";
	return this.queue(type,function(){
		var self = this;
		setTimeout(function(){
			$.dequeue(self);
		},milli);
	});
};

$.fn.clearQueue = $.fn.unpause = function(type) {
	return this.each(function(){
		type = type || "fx";
		if(this.queue && this.queue[type]) {
			this.queue[type].length = 0;
		}
	});
};







/*
 * Accordion 1.? (modified) - jQuery menu widget
 * Copyright (c) 2006 Jörn Zaefferer, Frank Marcia
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
$.accordian = function(items, defaultSection, options) {

	var active = defaultSection;
	var dummy = "#section0"; // the id of the invisible accordion section that is actually expanded when no other sections are expanded
	var running = 1;

	var titles = options && options.titles || '.title';
	var contents = options && options.contents || '.content';
	var onClick = options && options.onClick || function(){};
	var onShow = options && options.onShow || function(){};
	var onHide = options && options.onHide || function(){};
	var showSpeed = options && options.showSpeed || 'slow';
	var hideSpeed = options && options.hideSpeed || 'fast';
	
	$(items).children(contents).hide();
	$(items).each(onHide);
	// $(active).each(onShow);
	
	// add the click action to all the titles
	$(items).children(titles).click( function(e){
		
		// create an object that represents the contents of the title that was clicked
		var p = $(contents, this.parentNode);
		// create an object that represents the container holding the flash movie
		var f = $("#flashContent");
		// create an object that represents the container holding order method tabs
		var o = $("#orderContainer");
		// execute the onClick function (if it was set in the options)
		$(this.parentNode).each(onClick);
		
		// if the animation is running, exit the function and do nothing
		if (running) return false;
		
		running = 2;
		
		// if the title of the current section was clicked
		if (!p.is(":hidden")) { 
			f.hide();
			$(active).children(contents).slideUp(hideSpeed, function(){--running; $(this.parentNode).each(onHide);});
			$(dummy).children(contents).slideDown(showSpeed, function(){--running; this.style.height="";});
			active = $(dummy);
			$(active).each(onShow);
		} else { // the title that was clicked was not the current section
			f.hide();
			//o.hide();
			$(active).children(contents).not(':hidden').slideUp(hideSpeed, function(){--running; $(this.parentNode).each(onHide); f.show(); /* o.show(); */ });
			p.slideDown(showSpeed, function(){--running; this.style.height="";});
			active = '#' + $(this.parentNode)[0].id;
			$(active).each(onShow);
		}
		
		sectionTitleRollovers(active);
		return false;
		
	});
	
	// on page load, show the initial section after a short pause
	var p = $(contents, $(active));
	var f = $("#flashContent");
	var l = $("#loadingAnim");
	$("#section0")
		.children(contents)
		.pause(3000)
		.slideUp(hideSpeed, 
		
		function(){ 
			f.hide(); 
			$(this.parentNode).each(onHide); 
			l.fadeOut("slow");
			p.slideDown("slow", 
				function(){ 
					f.show();
					this.style.height="";
				}
			); 
			$(active).each(onShow); 
			--running; 
		}
	);
	sectionTitleRollovers("#section0");
	
};


// function that creates proper mouseover effects for IE since IE 6 only recognizes CSS :hover pseudoclass on <a> tags
function sectionTitleRollovers(activeSection) {
	if ($.browser.msie) {
		$(".sectionTitle").each( function() {
			if ("#"+$(this).parent().attr("id") == activeSection) {
				$(this).css("background-color","#f5f5f5");
				$(this).mouseover( function(){
					$(this).css("backgroundColor","#000");
				}).mouseout( function(){
					$(this).css("background-color","#f5f5f5");
				});
			} else {
				$(this).css("background-color","#a69b90");
				$(this).mouseover( function(){
					$(this).css("background-color","#fff");
				}).mouseout( function(){
					$(this).css("background-color","#a69b90");
				});
			}
		});
	}
}








/*
 * Thickbox 2.1 (modified) - One Box To Rule Them All.
 * By Cody Lindley (http://www.codylindley.com)
 * Copyright (c) 2006 cody lindley
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 * Thickbox is built on top of the very light weight jQuery library.
 */
//on page load call TB_init
$(document).ready(TB_init);

//add thickbox to href elements that have a class of .thickbox
function TB_init(){
	$("a.thickbox").click(function() {
		var t = this.title || this.name || null;
		var g = this.rel || false;
		TB_show(t,this.href,g);
		this.blur();
		return false;
	});
}

function TB_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
	
	try {
		
		if (document.getElementById("TB_HideSelect") == null) {
			$("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");
			//$("#TB_overlay").click(TB_remove);
		}
		
		if(caption==null){caption=""};
		
		$(window).scroll(TB_position);
 		
		TB_overlaySize();
		
		$("body").append("<div id='TB_load'><img src='assets/img/loading-animation.gif' alt='loading' /></div>");
		TB_load_position();
		
		
		if (url.indexOf("?")!==-1) { //If there is a query string involved
			var baseURL = url.substr(0, url.indexOf("?")); //chop it off
		} else { 
			var baseURL = url;
		}
		
		//function to reverse a string
		function strrev(str) { if (!str) return ''; var revstr=''; for (i = str.length-1; i>=0; i--) { revstr+=str.charAt(i); } return revstr; }
		
		// code that determines the current image number
		var baseURLReversed = strrev(baseURL); 
		var reverseImageName = baseURLReversed.substr(0, baseURLReversed.indexOf("/") );
		imageNumber = strrev(reverseImageName.substr(reverseImageName.indexOf(".")+1, reverseImageName.length ) );
		TB_currentSection = reverseImageName.substr(reverseImageName.length-1,reverseImageName.length-1);
		captionFile = "/exhibits/twww/assets/html/"+imageNumber+".html";
		
		var urlString = /\.jpg|\.jpeg|\.png|\.gif|\.bmp/g;
		var urlType = baseURL.toLowerCase().match(urlString);
		
		// if this is an image URL (it always will be)
		if (urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp') {
			
			TB_PrevCaption = "";
			TB_PrevURL = "";
			TB_PrevHTML = "";
			TB_NextCaption = "";
			TB_NextURL = "";
			TB_NextHTML = "";
			TB_imageCount = "";
			TB_FoundCurrentURL = false;
			TB_LastImageInSet = false;
			
			// if the link clicked was part of a specified group of image links (it always will be)
			if (imageGroup) {
				
				// create an array of the <a> tags in this imageGroup so we can examine their properties
				TB_TempArray = $("a[@rel="+imageGroup+"]").get();
				
				// loop through all the <a> tags in this imageGroup
				// UNTIL the TB_NextHTML has been defined, or we run out of <a> tags
				for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML == "")); TB_Counter++) {
					var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);
					if ( !(TB_TempArray[TB_Counter].href == url) ) { // if we are NOT on the current image
						if (TB_FoundCurrentURL) { // if we are now on the link for "next" image (this will be the last iteration for the "for" loop)
							TB_NextCaption = TB_TempArray[TB_Counter].title;
							TB_NextURL = TB_TempArray[TB_Counter].href;
							TB_NextHTML = "<span id='TB_next'><a href='#'>Next &gt;</a></span>";
						} else { // if we are on one of the previous images (these keep overwriting eachother until the actual previous image)
							TB_PrevCaption = TB_TempArray[TB_Counter].title;
							TB_PrevURL = TB_TempArray[TB_Counter].href;
							TB_PrevHTML = "<span id='TB_prev'><a href='#'>&lt; Prev</a></span>";
						}
					} else { // we are on the <a> tag for the current image
						TB_FoundCurrentURL = true;
						TB_imageCount = "Image " + (TB_Counter + 1) +" of "+ (TB_TempArray.length) +" in this section.";
					}
				}
			}
			
			// if we are on the last image in the set (because there was no "Next" button created in the above loop)
			if (TB_NextHTML == "") {
				//alert("lastImage!");
				TB_LastImageInSet = true;
				TB_NextHTML = "<span id='TB_next' class='nextSectionBtn'><a href='#' class='nextSection'>Next Section &gt;</a></span>";
			}
			
			
			imgPreloader = new Image();
			imgPreloader.onload = function(){ 
			imgPreloader.onload = null;
				
			// Resizing large images - orginal by Christian Montoya. Edited by me.
			var pagesize = TB_getPageSize();
			var x = pagesize[0] - 250;
			var y = pagesize[1] - 200;
			//alert("PageSize: "+x+" x "+y)
			var imageWidth = imgPreloader.width;
			var imageHeight = imgPreloader.height;
			//alert("ImageSize: "+imageWidth+" x "+imageHeight)
			
			if (imageWidth > x) { //if the image is wider than the pagesize[0]
				//alert("Image is wider than page.");
				imageHeight = imageHeight * (x / imageWidth); 
				imageWidth = x; 
				if (imageHeight > y) { //if the image is still too tall
					//alert("Image is still too tall.");
					imageWidth = imageWidth * (y / imageHeight); 
					imageHeight = y; 
				}
			} else if (imageHeight > y) { //the image was not too wide, so check if the image height is larger than the pagesize[1]
				//alert("Image is taller than page.");
				imageWidth = imageWidth * (y / imageHeight); 
				imageHeight = y; 
				if (imageWidth > x) { // if the image is still too wide
					//alert("Image is still too wide.");
					imageHeight = imageHeight * (x / imageWidth); 
					imageWidth = x;
				}
			}
			// End Resizing
			
			TB_WIDTH = imageWidth + 20;
			TB_HEIGHT = imageHeight + 120;
			
			$("#TB_window").append("<img id='TB_Image' src='"+url+"' width='"+imageWidth+"' height='"+imageHeight+"' alt='"+caption+"' /><div id='TB_caption'></div><div id='TB_secondLine'>" + TB_imageCount + TB_PrevHTML + TB_NextHTML + " <a href='#' id='TB_printLink' onclick='TB_printClick(imageNumber); return false;'>Print This Image</span></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Close Image'>Close Image</a></div>"); 		
			
			$("#TB_closeWindowButton").click(TB_remove);
			
			//console.debug("/exhibits/twww/assets/html/"+captionFile);
			$("#TB_caption").load(captionFile);
			
			if (!(TB_PrevHTML == "")) {
				function goPrev(){
					//if($(document).unclick(goPrev)){$(document).unclick(goPrev)};
					$("#TB_window").remove();
					$("body").append("<div id='TB_window'></div>");
					TB_show(TB_PrevCaption, TB_PrevURL, imageGroup);
					return false;	
				}
				$("#TB_prev").click(goPrev);
			}
			
			if (TB_LastImageInSet != true) { // if this is not the last image in this set
				function goNext() {
					$("#TB_window").remove(); // close the image window
					$("body").append("<div id='TB_window'></div>");
					TB_show(TB_NextCaption, TB_NextURL, imageGroup);
					return false;
				}
				$("#TB_next").click(goNext);
			} else { // we are displaying the last image in this set
				function goNextSection() {
					TB_nextSection = parseInt(TB_currentSection) + 1;
					TB_remove(); // get rid of the entire thickbox
					setTimeout( function() { $('#section'+ TB_nextSection +'title').trigger('click');}, 500); //open the next section in the accordion after a half-second delay
					return false;
				}
				$("#TB_next").click(goNextSection);
			}
			
			
			document.onkeydown = function(e){ 	
				if (e == null) { // ie
					keycode = event.keyCode;
				} else { // mozilla
					keycode = e.which;
				}
				if(keycode == 27){ // close
					TB_remove();
				} else if(keycode == 190){ // display previous image
					if(!(TB_NextHTML == "")){
					document.onkeydown = "";
					goNext();
					}
				} else if(keycode == 188){ // display next image
					if(!(TB_PrevHTML == "")){
					document.onkeydown = "";
					goPrev();
					}
				}	
			}
			
			TB_position();
			$("#TB_load").remove();
			$("#TB_ImageOff").click(TB_remove);
			$("#TB_window").css({display:"block"}); //for safari using css instead of show
			}
			
			imgPreloader.src = url;
			
		} else {//code to show html pages
			
			var queryString = url.replace(/^[^\?]+\??/,'');
			var params = TB_parseQuery( queryString );
			
			TB_WIDTH = (params['width']*1) + 30;
			TB_HEIGHT = (params['height']*1) + 40;
			ajaxContentW = TB_WIDTH - 30;
			ajaxContentH = TB_HEIGHT - 45;
			
			if (url.indexOf('TB_iframe') != -1) {				
					urlNoQuery = url.split('TB_');		
					$("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a></div></div><iframe frameborder='0' hspace='0' src='"+urlNoQuery[0]+"' id='TB_iframeContent' name='TB_iframeContent' style='width:"+(ajaxContentW + 29)+"px;height:"+(ajaxContentH + 17)+"px;' onload='TB_showIframe()'> </iframe>");
				} else {
					$("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>close</a></div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW+"px;height:"+ajaxContentH+"px;'></div>");
			}
					
			$("#TB_closeWindowButton").click(TB_remove);
			
				if(url.indexOf('TB_inline') != -1){	
					$("#TB_ajaxContent").html($('#' + params['inlineId']).html());
					TB_position();
					$("#TB_load").remove();
					$("#TB_window").css({display:"block"}); 
				}else if(url.indexOf('TB_iframe') != -1){
					TB_position();
					if(frames['TB_iframeContent'] == undefined){//be nice to safari
						$("#TB_load").remove();
						$("#TB_window").css({display:"block"});
						$(document).keyup( function(e){ var key = e.keyCode; if(key == 27){TB_remove()} });
					}
				}else{
					$("#TB_ajaxContent").load(url, function(){
						TB_position();
						$("#TB_load").remove();
						$("#TB_window").css({display:"block"}); 
					});
				}
			
		}
		
		$(window).resize(TB_position);
		
		document.onkeyup = function(e){ 	
			if (e == null) { // ie
				keycode = event.keyCode;
			} else { // mozilla
				keycode = e.which;
			}
			if(keycode == 27){ // close
				TB_remove();
			}	
		}
		
	} catch(e) {
		alert( e );
	}
}

// thickbox helper functions below

function TB_showIframe(){
	$("#TB_load").remove();
	$("#TB_window").css({display:"block"});
}

function TB_remove() {
	$("#TB_window").fadeOut("fast",function(){$('#TB_window,#TB_overlay,#TB_HideSelect').remove();});
	$("#TB_load").remove();
	return false;
}

function TB_position() {
	var pagesize = TB_getPageSize();
	var arrayPageScroll = TB_getPageScrollTop();
	$("#TB_window").css({
		width:TB_WIDTH+"px",
		//width:"900px",
		height:TB_HEIGHT+"px",
		left: (arrayPageScroll[0] + (pagesize[0] - TB_WIDTH)/2)+"px", 
		top: (arrayPageScroll[1] + (pagesize[1]-TB_HEIGHT)/2)+"px" 
	});
}

function TB_overlaySize(){
	if (window.innerHeight && window.scrollMaxY || window.innerWidth && window.scrollMaxX) {	
		yScroll = window.innerHeight + window.scrollMaxY;
		xScroll = window.innerWidth + window.scrollMaxX;
		var deff = document.documentElement;
		var wff = (deff&&deff.clientWidth) || document.body.clientWidth || window.innerWidth || self.innerWidth;
		var hff = (deff&&deff.clientHeight) || document.body.clientHeight || window.innerHeight || self.innerHeight;
		xScroll -= (window.innerWidth - wff);
		yScroll -= (window.innerHeight - hff);
	} else if (document.body.scrollHeight > document.body.offsetHeight || document.body.scrollWidth > document.body.offsetWidth){ // all but Explorer Mac
		yScroll = document.body.scrollHeight;
		xScroll = document.body.scrollWidth;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		yScroll = document.body.offsetHeight;
		xScroll = document.body.offsetWidth;
  	}
	$("#TB_overlay").css({"height": yScroll, "width": xScroll});
	$("#TB_HideSelect").css({"height": yScroll,"width": xScroll});
}

function TB_load_position() {
	var pagesize = TB_getPageSize();
	var arrayPageScroll = TB_getPageScrollTop();
	$("#TB_load")
	.css({left: (arrayPageScroll[0] + (pagesize[0] - 100)/2)+"px", top: (arrayPageScroll[1] + ((pagesize[1]-100)/2))+"px" })
	.css({display:"block"});
}

function TB_parseQuery ( query ) {
   var Params = new Object ();
   if ( ! query ) return Params; // return empty object
   var Pairs = query.split(/[;&]/);
   for ( var i = 0; i < Pairs.length; i++ ) {
      var KeyVal = Pairs[i].split('=');
      if ( ! KeyVal || KeyVal.length != 2 ) continue;
      var key = unescape( KeyVal[0] );
      var val = unescape( KeyVal[1] );
      val = val.replace(/\+/g, ' ');
      Params[key] = val;
   }
   return Params;
}

function TB_getPageScrollTop(){
	var yScrolltop;
	var xScrollleft;
	if (self.pageYOffset || self.pageXOffset) {
		yScrolltop = self.pageYOffset;
		xScrollleft = self.pageXOffset;
	} else if (document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft ) {	 // Explorer 6 Strict
		yScrolltop = document.documentElement.scrollTop;
		xScrollleft = document.documentElement.scrollLeft;
	} else if (document.body) {// all other Explorers
		yScrolltop = document.body.scrollTop;
		xScrollleft = document.body.scrollLeft;
	}
	arrayPageScroll = new Array(xScrollleft,yScrolltop);
	return arrayPageScroll;
}

function TB_getPageSize(){
	var de = document.documentElement;
	var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
	var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
	arrayPageSize = new Array(w,h);
	return arrayPageSize;
}

function TB_printClick(currentImageNumber) {
	$("#TB_iframePrintImage").remove();
	$("body").append("<iframe id='TB_iframePrintImage' src='/exhibits/twww/assets/php/print-image.php?image="+currentImageNumber+"'></iframe>");
	return false;
}





/*
 * Here's where we kick off all the main jQuery functionality
 */
$(document).ready( function() {
	
	var defaultSection = 1;
	if (location.search) {
		var lastChar = location.search.charAt(location.search.length - 1);		
		var validChars = "12345678";
		if (validChars.indexOf(lastChar) > 0) {
			defaultSection = lastChar;
		}
	}
	
	// create the accordion
	$.accordian('#sections > div', '#section' + defaultSection , {
		titles:'.sectionTitle',
		contents:'.sectionContent',
		onClick:function(){},
		onShow:function(){$(this).removeClass('off').addClass('on');},
		onHide:function(){$(this).removeClass('on').addClass('off');},
		showSpeed:250,
		hideSpeed:550
	});
	
	// this function can be invoked to register any 'external accordion nav' links that are inside the DOM element passed to it
	function registerAccordionNav(insideElement) {
		// add a click event handler to all links of class 'accordionNav'
		$('a.accordionNav', insideElement).click( function() {
			//grab the last character of the href (the value of 'section')
			var goTo = this.href.charAt(this.href.length-1);
			//trigger an event as if the sectionXtitle has been clicked
			$('#section'+goTo+'title').trigger('click');
			return false;
		});
	}
	registerAccordionNav('#sections');
	
	//insert "clearing" elements to assure section panel height
	$(".sectionContent").append('<p class="clear">.</p>');
	
	// click actions for continue buttons
	$(".continueBtn a").click( function() {
		var goTo = this.href.charAt(this.href.length-1);
		$('#section'+goTo+'title').trigger('click');
		return false;
	});
	
	// insert the swf video player
	var so = new SWFObject("assets/swf/twww-video.swf", "twwwVideo", "400", "390", "8", "#7d756c", true);
	so.write("flashContent");
	
	// hide the 2nd and 3rd book ordering methods (Why doesn't this work in Safari?)
	$("#orderMethod2, #orderMethod3").hide();
	
	// register the tab clicks inside #section7
	$("#orderContainer li a").click( 
		function() {
			var clickedId = $(this).attr("id");
			var clickedTabNumber = clickedId.substr(clickedId.length-1,clickedId.length-1);
			$(this).blur();
			for(i=1; i<=3; i++) {
				if (i == clickedTabNumber) {
					$("#orderContainer ul li a").css("background-image","url(/exhibits/twww/assets/img/twww-order-tabs"+i+".gif)");
					$("#orderMethod"+i).show();
				} else {
					$("#orderMethod"+i).hide();
				}
			}
			return false;
		}
	);
	
});
