/**
* An adapter for the Shadowbox media viewer and the Yahoo! User Interface (YUI)
* JavaScript library.
*
* This file is part of Shadowbox.
*
* Shadowbox is free software: you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* Shadowbox is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Shadowbox.  If not, see <http://www.gnu.org/licenses/>.
*
* @author      Michael J. I. Jackson <mjijackson@gmail.com>
* @copyright   2007 Michael J. I. Jackson
* @license     http://www.gnu.org/licenses/lgpl-3.0.txt GNU LGPL 3.0
* @version     SVN: $Id: shadowbox-yui.js 48 2008-01-26 09:58:25Z mjijackson $
*/

if (typeof YAHOO == 'undefined') {
	throw 'Unable to load Shadowbox, core YUI utilities (yahoo, dom, event, anim) not found.';
}

// create the Shadowbox object first
var Shadowbox = {};

Shadowbox.lib = function() {

	var E = YAHOO.util.Event;
	var D = YAHOO.util.Dom;

	return {

		/**
		* Gets the value of the style on the given element.
		*
		* @param   {HTMLElement}   el      The DOM element
		* @param   {String}        style   The name of the style (e.g. margin-top)
		* @return  {mixed}                 The value of the given style
		* @public
		*/
		getStyle: function(el, style) {
			return D.getStyle(el, style);
		},

		/**
		* Sets the style on the given element to the given value. May be an
		* object to specify multiple values.
		*
		* @param   {HTMLElement}   el      The DOM element
		* @param   {String/Object} style   The name of the style to set if a
		*                                  string, or an object of name =>
		*                                  value pairs
		* @param   {String}        value   The value to set the given style to
		* @return  void
		* @public
		*/
		setStyle: function(el, style, value) {
			if(typeof style != 'object') {
				var temp = {};
				temp[style] = value;
				style = temp;
			}
			for(var s in style)
				D.setStyle(el, s, style[s]);
		},

		/**
		* Gets a reference to the given element.
		*
		* @param   {String/HTMLElement}    el      The element to fetch
		* @return  {HTMLElement}                   A reference to the element
		* @public
		*/
		get: function(el) {
			return D.get(el);
		},

		/**
		* Removes an element from the DOM.
		*
		* @param   {HTMLElement}           el      The element to remove
		* @return  void
		* @public
		*/
		remove: function(el) {
			el.parentNode.removeChild(el);
		},

		/**
		* Gets the target of the given event. The event object passed will be
		* the same object that is passed to listeners registered with
		* addEvent().
		*
		* @param   {mixed}                 e       The event object
		* @return  {HTMLElement}                   The event's target element
		* @public
		*/
		getTarget: function(e) {
			return E.getTarget(e.browserEvent || e);
		},

		/**
		* Prevents the event's default behavior. The event object passed will
		* be the same object that is passed to listeners registered with
		* addEvent().
		*
		* @param   {mixed}                 e       The event object
		* @return  void
		* @public
		*/
		preventDefault: function(e) {
			E.preventDefault(e.browserEvent || e);
		},

		/**
		* Adds an event listener to the given element. It is expected that this
		* function will be passed the event as its first argument.
		*
		* @param   {HTMLElement}   el          The DOM element to listen to
		* @param   {String}        name        The name of the event to register
		*                                      (i.e. 'click', 'scroll', etc.)
		* @param   {Function}      handler     The event handler function
		* @return  void
		* @public
		*/
		addEvent: function(el, name, handler) {
			E.addListener(el, name, handler);
		},

		/**
		* Removes an event listener from the given element.
		*
		* @param   {HTMLElement}   el          The DOM element to stop listening to
		* @param   {String}        name        The name of the event to stop
		*                                      listening for (i.e. 'click')
		* @param   {Function}      handler     The event handler function
		* @return  void
		* @public
		*/
		removeEvent: function(el, name, handler) {
			E.removeListener(el, name, handler);
		},

		/**
		* Animates numerous styles of the given element. The second parameter
		* of this function will be an object of the type that is expected by
		* YAHOO.util.Anim. See http://developer.yahoo.com/yui/docs/YAHOO.util.Anim.html
		* for more information.
		*
		* @param   {HTMLElement}   el          The DOM element to animate
		* @param   {Object}        obj         The animation attributes/parameters
		* @param   {Number}        duration    The duration of the animation
		*                                      (in seconds)
		* @param   {Function}      callback    A callback function to call when
		*                                      the animation completes
		* @return  void
		* @public
		*/
		animate: function(el, obj, duration, callback) {
			var anim = new YAHOO.util.Anim(el, obj, duration, YAHOO.util.Easing.easeOut);
			if(typeof callback == 'function') {
				var f = function() {
					anim.onComplete.unsubscribe(f);
					callback.call(anim, anim);
				};
				anim.onComplete.subscribe(f, anim, true);
			}
			anim.animate();
		}

	};

} ();
