/**
 * 
 * 
 * 
 * 
 * 
 */

YAHOO.namespace('wsp.widget');
(function() {
    /**
     * YUI Library aliases
     */
    var Dom = YAHOO.util.Dom,
        Event = YAHOO.util.Event,
        Anim = YAHOO.util.Anim,
        Lang = YAHOO.lang;
  
  
    /**
     * 
     * @param id {Element|String} element object or element identifier
     * @param settiings {Object} contains next properties of Accordion setup:
     *                          state:          {collapsed|expanded} - initial state of Accordion.
     *                          animation:      {true|false} enable/disable animation effects in Accordion.
     *                          oneExpanded:    {true|false} - When true - only one expanded section is allowed.
     *                          animationSpeed: {any positive number from 0} - Time of animation in sec. If 0 then animaion is disabled.
     *                          animationType:  {backBoth|backIn|
     *                                          backOut|bounceBoth|bounceIn|bounceOut|
     *                                          easeBoth|easeBothStrong|easeIn|easeInStrong|easeNone|easeOut|easeOutStrong|
     *                                          elasticBoth|elasticIn|elasticOut} - Animation effect.
     */
    YAHOO.wsp.widget.Accordion = function(id, settings){
        var oSettings = settings;
        if (YAHOO.lang.isString(id)) {
            this._oElement = Dom.get(id);
        } else {
            this._oElement = id;
        }
        
        if (!oSettings) {
            oSettings = {}
        }
        
        if (Lang.isUndefined(oSettings.state)) {
            oSettings.state = "collapsed";    
        }
                
        if (Lang.isUndefined(oSettings.oneExpanded)) {
            oSettings.oneExpanded = true;
        }
        
        if (Lang.isUndefined(oSettings.animationSpeed)) {
            oSettings.animationSpeed = 0.5;
        }
        
        if (Lang.isUndefined(oSettings.animationType)) {
            oSettings.animationType = YAHOO.util.Easing.backOut;
        } else {
            if (YAHOO.util.Easing[oSettings.animationType]) {
                oSettings.animationType = YAHOO.util.Easing[oSettings.animationType];
            } else {
                oSettings.animationType = YAHOO.util.Easing.backOut;
            }
        }
        
        if (Lang.isBoolean(oSettings.animation) &&(!oSettings.animation)) {
             oSettings.animationSpeed = 0;   
        }
        
        this._oSettings = oSettings;
        var aSections = Dom.getChildren(this._oElement);
                
        // Collapse all sections excpet marked as expanded.
        var oExpandedNode = null;
        if (oSettings.state == "collapsed") {
            for (var i = 0; i < aSections.length; i++) {
                var oContent = Dom.getLastChild(aSections[i]);
                if (!Dom.hasClass(oContent, "expanded")) {
                    Dom.setStyle(oContent, "height", "0px"); 
                    Dom.addClass(oContent, "collapsed");
                    var oHeader = Dom.getPreviousSibling(oContent);
                    Dom.addClass(oHeader, "collapsed");
                } else {
                    oExpandedNode = oContent;
                }
            }
        }
        
        // Expand parent nodes if it is neccesary.
        if (oExpandedNode) {
            var oAncestor = Dom.getAncestorByClassName(oExpandedNode, "yui-accordion-section");
            while(oAncestor) {
                this._expand(oAncestor);
                oAncestor = Dom.getAncestorByClassName(oAncestor, "yui-accordion-section");
            }
        }

        // Attach Event handlers to Headers.
        for (var i = 0; i < aSections.length; i++) {
            var oSection = aSections[i];
            var oFirstChild = Dom.getFirstChild(oSection);
            if (Dom.hasClass(oFirstChild, "yui-accordion-header")) {
                Event.on(oFirstChild, "click", this._onHeaderClick, this, true);    
            }
        }       
    };
    


    YAHOO.wsp.widget.Accordion.prototype = {
        _oElement: null,
        _oSettings: null,
            
        /**
         * Expands content of Accordion's section
         * @param oContent {Object} section content that must be expanded.  
         */
        _expand : function(oContent) {
            if (!Dom.hasClass(oContent, "busy")) {
                Dom.addClass(oContent, "busy");
                var oAnim = new YAHOO.util.Anim(
                    oContent, {
                        height: {to: oContent.scrollHeight} 
                    }, this._oSettings.animationSpeed, this._oSettings.animationType
                );
                oAnim.onComplete.subscribe(function(s, o) {
                    var oHeader = Dom.getPreviousSibling(oContent);
                    Dom.removeClass(oHeader, "collapsed");
                    Dom.addClass(oHeader, "expanded");
                    
                    Dom.removeClass(oContent, "collapsed");
                    Dom.removeClass(oContent, "busy");
                    Dom.addClass(oContent, "expanded"); 
                    Dom.setStyle(oContent, "height", "auto");
                }); 

                oAnim.animate();   
            }
        },
        
        /**
         * Collapse Content of Accordion's section 
         * @param oContent {Object} section content that must be collapsed.
         */
        _collapse : function(oContent) {
            if (!Dom.hasClass(oContent, "busy")) {
                Dom.addClass(oContent, "busy");
                var oAnim = new Anim(oContent, {
                    height: {
                        to: 0
                    }
                }, this._oSettings.animationSpeed, this._oSettings.animationType);
                
                oAnim.onComplete.subscribe(function(s, o){
                    if (!Dom.hasClass(oContent, "collapsed")) 
                        var oHeader = Dom.getPreviousSibling(oContent);
                        Dom.removeClass(oHeader, "expanded");
                        Dom.addClass(oHeader, "collapsed");

                        Dom.addClass(oContent, "collapsed");
                        Dom.removeClass(oContent, "expanded");
                        Dom.removeClass(oContent, "busy");
                });
                oAnim.animate();
            }
        },

        /**
         * Handles click event on Header.
         * @param e {Object} Event object
         */
        _onHeaderClick : function(e) {
            Event.stopEvent(e);
            
            var oHeader = Event.getTarget(e);
            if (!Dom.hasClass(oHeader, "yui-accordion-header")) {
                oHeader = Dom.getAncestorByClassName(oHeader, "yui-accordion-header");
            }
            
            if (!oHeader) {
                return;
            }
            
            var oChangedContent = Dom.getNextSibling(oHeader); 
            var aSections = Dom.getChildren(this._oElement);
            
            if (oChangedContent) {
                // If accordion has busy sections then skip action.
                for (var i = 0; i < aSections.length; i++) {
                    if(Dom.hasClass(Dom.getLastChild(aSections[i]), "busy")) {
                        return;
                    }
                }

                // If neccesary then close other Sections.
                if (this._oSettings.oneExpanded) {
                    aSections = Dom.getChildren(this._oElement);
                    for (var i = 0; i < aSections.length; i++) {
                        var oSection = aSections[i];
                        if ((Dom.getLastChild(oSection) != oChangedContent) && (!Dom.hasClass(Dom.getLastChild(oSection), "collapsed"))) {
                            this._collapse(Dom.getLastChild(oSection));
                        }
                    }
                }                
                
                // Expand or collapse section depends on it's state.
                if (Dom.hasClass(oChangedContent, "collapsed")) {
                    this._expand(oChangedContent);
                } else {
                    this._collapse(oChangedContent);
                }
            }
        }      
    }    
})();


