/*--######################################################################--*/
/*----------------------------- Initialization -----------------------------*/
/*--######################################################################--*/

function Is() {
    var agent = navigator.userAgent.toLowerCase();
    this.major = parseInt(navigator.appVersion);
    this.minor = parseFloat(navigator.appVersion);
    this.Nav  = ((agent.indexOf('mozilla')!=-1) && ((agent.indexOf('spoofer')==-1) && (agent.indexOf('compatible') == -1)));
    this.Nav2 = (this.Nav && (this.major == 2));
    this.Nav3 = (this.Nav && (this.major >= 3));
    this.Nav4b = (this.Nav && (this.minor < 4.04));
    this.Nav4 = (this.Nav && (this.major >= 4));
    this.IE   = (agent.indexOf("msie") != -1);
    this.IE3  = (this.IE && (this.major == 2));
    this.IE4  = (this.IE && (this.major >= 4));
    this.op3 = (agent.indexOf("opera") != -1);
    this.win   = (agent.indexOf("win")!=-1);
    this.mac   = (agent.indexOf("mac")!=-1);
    this.unix  = (agent.indexOf("x11")!=-1);
}

//Globals
var is = new Is();
//var is.Nav, is.IE
var coll = ""
var styleObj = ""
var GoodBrowser = (is.Nav3 || is.IE4)
if (is.IE) {
	coll = "all.";
	styleObj = ".style";
	stepFactor = 2;
}

function ImageArray() {			
	//'myImages=new ImageArray(file1,file2,file3)' returns an array of images
	//'myImages[1].src' will reference file1
	var imageFiles = ImageArray.arguments
	this.length = imageFiles.length;
	for (var i=1; i<=imageFiles.length ; i++) {
			this[i] = new Image();
			this[i].src = imageFiles[i-1]
	}
	return this;
}

/*--######################################################################--*/
/*------------------------ First page ('HOME.HTM') -------------------------*/
/*--######################################################################--*/

//called by onLoad - HOME.HTM
function Prepare_Home() {
	PR = new ImageArray("H_IMAGES/PROCEED.GIF","H_IMAGES/OV_PROCD.GIF");
	TW = new ImageArray("H_IMAGES/TECHWORK.GIF","H_IMAGES/OV_TECH.GIF");
	EP = new ImageArray("H_IMAGES/EXHIBIT.GIF","H_IMAGES/OV_EXHB.GIF");
	SS = new ImageArray("H_IMAGES/SCREEN.GIF","H_IMAGES/OV_SAVER.GIF");
	CV = new ImageArray("H_IMAGES/VIDEO.GIF","H_IMAGES/OV_VIDEO.GIF");
	VT = new ImageArray("H_IMAGES/TOUR.GIF","H_IMAGES/OV_TOUR.GIF");
	PG = new ImageArray("H_IMAGES/PLANET.GIF","H_IMAGES/OV_PGIS.GIF");
	CE = new ImageArray("H_IMAGES/CONTACT.GIF","H_IMAGES/OV_CONTA.GIF");

	//daTopics is a 2D array storing all rollover image info for the different topics
	//EG: daTopics[2][1] is the OFF image for TechWorkshops, and daTopics[7][2] is the ON image for PlanetGIS
	daTopics = new Array(PR,TW,EP,SS,CV,VT,PG,CE)

	//daRolls holds all the images for the bottom right image
	daRolls = new ImageArray("H_IMAGES/CONFRNCE.GIF","H_IMAGES/ROLL_PRO.GIF","H_IMAGES/ROLL_TEC.GIF","H_IMAGES/ROLL_EXH.GIF","H_IMAGES/ROLL_SCS.GIF","H_IMAGES/ROLL_VID.GIF","H_IMAGES/ROLL_TOR.GIF","H_IMAGES/ROLL_PLG.GIF","H_IMAGES/ROLL_CON.GIF");

	TopicLayer = getLayerImages(getLayer('MENUS'));		//rollover effects for the different menu items
	ImageLayer = getLayerImages(getLayer('ROLLOVERS'));	//rollover effects for the bottom right image
	UClayer = getLayerHandle(getLayer('UC'));			//for moving the UC99 layer in
	
	//offsets to account for the way different browsers handle image array numbering
	if (is.Nav) {
		Roller = 0;
		IE = 0;
	} else if (is.IE) {
		Roller = 1;
		IE = 3;
	}
	RollUC();
}

