
var login_ajax_in_progress = false;
var currentSpinner = null;

if( typeof SPUTNIK === 'undefined' ){ var SPUTNIK = ( {} ); };

SPUTNIK.overlay = (function(){
    /* private variables */
    var container,overlay,overlayboxes,currentPane,closeBtn,lock,
        current = new Array(),

    _closeCurrent = function(){
        if(overlayboxes === undefined){
            overlayboxes = document.getElementById('overlayboxes');
        }

        /* empty the current array, back into the overlays placeholder */
        for(;current.length;){
            var el = current.pop();
            if(el.id == "login-system-message"){
                el.parentNode.removeChild(el);
            } else {
                overlayboxes.appendChild( el );
            }
        }

        YAHOO.util.Event.removeListener(closeBtn);
    },

    /* open */
    open = function(e,node){

        if(current.length > 0){ _closeCurrent(); }

        if(!YAHOO.util.Dom.hasClass( node , 'widget-overlay' )){
            createTemplate();
            var tmp = node.getElementsByTagName('div')[0],
                con = container.cloneNode(true);
                // we might have to refactor this at some point
                con.childNodes[0].childNodes[0].childNodes[0]
                   .childNodes[0].appendChild(tmp);

                con.className = "content";
                node.appendChild(con);
                node.className = 'widget-overlay';
        }

        shade(true);

        /* add the overlay to the overlay list */
        current.push( document.body.appendChild(node) );

        closeBtn = YAHOO.util.Dom.getElementsByClassName('btn-close','a',node);
        YAHOO.util.Event.addListener(closeBtn,'click',close);

        YAHOO.util.Dom.setStyle(
            closeBtn,
            'display',
            SPUTNIK.overlay.lock ? 'none' : 'block'
        );

        /* */
        currentPane = new YAHOO.widget.Overlay(node);
        currentPane.center();
    },

    /* close */
    close = function(){
        if(SPUTNIK.overlay.lock){ return; }
        _closeCurrent();
        /* disable the shade */
        shade(false);
    },

    /* shade */
    shade = function(bol){
        if(overlay === undefined){
            overlay = document.createElement('div');
            overlay.className = 'widget-overlay-shade';
            YAHOO.util.Dom.setStyle(overlay,'opacity',0.5);
            document.body.appendChild(overlay);
        }

        YAHOO.util.Dom.setStyle(overlay,'display',bol?'block':'none');

        if(bol) { YAHOO.util.Event.addListener(overlay,'click',close); }
        else { YAHOO.util.Event.removeListener(overlay,'click',close); }
    },

    /* createTemplate */
    createTemplate = function(){
        if( container && container.hasChildNodes() ){
            /* exit if this is already created */
            return;
        }

        var h1 = document.createElement('div'),
            h2 = document.createElement('div'),
            h3 = document.createElement('div'),
            h4 = document.createElement('div');

            /* adding class-names for styling */
            h1.className = 'h1';   h2.className = 'h2';
            h3.className = 'h3';   h4.className = 'h4';

            /* nesting the divs for the border */
            h3.appendChild(h4); h2.appendChild(h3); h1.appendChild(h2);

            closeBtn = document.createElement('a');
            closeBtn.href = '#';
            closeBtn.className = 'btn-close';

            h4.appendChild(closeBtn);

            container = document.createElement('div');
            container.appendChild(h1);

    };

    /* Public methods */
    return {
        open : open,
        close : close,
        lock : false,
        isOpen : function(){
            return YAHOO.util.Dom.getStyle( overlay, 'display' ) === 'block';
        }
    };

}());

