/* This file contains most of the javascript functions used on the OIR/OAPA site.
There are exceptions, and those other files are in the same directory as this file.*/

/*
This function was written by Simon Willison and can be found at http://simon.incutio.com/archive/2004/05/26/addLoadEvent
Queues up all the events that are triggered when the document loads.
Alternative to using the window.onload = func which can only be used once on a page.
*/

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        window.onload = function() {
            oldonload();
            func();
        }
    }
}

/* this function is used in the search box */

addLoadEvent(searchInput);

function searchInput() {
  var innerText = "Search";
	
  if (!document.getElementById("searchfield")) return false;
    document.getElementById("searchfield").onfocus = function() {
      if (this.value == innerText) {
        this.value = "";
      }
    }
    document.getElementById("searchfield").onblur = function() {
      if (this.value == "") {
        this.value = innerText;
      }
    }
} 


/*
The following script is used to collapse content and is used on many pages,
including topics, fact sheets, and fact book pages.
*/
/* 
 * DOMcollapse
 * Version 3.0
 * released 06.12.2005 
 * Not for commercial reselling or use, unless consent given by the author
 * Check for updates on http://onlinetools.org and http://wait-till-i.com
 *
*/

dc={
	triggerElements:'*', 	// elements to trigger the effect
	parentElementId:'centerContent',	// ID of the parent element (keep null if none)
	uniqueCollapse:false,	// is set to true only one element can be open at a time

	// CSS class names
	trigger:'trigger',
	triggeropen:'expanded',
	hideClass:'hide',
	showClass:'show',
	
	// pictures and text alternatives
	closedPic:'/oapa/images/graphics/domCollapse/plus.gif',
	closedAlt:'expand section',
	openPic:'/oapa/images/graphics/domCollapse/minus.gif',
	openAlt:'collapse section',
	/* Doesn't work with Safari
		hoverClass:'hover',
	*/

	init:function(e){
		var temp;
		if(!document.getElementById || !document.createTextNode){return;}
		if(!dc.parentElementId){
			temp=document.getElementsByTagName(dc.triggerElements);
		} else if(document.getElementById(dc.parentElementId)){
			temp=document.getElementById(dc.parentElementId).getElementsByTagName(dc.triggerElements);
		}else{
			return;
		}
		dc.tempLink=document.createElement('a');
		dc.tempLink.setAttribute('href','#');
		dc.tempLink.appendChild(document.createElement('img'));
		for(var i=0;i<temp.length;i++){
			if(dc.cssjs('check',temp[i],dc.trigger) || dc.cssjs('check',temp[i],dc.triggeropen)){
				dc.makeTrigger(temp[i],e);
			}
		}
	},
	makeTrigger:function(o,e){
		var tl=dc.tempLink.cloneNode(true);
		var tohide=o.nextSibling;
		while(tohide.nodeType!=1)
		{
			tohide=tohide.nextSibling;
		}
		o.tohide=tohide;
		if(!dc.cssjs('check',o,dc.triggeropen)){
			dc.cssjs('add',tohide,dc.hideClass);
			tl.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
			tl.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
			o.setAttribute('title',dc.closedAlt);
		}else{
			dc.cssjs('add',tohide,dc.showClass);
			tl.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
			tl.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
			o.setAttribute('title',dc.openAlt);
			dc.currentOpen=o;
		}
		dc.addEvent(o,'click',dc.addCollapse,false);
		/* Doesn't work with Safari
		dc.addEvent(o,'mouseover',dc.hover,false);
		dc.addEvent(o,'mouseout',dc.hover,false);
		*/
		o.insertBefore(tl,o.firstChild);
		dc.addEvent(tl,'click',dc.addCollapse,false);
		// Safari hacks 
		tl.onclick=function(){return false;}
		o.onclick=function(){return false;}
	},
	/* Doesn't work with Safari
	hover:function(e){
		var o=dc.getTarget(e);
		var action=dc.cssjs('check',o,dc.hoverClass)?'remove':'add';
		dc.cssjs(action,o,dc.hoverClass)
	},
	*/
	addCollapse:function(e){
		var action,pic;
		// hack to fix safari's redraw bug 
		// as mentioned on http://en.wikipedia.org/wiki/Wikipedia:Browser_notes#Mac_OS_X
		if (self.screenTop && self.screenX){
			window.resizeTo(self.outerWidth + 1, self.outerHeight);    
			window.resizeTo(self.outerWidth - 1, self.outerHeight);   
		}
		if(dc.uniqueCollapse && dc.currentOpen){
			dc.currentOpen.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
			dc.currentOpen.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
			dc.currentOpen.setAttribute('title',dc.closedAlt);
			dc.cssjs('swap',dc.currentOpen.tohide,dc.showClass,dc.hideClass);
			dc.cssjs('remove',dc.currentOpen,dc.triggeropen);
			dc.cssjs('add',dc.currentOpen,dc.trigger);
		}
		var o=dc.getTarget(e);
		if(o.tohide){
			if(dc.cssjs('check',o.tohide,dc.hideClass)){
				o.getElementsByTagName('img')[0].setAttribute('src',dc.openPic);
				o.getElementsByTagName('img')[0].setAttribute('alt',dc.openAlt);
				o.setAttribute('title',dc.openAlt);
				dc.cssjs('swap',o.tohide,dc.hideClass,dc.showClass);
				dc.cssjs('add',o,dc.triggeropen);
				dc.cssjs('remove',o,dc.trigger);
			}else{
				o.getElementsByTagName('img')[0].setAttribute('src',dc.closedPic);
				o.getElementsByTagName('img')[0].setAttribute('alt',dc.closedAlt);
				o.setAttribute('title',dc.closedAlt);
				dc.cssjs('swap',o.tohide,dc.showClass,dc.hideClass);
				dc.cssjs('remove',o,dc.triggeropen);
				dc.cssjs('add',o,dc.trigger);
			}
			dc.currentOpen=o;
			dc.cancelClick(e);
			//document.getElementById('debug').innerHTML=o.tohide.className;
		}
		else{
			dc.cancelClick(e);
		}
	},
	/* helper methods */
	getTarget:function(e){
		var target = window.event ? window.event.srcElement : e ? e.target : null;
		if (!target){return false;}
		while(!target.tohide && target.nodeName.toLowerCase()!='body')
		{
			target=target.parentNode;
		}
		// if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;} Safari fix not needed here
		return target;
	},
	cancelClick:function(e){
		if (window.event){
			window.event.cancelBubble = true;
			window.event.returnValue = false;
			return;
		}
		if (e){
			e.stopPropagation();
			e.preventDefault();
		}
	},
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener) 
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},
	cssjs:function(a,o,c1,c2){
		switch (a){
			case 'swap':
				o.className=!dc.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
			case 'add':
				if(!dc.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
			break;
			case 'remove':
				var rep=o.className.match(' '+c1)?' '+c1:c1;
				o.className=o.className.replace(rep,'');
			break;
			case 'check':
				return new RegExp("(^|\\s)" + c1 + "(\\s|$)").test(o.className)
			break;
		}
	}
}
dc.addEvent(window, 'load', dc.init, false);