//recursive animation for rolling in the UC99 layer
//currently set to stop when UClayer.left reaches 0
//called by Prepare_Home()
function RollUC() {
	UClayer.left=parseInt(UClayer.left)+10;
	if (parseInt(UClayer.left) >= 0) {
		return true;
	} else {
		setTimeout('RollUC()',50);
	}
		return true;
}

//implements all rollover effects for this page
//called by mouseOver/Out - HOME.HTM
function rMenu(topic,dir) {
	TopicLayer[topic-1+IE].src = daTopics[topic-1][dir].src
	ImageLayer[0].src = daRolls[topic+1].src
}

/*--######################################################################--*/
/*-------------------------------  Navigation ------------------------------*/
/*--######################################################################--*/


/*----------------------- Menu and Description Frames ----------------------*/

//called by onLoad - MENUBAR.HTM
function Prepare_Menubar() {
	lastDown = 1;
	if (is.Nav) {
		descImage =  getLayerImages(getFrame('descript').getLayer('DSBACK'))[0];
	} else {
		descImage =  getFrame('descript').getLayerImages(getLayer('DSBACK'))[0];
	}
	menuLayer = getLayer('MENUBACK');
	menuImages = getLayerImages(menuLayer);
	blankImg = menuImages[8];

	if (is.Nav) {
		shiftTo(menuLayer,0,-1);
	}

	if (document.images) {
		HomeIMGs = new ImageArray("GRAPHICS/HOMEBUTN.GIF","GRAPHICS/HOMELITE.GIF","GRAPHICS/HOMEBUTN.GIF")
		BlankIMGs = new ImageArray("GRAPHICS/SPACE.GIF","GRAPHICS/SPACE.GIF","GRAPHICS/SPACE.GIF");
		ContactIMGs = new ImageArray("GRAPHICS/UP_CESRI.GIF","GRAPHICS/OV_CESRI.GIF","GRAPHICS/DN_CESRI.GIF");
		ExhibitIMGs = new ImageArray("GRAPHICS/UP_EXHB.GIF","GRAPHICS/OV_EXHB.GIF","GRAPHICS/DN_EXHB.GIF");
		PlanetgIMGs = new ImageArray("GRAPHICS/UP_PGIS.GIF","GRAPHICS/OV_PGIS.GIF","GRAPHICS/DN_PGIS.GIF");
		ProceedIMGs = new ImageArray("GRAPHICS/UP_PROC.GIF","GRAPHICS/OV_PROC.GIF","GRAPHICS/DN_PROC.GIF");
		TechworkIMGs = new ImageArray("GRAPHICS/UP_TECH.GIF","GRAPHICS/OV_TECH.GIF","GRAPHICS/DN_TECH.GIF");
		VirTourIMGs = new ImageArray("GRAPHICS/UP_TOUR.GIF","GRAPHICS/OV_TOUR.GIF","GRAPHICS/DN_TOUR.GIF");
		BlankBar = new ImageArray("GRAPHICS/CLRBAR.GIF","GRAPHICS/O_BAR_PR.GIF","GRAPHICS/O_BAR_TW.GIF","GRAPHICS/O_BAR_EP.GIF","GRAPHICS/O_BAR_VT.GIF","GRAPHICS/O_BAR_PG.GIF","GRAPHICS/O_BAR_CE.GIF");
		DescBar = new ImageArray("GRAPHICS/DS_NORML.GIF","GRAPHICS/DS_PROC.GIF","GRAPHICS/DS_TECH.GIF","GRAPHICS/DS_EXHB.GIF","GRAPHICS/DS_TOUR.GIF","GRAPHICS/DS_PGIS.GIF","GRAPHICS/DS_CESRI.GIF");
		Buttons = new Array(HomeIMGs, BlankIMGs, ProceedIMGs, TechworkIMGs, ExhibitIMGs, VirTourIMGs, PlanetgIMGs, ContactIMGs)
	}
	
	destination = Number(top.location.hash.charAt(1));
	//alert(destination)
	if (destination<4) {
		destination++;
		menuImages[destination].src = Buttons[destination][3].src;
	}
	if (destination>5) {
		destination--;
		menuImages[destination].src = Buttons[destination][3].src;
	}
	lastDown = destination;
}

