YAHOO.namespace('tunetrack');

YAHOO.tunetrack.PageLink = function(pcm, element) {
    YAHOO.tunetrack.PageLink.superclass.constructor.call(this, pcm, element);
    if (!this.isLocal()) {
        this.set('target', '_blank');
    }
};
YAHOO.extend(YAHOO.tunetrack.PageLink, YAHOO.zoeyui.PageLink, {
    shouldHashify: function() {
        if (YAHOO.tunetrack.PageLink.superclass.shouldHashify.call(this)) {
            var path = this.getAbsolutePath();
            if (path.indexOf('/mnodes/') == 0) {
                return false;
            }
            if (path == '/console/') {
                return false;
            }
            if (path.indexOf('/media/') == 0) {
                return false;
            }
            return true;
        } else {
            return false;
        }
    }
});

YAHOO.tunetrack.recaptcha_pub = "6LdezwcAAAAAACvVi29GFgJcdj6JsuUrDIgY1IA-";


YAHOO.tunetrack.PageForm = function(pcm, element) {
    YAHOO.tunetrack.PageForm.superclass.constructor.call(this, element);
    this.pcm = pcm;
    this.editor_instances = [];
    this.processMarkup();
    this.subscribeEvents();
    this.getCaptchaElement();
};
YAHOO.lang.extend(YAHOO.tunetrack.PageForm, YAHOO.util.Element, {
    isLocal: function() {
        var action = this.get('action');
        return this.pcm.isLocalUrl(action);
    },
    prepareRichEditorData: function() {
        var i;
        for (i in this.editor_instances) {
            var editor = this.editor_instances[i];
            var data = editor.getData();
            var element = editor.element.$;
            element.value = data;
        } 
    },
    asyncSubmit: function() {
        if (this.get('enctype') == 'multipart/form-data') {
            return this.asyncUpload();
        }
        this.pcm.transitionOut();
        this.addClass('form-submitting');
        var action = this.get('action');
        var method = this.get('method');

        if (action.indexOf('?') == -1) {
            action = action + '?ajax=1';
        } else {
            action = action + '&ajax=1';
        }
        this.prepareRichEditorData();
        
        YAHOO.util.Connect.setForm(this.get('element')); 
        var req = YAHOO.util.Connect.asyncRequest(method, action, {
            success: this.onAsyncSubmitSuccess,
            failure: this.onAsyncSubmitFailure,
            scope: this,
            argument: action
        }); 
    },
    asyncUpload: function() {
        this.pcm.transitionOut();
        this.addClass('form-submitting');
        var action = this.get('action');
        var method = this.get('method');

        if (action.indexOf('?') == -1) {
            action = action + '?ajax=1';
        } else {
            action = action + '&ajax=1';
        }
        this.prepareRichEditorData();
        
        YAHOO.util.Connect.setForm(this.get('element'), true); 
        var req = YAHOO.util.Connect.asyncRequest(method, action, {
            upload: this.onAsyncSubmitSuccess,
            failure: this.onAsyncSubmitFailure,
            scope: this,
            argument: action
        }); 
    },
    destroy: function() {
        var i;
        for (i in this.editor_instances) {
            var instance = this.editor_instances[i];
            try {
                instance.destroy();
            } catch(e) {
            }
        }
        this.editor_instances = [];
    },
    processMarkup: function() {
        var self = this;
        try {
            var rich_editor_els = YAHOO.util.Dom.getElementsByClassName(
                    'rich-editor-container', 'div');
            if (rich_editor_els.length > 0) {
                this.pcm.yui_loader.require('ckeditor');
                this.pcm.yui_loader.insert({
                    onSuccess: function() {
                        YAHOO.util.Dom.batch(rich_editor_els, function(el) {
                            try {
                                var input_el = YAHOO.util.Dom.getElementBy(function() {
                                    return true;
                                }, 'textarea', el);
                                var editor = CKEDITOR.replace(input_el, {
                                    customConfig: '/media/js/ckeditor_config.js'
                                });
                                self.editor_instances[self.editor_instances.length] = editor;
                                
                            } catch(e) {
                            }
                        });
                    }
                });
            }
        } catch(e) {
            //console.log(e);
        }
    },
    getCaptchaElement: function() {
        this.captcha = null;
        var captchas = YAHOO.util.Dom.getElementsByClassName('captcha', 'div', this.get('element'));
        if (captchas.length > 0) {
            var captcha_el = captchas[0];
            this.captcha = Recaptcha.create(YAHOO.tunetrack.recaptcha_pub, captcha_el);
        }
    },
    onAsyncSubmitSuccess: function(req) {
        this.removeClass('form-submitting');
        this.destroy();
        this.pcm.onNavigateSuccess(req);
    },
    onAsyncSubmitFailure: function(req) {
        this.removeClass('form-submitting')
        this.destroy();
        this.pcm.onNavigateFailure(req);
    },
    subscribeEvents: function() {
        var self = this;
        if (this.isLocal()) {
            this.on('submit', function(e) {
                YAHOO.util.Event.preventDefault(e);
                self.asyncSubmit();
                return false;
            });
        }
    }
});


