/* ________________________________________________________________________________
   
                          slideshow.js ~ rev. 2011.06.30
                 XGB Web and Software Design ~ www.xgbdesign.com

   This script contains slideshow code developed by Dynamic Drive DHTML Code
   Library, and accessory functions developed by XGB Web and Software Design.
   Visit Dynamic Drive at http://www.dynamicdrive.com/ for scripts and information.
   ________________________________________________________________________________
*/
	

/* ____________________________________________________________________

   Ultimate Fade-in slideshow (v2.4)
   Last updated: May 24th, 2010. This notice must stay intact for usage 
   Author: Dynamic Drive at http://www.dynamicdrive.com/
   Visit http://www.dynamicdrive.com/ for full source code
   ____________________________________________________________________
*/


var fadeSlideShow_descpanel={
	controls: [['x.png',7,7], ['restore.png',10,11], ['loading.gif',54,55]], //full URL and dimensions of close, restore, and loading images
	fontStyle: 'normal 11px Verdana', //font style for text descriptions
	slidespeed: 200 //speed of description panel animation (in millisec)
}

//No need to edit beyond here...

jQuery.noConflict()

function fadeSlideShow(settingarg){
	this.setting=settingarg
	settingarg=null
	var setting=this.setting
	setting.fadeduration=setting.fadeduration? parseInt(setting.fadeduration) : 500
	setting.curimage=(setting.persist)? fadeSlideShow.routines.getCookie("gallery-"+setting.wrapperid) : 0
	setting.curimage=setting.curimage || 0 //account for curimage being null if cookie is empty
	setting.currentstep=0 //keep track of # of slides slideshow has gone through (applicable in displaymode='auto' only)
	setting.totalsteps=setting.imagearray.length*(setting.displaymode.cycles>0? setting.displaymode.cycles : Infinity) //Total steps limit (applicable in displaymode='auto' only w/ cycles>0)
	setting.fglayer=0, setting.bglayer=1 //index of active and background layer (switches after each change of slide)
	setting.oninit=setting.oninit || function(){}
	setting.onslide=setting.onslide || function(){}
	if (setting.displaymode.randomize) //randomly shuffle order of images?
		setting.imagearray.sort(function() {return 0.5 - Math.random()})
	var preloadimages=[] //preload images
	setting.longestdesc="" //get longest description of all slides. If no desciptions defined, variable contains ""
	for (var i=0; i<setting.imagearray.length; i++){ //preload images
		preloadimages[i]=new Image()
		preloadimages[i].src=setting.imagearray[i][0]
		if (setting.imagearray[i][3] && setting.imagearray[i][3].length>setting.longestdesc.length)
			setting.longestdesc=setting.imagearray[i][3]
	}
	var closebutt=fadeSlideShow_descpanel.controls[0] //add close button to "desc" panel if descreveal="always"
	setting.closebutton=(setting.descreveal=="always")? '<img class="close" src="'+closebutt[0]+'" style="float:right;cursor:hand;cursor:pointer;width:'+closebutt[1]+'px;height:'+closebutt[2]+'px;margin-left:2px" title="Hide Description" />' : ''
	var slideshow=this
	jQuery(document).ready(function($){ //fire on DOM ready
		var setting=slideshow.setting
		var fullhtml=fadeSlideShow.routines.getFullHTML(setting.imagearray) //get full HTML of entire slideshow
		setting.$wrapperdiv=$('#'+setting.wrapperid).css({position:'relative', visibility:'visible', background:'black', overflow:'hidden', width:setting.dimensions[0], height:setting.dimensions[1]}).empty() //main slideshow DIV
		if (setting.$wrapperdiv.length==0){ //if no wrapper DIV found
			alert("Error: DIV with ID \""+setting.wrapperid+"\" not found on page.")
			return
		}
		setting.$gallerylayers=$('<div class="gallerylayer"></div><div class="gallerylayer"></div>') //two stacked DIVs to display the actual slide 
			.css({position:'absolute', left:0, top:0, width:'100%', height:'100%', background:'black'})
			.appendTo(setting.$wrapperdiv)
		var $loadingimg=$('<img src="'+fadeSlideShow_descpanel.controls[2][0]+'" style="position:absolute;width:'+fadeSlideShow_descpanel.controls[2][1]+';height:'+fadeSlideShow_descpanel.controls[2][2]+'" />')
			.css({left:setting.dimensions[0]/2-fadeSlideShow_descpanel.controls[2][1]/2, top:setting.dimensions[1]/2-fadeSlideShow_descpanel.controls[2][2]}) //center loading gif
			.appendTo(setting.$wrapperdiv)
		var $curimage=setting.$gallerylayers.html(fullhtml).find('img').hide().eq(setting.curimage) //prefill both layers with entire slideshow content, hide all images, and return current image
		if (setting.longestdesc!="" && setting.descreveal!="none"){ //if at least one slide contains a description (versus feature is enabled but no descriptions defined) and descreveal not explicitly disabled
			fadeSlideShow.routines.adddescpanel($, setting)
			if (setting.descreveal=="always"){ //position desc panel so it's visible to begin with
				setting.$descpanel.css({top:setting.dimensions[1]-setting.panelheight})
				setting.$descinner.click(function(e){ //asign click behavior to "close" icon
					if (e.target.className=="close"){
						slideshow.showhidedescpanel('hide')
					}
				})
				setting.$restorebutton.click(function(e){ //asign click behavior to "restore" icon
					slideshow.showhidedescpanel('show')
					$(this).css({visibility:'hidden'})
				})
			}
			else if (setting.descreveal=="ondemand"){ //display desc panel on demand (mouseover)
				setting.$wrapperdiv.bind('mouseenter', function(){slideshow.showhidedescpanel('show')})
				setting.$wrapperdiv.bind('mouseleave', function(){slideshow.showhidedescpanel('hide')})
			}
		}
		setting.$wrapperdiv.bind('mouseenter', function(){setting.ismouseover=true}) //pause slideshow mouseover
		setting.$wrapperdiv.bind('mouseleave', function(){setting.ismouseover=false})
		if ($curimage.get(0).complete){ //accounf for IE not firing image.onload
			$loadingimg.hide()
			slideshow.paginateinit($)
			slideshow.showslide(setting.curimage)
		}
		else{ //initialize slideshow when first image has fully loaded
			$loadingimg.hide()
			slideshow.paginateinit($)
			$curimage.bind('load', function(){slideshow.showslide(setting.curimage)})
		}
		setting.oninit.call(slideshow) //trigger oninit() event
		$(window).bind('unload', function(){ //clean up and persist
			if (slideshow.setting.persist) //remember last shown image's index
				fadeSlideShow.routines.setCookie("gallery-"+setting.wrapperid, setting.curimage)
			jQuery.each(slideshow.setting, function(k){
				if (slideshow.setting[k] instanceof Array){
					for (var i=0; i<slideshow.setting[k].length; i++){
						if (slideshow.setting[k][i].tagName=="DIV") //catches 2 gallerylayer divs, gallerystatus div
							slideshow.setting[k][i].innerHTML=null
						slideshow.setting[k][i]=null
					}
				}
			})
			slideshow=slideshow.setting=null
		})
	})
}