/*------------------------- Menu Frame Operation -------------------------*/
function doImage(imgNum,imgState) {
	//imgNum is the position of the image in the document.images[] array
	//imgState is 1-off, 2-over, and 3-down
	if (document.images) {
		if (imgNum != lastDown) {
			menuImages[imgNum].src = Buttons[imgNum][imgState].src;
			if (imgState == 1) {
				blankImg.src = BlankBar[1].src
				descImage.src = DescBar[1].src
			} else if (imgState == 2) {
				if (!imgNum) imgNum++;
				blankImg.src = BlankBar[imgNum].src
				descImage.src = DescBar[imgNum].src
			} else if (imgState == 3) {
				menuImages[lastDown].src = Buttons[lastDown][1].src;
				lastDown = imgNum;
			}
		} else {
			blankImg.src = BlankBar[1].src
			descImage.src = DescBar[1].src
}	}	}
		
/*----------------------- Content Frame Initialization ---------------------*/
//called by onLoad - CONTENT.HTM
/* function getDestinationPage(destination) {
	switch (destination) {
		case 1:
			return "PROCEED";
			break;
		case 2:
			return "../WORKSHOPS/COMPLETE";
			break;
		case 3:
			return "EXHIBIT";
			break;
		case 4:
			return "SCREEN";
			break;
		case 5:
			return "VIDEO";
			break;
		case 6:
			return "TOUR";
			break;
		case 7:
			return "PLANET";
			break;
		case 8:
			return "CONTACT";
			break;
		case 9:
			return "SPECIAL";
			break;
	}
}
*/
/*--------------------- Description Frame Initialization -------------------*/
//called by onLoad - DESCRIPT.HTM
function rESRI(state) {
	ESRIlayer[1].src = ESRI_IMGs[state].src;
}

function Prepare_Description() {
	ESRIlayer = getLayerImages(getLayer('DSBACK'));
	ESRI_IMGs = new ImageArray("GRAPHICS/ESRIBUTN.GIF","GRAPHICS/ESRILITE.GIF");
}

/*--######################################################################--*/
/*-------------------------- Proceedings section ---------------------------*/
/*--######################################################################--*/

/*------------------------- Button Initialization --------------------------*/
//called by onLoad - PROCEED.HTM
function RollInTheButtons() {
	base = 80;					//base offset from top for positioning of buttons
	space = 60;					//spacing factor for buttons
	aButtons = new Array();		//holds object layer reference for each button layer
	aIDs = new Array();			//holds timer ID for each button

	for (i=0;i<RollInTheButtons.arguments.length;i++) {
		aButtons[i] = getLayerHandle(getLayer(RollInTheButtons.arguments[i]));
		shiftTo(aButtons[i],500+i*30,base+i*space);
		show(aButtons[i]);
	}
	aIDs[0] = setInterval("slideIn(aButtons[0],0)",20);
	aIDs[1] = setInterval("slideIn(aButtons[1],1)",20);
	aIDs[2] = setInterval("slideIn(aButtons[2],2)",20);
}

//called by RollInTheButtons
function slideIn(daLayer,myID) {
	shiftBy(daLayer,-2,0);
	if (getLeft(daLayer) < 454) {
		clearInterval(aIDs[myID]);
	}
}

/*--------------------------- Menu layer control ---------------------------*/
timer1 = 0;
function scroll() {
}

