/**
 * WickedJS - The Being Wicked JavaScript Library
 * 
 * A simple collection of utility methods for day-to-day
 * web dev.
 * 
 * @author Gordon Clemmons
 * @version 0.7.2
 */


var Wicked = {
	version: '0.7.2',
	initFuncs: []
};

/**
 * Allow string-based IDs or object-based elements
 * 
 * @param {Object} element
 */
Wicked.getElement = function( element )
{
	if ( typeof element == 'string' )
		element	= document.getElementById( element );
	return element;
};

/**
 * Get the true top/left position of any element
 * on the page.
 * 
 * @param {Object} element	A DOM element object or element ID
 */
Wicked.getElementPosition = function( element )
{
	element = Wicked.getElement( element );

	var eTop	= 0;
	var eLeft	= 0;
	do {
		eTop	+= element.offsetTop || 0;
		eLeft	+= element.offsetLeft || 0;
		element	= element.offsetParent;
	} while ( element );
	var pos	= {
		top: eTop,
		left: eLeft
	};
	return pos;
};

/**
 * Set an element's absolute position
 * 
 * @param {Object} element	A DOM element object or element ID
 * @param {int} top		pass null to not affect the target's top value
 * @param {int} left	pass null to not affect the target's left value
 */
Wicked.setElementPosition = function( element, top, left )
{
	element = Wicked.getElement( element );
	if ( left != null )
		element.style.left	= left + 'px';
	if ( top != null )
		element.style.top	= top + 'px';
};

/**
 * Get the height and width of an element
 * 
 * @param {Object} element	A DOM element object or element ID
 */
Wicked.getElementDimensions = function( element )
{
	element		= Wicked.getElement( element );
	var style	= element.style;

	var dim	= {
		height: element.offsetHeight,
		width: element.offsetWidth
	};
	
	// correctly handle hidden elements
	if ( style.display == null || style.display == 'none' )
	{
		var oVis	= style.visibility;
		var oDis	= style.display;
		var oPos	= style.position;
		style.visibility	= 'hidden';
		style.position		= 'absolute';
		style.display		= 'block';
		dim.height	= element.clientHeight;
		dim.width	= element.clientWidth;
		style.display		= oDis;
		style.position		= oPos;
		style.visibility	= oVis;
	}
	
	return dim;
};

/**
 * Return the HTML needed to display a YouTube video
 * 
 * @param {Object} videoId	The YouTube video ID
 * @param {Object} width
 * @param {Object} height
 * @param {Object} autoplay	1 = autoplay, 0 = no autoplay
 */
Wicked.getYouTubeVideo = function( videoId, width, height, autoplay )
{
	var html =	'<div><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ' +
				'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" ' +
				'width="' + width + '" height="' + height + '" id="YoutubeVideo">' + "\n" +
				'<param name="allowScriptAccess" value="sameDomain" /> ' +
				'<param name="wmode" value="transparent" />' +
				'<param name="allowFullScreen" value="false" /> ' +
				'<param name="movie" value="http://www.youtube.com/v/' + videoId + '&hl=en&fs=1&autoplay=' + autoplay + '" /> ' +
				'<param name="quality" value="high" /> ' +
				'<param name="bgcolor" value="#313339" /> ' + "\n" +
				'<embed src="http://www.youtube.com/v/' + videoId + '&hl=en&fs=1&autoplay=' + autoplay + '" quality="high" wmode="transparent" bgcolor="#ffffff" width="' + width + '" height="' + height + '" name="YoutubeVideo" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" /> ' +
				'</object></div>';
	return html;
};

/**
 * Determines whether or not the passed argument
 * has the passed class name
 * 
 * @param {Object} element	A DOM object element or element ID
 * @param {Object} name
 */
Wicked.hasClassName = function( element, name )
{
	element = Wicked.getElement( element );
	if ( element.className )
	{
		var classList = element.className.split(' ');
		for ( var c = 0; c < classList.length; c++ )
		{
			if ( classList[c] == name )
				return true;
		}
	}
	return false;
};


/**
 * Modify an element's opacity
 *
 * @param {Object} element	A DOM object element or element ID
 * @param {Object} opacity	0 to 10 where 0 is transparent and 10 is opaque
 */
Wicked.setElementOpacity = function( element, opacity )
{
	element = Wicked.getElement( element );
	if ( element.style.filter != null )
		element.style.filter = 'alpha(opacity=' + ( opacity * 10 ) + ')';
	element.style.opacity = opacity/10;
};

/**
 * Register a function to be called after the page loads
 * 
 * @param {Object} func
 */
Wicked.registerInit = function( func )
{
	Wicked.initFuncs.push( func );
};

/**
 * Shortcut for DOM object fetching
 * 
 * @param {Object} element
 */
function W$( element )
{
	return Wicked.getElement( element );
}

// simple either-or getter
function eitherOr( a1, a2 ) { return ( a1 ) ? a1 : a2; }

var _originalOnLoad	= window.onload;
window.onload = function() {
	for ( var f = 0; f < Wicked.initFuncs.length; f++ )
		Wicked.initFuncs[f]( arguments );
	if ( _originalOnLoad )
		_originalOnLoad(arguments);
};