/*
The following script (in two parts) is used on some alternate designs to add nifty boxes, 
like on 'www.umass.edu/oapa/oir/' and 'www.umass.edu/oapa/oapa/consulting.php' 
*/
/*
cbb function by Roger Johansson, http://www.456bereastreet.com/
*/
var cbb = {
	init : function() {
	// Check that the browser supports the DOM methods used
		if (!document.getElementById || !document.createElement || !document.appendChild) return false;
		var oElement, oOuter, oI1, oI2, tempId;
	// Find all elements with a class name of cbb
		var arrElements = document.getElementsByTagName('*');
		var oRegExp = new RegExp("(^|\\s)cbb(\\s|$)");
		for (var i=0; i<arrElements.length; i++) {
	// Save the original outer element for later
			oElement = arrElements[i];
			if (oRegExp.test(oElement.className)) {
	// 	Create a new element and give it the original element's class name(s) while replacing 'cbb' with 'cb'
				oOuter = document.createElement('div');
				oOuter.className = oElement.className.replace(oRegExp, '$1cb$2');
	// Give the new div the original element's id if it has one
				if (oElement.getAttribute("id")) {
					tempId = oElement.id;
					oElement.removeAttribute('id');
					oOuter.setAttribute('id', '');
					oOuter.id = tempId;
				}
	// Change the original element's class name and replace it with the new div
				oElement.className = 'i3';
				oElement.parentNode.replaceChild(oOuter, oElement);
	// Create two new div elements and insert them into the outermost div
				oI1 = document.createElement('div');
				oI1.className = 'i1';
				oOuter.appendChild(oI1);
				oI2 = document.createElement('div');
				oI2.className = 'i2';
				oI1.appendChild(oI2);
	// Insert the original element
				oI2.appendChild(oElement);
	// Insert the top and bottom divs
				cbb.insertTop(oOuter);
				cbb.insertBottom(oOuter);
			}
		}
	},
	insertTop : function(obj) {
		var oOuter, oInner;
	// Create the two div elements needed for the top of the box
		oOuter=document.createElement("div");
		oOuter.className="bt"; // The outer div needs a class name
	    oInner=document.createElement("div");
	    oOuter.appendChild(oInner);
		obj.insertBefore(oOuter,obj.firstChild);
	},
	insertBottom : function(obj) {
		var oOuter, oInner;
	// Create the two div elements needed for the bottom of the box
		oOuter=document.createElement("div");
		oOuter.className="bb"; // The outer div needs a class name
	    oInner=document.createElement("div");
	    oOuter.appendChild(oInner);
		obj.appendChild(oOuter);
	},
	// addEvent function from http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
	addEvent : function(obj, type, fn) {
		if (obj.addEventListener)
			obj.addEventListener(type, fn, false);
		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]);
		}
	}
};