fadeSlideShow.prototype={

	navigate:function(keyword){
		var setting=this.setting
		clearTimeout(setting.playtimer)
		if (setting.displaymode.type=="auto"){ //in auto mode
			setting.displaymode.type="manual" //switch to "manual" mode when nav buttons are clicked on
			setting.displaymode.wraparound=true //set wraparound option to true
		}
		if (!isNaN(parseInt(keyword))){ //go to specific slide?
			this.showslide(parseInt(keyword))
		}
		else if (/(prev)|(next)/i.test(keyword)){ //go back or forth inside slide?
			this.showslide(keyword.toLowerCase())
		}
	},

	showslide:function(keyword){
		var slideshow=this
		var setting=slideshow.setting
		if (setting.displaymode.type=="auto" && setting.ismouseover && setting.currentstep<=setting.totalsteps){ //if slideshow in autoplay mode and mouse is over it, pause it
			setting.playtimer=setTimeout(function(){slideshow.showslide('next')}, setting.displaymode.pause)
			return
		}
		var totalimages=setting.imagearray.length
		var imgindex=(keyword=="next")? (setting.curimage<totalimages-1? setting.curimage+1 : 0)
			: (keyword=="prev")? (setting.curimage>0? setting.curimage-1 : totalimages-1)
			: Math.min(keyword, totalimages-1)
		var $slideimage=setting.$gallerylayers.eq(setting.bglayer).find('img').hide().eq(imgindex).show() //hide all images except current one
		var imgdimensions=[$slideimage.width(), $slideimage.height()] //center align image
		$slideimage.css({marginLeft: (imgdimensions[0]>0 && imgdimensions[0]<setting.dimensions[0])? setting.dimensions[0]/2-imgdimensions[0]/2 : 0})
		$slideimage.css({marginTop: (imgdimensions[1]>0 && imgdimensions[1]<setting.dimensions[1])? setting.dimensions[1]/2-imgdimensions[1]/2 : 0})
		if (setting.descreveal=="peekaboo" && setting.longestdesc!=""){ //if descreveal is set to "peekaboo", make sure description panel is hidden before next slide is shown
			clearTimeout(setting.hidedesctimer) //clear hide desc panel timer
			slideshow.showhidedescpanel('hide', 0) //and hide it immediately
		}
		setting.$gallerylayers.eq(setting.bglayer).css({zIndex:1000, opacity:0}) //background layer becomes foreground
			.stop().css({opacity:0}).animate({opacity:1}, setting.fadeduration, function(){ //Callback function after fade animation is complete:
				clearTimeout(setting.playtimer)
				try{
					setting.onslide.call(slideshow, setting.$gallerylayers.eq(setting.fglayer).get(0), setting.curimage)
				}catch(e){
					alert("Fade In Slideshow error: An error has occured somwhere in your code attached to the \"onslide\" event: "+e)
				}
				if (setting.descreveal=="peekaboo" && setting.longestdesc!=""){
					slideshow.showhidedescpanel('show')
					setting.hidedesctimer=setTimeout(function(){slideshow.showhidedescpanel('hide')}, setting.displaymode.pause-fadeSlideShow_descpanel.slidespeed)
				}	
				setting.currentstep+=1
				if (setting.displaymode.type=="auto"){
					if (setting.currentstep<=setting.totalsteps || setting.displaymode.cycles==0)
						setting.playtimer=setTimeout(function(){slideshow.showslide('next')}, setting.displaymode.pause)
				}
			}) //end callback function
		setting.$gallerylayers.eq(setting.fglayer).css({zIndex:999}) //foreground layer becomes background
		setting.fglayer=setting.bglayer
		setting.bglayer=(setting.bglayer==0)? 1 : 0
		setting.curimage=imgindex
		if (setting.$descpanel){
			setting.$descpanel.css({visibility:(setting.imagearray[imgindex][3])? 'visible' : 'hidden'})
			if (setting.imagearray[imgindex][3]) //if this slide contains a description
				setting.$descinner.empty().html(setting.closebutton + setting.imagearray[imgindex][3])
		}
		if (setting.displaymode.type=="manual" && !setting.displaymode.wraparound){
			this.paginatecontrol()
		}
		if (setting.$status) //if status container defined
			setting.$status.html(setting.curimage+1 + "/" + totalimages)
	},

	showhidedescpanel:function(state, animateduration){
		var setting=this.setting
		var endpoint=(state=="show")? setting.dimensions[1]-setting.panelheight : this.setting.dimensions[1]
		setting.$descpanel.stop().animate({top:endpoint}, (typeof animateduration!="undefined"? animateduration : fadeSlideShow_descpanel.slidespeed), function(){
			if (setting.descreveal=="always" && state=="hide")
				setting.$restorebutton.css({visibility:'visible'}) //show restore button
		})
	},

	paginateinit:function($){
		var slideshow=this
		var setting=this.setting
		if (setting.togglerid){ //if toggler div defined
			setting.$togglerdiv=$("#"+setting.togglerid)
			setting.$prev=setting.$togglerdiv.find('.prev').data('action', 'prev')
			setting.$next=setting.$togglerdiv.find('.next').data('action', 'next')
			setting.$prev.add(setting.$next).click(function(e){ //assign click behavior to prev and next controls
				var $target=$(this)
				slideshow.navigate($target.data('action'))
				e.preventDefault()
			})
			setting.$status=setting.$togglerdiv.find('.status')
		}
	},

	paginatecontrol:function(){
		var setting=this.setting
			setting.$prev.css({opacity:(setting.curimage==0)? 0.4 : 1}).data('action', (setting.curimage==0)? 'none' : 'prev')
			setting.$next.css({opacity:(setting.curimage==setting.imagearray.length-1)? 0.4 : 1}).data('action', (setting.curimage==setting.imagearray.length-1)? 'none' : 'next')
			if (document.documentMode==8){ //in IE8 standards mode, apply opacity to inner image of link
				setting.$prev.find('img:eq(0)').css({opacity:(setting.curimage==0)? 0.4 : 1})
				setting.$next.find('img:eq(0)').css({opacity:(setting.curimage==setting.imagearray.length-1)? 0.4 : 1})
			}
	}

	
}

