IS_DOM = (document.getElementById) ? true : false;
IS_IE = (document.all) ? true : false;
IS_Mac = (navigator.appVersion.indexOf("Mac") != -1);
IS_IE5MAC = (IS_IE && IS_Mac) ? true : false;

function getThis(sId)
{
	var oObject;
	oObject = false;
	
	if (IS_DOM) {
		if (document.getElementById) {
			if (document.getElementById(sId)) {
				oObject = document.getElementById(sId);
			}
		}
	}
	
	return oObject;
}

// image swapper
function changeImages() 
{
  if (IS_DOM) {
    for (var i = 0; i < changeImages.arguments.length; i += 2) { 
  		document.getElementById(changeImages.arguments[i]).src = eval(changeImages.arguments[i + 1] + ".src"); 
	}
  }
}

function changeStyle(oElement, sPropertyName, sNewValue)
{
	if (document.getElementById || document.all) {
		// get element
		oStyle = oElement.style;
		// apply new style value to provided property
		eval("oStyle." + sPropertyName + " = '" + sNewValue + "'");
	}
}

/* 
interface to show/ hide box element given it's @id
must pass the box's initial state (either "closed" or "open")
so we know what to do in the NULL case 
*/
function changeDisplayState(sBoxId, sInitialState)
{
	sNewState = "";
	
	if (IS_DOM) {
		oBox = getThis(sBoxId).style;
		if (oBox.display == "none" || (oBox.display == "" && sInitialState == "closed")) {
			oBox.display = "block";
			sNewState = "open";
		} else {
			oBox.display = "none";
			sNewState = "closed";
		}
	}
	
	return sNewState;
}

function showBox(sBoxId, sInitialState)
{
	changeDisplayState(sBoxId, sInitialState);
}

// event attacher
function addEvent(obj, evType, fn){
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, true);
   		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
   		return r;
	} else {
   		return false;
	}
}

function removeEvent(obj, evType, fn, useCapture){
	if (obj.removeEventListener){
    	obj.removeEventListener(evType, fn, useCapture);
  		return true;
  } else if (obj.detachEvent){
  		var r = obj.detachEvent("on"+evType, fn);
    	return r;
  } else {
    	alert("Handler could not be removed");
  }
}

function getAncestry(oElement, iLevels)
{
	oAncestor = oElement;
	
	for (i = 0; i < iLevels; i++) {
		oAncestor = oAncestor.parentNode;
	}
	
	return oAncestor;
}

function setUpFAQs()
{
	var oFAQ;
	var oQuestionCollection;
	
	oFAQ = getThis("FAQs");
	
	if (oFAQ != false) {
		// get all divs inside FAQ set
		oQuestionCollection = oFAQ.getElementsByTagName("div");
		
		// loop over collection
		for (i = 0; i < oQuestionCollection.length; i++) {
			// add alternating background colors
			if (i % 4 == 2) {
				oQuestionCollection[i].style.background = "#E3E0D0";
			}
			
			// add expanding link
			var a = document.createElement("a");
			sCurrentId = "answerLink" + i;
    		a.setAttribute("href", "javascript:showAnswer('" + sCurrentId + "');");
     		a.setAttribute("title", "Find the Answer");
			a.setAttribute("id", sCurrentId);
     		a.appendChild(document.createTextNode("answer"));
			a.className = "openQuestion";
			if (!IS_IE5MAC) {
				oQuestionCollection[i].appendChild(a);
			}
		}
	}
}

function showAnswer(sLinkId)
{
	var oLink = getThis(sLinkId);
	if (IS_DOM) {
		oParent = getAncestry(oLink, 1);
		oDivCollection = oParent.getElementsByTagName("div");
		
		if (oDivCollection.length > 0) {
			oAnswerStyle = oDivCollection[0].style
			if (oAnswerStyle.display == "none" || oAnswerStyle.display == "") {
				oAnswerStyle.display = "block";
			} else {
				oAnswerStyle.display = "none";
			}
		}
	}
}

/* START PHOTO GALLERY */

// preload gallery controls
gallery_previous_on = new Image();
gallery_previous_on.src = "../img/nav/gallery_previous_r.gif";
gallery_previous_off = new Image();
gallery_previous_off.src = "../img/nav/gallery_previous_0.gif";
gallery_next_on = new Image();
gallery_next_on.src = "../img/nav/gallery_next_r.gif";
gallery_next_off = new Image();
gallery_next_off.src = "../img/nav/gallery_next_0.gif";

// initial position in gallery
var iGalleryPosition = 0;

// doPhotoSwap changes out main gallery image with another photo
// photos are listed by name in an array on the page
// also included is the directory name under /img/galleries/

function doPhotoSwap(sDirection)
{
	if (IS_DOM) {
		var iPositionChange = 0;
		var bError = false;
		var sError = "";
		
		if (sDirection == "previous") {
			iPositionChange = -1;
		}
		if (sDirection == "next") {
			iPositionChange = 1;
		}
		// update position in array
		iNewPosition = getNewPosition(iPositionChange);
		
		// if getNewPosition returned false, array is missing
		if (!aPhotos) {
			bError = true;
			sError = "Error: Photo list missing.";
		}
		
		oImage = getThis("photoSwap");
		
		// if browser can't find the main image we swap, set error
		if (oImage == false) {
			bError = true;
			sError = "Error: Main gallery image missing.";
		} else {
			oCredits = getThis("photographerName");
			oTitle = getThis("photoTitle");
			
			if (oCredits == false || oTitle == false) {
				bError = true;
				sError = "Error: Credits area missing.";
			}
		}
		
		// if no gallery name was provided in variable, set error
		if (!sGalleryDirectory || sGalleryDirectory == "") {
			bError = true;
			sError = "Error: Directory name not provided.";
		}
		
		// if we've encountered an error, alert user and stop
		if (bError == true) {
			alert(sError);
		} else {
			aPhotoInfo = aPhotos[iNewPosition];
			var sFileName = aPhotoInfo[0];
			var sPhotographer = aPhotoInfo[1];
			var sPhotoTitle = aPhotoInfo[2];
			sNewImagePath = "../img/galleries/" + sGalleryDirectory + "/" + sFileName;
			
			// update image
			oImage.src = sNewImagePath;
			// update photog name
			oCredits.innerHTML = sPhotographer;
			// update title
			oTitle.innerHTML = sPhotoTitle;
		}
	}
}

function getNewPosition(iChange)
{
	// don't let array index go below 0
	if (iGalleryPosition == 0 && iChange == -1) {
		return 0;
	}
	
	// don't let array index go above array length
	if (iGalleryPosition >= (aPhotos.length - 1) && iChange == 1) {
		return (aPhotos.length - 1);
	}
	
	// if we're within our limits, update and return new position
	iGalleryPosition += iChange;
	return iGalleryPosition;
}