/*
 * Gets a collection of elements based on class name
 * 
 * @param {String} strClass Containing the class(es) that you are looking for
 * @param {String} strTag (optional, defaults to '*') : An optional tag name 
 * to narrow the search to specific tags e.g. ?a? for links.
 * @param (String) objContElm (optional, defaults to document) An optional 
 * object container to search inside. Again this narrows the scope of the search
 */
function getElementsByClassName(strClass, strTag, objContElm) {
	strTag = strTag || "*";
  objContElm = objContElm || document;
  var objColl = (strTag == '*' && document.all) ? document.all : objContElm.getElementsByTagName(strTag);
  var arr = new Array();
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
  var arrClass = strClass.split(delim);
  for (i = 0, j = objColl.length; i < j; i++) {
    var arrObjClass = objColl[i].className.split(' ');
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (k = 0, l = arrObjClass.length; k < l; k++) {
      for (m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
          arr.push(objColl[i]);
          break comparisonLoop;
        }
      }
    }
  }
  return arr;
}

// shortcut to getElementsByClassName function
$$ = getElementsByClassName;

/*
 * This function mimics C# Stringbuilder class
 */
function StringBuilder() {
	this.__strings__ = new Array;
}
StringBuilder.prototype.append = function (str) {
	this.__strings__.push(str);
};
StringBuilder.prototype.toString = function () {
	return this.__strings__.join("");
};

/* 
 * Array.push functionality for browsers that don't support it (like mac ie) 
 */
if (typeof Array.prototype.push=="undefined")
{
	Array.prototype.push=function()
	{
		var i=0;
		b=this.length,a=arguments;
		for(i;i<a.length;i++)this[b+i]=a[i];
		return this.length;
	}
}

/*
 * This is used to read a URL query value
 */
function getQueryVariable(variable) 
{
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	for (var i=0;i<vars.length;i++) 
	{
		var pair = vars[i].split("=");
		if (pair[0] == variable) 
		{
			return pair[1];
		}
	}   
}

/* 
 * Entirely cross-browser addEvent function
 *
 * written by Dean Edwards, 2005
 */
function addEvent(element, type, handler)
{
	if (element.addEventListener)
		element.addEventListener(type, handler, false);
	else
	{
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];
		if (!handlers)
		{
			handlers = element.events[type] = {};
			if (element['on' + type]) handlers[0] = element['on' + type];
			element['on' + type] = handleEvent;
		}
	
		handlers[handler.$$guid] = handler;
	}
}
addEvent.guid = 1;

function removeEvent(element, type, handler)
{
	if (element.removeEventListener)
		element.removeEventListener(type, handler, false);
	else if (element.events && element.events[type] && handler.$$guid)
		delete element.events[type][handler.$$guid];
}

function handleEvent(event)
{
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];

	for (var i in handlers)
	{
		if (!Object.prototype[i])
		{
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
}

function fixEvent(event)
{
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}
fixEvent.preventDefault = function()
{
	this.returnValue = false;
}
fixEvent.stopPropagation = function()
{
	this.cancelBubble = true;
}

// Deprecated
AttachEvent = addEvent;

/*
 * Toggle elements on and off
 */
var toggle = {
	show : function(obj) {
		obj.style.display = '';
	},
	hide : function(obj) {
		obj.style.display = 'none';
	}
};

/*
 * This allows me to trigger a onload event before images load.
 * Just create a function called 'pageInit' in your application and 
 * put onload stuff in there. This works in IE, FX, Safari and Opera 9b2+.
 */
function init() {
	// quit if this function has already been called
	if (arguments.callee.done) return;

	// flag this function so we don't do the same thing twice
	arguments.callee.done = true;

	// kill the timer
	if (_timer) {
		clearInterval(_timer);
		_timer = null;
	}

	if (typeof pageInit == "function")
	{
		pageInit();
	}
}

/* for Mozilla/Opera9 */
if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
	document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function() {
		if (this.readyState == "complete") {
			init(); // call the onload handler
		}
	};
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
	var _timer = setInterval(function() {
		if (/loaded|complete/.test(document.readyState)) {
			init(); // call the onload handler
		}
	}, 10);
}

/* for other browsers */
window.onload = init;