fadeSlideShow.routines={

	getSlideHTML:function(imgelement){
		var layerHTML=(imgelement[1])? '<a href="'+imgelement[1]+'" target="'+imgelement[2]+'">\n' : '' //hyperlink slide?
		layerHTML+='<img src="'+imgelement[0]+'" style="border-width:0;" />\n'
		layerHTML+=(imgelement[1])? '</a>\n' : ''
		return layerHTML //return HTML for this layer
	},

	getFullHTML:function(imagearray){
		var preloadhtml=''
		for (var i=0; i<imagearray.length; i++)
			preloadhtml+=this.getSlideHTML(imagearray[i])
		return preloadhtml
	},

	adddescpanel:function($, setting){
		setting.$descpanel=$('<div class="fadeslidedescdiv"></div>')
			.css({position:'absolute', visibility:'hidden', width:'100%', left:0, top:setting.dimensions[1], font:fadeSlideShow_descpanel.fontStyle, zIndex:'1001'})
			.appendTo(setting.$wrapperdiv)
		$('<div class="descpanelbg"></div><div class="descpanelfg"></div>') //create inner nav panel DIVs
			.css({position:'absolute', left:0, top:0, width:setting.$descpanel.width()-8, padding:'4px'})
			.eq(0).css({background:'black', opacity:0.7}).end() //"descpanelbg" div
			.eq(1).css({color:'white'}).html(setting.closebutton + setting.longestdesc).end() //"descpanelfg" div
			.appendTo(setting.$descpanel)
		setting.$descinner=setting.$descpanel.find('div.descpanelfg')
		setting.panelheight=setting.$descinner.outerHeight()
		setting.$descpanel.css({height:setting.panelheight}).find('div').css({height:'100%'})
		if (setting.descreveal=="always"){ //create restore button
			setting.$restorebutton=$('<img class="restore" title="Restore Description" src="' + fadeSlideShow_descpanel.controls[1][0] +'" style="position:absolute;visibility:hidden;right:0;bottom:0;z-index:1002;width:'+fadeSlideShow_descpanel.controls[1][1]+'px;height:'+fadeSlideShow_descpanel.controls[1][2]+'px;cursor:pointer;cursor:hand" />')
				.appendTo(setting.$wrapperdiv)


		}
	},


	getCookie:function(Name){ 
		var re=new RegExp(Name+"=[^;]+", "i"); //construct RE to search for target name/value pair
		if (document.cookie.match(re)) //if cookie found
			return document.cookie.match(re)[0].split("=")[1] //return its value
		return null
	},

	setCookie:function(name, value){
		document.cookie = name+"=" + value + ";path=/"
	}
}