cbb.addEvent(window, 'load', cbb.init);


/* 
script for popping up new windows. You can find details here:
http://accessify.com/tools-and-wizards/accessibility-tools/pop-up-window-generator/
*/


var newWindow = null;

function closeWin(){
	if (newWindow != null){
		if(!newWindow.closed)
			newWindow.close();
	}
}

function popUpWin(url, type, strWidth, strHeight){
	
	closeWin();
	
	if (type == "fullScreen"){
		strWidth = screen.availWidth - 10;
		strHeight = screen.availHeight - 160;
	}
	
	var tools="";
	if (type == "standard" || type == "fullScreen") tools = "resizable,toolbar=yes,location=yes,scrollbars=yes,menubar=yes,width="+strWidth+",height="+strHeight+",top=0,left=0";
	if (type == "console") tools = "resizable,toolbar=no,location=no,scrollbars=no,width="+strWidth+",height="+strHeight+",left=0,top=0";
	newWindow = window.open(url, 'newWin', tools);
	newWindow.focus();
}

/* This function adds a show/hide help text span and is used in the fingertip 
Find it here:
http://www.websemantics.co.uk/tutorials/accessible_javascript_form_help_show_hide_technique/
*/

    function addEvent(func){
      if (!document.getElementById | !document.getElementsByTagName) return
      var oldonload=window.onload
      if (typeof window.onload != 'function') {window.onload=func}
      else {window.onload=function() {oldonload(); func()}}
    }
    addEvent(hideAll)

    function hideAll(){
      var obj,nextspan,anchor,content

      // get all spans
      obj=document.getElementsByTagName('span')

      // run through them
      for (var i=0;i<obj.length;i++){

        // if it has a class of helpLink
        if(/helpLink/.test(obj[i].className)){

          // get the adjacent span
          nextspan=obj[i].nextSibling
          while(nextspan.nodeType!=1) nextspan=nextspan.nextSibling

           // hide it
          nextspan.style.display='none'

          //create a new link
          anchor=document.createElement('a')

          // copy original helpLink text and add attributes
          content=document.createTextNode(obj[i].firstChild.nodeValue)
          anchor.appendChild(content)
          anchor.href='#help'
          anchor.title='Click to show help'
          anchor.className=obj[i].className
          anchor.nextspan=nextspan
          anchor.onclick=function(){showHide(this.nextspan);changeTitle(this);return false}

          // replace span with created link
          obj[i].replaceChild(anchor,obj[i].firstChild)
        }
      }
    }

    function changeTitle(obj){    // used to flip helpLink title
      if(obj)
        obj.title = obj.title=='Click to show help' ? 'Click to hide help' : 'Click to show help'
    }

    function showHide(obj){   // used to flip the display property
      if(obj)
        obj.style.display = obj.style.display=='none' ? 'inline' : 'none'
    }

