/**

 * 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();

        }



    };



}();