YAHOO.namespace('wsp.widget');
(function() {
    /**
     * YUI Library aliases
     */
    var Dom = YAHOO.util.Dom,
        Event = YAHOO.util.Event,
        Anim = YAHOO.util.Anim,
        Lang = YAHOO.lang;

    /**
     * The NavigationAccordion creates accordion that contains only links to another pages.
     * @param id {Object}
     * @param settings {Object}
     * @namespace YAHOO.wsp.widget
     * @class NavigationAccordion
     * @constructor
     * @extends YAHOO.wsp.widget.Accordion
     */        
    YAHOO.wsp.widget.NavigationAccordion = function(id, settings){
        var oRoot = null;
        if (YAHOO.lang.isString(id)) {
            oRoot = Dom.get(id);
        } else {
            oRoot = id;
        }
        
        var oNewRoot = document.createElement("ul");
        oNewRoot.className = "yui-navigation-accordion yui-accordion";
        
        var aItems = Dom.getChildren(oRoot); 
        
        
        for (var i = 0; i < aItems.length; i++) {
            if (Dom.hasClass(aItems[i], "page") ||
                (Dom.hasClass(aItems[i], "section") && !Dom.hasClass(aItems[i], "parent"))) {
                oNewRoot.appendChild(aItems[i])
            }  else if ((Dom.hasClass(aItems[i], "parent") && (Dom.hasClass(aItems[i], "section")))) {
                var oAccordionItem = this._createAccordionItem(aItems[i]);
                oNewRoot.appendChild(oAccordionItem);
            } 
        }
        
        // Replace old Accordion by new.
        oRoot.parentNode.replaceChild(oNewRoot, oRoot);
        
        // Create Accordions.
        var oAccordion = new YAHOO.wsp.widget.Accordion(oNewRoot, settings);
        var aAccordions = Dom.getElementsByClassName("yui-accordion", "ul", oNewRoot);
        for (var i = 0; i < aAccordions.length; i++) {
            var oAccordion = new YAHOO.wsp.widget.Accordion(aAccordions[i], settings);
        }
        
    }


    YAHOO.wsp.widget.NavigationAccordion.prototype = {

        /**
         * Converts Navigation LI item to Accordion item.
         * @param oNavigationItem {Object} Navigation item that must be converted to Accordion item.
         * @private
         */        
        _createAccordionItem : function(oNavigationItem) {
            // Create empty Accordion item.
            var oNewItem = document.createElement("li");
                
            var oAccordionHeader = document.createElement("div");
            oAccordionHeader.className = "yui-accordion-header";
            oAccordionHeader.appendChild(Dom.getChildren(oNavigationItem)[0]);
            oNewItem.appendChild(oAccordionHeader);

            var oAccordionSection = document.createElement("div");
            oAccordionSection.className = "yui-accordion-section";
            oNewItem.appendChild(oAccordionSection);

            if (Dom.hasClass(oNavigationItem, "selected")) {
                Dom.addClass(oAccordionHeader, "expanded");
                Dom.addClass(oAccordionSection, "expanded");
            }                
                
            var oAccordionContent = document.createElement("div");
            oAccordionContent.className = "yui-accordion-content";
            oAccordionSection.appendChild(oAccordionContent);
                
            var aItems = YAHOO.util.Dom.getChildren(oNavigationItem.getElementsByTagName("ul")[0]);
            var oAccordionEl = null; 
            for (var i = 0; i < aItems.length; i++) {
                if (Dom.hasClass(aItems[i], "parent")) {
                    if (!oAccordionEl) {
                        oAccordionEl = document.createElement("ul");
                        oAccordionEl.className = "yui-navigation-accordion yui-accordion";
                    }
                    oAccordionEl.appendChild(this._createAccordionItem(aItems[i]));                                       
                } else {
                    var oDiv = document.createElement("div");
                    oDiv.className = "navigation-item";
                    
                    var aChildren = YAHOO.util.Dom.getChildren(aItems[i]);
                    
                    if (aChildren.length > 0) {
                        oDiv.appendChild(aChildren[0]);
                    }
                    oAccordionContent.appendChild(oDiv);    
                }
                
                if (Dom.hasClass(aItems[i], "selected")) {
                    if (!Dom.hasClass(oAccordionSection, "expanded")) {
                        Dom.addClass(oAccordionSection, "expanded");
                        Dom.addClass(oAccordionHeader, "expanded");
                    }
                }
            }
            if (oAccordionEl) {
                oAccordionContent.appendChild(oAccordionEl);
            }
            
            return oNewItem;
        }
    }
})();    

