
function MM_swapImgRestore( ) {	// v3.0
	var i, x, a = document.MM_sr;
	for( i = 0 ; a && i < a.length && ( x = a[ i ] ) && x.oSrc ; i++ ) x.src = x.oSrc;
}
function MM_preloadImages( ) {	// v3.0
	var d = document;
	if( d.images ) {
		if( !d.MM_p ) d.MM_p = new Array( );
		var i , j = d.MM_p.length, a = MM_preloadImages.arguments;
		for( i = 0 ; i < a.length ; i++ ) {
			if( a[ i ].indexOf( "#" ) != 0 ) {
				d.MM_p[ j ] = new Image;
				d.MM_p[ j++ ].src = a[ i ];
			}
		}
	}
}
function MM_findObj( n, d ) {	// v4.01
	var p, i, x;
	if( !d ) d = document;
	if( ( p = n.indexOf( "?" ) ) > 0 && parent.frames.length ) {
		d = parent.frames[ n.substring( p + 1 ) ].document;
		n = n.substring( 0, p );
	}
	if( !( x = d[ n ] ) && d.all ) x = d.all[ n ];
	for( i = 0 ; !x && i < d.forms.length ; i++ ) x = d.forms[ i ][ n ];
	for( i = 0 ; !x && d.layers && i < d.layers.length ; i++ ) x = MM_findObj( n, d.layers[ i ].document );
	if( !x && d.getElementById ) x = d.getElementById( n );
	return x;
}
function MM_swapImage( ) {		// v3.0
	var i, j = 0, x, a = MM_swapImage.arguments;
	document.MM_sr = new Array;
	for( i = 0 ; i < ( a.length - 2 ) ; i += 3 ) {
		if( ( x = MM_findObj( a[ i ] ) ) != null ) {
			document.MM_sr[ j++ ] = x;
			if( !x.oSrc ) x.oSrc = x.src;
			x.src = a[ i + 2 ];
		}
	}
}

function setTrack( track, expire ) {

	var expDate = new Date(expire);
	strCookie = "track=" + escape(track) + "; expires=" + expDate.toGMTString() +
		        "; path=/";
//        ((domain) ? "; domain=" + domain : "") +
//        ((secure) ? "; secure" : "");

	document.cookie = strCookie;
	window.location.reload();
	return false;

}

function disablePast(date) {
	var today = new Date();
	if (date.getTime() < today.getTime() - 60*1000*60)
		return true; // true says "disable"
	else
		return false; // leave other dates enabled
}

function disableFuture(date) {
	var today = new Date();
	if (date.getTime() > today.getTime() + 60*1000*60)
		return true; // true says "disable"
	else
		return false; // leave other dates enabled
}

/*
 * Handy JS Utilities
 */
//Generic tool for getting all tags of a specific type and class
//tagName - Name of tag to search for
//withClass - Name of Class to search for
//expCnt - OPTIONAL max number of elements to find
function myGetElementsByClass(tagName, withClass, expCnt) {
	var tags = document.getElementsByTagName(tagName);
	var rtn = new Array();	
	expCnt = expCnt || false; //Default value for expCnt
	
	//Find only the ones with the right class
	for(var i=0; i < tags.length; i++) {
		if (tags[i].className == withClass) {
			rtn.push(tags[i]);
			if (expCnt > 0 && rtn.length > expCnt) { break; }
		}
	}
	return rtn;
}
//Attach an onclick event handler to a node
//Args: node - object that event is to be attached to
//		eventName - string describing event see eventMap below
//		function - function to be attached
function attachEvent(node, eventName, func) {
	node[eventName] = func; //Add event

	if (!isIE) {
		//Allow me to raise events
		node.addEventListener(eventName, func, true); //false to get it in bubble not capture
	}
	if (node.captureEvents) {
		var eventMap = new Object;
		eventMap["onclick"] = Event.CLICK;
		eventMap["onchange"] = Event.CHANGE;
		eventMap["onsubmit"] = Event.SUBMIT;
		if (! eventMap[eventName]) { return false; }
		node.captureEvents(eventMap[eventName]);
	}
}
//Fire an event on a given node
//Args: node - object that event is attached to
//		eventName - string describing event, see eventMap in attachEvent, ie 'onclick'
function dispatchEvent(node, eventName) {
	if (document.createEvent) {
		var evt = document.createEvent("Events"); //Simple event object
		evt.initEvent(eventName, true, true); //true for can bubble, true for cancelable
		node.dispatchEvent(evt);
	} else {
		//IE version
		var evt = document.createEventObject();
		node.fireEvent(eventName,evt);
		evt.cancelBubble = true; 
	}
}
//Get object that raised event
function getEventObject(e) {
	//Make sure I have the event
	if (!e) { e = window.event; }
	
	//Get the object that raised the event
	if (e.target) {
		return e.target;
	} else if (e.srcElement) {
		return e.srcElement;
	}
	return false;
}

