///////////////////////////// WEB SOFTWARE BY DAVID REGIER /////////////////////////////
///////////////////////////// http://www.ctpmaui.com/david /////////////////////////////
///////////////////// UNAUTHORIZED USE OF THIS CODE IS PROHIBITED //////////////////////

var CI = new Array();
CI[ "DavidEmail" ] = "david" + "@" + "creativetouchphoto." + "com";

var theUserAgent = navigator.userAgent;
var theAppVersion = navigator.appVersion;
var bName = navigator.appName;
var exactVer = parseFloat( theAppVersion );
var bVer = parseInt( exactVer );
var bMinor = navigator.appMinorVersion;
var os = navigator.platform;

var IE = false;
var NC = false; var NC6 = false; var NC7 = false;
var SF = false;

if( bName == "Microsoft Internet Explorer" ) {
	var splitAppVersion = theAppVersion.split( "MSIE" );
	bVer = parseInt( splitAppVersion[1] );
	exactVer = parseFloat( splitAppVersion[1] );
	IE = true;
}
else if( theAppVersion.indexOf( "Safari" ) >= 0 )
	SF = true;
else if( bName == "Netscape" ) {
	// SAVE navigator.userAgent:
	//Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.2) Gecko/20010726 Netscape6/6.1
	//Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0
	//Mozilla/4.73 [en] (Windows NT 5.0; U)
	if( theUserAgent.lastIndexOf( "Netscape" ) >= 0 ) { // NC6 or NC7
		var nInfo = theUserAgent.split( "Netscape" )[ 1 ];
		var slash = ( nInfo.indexOf( "/" ) >= 0 ) ? true : false;
		exactVer = ( slash ) ? parseFloat( nInfo.split( "/" )[ 1 ] ) : parseFloat( nInfo );
		bVer = parseInt( exactVer );
		if( bVer >= 7 ) NC7 = true;
		else if( bVer == 6 ) NC6 = true;
	}
	NC = true;
}
var winOS = ( os.substring( 0, 3 ) == "Win" );
var winIE = ( winOS && IE );
var macOS = ( os.substring( 0, 3 ) == "Mac" );
var macIE = ( macOS && IE );
//macIE = true;

var theHost = document.location.hostname.toLowerCase();

var local = ( theHost.length == 0 || theHost == "127.0.0.1" || theHost == "localhost" );
var live = !local;

window.onerror = errorHandler;

var ieTrans = ( IE && winOS );
var ncTrans = ( NC );

var aol = ( theUserAgent.indexOf( "AOL" ) >= 0 );
//--------------------------------------------------------------------------------------

var dText = new Array();
dText[ "ss" ] = "View photos on a traditional click-to-enlarge page";


//----------------------------------------------------------------------------------------
function errorHandler( msg, url, line ) {
	var qStr = ( myPar ) ? getQueryStr( "window" ) : null;
	if ( local || admin ) {
		alert( "ERROR: " + msg + "\n\nURL: " + url + "\n\nLINE: " + line );
		return false;
	}
	return true;
}

