/////////////////////////////////////////////////////////////////
//
//	src: 	wwww.washingtonci.com/javascript/site
//	author: jboz
//	date:	1-11
//	intent:	javascript utilities
//	
/////////////////////////////////////////////////////////////////


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//					runtime load of js files
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/**
*	intent:
*	runtime js file loading	
*
*	filename:string = file to load
*
*	usage:
*	include("someJS.js");
*	### will throw errors if dependancies exist.
**/

function include(filename)
{
	var body 		= document.getElementsByTagName('body').item(0);
	var script 		= document.createElement('script');
	script.src 		= filename;
	script.type 	= 'text/javascript';
	body.appendChild(script)
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//							event listeners
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/**
*	intent:
*	cross browser event listening	
*
*	evt:string 	= the event string to listen for 
*	elem:string	= id of element to attach listener to
*	func:string = reference to function, or anonymous function
*
*	usage:
*	addEvent('mouseover',	document.getElementById.someDiv,	hideDropDown );
*	addEvent('mouseover',	document.getElementById.someDiv,	function(){alert("hello world");});
*
**/

function addEvent(evt, elem, func)
{
	//window.alert("adding "+ func +" to " +elem+ " on " + evt);
	if (elem.addEventListener) //W3C DOM
	{
		elem.addEventListener(evt, func, false);
	}
	else if (elem.attachEvent)//IE DOM
	{
		elem.attachEvent("on"+evt, func);
	}
	else
	{
		window.alert("Could not attach event listener to:"+ elem);	
	}
	
	return;
}

/**
*	intent:
*	cross browser event listening	
*	** requires a referenced function for removal
*
*	params:
*	evt:string 	= the event string to remove 
*	elem:string	= id of element to remove listener from
*	func:string = reference to function
*
*	usage:
*	removeEvent('mouseover', document.getElementById.someDiv, hideDropDown );
*
**/

function removeEvent(evt, elem, func)
{
	//window.alert("removing "+ func +" from " +elem+ " on " + evt);
	if (elem.removeEventListener) //W3C DOM
	{
		elem.removeEventListener(evt, func, false);	
	}
	else if (elem.detachEvent)//IE DOM
	{
		elem.detachEvent("on"+evt, func);
	}
	else
	{
		window.alert("Could not remove event listener from:"+ elem);	
	}
	
	return;
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//						convert node list to array
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/**
*	intent:
*	populate an array with a nodeList, derived from getElementByTagName
*	** may pass an array in place of nodeList
*
*	params:
*	nodeList:string = nodeList
*	array:string	= empty array
*
*	usage:
*	someArray = new Array();
*	convertNodeList(someDiv.getElementsByTagName('span'), someArray);
*
**/

function convertNodeList(nodeList, array)
{
	for (i=0; i<nodeList.length; i++) 
	{
		array.push(nodeList[i]);
	}
	//window.alert(array);
		
	return;
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//						get element by class name
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/**
*	intent:
*	provide document.getElementsByClassName for non-compliant browsers
*
*	params:
*	className:string = class name to search for
*
*	usage:
*	someArray = new Array();
*	someArray = document.getElementsByClassName;
**/

if (!document.getElementsByClassName)
{
	document.getElementsByClassName = function(className) 
	{
		var retnode = [];
		var myclass = new RegExp('\\b'+className+'\\b');
		var elem = this.getElementsByTagName('*');
		for (var i = 0; i < elem.length; i++) 
		{
			var classes = elem[i].className;
			if (myclass.test(classes)) retnode.push(elem[i]);
		}
		return retnode;
	};
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//						index of
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/**
*	intent:
*	provide indexOf method for non-compliant browsers
*	search array for supplied element, return index if successful
*	returns -1 if unsucessful
*
*	params:
*	elt:string = element to search for
*
*	returns: 
*	int 
*
*	usage:
*	targetIndex = someArray.indexOf(someElement);
**/

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this && this[from] === elt)
        return from;
    }
    return -1;
  };
}
