var currentMenu = null;

if (!document.getElementById) {
	document.getElementById = function() {
		return null;
	};
}

function initializeMenu(menuId, actuatorId) {
  var menu = document.getElementById(menuId);
  var actuator = document.getElementById(actuatorId);
  if (menu == null || actuator == null) return;

  actuator.onmouseover = function() {
    if (currentMenu) {
      if (currentMenu.filters) if (currentMenu.filters[0]) currentMenu.filters[0].Apply();
      currentMenu.style.display = "none";
      if (currentMenu.filters) if (currentMenu.filters[0]) currentMenu.filters[0].Play();
    }
    this.showMenu();
    a=0;
  };
  
  actuator.onmouseout = function() {
  	a=1;
  	setTimeout('if(a==1){currentMenu.style.display = "none"};',100);
  };
  menu.onmouseover = function() {
  	a=0;
  };
  menu.onmouseout = function() {
  	a=1;
  	setTimeout('if(a==1){currentMenu.style.display = "none"};',100);
  };
  
  actuator.showMenu = function() {
    menu.style.left = this.offsetLeft + "px";
    menu.style.top = this.offsetTop + this.offsetHeight + "px";
    if (menu.filters) if (menu.filters[0]) menu.filters[0].Apply();
	menu.style.display = "block";
    if (menu.filters) if (menu.filters[0]) menu.filters[0].Play();
    currentMenu = menu;
  };
}

// Opens a link in a new window when class = externalLink

function doPopups() {
  if (!document.getElementsByTagName) return false;
  var links = document.getElementsByTagName("a");
  for (var i=0; i < links.length; i++) {
    if (links[i].className.match("popup")) {
		links[i].className = links[i].className + " newWinStyle";
		if (links[i].title == "") {
		links[i].title = "(new window)";
		}
		else {
		links[i].title = links[i].title + " (new window)";	
		}
	 	links[i].onclick = function(e) {
			if(!e)e=window.event;
			if(e.shiftKey || e.ctrlKey || e.altKey) return;
			window.open(this.href);
			return false;
			}
      }
    }
}

// ALTERNATING ROW COLOURS IN TABLE

// Main function, called when the page loads
function alternateRows() {
	var i, j;
	if (!document.getElementById) return;
		var tables = document.getElementsByTagName("table");	  
		//search through tables in document
		for (i=0; i<tables.length; i++) {
			// If table has the right classname
				rows = tables[i].getElementsByTagName("tr");
				applyClasstoRows(rows);
		}
}

// ALTERNATING ROW COLOURS IN FORM

// Main function, called when the page loads
function alternateFormRows() {
	var i, j;
	if (!document.getElementById) return;
		var forms = document.getElementsByTagName("form");
		//search through forms in document
		for (i=0; i<forms.length; i++) {
			// If form has the right classname
				rows = getElementsByClassName(forms[i], "div", "row");
				applyClasstoRows(rows);
		}
}

// Function, which is passed a reference, applies the class 'even' to each even row
function applyClasstoRows(myRows) {
	var blnAlternate = false;

	// search through rows
	for (j=0; j<rows.length; j++) {
		if (rows[j].className.indexOf('hide', 0) == -1) {
			
			if (blnAlternate) {
				rows[j].className = string_replace(rows[j].className, "alternate", "")
			  blnAlternate = false;
			}
			else {
				if (rows[j].className.indexOf('alternate', 0) == -1) {
				  rows[j].className = rows[j].className + " alternate";
				}
				blnAlternate = true;
			}
		}
/*		
	   // Set class for even rows (odd doesn't need to be set)
	   if (j%2 == 0) {
		  rows[j].className = rows[j].className + " alternate";
	   }
*/	   
	}
}

//Get Element by Class Name from: http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements);
}

//Function for converting title tags on images into caption
function addCaption(xClass) {
	var allImages = getElementsByClassName(document, "img", xClass);
	for ( var i=0; i < allImages.length; i++) {
		if (allImages[i].className.indexOf("noCaption") == -1) {
			var imageCaption = document.createTextNode(allImages[i].title);
			var imageContainer = document.createElement("div");
			var imagePara = document.createElement("p");
			var imageWidth = allImages[i].getAttribute("width");
			var spareSpan = document.createElement("span"); //This adds an extra span. Useful for curved corners
			imagePara.appendChild(imageCaption);
			
			var parent = allImages[i].parentNode;
			var grandparent = parent.parentNode;
			
			if (parent.tagName == 'A') {
				grandparent.insertBefore(imageContainer, parent);
				parent.removeChild(allImages[i]);
				grandparent.removeChild(parent);
				imageContainer.appendChild(parent);
				parent.appendChild(allImages[i]);
			} else {
				  parent.insertBefore(imageContainer, allImages[i]);
				  parent.removeChild(allImages[i]);
				  imageContainer.appendChild(allImages[i]);
			}
			
			if ( allImages[i].title != "" ) {
			imageContainer.appendChild(imagePara); 
			}
			imageContainer.appendChild(spareSpan);		
			imageContainer.className = xClass;
			spareSpan.className = "spareSpan";
			allImages[i].className = "imgCaption";
			imagePara.style.width = (imageWidth - 10) + "px";
		}
    }
}