/* ____________________________________________________________________________________________

   Ultimate Fade In Slideshow v2.0- (c) Dynamic Drive DHTML code library (www.dynamicdrive.com)
   This notice MUST stay intact for legal use
   Visit Dynamic Drive at http://www.dynamicdrive.com/ for this script and 100s more
   ____________________________________________________________________________________________
*/


var portfolio=new fadeSlideShow({
	wrapperid: "slideshow", //ID of blank DIV on page to house Slideshow
	dimensions: [631, 390], //width/height of gallery in pixels. Should reflect dimensions of largest image
	imagearray: ImageArray(), // This line modified by XGB Web and Software Design
	displaymode: {type:'auto', pause:5000, cycles:0, wraparound:false},
	persist: false, //remember last viewed slide and recall within same session?
	fadeduration: 800, //transition duration (milliseconds)
	descreveal: "ondemand",
	togglerid: ""
})


// Code developed by XGB Web and Software Design: ___________________________________________________________________


function ImageArray() {
	var ri, total = 52;
	var iArray = new Array(total);
	var rArray = RandomArray(39, total);
	var rImg = RecursionImage();
	var imgName = ImageNames();
	var urlName = URLnames();
	var capName = CaptionNames();
	var msg = " ~ Click the image to access this page";

	for (var i = 0; i < total; ++i) {
		ri = rArray[i];
		iArray[i] = ri == 999 ? rImg : new Array(
			"images/slideshow/" + imgName[ri] + ".jpg",   // Image source
			ri > 1 ? "http://www." + urlName[ri] : "",    // Page reference
			"_new",                                       // Target attribute
			ri > 1 ? capName[ri] + msg : capName[ri]      // Caption bar
		);
	}
	return iArray;
}