//called by onLoad - PROCEED.HTM
function Prepare_Proceed() {
	lastLyr = getLayerHandle(getLayer('ProcIntro'));
	TrackIndex = getLayerHandle(getLayer('ProcTr'));
	TitleIndex = getLayerHandle(getLayer('ProcTi'));
	AuthorIndex = getLayerHandle(getLayer('ProcAu'));
	MenuID = new Array();
	if (document.images) {
		TrIndexIMGs = new ImageArray("PROCEED/TRINDX.GIF","PROCEED/O_TRINDX.GIF");
		TiIndexIMGs = new ImageArray("PROCEED/TIINDX.GIF","PROCEED/O_TIINDX.GIF");
		AuIndexIMGs = new ImageArray("PROCEED/AUINDX.GIF","PROCEED/O_AUINDX.GIF");
	}
	shiftTo(TrackIndex,60,500); show(TrackIndex);
	shiftTo(TitleIndex,60,500); show(TitleIndex);
	shiftTo(AuthorIndex,60,500); show(AuthorIndex);
	
	//Track index scrolling
	loop = true;
	direction = "up";
	speed = 10;
	timer1 = null;
}

//rollOver effect - called by various images
//'idx' is the index of the imageArray you want
function r_Index(prefix,arrayName,dir) {
	var ImgFile = eval(prefix+arrayName);
	var LyrName = getLayerImages(getLayer(prefix+'Button'));
	if (is.Nav) {
		LyrName[0].src = ImgFile[dir].src;
	} else {
		LyrName[prefix+'Image'].src = ImgFile[dir].src;
	}
}

//mouseClick effect for switching menus
/*function popMenu(next) {
	thisLyr = getLayerHandle(getLayer('Proc'+next));
	show(thisLyr);
	MenuID = [];
	MenuID[0] = setInterval("pushDn(lastLyr,0,5,400,0)",10);
	MenuID[1] = setInterval("pushUp(thisLyr,0,-5,75,1)",10);
}
*/
//downward motion
function pushDn(target,stepX,stepY,stopY,stopID) {
	shiftBy(target,stepX,stepY)
	if (getTop(target) > stopY) {
		clearInterval(MenuID[stopID]);
		lastLyr = thisLyr;
		hide(target);
	}
}
//downward motion
function pushUp(target,stepX,stepY,stopY,stopID) {
	shiftBy(target,stepX,stepY)
	if (getTop(target) < stopY) {
		clearInterval(MenuID[stopID]);
	}
}

/*------------------------- Track Index Scrollover -------------------------*/
function scroll(dir,spd) {
    direction = dir;
    speed = spd;
    var page = getLayer('ProcTr','TrackContent');
    var y_pos = parseInt(page.top);
    if (loop == true) {
        if (direction == "dn" && y_pos > -200) {
            page.top = (y_pos-(speed));
           clearTimeout(timer1);
            timer1 = setTimeout("scroll(direction,speed)", 1);
        } else if (direction == "up" && y_pos < 10) {
            page.top = (y_pos+(speed));
            clearTimeout(timer1);
            timer1 = setTimeout("scroll(direction,speed)", 1);
        } else if (direction == "top") {
            page.top = 10;
        }
    }
}


/*--######################################################################--*/
/*----------------------------- Video section ------------------------------*/
/*--######################################################################--*/

/*------------------------- Video Window Control ---------------------------*/
function vidWindow(movieName) {
	if (is.Nav) {
		VideoWindow = window.open(movieName, "VideoWindow", "width=320,height=260,screenX=80,screenY=80,dependent,directories=no,location=no,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,toolbar=no");
	} else if (is.IE) {
		VideoWindow = window.open(movieName, "VideoWindow", "width=320,height=260,location=no,menubar=no,resizable=no,scrollbars=no");
	}
}


/*--######################################################################--*/
/*--------------------------- Extended API tools ---------------------------*/
/*--######################################################################--*/

//returns a handle suitable for animation, 
//EG: getLayerHandle(getLayer('Tom')).left++ moves <DIV ID=Tom> to the right
function getLayerHandle(layerObj) {
	var daHandle = layerObj;
	if (is.Nav) {
		return daHandle;
	} else if (is.IE) {
		return daHandle.style;
	}
}

//returns a handle for the image array on the given layer, 
//EG: getLayerImages(getLayer('Tom'))[0] refers to the first IMG in <DIV ID=Tom>
function getLayerImages(layerObj) {
	if (is.Nav) {
		return layerObj.document.images;
	} else if (is.IE) {
		return document.images;
	}
}