//----------------------------------------------------------------------------------------
function getCookieVal (offset) {
  var endstr = document.cookie.indexOf (";", offset);
  if (endstr == -1)
    endstr = document.cookie.length;
  return unescape(document.cookie.substring(offset, endstr));
}
//----------------------------------------------------------------------------------------
function GetCookie(name) {
  var arg = name + "=";
  var alen = arg.length;
  var clen = document.cookie.length;
  var i = 0;
  while (i < clen) {
    var j = i + alen;
    if (document.cookie.substring(i, j) == arg)
      return getCookieVal (j);
    i = document.cookie.indexOf(" ", i) + 1;
    if (i == 0) break;
  }
  return null;
}
//----------------------------------------------------------------------------------------
function SetCookie (name,value,expires,path,domain,secure) {
  document.cookie = name + "=" + escape (value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}
//----------------------------------------------------------------------------------------
function DeleteCookie (name,path,domain) {
  if (GetCookie(name)) {
    document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}
//----------------------------------------------------------------------------------------
//Global function read everytime page loads
var expdate = new Date();
var expdate1 = new Date();
expdate.setTime (expdate.getTime() + (24 * 60 * 60 * 365 * 1000)); // 1 year from now
expdate1.setTime (expdate1.getTime() + (24 * 60 * 60 * 30 * 1000)); // 30 days from now

//----------------------------------- STRING PROTOTYPE -----------------------------------

// NOTE: This file referenced by html files in root directory AND "other/index.html"
var showPrices = false;

function replaceLiteral( target, replacement ) { // String Method
	return this.split( target ).join( replacement );
}
String.prototype.replaceLiteral = replaceLiteral;

//----------------------------------- STRING PROTOTYPE -----------------------------------

var tmpStr = "";

function removeHtmlTags() { // String Method

	var theString = this.toString(); // Object ==> String
	tmpStr = theString;

	var startPos = theString.indexOf( "<" );
	var endPos = theString.indexOf( ">" );

	// If we got an HTML tag...
	if( startPos != -1 && endPos != -1 && ( endPos > startPos ) ) {
		var htmlTag = "<" + theString.substring( startPos + 1, endPos ) + ">";
		tmpStr = theString.replaceLiteral( htmlTag, "" );
		tmpStr.removeHtmlTags();
	}
	return tmpStr;
}
String.prototype.removeHtmlTags = removeHtmlTags;

//----------------------------------- STRING PROTOTYPE -----------------------------------

function getValue( strToSearch, eqDelim, fieldDelim ) {

	if( !eqDelim ) eqDelim = "=";
	if( !fieldDelim ) fieldDelim = "&";

	var value = null;
	var key = this.toString();
	var lookUpPattern = key + eqDelim;

	// If lookUpPattern is found
	if( strToSearch.indexOf( lookUpPattern ) != -1 ) {

		// if string has more than 1 key/value pair
		if( strToSearch.indexOf( fieldDelim ) != -1 ) {
			var searchArr = strToSearch.split( fieldDelim );
			for( var i = 0; i < searchArr.length; i++ ) {
				if( searchArr[ i ].indexOf( lookUpPattern ) == 0 ) {
					value = searchArr[ i ].split( eqDelim )[1];
					break;
				}
			}
		}
		else // There is only one key/value pair in strToSearch
			value = strToSearch.split( eqDelim )[1];
	}
	if( !value ) value = null; //N6 problem
	return value;
}
String.prototype.getValue = getValue;

//--------------------------------------------------------------------------------------

var irvinWin = null;

function openWin( theSite, tool, loc, status, menu, winSize, resizable ) {

	closeWin();

	var wid = 800 * 1.1 * winSize;
	var hgt = 450 * winSize;

	// Works on AOL, IE, NC
	// IE Makes pop up same size as INNER DIMENSIONS of parent window.
	// AOL makes pop up same exact size as parent since toobars etc. don't attribute to inner dim of AOL window

	if( winSize == 1 ) { // Make a full size pop-up...
		if( IE ) {
			wid = ( aol ) ? document.body.clientWidth : screen.availWidth - 10;
			hgt = ( aol ) ? document.body.clientHeight : screen.availHeight - 50;
		}
	else { // NC
			var hSkew = ( NC ) ? 50 : 100;
			wid = screen.availWidth - 10;
			hgt = screen.availHeight - hSkew;
		}
	}

	try {
		irvinWin = window.open("","irvin_window","toolbar="+tool+",location="+loc+",directories=0,status="+status+",menubar="+menu+",scrollbars=1,resizable="+resizable+",width="+wid+",height="+hgt+",top="+screen.availTop+",left="+screen.availLeft+"");

		irvinWin.location.href = theSite;
		focusWin();
	}
	catch( e ) {

		if( !popUpMsgTimer && theSite.indexOf( "ss.html" ) == 0 )
			popUpMsgTimer = setInterval( "setPopUpMsg( 1 )", 1500 );
	}

}

function closeWin() {
	try {
		if( irvinWin && !irvinWin.closed ) {
			irvinWin.close();
			irvinWin = null;
		}
	}
	catch( e ) {}
}
function focusWin() {
	try {
		if( irvinWin && typeof irvinWin.registered == "boolean" ) irvinWin.focus();
		else setTimeout( "focusWin()", 500 );
	}
	catch( e ) {}
}
//---------------------------------------------------------------------------------------
function linkToPopUp() {
	try {
		if( eval( "typeof irvinWin.registered" ) == "boolean" ) irvinWin.myOpener = self;
		else setTimeout( "linkToPopUp()", 250 );
	}
	catch( e ) {}
}
//--------------------------------------------------------------------------------------

var popUpMsg = true;
var popUpMsgTimer = 0;

function setPopUpMsg( on ) {
	if( on ) {
		if( popUpMsg ) { self.status = "Slide-show not working? Then disable your pop-up/ad blocker software..."; popUpMsg = false; }
		else { self.status = " "; popUpMsg = true; 	}
	}
	else { clearTimeout( popUpMsgTimer ); popUpMsgTimer = 0; self.status = " "; }
}
//--------------------------------------------------------------------------------------

function loadSS( ss ) {

	openWin( ss, "0", "0", "1", "0", 1.0, 1 );
	linkToPopUp();
	if( !popUpMsgTimer ) popUpMsgTimer = setInterval( "setPopUpMsg( 1 )", 1500 );
}

//////////////////////////////// START DYNAMIC MENU ////////////////////////////////

/*
ACCESSOR VARIABLES: IE, NC, winIE, macIE, SF
ACCESSOR FUNCTIONS: None
*/

//--------------------------------- OBJECT CONSTRUCTOR ---------------------------------

function DynamicMenu( objName ) {

	var ssMsg = "View photos via our automated pop-up slide-show";
	var tnMsg = "View photos on a traditional click-to-enlarge page";

	// Begin User Settings
	this.Links = new Array();

	this.Links[ "weddings" ] =
	[
		[ "Slide-Show", "javascript:loadSS( \\&#39;ss.html?db=img-data-weddings.js\\&#39; );", ssMsg ],
		[ "Thumbnails", "thumbnails.html?db=img-data-weddings.js", tnMsg ],
		[  "",        9,     [2,2],   [0, -3], [0, 0], [0, 4], [0,0] ]
		// Title, fontSize, relative, above,   right,  below,  left: [xPos, yPos]
	];

	this.Links[ "portraits" ] =
	[
		[ "Slide-Show", "javascript:loadSS( \\&#39;ss.html?db=img-data-portraits.js\\&#39; );", ssMsg ],
		[ "Thumbnails", "thumbnails.html?db=img-data-portraits.js", tnMsg ],
		[  "",        9,     [2,2],   [0, -3], [0, 0], [0, 4], [0,0] ]
		// Title, fontSize, relative, above,   right,  below,  left: [xPos, yPos]
	];

	this.Links[ "art" ] =
	[
		[ "Slide-Show", "javascript:loadSS( \\&#39;../ss.html?db=img-data-art.js\\&#39; );", ssMsg ],
		[ "Thumbnails", "../thumbnails.html?db=img-data-art.js", tnMsg ],
		[  "",        9,     [2,2],   [0, -3], [0, 0], [0, 4], [0,0] ]
		// Title, fontSize, relative, above,   right,  below,  left: [xPos, yPos]
	];


	this.Links[ "award" ] =
	[
		[ "Slide-Show", "javascript:loadSS( \\&#39;ss.html?db=img-data-award.js\\&#39; );", ssMsg ],
		[ "Thumbnails", "thumbnails.html?db=img-data-award.js", tnMsg ],
		[  "",        9,     [2,2],   [0, -3], [0, 0], [0, 4], [0,0] ]
		// Title, fontSize, relative, above,   right,  below,  left: [xPos, yPos]
	];

	this.Links[ "seniors" ] =
	[
		[ "Slide-Show", "javascript:loadSS( \\&#39;ss.html?db=img-data-seniors.js\\&#39; );", ssMsg ],
		[ "Thumbnails", "thumbnails.html?db=img-data-seniors.js", tnMsg ],
		[  "",        9,     [2,2],   [0, -3], [0, 0], [0, 4], [0,0] ]
		// Title, fontSize, relative, above,   right,  below,  left: [xPos, yPos]
	];

	this.settings = new Array();
	this.settings[ "fgColorOff" ] = "51,51,51";
	this.settings[ "fgColorOn" ] = "255,255,255";
	this.settings[ "fgColorDisable" ] = "151,151,151";
	this.settings[ "bgColorOff" ] = "225,225,225";
	this.settings[ "bgColorOn" ] = "0,0,102";
	this.settings[ "borderColor" ] = "102,102,102";
	this.settings[ "fgTitleColor" ] = "51,51,51";
	this.settings[ "bgTitleColor" ] = "204,204,204";
	this.settings[ "formElements" ] = null;
	this.settings[ "delayToKill" ] = 1000;
	this.settings[ "showToolTip" ] = true;

	// Do not edit past this line -------------------------

	this.Menu = null;
	this.OldLink = null;
	this.timer = 0;

	this.start = start;
	this.show = show;
	this.killOthers = killOthers;
	this.hide = hide;
	this.resetTimer = resetTimer;
	this.getPos = getPos;
	this.setElemVis = setElemVis;
	this.keepInWin = keepInWin;

	//-------------------------------------- METHOD --------------------------------------

	function start( Link, theEvent, arrName, menuPosition ) {
		killOthers( Link );
		show( Link, theEvent, arrName, menuPosition );
	}

	//-------------------------------------- METHOD --------------------------------------

	function killOthers( NewLink ) {
		resetTimer();
		if( DM.Menu && DM.OldLink && DM.OldLink != NewLink ) {
			DM.Menu.innerHTML = '';
			DM.Menu = null;
			DM.timer = 0;
			DM.OldLink = null;
			DM.setElemVis( "", "visible" );
		}
	}

	//-------------------------------------- METHOD --------------------------------------
	// It appears that Safari fails to add BODY: margin-top to y however it correctly determines y when link is set as position:absolute.
	function getPos( TheElement ) {
		var x = 0; var y = 0;
		//var deBugStr = ""
		while( TheElement != document.body ) {
			y += TheElement.offsetTop;
			x += TheElement.offsetLeft;
			y -= TheElement.scrollTop;
			x -= TheElement.scrollLeft;
			//deBugStr += "TAG: " + TheElement.tagName + ";  x:" + x + ";  y:" + y + "\n";
			TheElement = TheElement.offsetParent;
		}
		//prompt( "", deBugStr );
		return[ x, y ];
	}
	//-------------------------------------- METHOD --------------------------------------

	function keepInWin( topEdge, leftEdge, IeBody ) {

		var bodyHgt = ( IE ) ? IeBody.clientHeight : window.innerHeight;
		var bodyWid = ( IE ) ? IeBody.clientWidth : window.innerWidth;

		// Prevent menu from going off bottom & top of page
		var menuHgt = DM.Menu.offsetHeight;
		var yOffset = ( IE ) ? IeBody.scrollTop : window.pageYOffset;
		var vScreenPos = topEdge - yOffset;
		var vSkew = bodyHgt - vScreenPos;
		if( vSkew < menuHgt + 10 ) topEdge -= menuHgt - vSkew + 10; // bottom edge
		else if( vScreenPos < 10 ) topEdge = 10 + yOffset; // top edge

		// Prevent menu from going off right & left edges
		var menuWid = DM.Menu.offsetWidth;
		var xOffset = ( IE ) ? IeBody.scrollLeft : window.pageXOffset;
		var hScreenPos = leftEdge - xOffset;
		var hSkew = bodyWid - hScreenPos;
		if( hSkew < menuWid + 10 ) leftEdge -= menuWid - hSkew + 10; // right edge
		else if( hScreenPos < 10 ) leftEdge = 10 + xOffset; // left edge

		return[ topEdge, leftEdge ];

	}
	//-------------------------------------- METHOD --------------------------------------

	function show( Link, theEvent, arrName, menuPosition ) {

		if( !DM.Menu ) {

			DM.setElemVis( arrName, "hidden" )

			var e = ( window.event ) ? event : theEvent;

			var borderCol = DM.settings.borderColor;
			var borderStyle = ( borderCol ) ? " STYLE='border:1px solid rgb( " + borderCol + " );'" : "";

			var nLinks = DM.Links[ arrName ].length - 1;

			var menuTitle = DM.Links[ arrName ][ nLinks ][ 0 ];

			var fontSize = DM.Links[ arrName ][ nLinks ][ 1 ];

			var table = "" +

			"<TABLE ALIGN='left' BORDER='0' CELLSPACING='0' CELLPADDING='1' " + borderStyle + " onMouseover='DM.resetTimer();' onMouseout='DM.hide( 0 );'>";
				for( var i = 0; i < nLinks; i++ ) {

					if( menuTitle && i == 0 ) {
						table +=
						"<TR>" +
							"<TD NOWRAP ALIGN='center' STYLE='color:rgb( " + DM.settings.fgTitleColor + " ); background-color:rgb( " + DM.settings.bgTitleColor + " ); font-size:" + fontSize + "pt; font-family:arial,helvetica; font-weight:bold;'>&nbsp;" +
							menuTitle +
							"&nbsp;</TD>" +
						"</TR>";
					}

					table +=
					"<TR ALIGN='left' VALIGN='middle'>";

						var thePage = document.location.href;
						var pageShowing = ( thePage.substring( thePage.length - DM.Links[ arrName ][ i ][ 1 ].length, thePage.length ) == DM.Links[ arrName ][ i ][ 1 ] && !document.location.hash );

						var selfStatusCode = "";

						if( DM.Links[ arrName ][ i ][ 2 ] && !pageShowing ) {
							if( DM.settings.showToolTip )
								selfStatusCode = "this.title = \"" + DM.Links[ arrName ][ i ][ 2 ] + "\"; self.status = \"" + DM.Links[ arrName ][ i ][ 2 ] + "\"; ";
							else
								selfStatusCode = "self.status = \"" + DM.Links[ arrName ][ i ][ 2 ] + "\"; ";
						}

						var mouseOutCode = ( DM.Links[ arrName ][ i ][ 2 ] ) ? " self.status = \"\"; " : "";

						var fgColOn = ( pageShowing ) ? DM.settings[ "fgColorDisable" ] : DM.settings[ "fgColorOn" ];

						var fgColOff = ( pageShowing ) ? DM.settings[ "fgColorDisable" ] : DM.settings[ "fgColorOff" ];

						var bgCol = ( pageShowing )  ? DM.settings[ "bgColorOff" ] : DM.settings[ "bgColorOn" ];

						var cursorType = ( pageShowing ) ? "default" : "hand";
						if( NC ) cursorType = "default";

						var onClickCode = ( pageShowing ) ? "self.status = \"You are already on the \\&#34;" + DM.Links[ arrName ][ i ][ 0 ]  + "\\&#34; page\"; return true;" : "document.location.href=\"" + DM.Links[ arrName ][ i ][ 1 ] + "\"";

						table +=
						"<TD NOWRAP STYLE='background-color:rgb( " + DM.settings[ 'bgColorOff' ] + " );' onMouseOver='" + selfStatusCode + "this.firstChild.style.color=\"rgb( " + fgColOn + ")\"; style.cursor = \"" + cursorType + "\"; style.backgroundColor=\"rgb( " + bgCol + ")\"; return true;' onMouseOut='" + mouseOutCode + "this.firstChild.style.color=\"rgb( " + fgColOff + ")\"; style.backgroundColor=\"rgb( " + DM.settings[ 'bgColorOff' ] + ")\"; return true;' onClick='" + onClickCode + "'>" +

							"<SPAN STYLE='font-size:" + fontSize + "pt; font-family:arial,helvetica; color:rgb( " + ( ( pageShowing ) ? fgColOn : DM.settings[ 'fgColorOff' ] ) + ");'>&nbsp;" + DM.Links[ arrName ][ i ][ 0 ]  + "&nbsp;</SPAN>" +

						"</TD>" +
					"</TR>";
				}

			table +=
			"</TABLE><BR>"; // Trailing "<BR>" nesessary for macIE - don't delete!

			DM.Menu = document.createElement( "DIV" );
			document.body.appendChild( DM.Menu );

			DM.OldLink = Link;
			DM.Menu.style.zIndex = 1000;
			DM.Menu.style.visibility = "hidden";
			DM.Menu.style.position = "absolute";
			DM.Menu.style.top = ( screen.height * -1 ) + "px";
			DM.Menu.style.left = ( screen.width * -1 ) + "px";
			DM.Menu.innerHTML = table;

			if( macIE || SF ) menuPosition = "relative";
			if( menuPosition != "relative" ) var PosArr = getPos( Link );

			var ieCSS = ( IE && document.compatMode) ? document.compatMode ==  "CSS1Compat" : false;
			var IeBody = null;
			if( IE ) IeBody = ( ieCSS ) ? document.documentElement : document.body;
			var MenuPos = [ -1 ,-1 ];

			switch( menuPosition ) {

				case "relative":
					var topEdge = ( IE ) ? e.clientY + IeBody.scrollTop : e.pageY;
					topEdge += DM.Links[ arrName ][ nLinks ][ 2 ][ 1 ];
					var leftEdge = ( IE ) ? e.clientX + IeBody.scrollLeft : e.pageX;
					leftEdge += DM.Links[ arrName ][ nLinks ][ 2 ][ 0 ];
					MenuPos = DM.keepInWin( topEdge, leftEdge, IeBody );
					break;

				case "above":
					var topEdge = PosArr[ 1 ] - DM.Menu.offsetHeight + DM.Links[ arrName ][ nLinks ][ 3 ][ 1 ];
					var leftEdge = PosArr[ 0 ] + DM.Links[ arrName ][ nLinks ][ 3 ][ 0 ];
					MenuPos = DM.keepInWin( topEdge, leftEdge, IeBody );
					break;

				case "right":
					var topEdge = PosArr[ 1 ] + DM.Links[ arrName ][ nLinks ][ 4 ][ 1 ];
					var leftEdge = PosArr[ 0 ] + Link.offsetWidth + DM.Links[ arrName ][ nLinks ][ 4 ][ 0 ];
					MenuPos = DM.keepInWin( topEdge, leftEdge, IeBody );
					break;

				case "below":
					var topEdge = PosArr[ 1 ] + Link.offsetHeight + DM.Links[ arrName ][ nLinks ][ 5 ][ 1 ];
					var leftEdge = PosArr[ 0 ] + DM.Links[ arrName ][ nLinks ][ 5 ][ 0 ];
					MenuPos = DM.keepInWin( topEdge, leftEdge, IeBody );
					break;

				case "left":
					var topEdge = PosArr[ 1 ] + DM.Links[ arrName ][ nLinks ][ 6 ][ 1 ];
					var leftEdge = PosArr[ 0 ] - DM.Menu.offsetWidth + DM.Links[ arrName ][ nLinks ][ 6 ][ 0 ];
					MenuPos = DM.keepInWin( topEdge, leftEdge, IeBody );
					break;

				default:
					alert( "SWITCH/CASE ERROR: menuPosition \"" + menuPosition + "\" is invalid. It must be set to \"relative\", \"above\", \"right\", \"below\" or \"left\"." );

			}
			DM.Menu.style.top = MenuPos[ 0 ] + "px";
			DM.Menu.style.left = MenuPos[ 1 ] + "px";
			DM.Menu.style.visibility = "visible";

		}
	}

	//-------------------------------------- METHOD --------------------------------------

	function setElemVis( arrName, vis ) {
		if( winIE && DM.settings.formElements ) {
			for( member in DM.settings.formElements ) {
				if( vis == "visible" || arrName == DM.settings.formElements[ member ][ 0 ] )
					document.getElementById( DM.settings.formElements[ member ][ 1 ] ).style.visibility = vis;
			}
		}
	}
	//-------------------------------------- METHOD --------------------------------------

	function hide( delay ) {
		if( !arguments.length ) delay = DM.settings.delayToKill;
		if( DM.timer == 0 && DM.Menu ) {
			DM.timer = setTimeout( "" +
				"DM.Menu.innerHTML = '';" +
				"DM.Menu = null;" +
				"DM.timer = 0;" +
				"DM.setElemVis( '', 'visible' );",
				delay
			);
		}
	}

	//-------------------------------------- METHOD --------------------------------------

	function resetTimer() {
		clearTimeout( DM.timer );
		DM.timer = 0;
	}
}

DM = ( document.getElementById ) ? new DynamicMenu() : null;

////////////////////////////////// END DYNAMIC MENU //////////////////////////////////

var ImgReal = null;
function checkDim( imgNameToCk, imgWidToCk, imgHgtToCk ) {

	if( ImgReal == null ) {
		ImgReal = new Image();
		ImgReal.src = eval( "document.images." + imgNameToCk + ".src;" );
	}
	if( ImgReal.complete ) {
		var realWid = ImgReal.width;
		var realHgt = ImgReal.height;
		if( realWid > 1 && realHgt > 1 ) {
			if( imgWidToCk != realWid || imgHgtToCk != realHgt )
				alert( ImgReal.src + " has incorrect dimensions set:\n\n• " + imgWidToCk + "×" + imgHgtToCk + " are the errant values\n• " + realWid + "×" + realHgt + " are the true values" );
		}
		ImgReal = null;
	}
	else {
		this.imgNameToCk = imgNameToCk;
		this.imgWidToCk = imgWidToCk;
		this.imgHgtToCk = imgHgtToCk;
		setTimeout( "checkDim( imgNameToCk, imgWidToCk, imgHgtToCk );", 500 );
	}
}
//--------------------------------------------------------------------------------------
function randompick() {
  return randompick.arguments[ Math.floor( Math.random()*randompick.arguments.length ) ];
}

function borderIm( Img, color ) { if( Img.complete ) Img.style.borderColor = color; }
// ACCESSOR VARS: ieTrans, exactVer
// ACCESSOR FUNC: randompick()

function getTransition( transNum, duration ) {

	var trans = "";
	if( ieTrans ) {
		var d = duration;

		if( exactVer >= 5.5 ) {

			var thisTrans = ( transNum == 0 ) ? Math.floor( Math.random() * 17 ) + 1 : transNum;

			switch ( thisTrans ) {
				case 1: trans="Fade(duration="+d+",overlap=1)"; break;
				case 2: trans="Blinds(duration="+d+",bands="+randompick(2,4,6,8)+",direction="+randompick('up','down','right','left')+")"; break;
				case 3: trans="CheckerBoard(duration="+d+",squaresX="+randompick(2,4,8,12)+",squaresY="+randompick(2,4,8,12)+",direction="+randompick('up','down','right','left')+")"; break;
				case 4: trans="Barn(duration="+d+",motion="+randompick('in','out')+",orientation=",randompick('horizontal','vertical')+")"; break;
				case 5: trans="GradientWipe(duration="+d+",gradientSize="+randompick(0,0.1,0.3,0.5,0.7,0.9,1)+",wipeStyle="+randompick(0,1)+",motion="+randompick('forward','reverse')+")"; break;
				case 6: trans="Inset(duration="+d+")"; break;
				case 7: trans="Iris(duration="+d+",irisStyle="+randompick('DIAMOND','CIRCLE','CROSS','PLUS','SQUARE','STAR')+",motion="+randompick('in','out')+")"; break;
				case 8: trans="RadialWipe(duration="+d+",wipeStyle="+randompick('CLOCK','WEDGE','RADIAL')+")"; break;
				case 9: trans="RandomBars(duration="+d+",orientation="+randompick('horizontal','vertical')+")"; break;
				case 10: trans="RandomBars(duration="+d+")"; break;
				case 11: trans="Slide(duration="+d+",pushStyle="+randompick('HIDE','PUSH','SWAP')+",bands="+randompick(1,2,3,4,5,6,7)+")"; break;
				case 12: trans="Spiral(duration="+d+",gridSizeX="+randompick(8,16,32,64)+",gridSizeY="+randompick(8,16,32,64)+")"; break;
				case 13: trans="Stretch(duration="+d+",stretchStyle="+randompick('HIDE','PUSH','SPIN')+")"; break;
				case 14: trans="Strips(duration="+d+",motion="+randompick('leftdown','leftup','rightdown','rightup')+")"; break;
				case 15: trans="Wheel(duration="+d+",spokes="+randompick(2,4,10,16,20)+")"; break;
				case 16: trans="Zigzag(duration="+d+",gridSizeX="+randompick(8,16,32,64)+",gridSizeY="+randompick(8,16,32,64)+")"; break;
				case 17: trans="RandomDissolve(duration="+d+")"; break;
        //case 18: trans="Pixelate(duration="+d+",maxSquare="+randompick(5,10,20,30,40,50)+")"; break;
				default: alert( "SWITCH/CASE ERROR: Case caught by default handler in \"getTransition\"" );
			}
			trans = "progid:DXImageTransform.Microsoft." + trans;
		}
		else { // Old IE 5 Browsers

			switch ( transNum ) {
				case 1: trans="blendTrans(duration="+d+")"; break;
				default: trans="revealTrans(duration="+d+",transition=" + Math.floor(Math.random()*23) + ")";
			}
		}
	}
	return trans;
}

//////////////////////////////// START IMAGE VIEWER: IV ////////////////////////////////

/*
ACCESSOR CLS: off, on, ivLgImgMargin, ivLgImgTitle
ACCESSOR FUN: checkDim, getTransition, randompick, replaceLiteral
ACCESSOR VAR: macIE, IE, ieTrans, ncTrans
*/

//--------------------------------- OBJECT CONSTRUCTOR ---------------------------------

function ImageViewer() {

	this.transNum = 1;
	this.transDur = 0.8;

	this.Link = null;
	this.setSectVis = setSectVis;
	this.hideOtherPhotos = hideOtherPhotos;
	this.show = show;
	this.hideLgImg = hideLgImg;
	this.startFilter = startFilter;
	this.setImgTitle = setImgTitle;
	this.Photo = null;
	this.opacity = 0;
	this.opacityTimer = 0;
	this.scrollFromTop = 0;
	this.scrollFromLeft = 0;
	this.lgPhotoShowing = false;

	//-------------------------------------- METHOD --------------------------------------
	// Loops thru any section(s) that are to be hidden when large image is displayed AND
	// Loops thru any section(s) that are to be re-shown when large image is is hidden

	function setSectVis( sectName, className ) {
		var i = 0;
		while( document.getElementById( sectName + i ) ) {
			Section = document.getElementById( sectName + i );
			Section.className = className;
			i++;
		}
	}
	//-------------------------------------- METHOD --------------------------------------
	// Loops thru other open photos (if any) and hides them.
	// Keeps more than 1 large photos from showing simultaneously

	function hideOtherPhotos( tnPage ) {
		if( document.getElementById && !tnPage ) {
			var OtherDivs = document.getElementsByTagName( "DIV" );
			for( var i = 0; i < OtherDivs.length; i++ ) {
				if( OtherDivs[i].id.indexOf( "bigIV" ) == 0 )
					this.hideLgImg( OtherDivs[i].id.substring( 5, OtherDivs[i].id.length ) );
			}
		}
	}
	//-------------------------------------- METHOD --------------------------------------
	// [ 'images/', 'princeWFReid.jpg', 347, 351, 'Maui Prince', 'b', 1, LinkObj , 'sectName' ]
	//      0               1           2    3           4       5   6     7           8

	// Displays full size image on the current page
	function show( ImgInfoArr ) {

		if( document.getElementById ) {

			// Record where page is scrolled to so it can be reset back later
			var ieCSS = ( IE && document.compatMode) ? document.compatMode ==  "CSS1Compat" : false;
			if( IE ) var IeBody = ieCSS ? document.documentElement : document.body;
			this.scrollFromTop = ( IE ) ? IeBody.scrollTop : window.pageYOffset;
			this.scrollFromLeft = ( IE ) ? IeBody.scrollLeft : window.pageXOffset;

			var tnPage = ( ImgInfoArr[ 8 ] == "thumbnails" ) ? true : false;

			if( tnPage ) this.Link = ImgInfoArr[ 7 ];

			this.hideOtherPhotos( tnPage );
			var sectName = ImgInfoArr[ 8 ];
			this.setSectVis( sectName, "off" );

			switch( ImgInfoArr[ 5 ] ) {
				case "w": ImgInfoArr[ 5 ] = "255,255,255"; break;
				case "b": ImgInfoArr[ 5 ] = "0,0,0"; break;
			}

			var imgFilter = "";

			if( ieTrans ) imgFilter = "visibility:hidden; filter:" + getTransition( this.transNum,this.transDur );
			else if( ncTrans ) imgFilter = "-moz-opacity:0";

			var html = ( tnPage ) ? "<DIV ID='bigIV" + sectName + "' STYLE='position:absolute; top:50%; left:50%; margin-left:-" + ( ImgInfoArr[ 2 ] / 2 ) + "px; margin-top:-" + ( ImgInfoArr[ 3 ] / 2 + 20 ) + "px;'>" : "<DIV ID='bigIV" + sectName + "' CLASS='ivLgImgMargin'>";

			if( tnPage ) {

				// Evaluate & set global stmts from arrGlobalInfo
				for( i = 0; i < arrGlobalInfo.length - 1; i++ ) eval( arrGlobalInfo[ i ] );

				this.lgPhotoShowing = true;
				var BodyStyle = document.body.style;
				BodyStyle.backgroundImage = "url( none )";
				BodyStyle.backgroundColor = bkgColOnTN;
				BodyStyle.marginTop = "0px";
				BodyStyle.marginRight = "0px";
				BodyStyle.marginBottom = "0px";
				BodyStyle.marginLeft = "0px";

				if( macIE )
					html = "<DIV ID='bigIV" + sectName + "'>" + "<TABLE BORDER='0' CELLSPACING='0' CELLPADDING='0' WIDTH='100%' HEIGHT='" + ( document.body.clientHeight - 60 ) + "'><TR><TD ALIGN='center' VALIGN='middle'>";
				if( !WRITE_TN_IMAGE_TITLE ) ImgInfoArr[ 4 ] = "&nbsp; <BR>";
			}

				html +=
				"<TABLE BORDER='0' CELLSPACING='0' CELLPADDING='0'>" +
					"<TR>" +
						"<TD>" +
							"<A HREF='javascript:void(0);' ID='topFocalPt'></A><BR>" +
						"</TD>" +
					"</TR>" +
					"<TR>";

						var bkgStyle = ( tnPage ) ? " STYLE='background-color:" + bkgColOnTN + ";'" : " ";
						html +=
						"<TD ALIGN='center'" + bkgStyle + ">" +
							"<A HREF='javascript:IV.hideLgImg( \"" + sectName + "\" );' onMouseOver='self.status=this.title; return true;' onMouseOut='self.status=\"\"; return true;' TITLE='Click to go back'" + bkgStyle + "><IMG NAME='" + sectName + "IV' SRC='" + ImgInfoArr[ 0 ] + ImgInfoArr[ 1 ] + "' BORDER='0' WIDTH='" + ImgInfoArr[ 2 ] + "' HEIGHT='" + ImgInfoArr[ 3 ] + "' HSPACE=0 VSPACE=0 STYLE='border:" + ImgInfoArr[ 6 ] + "px solid rgb( " + ImgInfoArr[ 5 ] + " ); float:left; " + imgFilter + ";' onAbort='this.src=this.src;' onLoad='checkDim( \"" + sectName + "IV\", " + ImgInfoArr[ 2 ] + ", " + ImgInfoArr[ 3 ] + " ); if( ieTrans || ncTrans ) IV.startFilter( this ); IV.setImgTitle( \"" + ImgInfoArr[ 4 ] + "\" );'></A>" +
						"</TD>" +
					"</TR>" +
					"<TR>" +
						"<TD ALIGN='center'>" +
							"<DIV ID='imgTitleIV' CLASS='ivLgImgTitle'>Loading image, please wait...</DIV><DIV STYLE='line-height:4px;'> &nbsp;</DIV>" +
						"</TD>" +
					"</TR>" +
					"<TR>" +
						"<TD ALIGN='center'>" +
							"<A HREF='javascript:IV.hideLgImg( \"" + sectName + "\" );' onMouseOver='self.status=this.title; return true;' onMouseOut='self.status=\"\"; return true;' TITLE='Click photo to go back to thumbnail' ID='botFocalPt'>Back</A>" +
						"</TD>" +
					"</TR>" +
				"</TABLE><BR>";

			if( macIE && tnPage ) html += "</TD></TR></TABLE><BR>";
			html += "</DIV>";
			var ImgConsole = document.getElementById( sectName );
			ImgConsole.innerHTML = html;
			ImgConsole.className = "on";
			var FocuserBot = document.getElementById( "botFocalPt" ); FocuserBot.focus();
			var FocuserTop = document.getElementById( "topFocalPt" ); FocuserTop.focus();
			return false;
		}
		else { // Old Browsers
			document.location.href = ImgInfoArr[ 0 ] + ImgInfoArr[ 1 ];
			return false;
		}
	}

	//-------------------------------------- METHOD --------------------------------------
	// Set page back to default state by hiding large image
	function hideLgImg( sectName ) {

		var tnPage = ( sectName == "thumbnails" ) ? true : false;
		var ImgConsole = document.getElementById( "bigIV" + sectName );
		ImgConsole.innerHTML = "";
		ImgConsole.className = "off";
		if( tnPage ) {
			this.lgPhotoShowing = false;
			var BodyStyle = document.body.style;
			BodyStyle.backgroundImage = TN_PAGE_STYLE.bkgImg;
			BodyStyle.backgroundColor = TN_PAGE_STYLE.bkgCol;
			BodyStyle.marginTop = TN_PAGE_STYLE.marTop;
			BodyStyle.marginRight = TN_PAGE_STYLE.marRgt;
			BodyStyle.marginBottom = TN_PAGE_STYLE.marBot;
			BodyStyle.marginLeft = TN_PAGE_STYLE.marLft;
		}

		IV.setSectVis( sectName, "on" );
		if( tnPage && typeof this.Link == "object" ) {
			this.Link.focus();
			this.Link.blur();
		}
		// Scroll window back to where it was before
		window.scroll( this.scrollFromLeft, this.scrollFromTop );
	}
	//-------------------------------------- METHOD --------------------------------------
	function startFilter( Photo ) {
		if( ieTrans ) {
			eval( "" +
				"try {" +
					"Photo.filters(0).apply();" +
					"Photo.style.visibility = 'visible';" +
					"Photo.filters(0).play();" +
				"}" +
				"catch( e ) { Photo.style.visibility = 'visible'; }" +
			"" );
		}
		else {

			Photo.onload = function() { /*cancel photo onload function*/ }
			Photo.style.MozOpacity = this.opacity;
			this.opacity += .05;

			if( IV.opacity < 1 ) {
				this.Photo = Photo;
				IV.opacityTimer = setTimeout( "IV.startFilter( IV.Photo )", 40 );
			}
			else {
				Photo.style.MozOpacity = 0.9999; // 1.0 causes flicker
				clearTimeout( IV.opacityTimer );
				IV.opacity = 0;

			}
		}
	}
	//-------------------------------------- METHOD --------------------------------------

	function setImgTitle( imgTitle ) {
		var ImgTitle = document.getElementById( "imgTitleIV" );
		imgTitle = imgTitle.replaceLiteral( '^^', "'" );
		imgTitle = imgTitle.replaceLiteral( '^', '"' );
		ImgTitle.innerHTML = imgTitle + "<DIV STYLE='line-height:4px;'> &nbsp;</DIV>";

	}
}
var IV = new ImageViewer();
////////////////////////////////// END IMAGE VIEWER: IV //////////////////////////////////


////////////////////////////// START EMBEDDED SLIDE SHOW: SS //////////////////////////////

/*
ACCESSOR VAR: local, ieTrans, ncTrans
ACCESSOR FUN: replaceLiteral, getTransition
ACCESSOR CLS:
MUTATOR  FUN: getImage, showMsg, preLoadNext, stop
*/

//--------------------------------- OBJECT CONSTRUCTOR ---------------------------------

function SlideShow() {

	this.imageDir = SSImageArr[ SSImageArr.length - 1 ][ 0 ];
	this.speedNorm = SSImageArr[ SSImageArr.length - 1 ][ 1 ];
	this.showStatus = SSImageArr[ SSImageArr.length - 1 ][ 2 ];
	this.showConsole = SSImageArr[ SSImageArr.length - 1 ][ 3 ];
	this.imgFiltNum = SSImageArr[ SSImageArr.length - 1 ][ 4 ];
	this.imgFiltDur = SSImageArr[ SSImageArr.length - 1 ][ 5 ];
	this.borderWid = SSImageArr[ SSImageArr.length - 1 ][ 6 ];
	SSImageArr.length = SSImageArr.length - 1;
	this.speedActual = this.speedNorm;
	this.SPEED_FAST = 1000;
	this.preLoadTimer = 0;
	this.NextImage = null;
	this.slideDelay = 0;
	this.slideNum = 0;
	this.opacity = 0;
	this.opacityTimer = 0;
	this.NcOverlay = null;

	// Define methods...
	this.showSlide = showSlide;
	this.skipErrantSlide = skipErrantSlide;
	this.preLoadNext = preLoadNext;
	this.imgClickHandler = imgClickHandler;
	this.stop = stop;
	this.getImage = getImage;
	this.dissolve = dissolve;
	this.getRGB = getRGB;
	this.showMsg = showMsg;
	this.getImgPos = getImgPos;
	this.moveNcOverlay = moveNcOverlay;
	//-------------------------------------- METHOD --------------------------------------

	function getImgPos( TheImage ) {

		// NC Only; get on screen position of image so we can lay new one on top
		var x = 0; var y = 0;
		TheElement = TheImage;
		while( TheElement != document.body ) {
			y += TheElement.offsetTop;
			x += TheElement.offsetLeft;
			y -= TheElement.scrollTop;
			x -= TheElement.scrollLeft;
			TheElement = TheElement.offsetParent;
		}
		return[ x, y ];

	}
	//-------------------------------------- METHOD --------------------------------------

	// NC Only; called onresize & while ss running each time new img placed on top
	function moveNcOverlay() {
		if( SS.NcOverlay ) {
			var ImgPos = SS.getImgPos( document.images.slideShow );
			SS.NcOverlay.style.left = ImgPos[ 0 ] + "px";
			SS.NcOverlay.style.top = ImgPos[ 1 ] + "px";
		}

	}
	//-------------------------------------- METHOD --------------------------------------

	function getRGB( abbrev ) {
		var rgb = abbrev;
		switch( abbrev ) {
			case "b": rgb = "0,0,0"; break;
			case "w": rgb = "255,255,255"; break;
		}
		return rgb;
	}
	//-------------------------------------- METHOD --------------------------------------
	function showSlide() {

		if( this.NextImage ) {

			var TheImage = document.images.slideShow;

			var useFilterIE = ( ieTrans && this.imgFiltNum >= 0 && this.speedActual > this.SPEED_FAST );
			var transErr = false;

			if( useFilterIE ) {
				TheImage.style.filter = getTransition( this.imgFiltNum, this.imgFiltDur );
				eval( "try{ TheImage.filters(0).Apply(); } catch( e ){ transErr = true; }" );

				TheImage.src = this.NextImage.src;

				if( this.borderWid )
					TheImage.style.borderColor = "rgb( " + this.getRGB( SSImageArr[ this.slideNum ][ 2 ] ) + " )";

				if( !transErr ) eval( "try{ TheImage.filters(0).Play(); } catch( e ){ /*null action*/; }" );
			}

			else if( ncTrans && this.imgFiltNum >= 0 ) {

				var nNewImg = ( SSImageArr.length == this.slideNum ) ? 0 : this.slideNum;
				var nOldImg = ( nNewImg == 0 ) ? SSImageArr.length - 1 : nNewImg - 1;
				TheImage.src = this.imageDir + SSImageArr[ nOldImg ][ 0 ];

				if( this.borderWid )
					TheImage.style.borderColor = "rgb( " + this.getRGB( SSImageArr[ nOldImg ][ 2 ] ) + " )";

				var imgStyle = ( this.borderWid ) ? " style='border:" + this.borderWid + "px solid rgb(" + this.getRGB( SSImageArr[ nNewImg ][ 2 ] ) + "); -moz-opacity:0;'" : " style='-moz-opacity:0;'";

				var newImg = "<img name='slideShowNew' src='" + this.imageDir + SSImageArr[ nNewImg ][ 0 ] + "' width='" + TheImage.width + "' height='" + TheImage.height + "' alt='" + TheImage.alt + "' title='" + TheImage.title + "'" + imgStyle + ">";

				if( !SS.NcOverlay ) {
					SS.NcOverlay = document.createElement( "DIV" );
					document.body.appendChild( SS.NcOverlay );
					SS.NcOverlay.style.zIndex = 1000;
					SS.NcOverlay.style.position = "absolute";
				}

				var ImgPos = SS.getImgPos( TheImage );

				SS.NcOverlay.style.left = ImgPos[ 0 ] + "px";
				SS.NcOverlay.style.top = ImgPos[ 1 ] + "px";

				SS.NcOverlay.innerHTML = newImg;
				dissolve();

			}
			else { // Macs or no transitions
				TheImage.src = this.NextImage.src;
				if( this.borderWid )
					TheImage.style.borderColor = "rgb( " + this.getRGB( SSImageArr[ this.slideNum ][ 2 ] ) + " )";
			}

			this.showMsg();
		}

	}
	//-------------------------------------- METHOD --------------------------------------
	function showMsg() {

		if( this.showStatus || this.showConsole ) {
			var msg = SSImageArr[ this.slideNum ][ 1 ].replaceLiteral( '^', '"' );
			var colon = ( msg ) ? ": " : "";
			var slideCount = "Slide " + ( this.slideNum + 1 ) + " of " + SSImageArr.length
			if( this.showStatus )
				self.status = slideCount + colon + msg;
			if( this.showConsole )
				document.getElementById( "ssConsole" ).innerHTML = slideCount + colon + msg;
		}
	}
	//-------------------------------------- METHOD --------------------------------------
	function dissolve() { // NC Win Only; Duration: 0.8 seconds
		var NewImg = document.images.slideShowNew;
		NewImg.style.MozOpacity = SS.opacity;
		SS.opacity += .05;
		if( SS.opacity < 1 ) SS.opacityTimer = setTimeout( "SS.dissolve()", 40 );
		else {
			NewImg.style.MozOpacity = 0.9999; // 1.0 causes flicker
			clearTimeout( SS.opacityTimer );
			SS.opacity = 0;
		}
	}
	//-------------------------------------- METHOD --------------------------------------
	function skipErrantSlide() {
		if( local || SS.speedActual == SS.SPEED_FAST ) alert( "Slide #" + SS.slideNum + "; " + SS.NextImage.src + " failed to load" );
		SS.NextImage = null;
	}

	//-------------------------------------- METHOD --------------------------------------

	function preLoadNext() {

		var recursionTimer = 500;

		this.slideDelay += recursionTimer;

		if( !this.NextImage ) {

			this.slideNum++;
			if( this.slideNum == SSImageArr.length ) this.slideNum = 0;
			this.NextImage = new Image();
			this.NextImage.onerror = this.skipErrantSlide;
			this.NextImage.src = this.imageDir + SSImageArr[ this.slideNum ][ 0 ];
		}

		if( this.NextImage && this.NextImage.complete && this.slideDelay > this.speedActual ) {
			this.slideDelay = 0;
			this.showSlide();
			this.NextImage = null;
			clearTimeout( this.preLoadTimer );
			this.preLoadNext();
		}
		else
			this.preLoadTimer = setTimeout( "SS.preLoadNext()", recursionTimer );

	}
	//-------------------------------------- METHOD --------------------------------------
	function imgClickHandler() {
		if( window.event && event.ctrlKey && event.altKey ) {
			if( this.speedActual == this.speedNorm ) this.speedActual = this.SPEED_FAST;
			else this.speedActual = this.speedNorm;
		}
	}
	//-------------------------------------- METHOD --------------------------------------
	function stop() { clearTimeout( this.preLoadTimer ); 	}
	//-------------------------------------- METHOD --------------------------------------

	function getImage( imgWid, imgHgt, toolTip ) {

		var imgStyle = ( this.borderWid ) ? " style='border:" + this.borderWid + "px solid rgb(" + this.getRGB( SSImageArr[ 0 ][ 2 ] ) + ");'" : "";

		return "<img name='slideShow' src='" + this.imageDir + SSImageArr[ this.slideNum ][ 0 ] + "' onError='skipErrantSlide(); preLoadNext(); slideDelay = speedActual + 1;' width='" + imgWid + "' height='" + imgHgt + "' alt='" + toolTip + "' title='" + toolTip + "' onmousedown='SS.imgClickHandler();'" + imgStyle + " galleryimg='no' onAbort='this.src=this.src;'>";
	}
}

/////////////////////////////// END EMBEDDED SLIDE SHOW: SS //////////////////////////////