function RandomArray(size, total) {
	var rA = new Array(size);
	var taken = new Array(size);

	// Initialize all images to the unselected state:
	for (var i = 0; i < size; ++i)
		taken[i] = false;

	// Make sure no image is selected more than once:
	for (i = 0; i < size; ++i) {
		do rA[i] = Math.floor(Math.random() * size);
		while (taken[rA[i]]);
		taken[rA[i]] = true;
	}
	// For the recursion image, insert a dummy number
	// at every fourth position of the array:
	for (i = 0; i < total; i += 4)
		rA.splice(i, 0, 999);

	return rA;
}


// The variable named "homeTheme" is defined globally so that it can
// eventually communicate with PostNavigationSchema(), ensuring that the
// latter returns a navigation schema that accords with the recursion image:

function RecursionImage() {
	homeTheme = Math.floor(Math.random() * 4);
	var imgUrl = "images/slideshow/recursion" + homeTheme + ".png";
	var caption = "Recursion: Just one part of what XGB Design is all about!";
	return new Array(imgUrl, "about.html", "_new", caption);
}


// 39 items total
function ImageNames() {
	return new Array(
		// Unlinked images: 2 items
		"nxpr1", "nxpr2",

		// Linked images: 37 items
		"adpt1", "adpt2", "adpt3", "glrp1", "glrp2", "glrp3", "glrp4", "kceo1", "kceo2", "kceo3",
		"kfec1", "kfec2", "kfec3", "kfsd1", "kfsd2", "kfsd3", "kfsd4", "kspa1", "kspa2", "kspa3",
		"kspa4", "lwgd1", "lwgd2", "lwgd3", "lwgd4", "prog1", "prog2", "prog3", "prog4", "prog5",
		"prog6", "sdfh1", "sdfh2", "xmas1", "xmas2", "xmas3", "xml-1"
	);
}