//taken from Shawn Olson & http://www.shawnolson.net, adapted by CB3 to be "toggle all" instead
function checkUncheckAll(theElement) {
     var theForm = theElement.form, z = 0;
	 for(z=0; z<theForm.length;z++){
      if(theForm[z].type == 'checkbox' && theForm[z].name != 'checkall'){
		  theForm[z].checked = !theForm[z].checked;
	  }
  }
}

function getAllFormData(theForm) {
	var data = new Object();
	var els = theForm.elements;
	for (var i=0; i < els.length; i++) {
		if (els[i].value) {
			if (els[i].type == 'select-multiple') {
				var types = Array();
				for (var j=0; j < els[i].length; j++) {
					if (els[i].options[j].selected==true) {
						types.push(els[i].options[j].value);	
					}
				}
				
				//we support only ONE level of array! could maybe do more with a while? or recursive function?
				var name = els[i].name;
				if (name.indexOf('[')!=-1) {
						var firstIndex = name.indexOf('[');
						var lastIndex = name.indexOf(']');
						newname = name.substring(0,firstIndex);
						var inside = name.substring(firstIndex+1,lastIndex);
						if (!data[newname]) data[newname] = new Object();
						data[newname][inside] = els[i].value;
				} else {
					data[name] = types;
				}
			} else if (
					   ((els[i].type == 'radio' || els[i].type == 'checkbox') && els[i].checked) 
					    || 
					   (els[i].type != 'radio' && els[i].type != 'checkbox')
					  )
			{
				//we support only ONE level of array! could maybe do more with a while? or recursive function?
				var name = els[i].name;
				if (name.indexOf('[')!=-1) {
						var firstIndex = name.indexOf('[');
						var lastIndex = name.indexOf(']');
						newname = name.substring(0,firstIndex);
						var inside = name.substring(firstIndex+1,lastIndex);
						if (!data[newname]) data[newname] = new Object();
						data[newname][inside] = els[i].value;
				} else {
					data[name] = els[i].value;
				}
			} 				
		}
	}
	return data;
}

// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
function isInteger(val){
	if (isBlank(val)){return false;}
	for(var i=0;i<val.length;i++){
		if(!isDigit(val.charAt(i))){return false;}
		}
	return true;
}

//-------------------------------------------------------------------
// isBlank(value)
//   Returns true if value only contains spaces
//-------------------------------------------------------------------
function isBlank(val){
	if(val==null){return true;}
	for(var i=0;i<val.length;i++) {
		if ((val.charAt(i)!=' ')&&(val.charAt(i)!="\t")&&(val.charAt(i)!="\n")&&(val.charAt(i)!="\r")){return false;}
		}
	return true;
}

//-------------------------------------------------------------------
// isDigit(value)
//   Returns true if value is a 1-character digit
//-------------------------------------------------------------------
function isDigit(num) {
	if (num.length>1){return false;}
	var string="1234567890";
	if (string.indexOf(num)!=-1){return true;}
	return false;
}

/* End functions from Matt Kruse */


/* from http://www.brainerror.net/scripts_js_blendtrans.php */
function opacity(id, opacStart, opacEnd, millisec) {
	//speed for each frame
	var speed = Math.round(millisec / 100);
	var timer = 0;
	
	var original_content = document.getElementById(id).innerHTML;

	//determine the direction for the blending, if start and end are the same nothing happens
	if(opacStart > opacEnd) {
		for(i = opacStart; i >= opacEnd; i--) {
			setTimeout("changeOpac(" + i + ",'" + id + "','"+original_content+"')",(timer * speed));
			timer++;
		}
	} else if(opacStart < opacEnd) {
		for(i = opacStart; i <= opacEnd; i++)
			{
			setTimeout("changeOpac(" + i + ",'" + id + "','"+original_content+"')",(timer * speed));
			timer++;
		}
	}
}

//change the opacity for different browsers
function changeOpac(opacity, id, content) {
	if (content && document.getElementById(id).innerHTML != content) {
			opacity = 100;
	}
	var object = document.getElementById(id).style; 
	object.opacity = (opacity / 100);
	object.MozOpacity = (opacity / 100);
	object.KhtmlOpacity = (opacity / 100);
	object.filter = "alpha(opacity=" + opacity + ")";
}

function shiftOpacity(id, millisec) {
	//if an element is invisible, make it visible, else make it ivisible
	if(document.getElementById(id).style.opacity == 0) {
		opacity(id, 0, 100, millisec);
	} else {
		opacity(id, 100, 0, millisec);
	}
}

/* End functions from http://www.brainerror.net/scripts_js_blendtrans.php */

function toggleHidden(element) {
	var e;
	var reg = /\bhidden\b/;
	if (e = document.getElementById(element)) {
		if (reg.test(e.className)) e.className = 'unhidden';
		else e.className = 'hidden';
	} else {
		return false;
	}
	return true;
}