
/**
 * Classs for toggle-list
 *
 * @param    {String}       listId - id-name from the ul-tag
 * @returns  {Object}       the API with public members
 */
S.ToggleList = function(listId)
{
    var _root = "";
    var _speed = "slow";
    var _unique = false;
    var _openCallback = [];


    // --------------------- private-area [methods] ------------------------- //


    /**
     * Constructor - hides all toggle-list-elements
     *
     * @param    {String}         listId - listId - id-name from the ul-tag
     */
    function __construct(listId)
    {
        if (!listId) {throw "Constructor-parameter must be a string";}

        _root = listId;
        $(_root + " a.jsToggle").removeClass("jsActive");
        $(_root + " .jsToggle:not(a.jsToggle)").hide(0);
        _open();
    }

    /**
     * Opens all toggle-elements witch has the class name "jsOpen"
     *
     * @returns  {void}
     */
    function _open()
    {
        var index = 0;
        $(_root + " a.jsToggle").each(function(){
            if ($(this).hasClass("jsOpen"))
            {
                $(this).addClass("jsActive");
                $(_root + " .jsToggle:not(a.jsToggle):eq("+index+")").show(0);
            }
            
            
            index++;
        });
    }


    /**
     * Close all list-points
     *
     * @returns  {void}
     */
    function _closeAll(currentIndex)
    {
        var index = 0;

        $(_root + " a.jsToggle").each(function() {
            if (index != currentIndex)
            {
                $(this).removeClass("jsActive");
                $(_root + " .jsToggle:not(a.jsToggle):eq("+index+")").hide(_speed);
            }
            else
            {
                $(this).toggleClass("jsActive");
                $(_root + " .jsToggle:not(a.jsToggle):eq("+index+")").toggle(_speed);
            }
            index++;
        });
    }


    /**
     * Opens toggle-list-elements by number
     *
     * @param    {Array}         listArray - numbers of the toggle-list-elements, witch sould be open
     * @returns  {void}
     */
    function _toggle(listArray)
    {
        for (var i=0; i<listArray.length; i++)
        {
            $(_root + " a.jsToggle:eq(" + (listArray[i]-1) + ")").toggleClass("jsActive");
            $(_root + " .jsToggle:not(a.jsToggle):eq(" + (listArray[i]-1) + ")").toggle(_speed);
        }
    }


    __construct(listId);

    // --------------------- public-area [API] ------------------------------ //
    return {


        /**
         * Opens a toggle-list-element
         *
         * @param    {HTMLObject|Array}         handlerObject - HTMLObjet from the event-handler object (this)
         *                                      or Array with numbers (indexes)
         * @returns  {void}
         */
        toggle: function(handlerObject)
        {
            // toggle multiple lists
            if (handlerObject.constructor == Array) {
                _toggle(handlerObject);
                return;
            }
            
            var index = $(_root + " a.jsToggle").index($(handlerObject));
            
            if(!$(_root + " a.jsToggle:eq(" + index + ")").hasClass("jsActive")){
                if(typeof _openCallback[index] === "function"){
                     _openCallback[index]();
                }
            }
            
            if (_unique)
            {
                _closeAll(index);
            }
            else
            {
                $(_root + " .jsToggle:not(a.jsToggle):eq("+index+")").toggle(_speed);
                $(_root + " a.jsToggle:eq(" + index + ")").toggleClass("jsActive");
            }

            return false;
        },


        /**
         * Speed for the toggle-animation
         *
         * @param    {Mixed}         speed - based on jQuery-speed-handling
         * @returns  {void}
         */
        setSpeed: function(speed)
        {
            _speed = speed;
        },


        /**
         * If "_unique" ist "true", all other list-points will closed, when one is open
         *
         * @param    {Boolean}         value - true or false
         * @returns  {void}
         */
        setUnique: function(value)
        {
            if (value.constructor != Boolean) {throw "parameter from setUnique must from typof boolean";}
            _unique = value;
        },
        
        /**
         * Set function which is called after a list item is opened
         * @param index (Integer) Index of toggle
         * @param fn (function) callback function
         */
        
        setOpenCallback: function(index, fn){
            _openCallback[index] = fn;
        }
    }
}