SPUTNIK.login = (function(){

    var login_ajax_in_progress,
        overlayboxes,

        /* bug in ie make it fire both the inline, and the overlay, loginbox
         * when opening it from the inlinelostloginbox, this flag is set to
         * true when going from that box back to the inline loginbox */
        doNotFireIeFix = false,

    _openInlineMessage = function(m){
        var type = m.type || 'notice';

        if( m.description ) {

            var frameHd = document.createElement('div');
            var frameBd = document.createElement('div');
            var frameFt = document.createElement('div');

            frameHd.className = 'head';
            frameBd.className = 'body';
            frameFt.className = 'footer';

            var message = document.createElement('p');
                message.innerHTML = m.description;

            frameBd.appendChild(message);

            YAHOO.util.Dom.addClass(message, type);

            if(m.node){
                YAHOO.util.Dom.addClass(m.node, 'notification-area-open');

                m.node.innerHTML = '';

                m.node.appendChild(frameHd);
                m.node.appendChild(frameBd);
                m.node.appendChild(frameFt);
            }
        }
    },

    _closeInlineMessage = function(m){
        YAHOO.util.Dom.removeClass( m, 'notification-area-open' );
        m.innerHTML = '';
    },

    _showSpinner = function(form) {
        var spinner = form.getElementsByTagName('img')[0];
        if (spinner) {
            currentSpinner = spinner;
            spinner.style.visibility = "visible";
        }
    },

    _hideSpinner = function() {
        var spinner = currentSpinner;
        if (spinner) {
            spinner.style.visibility = "hidden";
        }
    },

    _openMessage = function(m){
        return false;
        /*
            input obj
            { title, description, fn }
        */

        overlayboxes = overlayboxes || document.getElementById('overlayboxes');

        /* return this html structure
        <div id="login-system-message">
            <div class="widget-login">
                <div class="window-message">
                    <h3>{title}</h3>
                    <p>{description}</p>
                    <p class="dismiss">
                        <a id="sputnik-overlay-close" href="#">
                            Luk denne besked
                        </a>
                    </p>
                </div>
            </div>
        </div>
        */

        var wrapper = document.createElement('div'),
            widget = document.createElement('div'),
            message = document.createElement('div'),
            wrapperId = "login-system-message";

        wrapper.id = wrapperId;
        message.className = "window-message";
        widget.className = "widget-login";


        if(m.title){
            var headline = document.createElement('h3');
            headline.appendChild(document.createTextNode(m.title));

            if(m.titleClass){ headline.className = m.titleClass; }

            message.appendChild(headline);
        }

        if(m.description){
            var description = document.createElement('p');
            description.appendChild(document.createTextNode(m.description));
            message.appendChild(description);
        }

        if(m.options){
            var dismiss = document.createElement('p');
            dismiss.className="dismiss";

            for( var len = m.options.length, i = 0; i < len ; i++ ){
                var dismissLink = document.createElement('a');
                dismissLink.href = m.options[i].href;
                dismissLink.appendChild(document.createTextNode(m.options[i].label));
                YAHOO.util.Event.addListener(dismissLink,'click',m.options[i].fn);
                dismiss.appendChild(dismissLink);
            }

            message.appendChild(dismiss);
        }

        widget.appendChild(message);
        wrapper.appendChild(widget);

        overlayboxes.appendChild(wrapper);

        SPUTNIK.overlay.open({},document.getElementById(wrapperId));
    },

    openConfirmationDialog = function(e,dialogName) {
        if (dialogName == null)
            dialogName = 'sputnik-oneclickconfirmation';
        if(doNotFireIeFix){ doNotFireIeFix = false; return; }
        var box = document.getElementById(dialogName);
        SPUTNIK.overlay.open( e, box );
        return box;
    },

    openLoginBox = function(e){
        /* omniture page functionality: lostlogin */
        if (s_pageFunctionality)
            s_pageFunctionality('loginlightbox', 'Log ind');
        
        // if(!SPUTNIK.overlay.isOpen()) return;
        if(doNotFireIeFix){ doNotFireIeFix = false; return; }

        var loginBox = document.getElementById('sputnik-login-box');

        /* open a login box overlay */
        SPUTNIK.overlay.open( e, loginBox );

        var form = loginBox.getElementsByTagName('form')[0];

        /* close notification, if open */
        _closeInlineMessage(_findNotificationArea(form));

        /* focus the first element, be warned, do not put hidden input elements
         * as the first thing in the forms */
        form.getElementsByTagName('input')[0].focus();

        // setupEvents(form);
        YAHOO.util.Event.purgeElement( form, false, 'submit');
        YAHOO.util.Event.addListener( form, 'submit', _loginHandler );

        return loginBox;
    },

    setupEvents = function(form) {
        /* remove events on the form before applying a submit handler,
         * it would apply a handler every time the box is called */
        YAHOO.util.Event.purgeElement( form, false, 'submit');
        YAHOO.util.Event.addListener( form, 'submit', _loginHandler );
    },

    _findNotificationArea = function(formNode){
        var divs = formNode.getElementsByTagName('div');
        var el = undefined;

        for(var len = divs.length, i = 0; i<len; i++){
            if(YAHOO.util.Dom.hasClass( divs[i], 'notification-area' )){
                return divs[i];
            }
        }
    },

    _loginHandler = function(e){
        var form = YAHOO.util.Event.getTarget(e);

        YAHOO.util.Event.preventDefault( YAHOO.util.Event.getEvent(e) );

        if (login_ajax_in_progress) return false;

        /* fetch data from form */
        var inputs = form.getElementsByTagName('input');
        var userinput = {};
        var useOverlay = SPUTNIK.overlay.isOpen();

        for( var len = inputs.length, i = 0; i<len; i++ ){
            userinput[inputs[i].name] = inputs[i].value;
        }

        if (!userinput.username.length || !userinput.password.length) {
            // alert('Du skal indtaste dit brugernavn og din adgangskode.');
            /* * /
            _openMessage({
                'title': 'Hov!',
                'description':'Du skal udfylde brugernavn og kodeord, for at logge ind.',
                'options' : [{
                    'label' : 'Prøv igen',
                    'fn' : SPUTNIK.login.openLoginBox,
                    'href' : '#'
                }]
            });
            /*/

            _openInlineMessage({
                'type' : 'warning',
                'description' : 'Du skal udfylde brugernavn og adgangskode, for at logge ind.',
                'node' : _findNotificationArea(form)
            });
            /* */
            return false;
        }

        /* build post data and url */
        var url = 'http://ajax.tv2.dk/login/user/login';
        var post = 'username='+escape(userinput.username)+
                   '&password='+escape(userinput.password)+
                   '&autologon='+escape(userinput.autologon);

        login_ajax_in_progress = true;

        /* open a login message */
        SPUTNIK.overlay.lock = true;
        _openMessage({ 'title' : 'Logger dig ind', 'titleClass' : 'loading' });

        /* send ajax request */
        _showSpinner(form);
        TV2.ajax.asyncRequest(
            'POST',
            url,
            {
                success : function(o) {
                    var result = eval('['+o.responseText+']');
                    result = result[0];

                    SPUTNIK.overlay.lock = false;
                    login_ajax_in_progress = false;
                    _hideSpinner(form);

                    if (result.success) {
                        /* omniture login event - via custom link called 'login' */
                        if (s_loginFunction)
                            s_loginFunction('Log ind');
                        
                        /* login success, reload page */
                        window.location.href = window.location.href.replace('#login', '');
                        window.location.reload(true);
                    }
                    else {
                        /* */
                        if( o.argument.useOverlay ){
                            var loginBox = SPUTNIK.login.openLoginBox();
                            // var form = loginBox.getElementsByTagName('form')[0];
                            var form = o.argument.formNode;

                        }
                        else {
                            // open inline login message and find form
                            SPUTNIK.overlay.close();
                            // var loginBox = document.getElementById('sputnik-login-box');
                            var form = o.argument.formNode;
                            // var form = openInlineLoginBox(
                            //     loginBox.getElementsByTagName('form')[0].cloneNode(true)
                            // );

                        }

                        _openInlineMessage({
                            'type' : 'warning',
                            'description' : result.message,
                            'node' : _findNotificationArea(form)
                        });
                        /*/
                        _openMessage({
                            'title' : 'Hov!',
                            'description' : result.message,

                            'options' : [{
                                'label' : 'Glemt login',
                                'fn' : SPUTNIK.login.openLostLoginBox,
                                'href' : '#'
                            },
                            {
                                'label' : 'Prøv igen',
                                'fn' : SPUTNIK.login.openLoginBox,
                                'href' : '#'
                            }]
                        });
                        /* */
                    }
                },
                failure : function(o) {
                    SPUTNIK.overlay.lock = false;
                    login_ajax_in_progress = false;
                    _hideSpinner(form);
                    _openMessage({
                        'title' : 'Hov!',
                        'description' : 'Vi beklager, der skete en fejl under login.',

                        'options' : [{
                            'label' : 'Prøv igen',
                            'fn' : SPUTNIK.login.openLoginBox,
                            'href' : '#'
                        },
                        {
                            'label' : 'Glemt login',
                            'fn' : SPUTNIK.login.openLostLoginBox,
                            'href' : '#'
                        }]
                    });
                },
                argument : {
                    'useOverlay' : useOverlay,
                    'formNode' : form
                }
            },
            post
        );

    },

    openLostLoginBox = function(e){
        /* omniture page functionality: lostlogin */
        if (s_pageFunctionality)
            s_pageFunctionality('lostlogin', 'Glemt adgangskode?');

        var loginBox = document.getElementById('sputnik-login-forgotten');
        var form = loginBox.getElementsByTagName('form')[0];

        // open a login box overlay
        if(SPUTNIK.overlay.isOpen()){
            SPUTNIK.overlay.open( e, loginBox );
        }
        else{
            /* open inline */
            form = openInlineForgotBox(form.cloneNode(true));
        }


        /* close notification, if open */
        _closeInlineMessage(_findNotificationArea(form));

        // focus the first element, be warned, do not put hidden input elements
        // as the first thing in the forms
        form.getElementsByTagName('input')[0].focus();

        YAHOO.util.Event.purgeElement( form, false, 'submit');
        YAHOO.util.Event.addListener( form, 'submit', _lostLoginHandler );

        return loginBox;
    },

    openInlineForgotBox = function(formNode) {    
        var inlineTarget = document.getElementById('player-login-ctx') || document.getElementById('loginbox-page-ctx');

        var wrapper = document.createElement('div');
        wrapper.className = 'widget-login';
        wrapper.style.background = 'none';

        wrapper.appendChild(formNode);

        inlineTarget.innerHTML = '';

        inlineTarget.appendChild(wrapper);

        YAHOO.util.Event.on(
            'dismiss-lost-login',
            'click',
            function(){
                if(!SPUTNIK.overlay.isOpen()){
                    var loginBox = document.getElementById('sputnik-login-box');
                    var form = openInlineLoginBox(
                        loginBox.getElementsByTagName('form')[0].cloneNode(true)
                    );
                }
            }
        );

        YAHOO.util.Event.purgeElement( formNode, false, 'submit');
        YAHOO.util.Event.addListener( formNode, 'submit', _lostLoginHandler );

        return formNode;
    },

    openInlineLoginBox = function(form) {

        if(YAHOO.env.ua.ie !== 0 && !SPUTNIK.overlay.isOpen()){
            doNotFireIeFix = true;
        }
        else {
            doNotFireIeFix = false;
        }

        var inlineTarget = document.getElementById('player-login-ctx') || document.getElementById('loginbox-page-ctx');

        var wrapper = document.createElement('div');
        wrapper.className = 'widget-login';
        wrapper.style.background = 'none';

        wrapper.appendChild(form);

        inlineTarget.innerHTML = '';

        inlineTarget.appendChild(wrapper);

        YAHOO.util.Event.purgeElement( form, false, 'submit');
        YAHOO.util.Event.addListener( form, 'submit', _loginHandler );

        return form;
    },

    buildInPageLoginBox = function(contextNodeId) {
        var loginbox = document.getElementById('sputnik-login-box');

        var loginboxForm = loginbox.getElementsByTagName('form')[0];

        if (loginboxForm) {
            var wrapper = document.createElement('div');
            wrapper.className = 'widget-login';
            wrapper.style.background = 'none';

            var loginboxClone = loginboxForm.cloneNode(true);

            var contextNode = document.getElementById(contextNodeId);

            wrapper.appendChild(loginboxClone);

            contextNode.appendChild(wrapper);

            SPUTNIK.login.setupEvents(loginboxClone);
        }
    },

    _lostLoginHandler = function(e){
        var form = YAHOO.util.Event.getTarget(e);
        YAHOO.util.Event.preventDefault(YAHOO.util.Event.getEvent(e));

        var useOverlay = SPUTNIK.overlay.isOpen();
        var inputs = form.getElementsByTagName('input');
        var userinput = {};

        for( var len = inputs.length, i = 0; i<len; i++ ){
            userinput[inputs[i].name] = inputs[i].value;
        }


        //build post data and url
        var url = 'http://'+TV2.getSite('ajax')+'/login/user/forgotpassword';
        var post = 'email='+escape(userinput.email);

        /* open a login message */
        SPUTNIK.overlay.lock = true;
        _openMessage({
            'title' : 'Sender en email til den angivne e-mail',
            'titleClass' : 'loading'
        });

        /* send ajax request */
        _showSpinner(form);
        TV2.ajax.asyncRequest(
            'POST',
            url,
            {
                success : function(o) {

                    var result = eval('['+o.responseText+']');
                    result = result[0];

                    SPUTNIK.overlay.lock = false;
                    login_ajax_in_progress = false;
                    _hideSpinner(form);

                    if (result.success) {
                        /* email sendt */

                        /* */
                        if(o.argument.useOverlay){
                            var loginBox = SPUTNIK.login.openLoginBox();
                            var form = loginBox.getElementsByTagName('form')[0];
                        }
                        else{
                            // open inline login message and find form
                            SPUTNIK.overlay.close();
                            var loginBox = document.getElementById('sputnik-login-box');
                            var form = openInlineLoginBox(
                                loginBox.getElementsByTagName('form')[0].cloneNode(true)
                            );
                        }


                        _openInlineMessage({
                            'type' : 'info',
                            'description' : result.msg,
                            'node' : _findNotificationArea(form)
                        });
                        /*/
                        _openMessage({
                            'title' : 'Du har modtaget en e-mail fra TV 2',
                            'description' : result.msg,
                            'options' : [{
                                'label' : 'Gå tilbage til login',
                                'fn' : SPUTNIK.login.openLoginBox,
                                'href' : '#'
                            }]
                        });
                        /* */
                    }
                    else {
                        /* */
                        if(o.argument.useOverlay){
                            var forgotBox = SPUTNIK.login.openLostLoginBox();
                            // var forgotBox = document.getElementById('sputnik-login-forgotten');
                            var form = forgotBox.getElementsByTagName('form')[0];
                        }
                        else{
                            SPUTNIK.overlay.close();
                            var form = o.argument.formNode;
                        }

                        _openInlineMessage({
                            'type' : 'warning',
                            'description' : result.msg,
                            'node' : _findNotificationArea(form)
                        });
                        /*/
                        _openMessage({
                            'title' : 'Hov!',
                            'description' : result.message,
                            'options' : [{
                                'label' : 'Prøv igen',
                                'fn' : SPUTNIK.login.openLoginBox,
                                'href' : '#'
                            }]
                        });
                        /* */
                    }

                },
                failure : function(o) {
                    //console.log('ajax failure');
                    // var result = eval('['+o.responseText+']');
                    // result = result[0];
                    // if (result.success) {
                    //     window.location.reload();
                    // } else {
                    //     alert(result.message);
                    // }
                    // login_ajax_in_progress = false;
                    _hideSpinner(form);
                    SPUTNIK.overlay.lock = false;
                    login_ajax_in_progress = false;
                    _openMessage({
                        'title' : 'Der skete en fejl'
                    });
                },
                argument : {
                    'useOverlay' : useOverlay,
                    'formNode' : form
                }
            },
            post
        );

    };

    return {
        buildInPageLoginBox : buildInPageLoginBox,
        setupEvents : setupEvents,
        openLoginBox : openLoginBox,
        openLostLoginBox : openLostLoginBox,
        openConfirmationDialog : openConfirmationDialog
    };

}());

YAHOO.util.Event.onDOMReady(function() {
    if (!TV2.Sputnik.userIsLoggedIn()) {
        //bottom-login-link2 & top-login-link2 may not always exist in the DOM, but we ignore the error here :)
        YAHOO.util.Event.on(
            ['top-login-link','bottom-login-link','bottom-login-link2','top-login-link2'],
            'click',
            SPUTNIK.login.openLoginBox
        );

        /* what is this? */
        YAHOO.util.Event.on(
            'sputnik-overlay-close',
            'click',
            SPUTNIK.overlay.close()
        );

        YAHOO.util.Event.on(
            'dismiss-lost-login',
            'click',
            SPUTNIK.login.openLoginBox
        );
    }

    var loginboxInPageId = 'loginbox-page-ctx';
    var inPageLoginBox = document.getElementById(loginboxInPageId);
    if (inPageLoginBox) {
        SPUTNIK.login.buildInPageLoginBox(loginboxInPageId);
    }
});

