// JavaScript Document

//inside script tag, border with these 2 including the /* and */ 's
/*<![CDATA[*//*---->*/
// code is here
/*--*//*]]>*/

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];
	}
};

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 downloadFile(filename)
{
	var iframe = document.createElement("iframe");
	iframe.src = filename;
	iframe.style.display = "none";
	document.body.appendChild(iframe); 
}

var xmlhttp;

function loadXML(url, error_obj, wait_obj, wait_msg, error_msg, callback, bypasscache)
{
	xmlhttp=null;
	if (window.XMLHttpRequest)
  	{
		// code for all new browsers
  		xmlhttp=new XMLHttpRequest();
  	}
	else if (window.ActiveXObject)
  	{
		// code for IE5 and IE6
  		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  	}

	if (xmlhttp!=null)
  	{
		wait_obj.innerHTML = wait_msg;

  		xmlhttp.onreadystatechange=callback;
  		xmlhttp.open("GET",url + (bypasscache?((url.match(/\?/) == null ? "?" : "&") + (new Date()).getTime()):''),true);
  		xmlhttp.send(null);
	}
	else
  	{
		error_obj.innerHTML = "<b>" + error_msg + " Your browser does not seem to support XMLHTTP.</b>";
  	}
}

var res_div;
function getXMLRoot(xh)
{
//alert(xmlhttp.getAllResponseHeaders());
//hmmm: xmlhttp.responseXML.loadXML(xmlhttp.responseText);

/*
alert('asdf ' + xh.responseXML.parseError.reason);
res_div = document.createElement('div');
res_div.innerHTML = xh.responseText;
alert('div is ' + res_div.childNodes[2].nodeName + ' ' + res_div.childNodes[102] + ' ' + res_div.childNodes[110] + ' ' + res_div.childNodes[111] + ' ' + res_div.childNodes[112] + ' ' + res_div.childNodes[202]);
return(res_div);
*/
	if (isIE6ish() || isIE7ish())
	{
		var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(xh.responseText);

		return(xmlDoc.childNodes[1]);
	}
	else return(xh.responseXML.childNodes[0]);
}

// Firefox 3.0.3 (at least) bug workaround
function safeNodeRetrieve(mynodes)
{
	if (mynodes.length == 0) return(null);

	if (mynodes.length == 1) return(mynodes[0].nodeValue);

	var res = '';

	for (var i=0; i<mynodes.length; i++)
	{
		// at least one should be valid, perhaps multiple (2 seen)
		if (mynodes[i]) res += mynodes[i].nodeValue;
//console.log('assembling ', i, mynodes[i].nodeValue);
	}

	return(res);
}

function isIE7ish()
{
	var pattern = /^4\.0 \(compatible; MSIE 7/; // IE6 couldn't parse via constructor
	return(navigator.appName == 'Microsoft Internet Explorer' && (pattern.test(navigator.appVersion)));
}

function isIE6ish()
{
	var pattern = /^4\.0 \(compatible; MSIE 6/; // IE6 couldn't parse via constructor
	return(navigator.appName == 'Microsoft Internet Explorer' && (pattern.test(navigator.appVersion)));
}

/*


   1.
      function getElementsByClassName(classname, node) {
   2.
      if(!node) node = document.getElementsByTagName("body")[0];
   3.
      var a = [];
   4.
      var re = new RegExp('\\b' + classname + '\\b');
   5.
      var els = node.getElementsByTagName("*");
   6.
      for(var i=0,j=els.length; i<j; i++)
   7.
      if(re.test(els[i].className))a.push(els[i]);
   8.
      return a;
   9.
      }

*/

/* doesn't work?

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
};
*/

/*
function toggle(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
};
*/

/*
function toggle(s) {
var el = document.getElementById(s),els=el.style;
if (els.display!='none'){
el._sty_disp_bk=els.display;
els.display = 'none';
} else {
els.display=el._sty_disp_bk||"";
}
}
*/

/* causes problems? change to function inArray(array, value)?

Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};
*/

function $c() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

// Sample Usage:
/*
var obj1 = document.getElementById('element1');
var obj2 = document.getElementById('element2');
function alertElements() {
  var i;
  var elements = $('a','b','c',obj1,obj2,'d','e');
*/

/* id first, then class, then name, then others... not benchmarked. */
/* doesn't work for checkboxes? returns wrong kind of node maybe? */
function $a() {
	var elements = new Array();
	for (var i=0,len=arguments.length;i<len;i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			var matched = document.getElementById(element);
			if (matched) {
				elements.push(matched);
			} else {
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				var regexp = new RegExp('(^| )'+element+'( |$)');
				for (var i=0,len=allels.length;i<len;i++) if (regexp.test(allels[i].className)) elements.push(allels[i]);
			}
			if (!elements.length) elements = document.getElementsByTagName(element);
			if (!elements.length) {
				elements = new Array();
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				for (var i=0,len=allels.length;i<len;i++) if (allels[i].getAttribute(element)) elements.push(allels[i]);
			}
			if (!elements.length) {
				var allels = (document.all) ? document.all : document.getElementsByTagName('*');
				for (var i=0,len=allels.length;i<len;i++) if (allels[i].attributes) for (var j=0,lenn=allels[i].attributes.length;j<lenn;j++) if (allels[i].attributes[j].specified) if (allels[i].attributes[j].nodeValue == element) elements.push(allels[i]);
			}
		} else {
			elements.push(element);
		}
	}
	if (elements.length == 1) {
		return elements[0];
	} else {
		return elements;
	}
}

function get_url_param(name)
{ 
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS ); 
var results = regex.exec( window.location.href ); 
if( results == null )    return null; 
else return results[1];
}

/* safer, handles existing event handlers to prevent memory leaks, etc */
/*
function setInnerHTML(el, html) {
          el = YAHOO.util.Dom.get(el);
          if (!el || typeof html !== 'string') {
              return null;
          }
      
          // Break circular references.
          (function (o) {
      
              var a = o.attributes, i, l, n, c;
              if (a) {
                  l = a.length;
                  for (i = 0; i <l; i += 1) {
                      n = a[i].name;
                      if (typeof o[n] === 'function') {
                          o[n] = null;
                      }
                  }
              }
      
              a = o.childNodes;
      
              if (a) {
                  l = a.length;
                  for (i = 0; i <l; i += 1) {
                      c = o.childNodes[i];
      
                      // Purge child nodes.
                      arguments.callee(c);
      
                      // Removes all listeners attached to the element via YUI's addListener.
                      YAHOO.util.Event.purgeElement(c);
                  }
              }
      
          })(el);
      
          // Remove scripts from HTML string, and set innerHTML property
          el.innerHTML = html.replace(/<script[^>]*>((.|[\r\n])*?)<\\?\/script>/ig, "");

          // Return a reference to the first child
          return el.firstChild;
      };
*/

/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};
