/**
 * Override or add custom Performances UI elements
 */
(function(){
    var Performances = performances;

    Performances.userMessages = null;

    Performances.outputPerson = function(el, p, triggerSelection) {
        var listItem = createElement("a",{
            "class":"perfLink"
        });
        var count = createElement("em",{
            "class":"cnt"
        });
        var countMsg = "";
        if (p.tracks > 0) {
            countMsg += p.tracks + " Recording"+(p.tracks == 1?"":"s");
        }
        if (p.midis > 0) {
            if (p.tracks > 0) {
                countMsg += ", ";
            }
            countMsg += p.midis + " Midi"+(p.midis == 1?"":"s");
        }
        count.appendChild(document.createTextNode(countMsg));
        listItem.appendChild(count);
        listItem.appendChild(document.createTextNode(p.name+" "));
        if (YAHOO.lang.isString(p.info) && p.info.length > 0) {
            var info = createElement("em");
            info.appendChild(document.createTextNode(p.info));
            listItem.appendChild(info);
        }
        el.appendChild(listItem);
        if (triggerSelection===true) {
            this.selectPerformer(p.type + "_" + p.id);
        }
        YAHOO.util.Event.addListener(listItem, "click", function(){
            YAHOO.CMA.Scroller().scrollTo('topSL');
            this.selectPerformer(p.type + "_" + p.id);
        },this,true);
    };

    Performances.renderUserMessage = function(el) {
        var csSel = this.cs.getState().selection;
        var ssSel = this.ss.getState().selection;
        if (csSel && ssSel && YAHOO.lang.isObject(this.userMessages)) {
            if (YAHOO.lang.isString(this.userMessages[csSel]) && this.userMessages[csSel].length > 0) {
                el.innerHTML = this.userMessages[csSel];
                YAHOO.util.Dom.addClass("collectionSelectorHeader", "tall");
                YAHOO.util.Dom.removeClass(el, "yui-hidden");
            } else {
                YAHOO.util.Dom.addClass(el, "yui-hidden");
                YAHOO.util.Dom.removeClass("collectionSelectorHeader", "tall");
                el.innerHTML = "";
            }
        } else {
            YAHOO.util.Dom.addClass(el, "yui-hidden");
            YAHOO.util.Dom.removeClass("collectionSelectorHeader", "tall");
            el.innerHTML = "";
        }
    };

    Performances.renderStageMessage = function() {
        var csSel = this.cs.getState().selection;
        var ssSel = this.ss.getState().selection;
        if (csSel && ssSel) {
            var txtMsg = null;
            if (YAHOO.lang.isString(this.stageMessages[csSel]) && this.stageMessages[csSel].length > 0) {
                txtMsg = this.stageMessages[csSel];
            }
            renderJoinOrUpgradeStageMessage(txtMsg, this.user);
        }
    };

    Performances.renderPerformerList = function(selectFirst) {
        var csSel = this.cs.getState().selection;
        var ssSel = this.ss.getState().selection;
        if (csSel && ssSel) {
            if (YAHOO.lang.isBoolean(selectFirst) === false) {
                selectFirst = false;
            }
            try {
                this.itemListEl.innerHTML = "";

                var c = this.data.collections[csSel][ssSel];
                var pp = c.primary;
                var op = c.other;
                if (YAHOO.lang.isObject(pp) || YAHOO.lang.isObject(op)) {
                    var isFirst = true;
                    if (pp.length > 0) {
                        var primPerf = createElement("div",{
                            "class":"perf"
                        });
                        primPerf.innerHTML = "<strong>Primary Performers</strong>";
                        this.itemListEl.appendChild(primPerf);
                        for (var key in pp) {
                            var p = pp[key];
                            this.outputPerson(this.itemListEl, p, isFirst && selectFirst);
                            isFirst = false;
                        }
                    }

                    if (op.length > 0) {
                        if (pp.length > 0) {
                            var primPerf = createElement("div",{
                                "class":"perf other"
                            });
                            primPerf.innerHTML = "&nbsp;";
                            this.itemListEl.appendChild(primPerf);
                        }
                        for (var key in op) {
                            var p = op[key];
                            this.outputPerson(this.itemListEl, p, isFirst && selectFirst);
                            isFirst = false;
                        }
                    }

                    try { // Reset Scroller in output list
                        this.itemListEl.scrollTop = 0;
                    } catch(e) {}
                } else {
                    var primPerf = createElement("div",{
                        "class":"perf"
                    });
                    primPerf.innerHTML = "<strong>There are no items in this collection</strong>";
                    this.itemListEl.appendChild(primPerf);

                    this.bodyEl.innerHTML = "";
                    if (YAHOO.lang.isObject(this.pag)) {
                        for (var property in this.containerEls) {
                            YAHOO.util.Dom.removeClass(this.containerEls[property], 'yui-ls-col');
                            YAHOO.util.Dom.removeClass(this.containerEls[property], 'yui-pg-container');
                        }
                        this.pag.destroy();
                    }
                }
            } catch(x) {
                alert(x);
            }
        }
    };
})();