function URLnames() {
	return new Array(
		// Unlinked images: 2 items
		"", "",

		// Linked images: 37 items
		"adaptt.org/",
		"adaptt.org/athletes.html",
		"adaptt.org/veganism.html",
		"xgbdesign.com/george-lacks/online-collections.html",
		"xgbdesign.com/george-lacks/george-as-subject.html",
		"xgbdesign.com/george-lacks/hitler-suite.html#viewport",
		"xgbdesign.com/george-lacks/george-as-subject.html#viewport",
		"kceoradio.com/",
		"kceoradio.com/about.html",
		"kceoradio.com/programs.html",

		"xgbdesign.com/archive/kungfood/", 
		"xgbdesign.com/archive/kungfood/art.html",
		"xgbdesign.com/archive/kungfood/cafemenu.html",
		"xgbdesign.com/archive/kfsdradio/",
		"xgbdesign.com/archive/kfsdradio/metopera.html",
		"xgbdesign.com/archive/kfsdradio/contact.html",
		"xgbdesign.com/archive/kfsdradio/requests.html",
		"thesparadio.com/",
		"thesparadio.com/datebook.html",
		"thesparadio.com/jazz-at-the-spa.html",

		"thesparadio.com/contact.html",
		"liesawalker.com/about.html",
		"liesawalker.com/testimonials.html",
		"liesawalker.com/business-identity.html#viewport",
		"liesawalker.com/photography.html#viewport",
		"xgbdesign.com/c++code/rpn-calculator/",
		"xgbdesign.com/c++code/rpn-calculator/version1-05.html",
		"xgbdesign.com/scripts/slideshow.txt",
		"xgbdesign.com/c++code/Kardio.txt",
		"xgbdesign.com/haskell/engineSpec.txt",

		"xgbdesign.com/haskell/solutionSet.txt",
		"xgbdesign.com/odds-n-ends/sdfh/New_Years_Eve_Contradance.html",
		"xgbdesign.com/odds-n-ends/sdfh/New_Years_Eve_Contradance.html",
		"xgbdesign.com/archive/ksparadio-xmas/",
		"xgbdesign.com/archive/ksparadio-xmas/about.html",
		"xgbdesign.com/archive/ksparadio-xmas/contact.html",
		"xgbdesign.com/odds-n-ends/derivations.xml"
	);
}


function CaptionNames() {
	return new Array(
		// Unlinked images: 2 items
		"Nature's Express Healthier Fast Food (formerly Kung Food Express Caf&eacute;)",
		"Nature's Express Healthier Fast Food (formerly Kung Food Express Caf&eacute;)",

		// Linked images: 37 items
		"ADAPTT >> Home",
		"ADAPTT >> Vegan and Vegetarian Athletes",
		"ADAPTT >> All About Veganism",
		"George Lacks :: A Remembrance in Pictures >> Online Collections",
		"George Lacks :: A Remembrance in Pictures >> George As Subject",
		"George Lacks Commemoration >> The Hitler Suite >> Viewport",		
		"George Lacks Commemoration >> George As Subject >> Viewport",
		"AM 1000 KCEO >> Home",
		"AM 1000 KCEO >> About KCEO",
		"AM 1000 KCEO >> Featured Programs",

		"Kung Food Express Caf&eacute; >> Home",
		"Kung Food Express Caf&eacute; >> Art and Artists",
		"Kung Food Express Caf&eacute; >> Caf&eacute; Menu",
		"Classical KFSD AM 1450 >> Home", 
		"Classical KFSD AM 1450 >> Metropolitan Opera",
		"Classical KFSD AM 1450 >> Contact Us",
		"Classical KFSD AM 1450 >> Listener Request Friday Archive",
		"The SPA Radio >> Home",
		"The SPA Radio >> The SPA Datebook",
		"The SPA Radio >> Jazz At The SPA", 

		"The SPA Radio >> Contact Us",
		"Liesa Walker Graphic Design and Production >> About Liesa",
		"Liesa Walker Graphic Design and Production >> Testimonials",
		"Liesa Walker Graphic Design >> Business Identity >> Viewport",
		"Liesa Walker Graphic Design >> Photography >> Viewport",
		"The Tiny RPN Calculator >> Overview",
		"The Tiny RPN Calculator >> Version 1.05",
		"An example of programming in JavaScript",
		"An example of programming in C++",
		"An example of programming in Haskell",

		"An example of programming in Haskell",
		"E-Flyer, San Diego Folk Heritage New Year's Eve Dance 2007",
		"E-Flyer, San Diego Folk Heritage New Year's Eve Dance 2007",
		"The SPA Radio, \"Holiday Standards\" Edition >> Home",
		"The SPA Radio, \"Holiday Standards\" Edition >> About The SPA",
		"The SPA Radio, \"Holiday Standards\" Edition >> Contact Us",
		"Derivations and Proofs in XML"
	);
}