YAHOO.tunetrack.site_config = {
    page_container_id: 'page-content-area',
    page_link_type: YAHOO.tunetrack.PageLink,
    welcome_area_id: 'welcome-area'
};

YAHOO.tunetrack.SiteManager = function() {
    YAHOO.tunetrack.SiteManager.superclass.constructor.call(this, YAHOO.tunetrack.site_config);
    YAHOO.zoeyui.pcm = this;
    YAHOO.tunetrack.site = this;
    this.current_page_data = null;
    this.initLoader();
    this.widgets = [];
};

YAHOO.extend(YAHOO.tunetrack.SiteManager, YAHOO.zoeyui.PageContextManager, {
    initLoader: function() {
        this.yui_loader = new YAHOO.util.YUILoader({
            base: '/media/yui/build/'
        });
        this.yui_loader.addModule({
            name: 'mc',
            type: 'js',
            varName: 'YAHOO.music_credits.is_loaded',
            fullpath: '/media/mc/js/mc.js',
            requires: ['yahoo', 'dom', 'event', 'json', 'connection', 'datasource', 'datatable', 'paginator']
        });
        this.yui_loader.addModule({
            name: 'mediasitemembership',
            type: 'js',
            varName: 'YAHOO.mediasite.MediaSiteMembershipListDT',
            fullpath: '/media/mediasite/js/memberships.js',
            requires: ['yahoo', 'dom', 'event', 'json', 'connection', 'datasource', 'datatable', 'paginator']
        });
        this.yui_loader.addModule({
            name: 'messages',
            type: 'js',
            varName: 'YAHOO.site_messages.MessageListDT',
            fullpath: '/media/messages/js/message.js',
            requires: ['yahoo', 'dom', 'event', 'json', 'connection', 'datasource', 'datatable', 'paginator']
        });
        this.yui_loader.addModule({
            name: 'ckeditor',
            type: 'js',
            varName: 'CKEDITOR.replace',
            fullpath: '/media/ckeditor/ckeditor.js',
            requires: []
        });
    },
    processLinks: function() {
        var self = this;
        try {
            //var pls_widget_els = YAHOO.util.Dom.getElementsByClassName(
            //        'playlist-widget-markup', 'div');
            var pls_widget_els = YAHOO.util.Dom.getElementsByClassName(
                    'playlist-widget-markup', 'ul');
            YAHOO.util.Dom.batch(pls_widget_els, function(el) {
                try {
                    var widget = new YAHOO.zoeyplayer.PlaylistWidget(el, true);
                    widget.render();
                    if (YAHOO.zoeyplayer.playback.playlist.hasItems() == false) {
                        YAHOO.zoeyplayer.playback.setPlaylist(widget.playlist);

                        var playable_item = widget.playlist.item_list[0];

                        setCurrentPlayableItem({
                            manager: YAHOO.zoeyplayer.playback,
                            playable_item: playable_item
                        });
                    } 
                    self.widgets[self.widgets.length] = widget;
                } catch(e) {
                    console.log(e);
                }
            });
        } catch(e) {
            //console.log(e);
        }
        try {
            var single_widget_els = YAHOO.util.Dom.getElementsByClassName(
                    'playable-item-markup', 'div');
            YAHOO.util.Dom.batch(single_widget_els, function(el) {
                try {
                    var widget = new YAHOO.zoeyplayer.PlayableItemWidget(null, el);
                    self.widgets[self.widgets.length] = widget;
                } catch(e) {
                    //console.log(e);
                }
            });
        } catch(e) {
            //console.log(e);
        }
        try {
            var link_button_els = YAHOO.util.Dom.getElementsByClassName('link-button', undefined, 
                   this.conf.page_container_id); 
            YAHOO.util.Dom.batch(link_button_els, function(el) {
                try {
                    var button = new YAHOO.widget.Button(el);
                    self.widgets[self.widgets.length] = button;
                } catch(e) {
                }
            });
        } catch(e) {
        }



        YAHOO.tunetrack.SiteManager.superclass.processLinks.call(this);
    },
    onPageChange: function() {
        if (this.current_page_data == null) {
            return;
        }
        this.current_path = this.current_page_data.path;
        if (!!(window.history && history.pushState)) {
        if (!!(window.history && history.pushState)) {
            history.pushState(null, null, this.current_path);
        } else {
            window.location.hash = path;
        }

        } else {
            if (window.location.hash != this.current_page_data.path) {
                window.location.hash = this.current_page_data.path;
            }
        }
        var username = this.current_page_data.username;
        /*
        var welcome_area = document.getElementById(this.conf.welcome_area_id);
        var welcome_html = '';
        if (username==null) {
            welcome_html = "Welcome <i>Guest</i></a> | <a class='login' href='/accounts/login/'>Login</a><br/>";
            welcome_html +="<a href='/artistech/join/'>Join TuneTrack</a> | <a href='/artistech/pages/faq/'>FAQ</a>";
            welcome_area.innerHTML = welcome_html;
        } else {
            welcome_html = "<a href='/accounts/profile/' id='account-link'>"+username+"</a>";
            welcome_html += " | <a class='logout' href='/accounts/logout/'>Logout</a><br/>";
            welcome_html += "<a href='/accounts/profile/'>TuneTrack Account</a>";
            welcome_html += " | <a href='/artistech/pages/faq/'>FAQ</a>"
            welcome_area.innerHTML = welcome_html;
        }
        */
    },
    processMarkup: function() {
        var self = this;
        var container = document.getElementById(this.conf.page_container_id);
        var page_div = YAHOO.util.Dom.getFirstChild(container);
        var data = unescape(page_div.getAttribute('data-page-info-json'));
        var mediasite_slug = unescape(page_div.getAttribute('data-mediasite'));
        data = YAHOO.lang.JSON.parse(data);
        if (this.current_page_data == null || data.path != this.current_page_data.path || data.username != this.current_page_data.username) {
            if (this.current_page_data == null) {
                this.current_page_data = data;
            } else {
                this.current_page_data = data;
                this.onPageChange();
            }
        }

        if (mediasite_slug == '') {
            this.setStylesheet(null);
        } else {
            this.setStylesheet('/' + mediasite_slug + '/screen.css');
        }
        if (mediasite_slug == '' || mediasite_slug == 'artistech') {
            try {
                window.scroll(0,0);
            } catch (e) {
            }
        } else {
            try {
                if (process_initial_markup) {
                    window.scroll(0,0);
                    process_initial_markup = false;
                } else {
                    window.scroll(0,75);
                }
            } catch (e) {
            }
        }

        YAHOO.tunetrack.SiteManager.superclass.processMarkup.call(this);

        try {
            var artwork_widget_els = YAHOO.util.Dom.getElementsByClassName(
                    'artwork-pager', 'div');
            YAHOO.util.Dom.batch(artwork_widget_els, function(el) {
                try {
                    var widget = new YAHOO.zoeyplayer.ArtworkPagerWidget(el);
                    self.widgets[self.widgets.length] = widget;
                } catch(e) {
                    //console.log(e);
                }
            });
        } catch(e) {
            //console.log(e);
        }

        try {
            var tabview_widget_els = YAHOO.util.Dom.getElementsByClassName(
                    'tabview-markup', 'div');
            if (tabview_widget_els.length > 0) {
                this.yui_loader.require('tabview');
                this.yui_loader.insert({
                    onSuccess: function() {
                        YAHOO.util.Dom.batch(tabview_widget_els, function(el) {
                            try {
                                var widget = new YAHOO.widget.TabView(el);
                                self.widgets[self.widgets.length] = widget;
                            } catch(e) {
                                //console.log(e);
                            }
                        });
                    }
                });
            }
        } catch(e) {
            //console.log(e);
        }
        
        try {
            var form_els = YAHOO.util.Dom.getElementsBy(function() {return true;}, 'form',
                    this.conf.page_container_id);
            if (form_els.length > 0) {
                YAHOO.util.Dom.batch(form_els, function(el) {
                    var page_form = new YAHOO.tunetrack.PageForm(self, el);
                    self.widgets[self.widgets.length] = page_form;
                });
            }
        } catch(e) {
            //console.log(e);
        }
        try {
            var openlike_els = YAHOO.util.Dom.getElementsByClassName(
                    'openlike-widget', 'div');
            if (openlike_els.length > 0) {
                YAHOO.util.Dom.batch(openlike_els, function(el) {
                    var yui_el = new YAHOO.util.Element(el);
                    OPENLIKE.Widget({
                        s: ['twitter','reddit', 'google', 'digg', 'facebook'],
                        url: 'http://' + document.domain + self.current_page_data.path,
                        title: yui_el.get('title') + ' @ TuneTrack.net',
                        container: el
                    });
                });
            }
        } catch(e) {
        }
        try {
            var paypal_els = YAHOO.util.Selector.query(
                    '.paypal-payment-button form');
            for (paypal_index in paypal_els) {
                paypal_form = paypal_els[paypal_index]; 
                //paypal_form.submit();
            }
        } catch(e) {
            //console.log(e);
        }

    }
});