var collectionSelector = null, sortSelector = null, selectedCollection = null;
try {
    selectedCollection = YAHOO.util.History.getCurrentState("tvf");
} catch (e) {
    selectedCollection = readCookie("tab");
    selectedCollection = (selectedCollection === null || selectedCollection == "") ? "tracks" : selectedCollection;
}

function handleSelectorsReady() {
    if (collectionSelector && sortSelector) {
        performances.init($("perfList"), $("performances"), workJSON, collectionSelector, sortSelector);
        performances.renderPerformerList(true);
        performances.renderUserMessage($("collectionUserMessage"));
        performances.renderStageMessage();
    }
}

function handleCollectionChanged() {
    if (collectionSelector && sortSelector) {
        var currentState = YAHOO.util.History.getCurrentState("tvf");
        if (collectionSelector.getState().selection != currentState) {
            YAHOO.util.History.navigate("tvf", collectionSelector.getState().selection);
            createCookie("tab", collectionSelector.getState().selection);
        }
        performances.renderPerformerList(true);
        performances.renderUserMessage($("collectionUserMessage"));
        performances.renderStageMessage();
    }
}

function handleSortChanged() {
    if (collectionSelector && sortSelector) {
        performances.renderPerformerList();
        performances.renderUserMessage($("collectionUserMessage"));
    }
}

