
//An Add event listener function which is Cross Browser compatable
function CBAddEventListener( element_to_add_to, event_to_listen_for, function_to_add ) { 

	if ( !element_to_add_to._action_array ) 
		element_to_add_to._action_array = new Object();

	//if there's already an action attached to this event, we remove it
	if ( element_to_add_to._action_array[ event_to_listen_for ] ) {
		//element_to_add_to.removeEventListener( event_to_listen_for, element_to_add_to._action_array[ event_to_listen_for ], true );
		CBRemoveEventListener( element_to_add_to, event_to_listen_for );
	}

	if ( element_to_add_to.addEventListener ) { 
		element_to_add_to.addEventListener( event_to_listen_for, function_to_add, true );

		element_to_add_to._action_array[ event_to_listen_for ] = function_to_add;

	}
	else if ( element_to_add_to.attachEvent ) {
		//event_to_listen_for = 'on' + event_to_listen_for;

		element_to_add_to.attachEvent( 'on' + event_to_listen_for, function_to_add );

		element_to_add_to._action_array[ event_to_listen_for ] = function_to_add;
	}

}

/** 
* Remove an event listener in a way which is Cross Browser compatable
**/
function CBRemoveEventListener( element_to_remove_from, event_removing_from ) { 

	if ( element_to_remove_from._action_array && ( element_to_remove_from._action_array[ event_removing_from ] || element_to_remove_from._action_array[ 'on' + event_removing_from ] ) ) { 
		if ( element_to_remove_from.removeEventListener ) { 
			element_to_remove_from.removeEventListener( event_removing_from, element_to_remove_from._action_array[ event_removing_from ], true );
		}
		else if ( element_to_remove_from.detachEvent ) { 
			element_to_remove_from.detachEvent( 'on' + event_removing_from, element_to_remove_from._action_array[ event_removing_from ] );
		}
	}
	else { 
		return false;
	}

	return true;
}

/**
* Re-Add a previously removed function to a listener
**/
function CBReAddEventListener( element_to_add_to, event_to_listen_for ) { 

	if ( element_to_add_to._action_array && element_to_add_to._action_array[ event_to_listen_for ] ) {
		CBAddEventListener( element_to_add_to, event_to_listen_for, element_to_add_to._action_array[ event_to_listen_for ] );

		return true;
	}

	return false;

}

/**
* getTarget
*
* @param e The event to find the target of
*
* @returns The target of the event
**/
function getTarget( e ) { 

	var target;
	if (!e) var e = window.event;
	if (e.target) target = e.target;
	else if (e.srcElement) target = e.srcElement;
	if (target.nodeType == 3) // defeat Safari bug
		target = target.parentNode;

	return target;

}

/**
* removeAllChildren
*
* Removes all child nodes of the passed in DOM object
*
* @param d the DOM object to remove children from
**/
function removeAllChildren( d ) { 

	while( d.childNodes[0]  ) 
		d.removeChild( d.childNodes[0] );

}

/**
* getWindowWidth
*
* @returns the width of the window containing the page
**/
function getWindowWidth() { 

	if ( window.innerWidth ) return window.innerWidth;
	if ( document.body.offsetWidth ) return document.body.offsetWidth;

	return false;

}

/**
* getWindowHeight
*
* @returns the height of the window containing the page
**/
function getWindowHeight() { 

	if ( window.innerHeight ) return window.innerHeight;
	if ( document.body.offsetHeight ) return document.body.offsetHeight;

	return false;

}