//takes a list of layer names as parameters and returns a reference to the deepest nested layer
//used by getLayerHandle and getLayerImages
function getLayer() {
	var daLayer = 'document.';
	if (is.Nav) {
		//tack on each layer for NN
		for (var i=0 ; i < getLayer.arguments.length-1 ; i++) {
			daLayer += (getLayer.arguments[i]+'.document.');
		}
	} else if (is.IE) {
		//just use the deepest layer for IE
		daLayer = 'document.all.'
	}
	daLayer += getLayer.arguments[getLayer.arguments.length-1];
	return eval(daLayer)
}

//takes a list of layer names as parameters and returns a reference to the deepest nested layer
function getFrame() {
	var daFrame = "top.";
	if (is.Nav && (getFrame.arguments.length>1)) {
		//tack on each child frame for NN
		for (var i=0 ; i < (getFrame.arguments.length-1) ; i++) {
			daFrame += (getFrame.arguments[i]+'.document.');
		}
	} else if (is.IE) {
		//daFrame += 'document.all.';
	}
	daFrame += getFrame.arguments[getFrame.arguments.length-1];
	return eval(daFrame)
}


/*--######################################################################--*/
/*------------------------ Custom API for animation ------------------------*/
/*--######################################################################--*/

//IE tends to animate motion slower than NN, so use these to equalize
//shiftBy uses parseInt to compensate for noninteger factors
var xFactor = 2
var yFactor = 2

//Moving an object by x/y coordinates
function shiftBy(obj, deltaX, deltaY) {
	if (is.Nav) {
		obj.moveBy(deltaX,deltaY);
	} else {
		obj.pixelLeft += (parseInt(deltaX*xFactor));
		obj.pixelTop += (parseInt(deltaY*yFactor));
	}
}

//Moving an object to specific x/y coordinates
function shiftTo(obj,x,y) {
	if (is.Nav) {
		obj.moveTo(x,y);
	} else {
		obj.pixelLeft = x;
		obj.pixelTop = y;
	}
}

//Showing an object
function show(obj) {
	obj.visibility = "visible";
}

//Hiding an object
function hide(obj) {
	obj.visibility = "hidden";
}

//standard modulo operator handy for cycling, etc
//EG: mod(38,7) = 38mod7 = 3
function mod(quotient,divisor) {
	return quotient-(Math.floor(quotient/divisor)*divisor);
}


/*--######################################################################--*/
/*------------------------ Information retrieval API -----------------------*/
/*--######################################################################--*/

//Retrieve the x-coordinate of an object
function getLeft(obj) {
	if (is.Nav) {
		return obj.left;
	} else {
		return obj.pixelLeft;
	}
}

//Retrieve the y-coordinate of an object
function getTop(obj) {
	if (is.Nav) {
		return obj.top;
	} else {
		return obj.pixelTop;
	}
}

//Retrieve the height of an object
function getHeight(obj) {
	if (is.Nav) {
		return obj.clip.height;
	} else {
		return obj.clientHeight;
	}
}

//Retrieve the width of an object
function getWidth(obj) {
	if (is.Nav) {
		return obj.clip.width;
	} else {
		return obj.clientWidth;
	}
}

//Retrieve available content width inside browser window
function availableWidth() {
	if (is.Nav) {
		return window.innerWidth;
	} else {
		return document.body.clientWidth;
	}
}

//Retrieve available content width inside browser window
function availableHeight() {
	if (is.Nav) {
		return window.innerHeight;
	} else {
		return document.body.clientHeight;
	}
}


/*--######################################################################--*/
/*---------------- Re-using original window for external links -------------*/
/*--######################################################################--*/

var dest = 0;

function Go_Web(go_address) {
	dest++;
	//alert(top.opener.closed);
	if (is.NN) {
		if (top.opener.closed) 	{
			browser2=window.open("http://" + go_address);
			browser2.focus();
		} else {
			top.opener.location = "http://" + go_address;
			top.opener.focus();
		}
	} else {
		IEbrowser2 = window.open("http://" + go_address,"Window" + dest);
}	}

function Go_Paper(go_address) {
	dest++;
	if (is.NN) {
		if (top.opener.closed) 	{
			browser2=window.open(go_address);
			browser2.focus();
		} else {
			top.opener.location = go_address;
			top.opener.focus();
		}
	} else {
		IEbrowser2 = window.open(go_address,"Window" + dest);
}	}