function submitForm() {
	if(document.getElementById('donation-amount')) {
		var am = parseInt(document.getElementById('donation-amount').value);
		if(!isNaN(am) && am >=1 )
			return true;
		else {
			alert('Donation amount must be at least £1');
			return false;
		}
	}
	else
		return true;
}


function string_replace(str1, str2, str3) {
	var strReturn = "";
	var reg=new RegExp(str2, "g");
	
	strReturn = str1.replace(reg, str3);
	return strReturn;	
}


// Easy way of adding an event
function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); };
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}

// Solves an IE caching problem
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
addEvent(window,'unload',EventCache.flush);

function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}




//
// JSON class for generic DOM functions.
// ****************************************************************************
// Developer notes ::
// ** MDC : Initial creation.
//
var headscapeDOM = {

	//
	// Generic addEvent function.
	//
	// Developer notes ::
	// ** MDC : Initial creation.
	//
	addEvent : function(obj, evType, fn, useCapture) {
		if (obj.addEventListener){
			obj.addEventListener(evType, fn, useCapture);
			return true;
		} else if (obj.attachEvent){
			var r = obj.attachEvent("on"+evType, fn);
			return r;
		} else {
			//alert("Handler could not be attached");
		}
	}
	// ----------------------------------------------------------------------------

}
// ****************************************************************************




//
// JSON class for Send to a Friend
// Prevents the user clicking submit more than once
// ****************************************************************************
// Developer notes ::
// ** MDC : Initial creation
//
var sightingButterflyTypeSelected = {

	//
	// Listens for the form submission.
	//
	// Developer notes ::
	// ** MDC : Initial creation
	//
	watch : function(e) {
		if (document.getElementById) {
			/*var butterflyType1 = document.getElementById("type_1");
			var butterflyType2 = document.getElementById("type_2");
			if (butterflyType1) {
				headscapeDOM.addEvent(butterflyType1, 'change', this.highlight, false);
			}
			if (butterflyType2) {
				headscapeDOM.addEvent(butterflyType2, 'change', this.highlight, false);
			}*/
			var els = getElementsByClassName(document, 'DIV', 'insect');
			for(i=0; i<els.length; i++)
				headscapeDOM.addEvent(els[i], 'click', this.chkHighlight, false);
			if(els.length >0) this.chkHighlight();
		}
	},
	// ----------------------------------------------------------------------------


	chkHighlight : function(e) {
		if(document.getElementById("type_1").checked) {
			document.getElementById("type_2").parentNode.className = 'insect';
			document.getElementById("type_1").parentNode.className = 'insect selected';
		}
		if(document.getElementById("type_2").checked) {
			document.getElementById("type_1").parentNode.className = 'insect';
			document.getElementById("type_2").parentNode.className = 'insect selected';
		}
	}

	//
	// Highlight the selected butterfly
	//
	// Developer notes ::
	// ** MDC : Initial creation	
	//
	/*highlight : function(e) {
		var butterflyType;

		if (window.event) {
			var whichlink = window.event.srcElement;
		}
		else
		{
			var whichlink = e.target;
		}

		whichlink.parentNode.className = 'insect selected';
		
		if (whichlink.id == 'type_1') {
			butterflyType = document.getElementById("type_2");
		}
		if (whichlink.id == 'type_2') {
			butterflyType = document.getElementById("type_1");
		}

		butterflyType.parentNode.className = 'insect';

		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}

	}*/
	// ----------------------------------------------------------------------------

}
// ****************************************************************************



//
// JSON class for the sigthing form
// Expand and collapse the personal details section
// ****************************************************************************
// Developer notes ::
// ** MDC : Initial creation
//
var sightingForm = {

	watch : function(e) {
		var i;
		if (document.getElementById("more")) {
			var eltMore = document.getElementById("more");
			headscapeDOM.addEvent(eltMore, 'click', this.expand_and_collapse_personal_details, false);

			if (! eltMore.checked) {
				for (i=1; i<15; i++) {
					document.getElementById("pd" + i).className = document.getElementById("pd" + i).className + ' hide';
				}
			}
		}
	},
	// ----------------------------------------------------------------------------


	expand_and_collapse_personal_details : function(e) {
		var i;
		if(document.getElementById("more").checked) {
			for (i=1; i<15; i++) {
				document.getElementById("pd" + i).className = string_replace(document.getElementById("pd" + i).className, "hide", "show")
			}
		}
		else {
			for (i=1; i<15; i++) {
				document.getElementById("pd" + i).className = string_replace(document.getElementById("pd" + i).className, "show", "hide")
			}
		}
		alternateFormRows();

/*
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
*/		
	}
	// ----------------------------------------------------------------------------

}
// ****************************************************************************


// Runs all the listed functions on the loading of the window
window.onload=function(){
	sightingButterflyTypeSelected.watch();
	//sightingForm.watch();
	loadMenus();
	doPopups();
	alternateRows();
	alternateFormRows();
	addCaption("imageLeft");
	addCaption("imageRight");
	if(typeof initFormAjax == 'function') initFormAjax();
}