YAHOO.util.Event.onDOMReady(function() {
    collectionSelector = new YAHOO.widget.Selector("collectionSelector", {
        "message":"Select your collection:"
        , "selections":collectionItems
        , "selection":selectedCollection
    });

    collectionSelector.subscribe('rendered', handleSelectorsReady, this, true);
    collectionSelector.subscribe('selectionChanged', handleCollectionChanged, this, true);
    collectionSelector.render();

    sortSelector = new YAHOO.widget.Selector("sortSelector", {
        "message":"Sort By:"
        , "selections":[
            {
                "id":"name"
                , "label":"Name"
                , "title":"Sort performer list by name."
            }
            , {
                "id":"count"
                , "label":"Track Count"
                , "title":"Sort performer list by track count."
            }
        ]
        , "selection":"count"
    });
    sortSelector.subscribe('rendered', handleSelectorsReady);
    sortSelector.subscribe('selectionChanged', handleSortChanged);
    sortSelector.render();

    var defaultPageTitle = document.title;
    if (!(YAHOO.lang.isString(selectedCollection) && selectedCollection.length > 0)) {
        selectedCollection = "tracks";
    }
    var bookmarkedCollectionState = YAHOO.util.History.getBookmarkedState("tvf");
    var initialCollectionState = bookmarkedCollectionState || selectedCollection;
    YAHOO.util.History.register("tvf", initialCollectionState, function (state) {
        if (collectionSelector) {
            collectionSelector.setSelection(state);
        } else {
            selectedCollection = state;
        }
    });

    var defaultTabState = param("",true);
    var bookmarkedTabState = YAHOO.util.History.getBookmarkedState("tv");
    var initialTabState = bookmarkedTabState || defaultTabState;
    if (YAHOO.lang.isNull(initialTabState)) {
        initialTabState = "music";
    }
    YAHOO.util.History.register("tv", initialTabState, function (state) {
        YAHOO.CMA.tabView.setActiveTab(state);
    });

    function initTabView () {
        YAHOO.util.Dom.addClass("pageLoader", "yui-hidden");

        YAHOO.CMA.tabView = new YAHOO.widget.TabView('cTabs');
        YAHOO.CMA.tabView.getTabIdx = function(tabName) {
            var tabs = this.get('tabs');
            for (var idx = 0; idx < tabs.length; idx++) {
                var tab = tabs[idx];
                var tabId = tab.get('labelEl').id;
                if (tabId == tabName) {
                    return idx;
                }
            }
            return null;
        };
        YAHOO.CMA.tabView.setActiveTab = function(tabMode) {
            var tabIdx = this.getTabIdx("music"); // Default Tab
            if (!YAHOO.lang.isNull(tabMode)) {
                var tabs = this.get('tabs');
                for (var idx = 0; idx < tabs.length; idx++) {
                    var tab = tabs[idx];
                    var tabId = tab.get('labelEl').id;
                    if (tabId == tabMode) {
                        if (tab.get('disabled')) {
                            tabIdx = null;
                        } else {
                            tabIdx = idx;
                        }
                        break;
                    }
                }
            }
            if (tabIdx != null) {
                this.set('activeIndex',tabIdx);
            }
        };
        YAHOO.CMA.tabView.addListener('activeTabChange', function () {
            var currentState, adjustedPageTitle = "";
            var tabId = YAHOO.CMA.tabView.get('activeTab').get('labelEl').id;
            if (tabId=="about") {
                adjustedPageTitle += "[About] ";
                renderJoinOrUpgradeStageMessage(performances.altTxt, performances.user);
            } else if (tabId=="music") {
                adjustedPageTitle += "[Recordings] ";
                renderJoinOrUpgradeStageMessage(performances.stageMessages[performances.cs.getState().selection], performances.user);
            } else if (tabId=="albums") {
                adjustedPageTitle += "[Albums] ";
                renderJoinOrUpgradeStageMessage(performances.altTxt, performances.user);
            } else if (tabId=="comments") {
                adjustedPageTitle += "[Comments] ";
                renderJoinOrUpgradeStageMessage(performances.altTxt, performances.user);
                loadComments();
            }
            document.title = adjustedPageTitle + defaultPageTitle;

            try {
                currentState = YAHOO.util.History.getCurrentState("tv");
                if (tabId != currentState) {
                    YAHOO.util.History.navigate("tv", tabId);
                }
            } catch (e) {
                YAHOO.CMA.tabView.setActiveTab(tabId);
            }
        });
    }

    YAHOO.util.History.onReady(function () {
        initTabView();
        var currentTabState = YAHOO.util.History.getCurrentState("tv");
        YAHOO.CMA.tabView.setActiveTab(currentTabState);

        var currentCollectionState = YAHOO.util.History.getCurrentState("tvf");
        if (currentCollectionState) {
            if (collectionSelector) {
                collectionSelector.setSelection(currentCollectionState);
            } else {
                selectedCollection = currentCollectionState;
            }
        }
    });

    try {
        YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
    } catch (e) {
        initTabView();
    }


    aTO.data = workJSON.albums;
    var aT = YAHOO.CMA.albumTab;
    if (YAHOO.lang.isObject(aTO.data)) {
        aT.init(
            {"msgElm":"albTabMsg", "sortElm":"albTabSort", "pagElm":["albTabPagTop","albTabPagBot"], "contentElm":"albTabBody"}
            , aTO
            , "<strong>"+aT.AlbumLabelTag+":</strong> "+aT.CountTag
        );
    }
}, this);
