﻿App = function() {

    /* Private */

    /* Properties */

    var cmp = {};

    var settings = {

        mapZoomDefault: 10,
        mapZoomMax: 10

    };





    /* Defaults */

//    TVI.debug = true;

    TVI.Data.defaultURL = '/Handlers/Data.aspx/query';
    TVI.Forms.handlerURL = '/Handlers/';

    TVI.Components.Button.disableInIE6 = true;

    TVI.Mapping.key = 'ABQIAAAAy7Od-n3EG1T00QnIoDJUbBTxG0mg57RxsVCzyJS_HsrNDkgHcBSAFZxyPt4XjTqPKxrY6cqtup1Jbg';

    TVI.Popup.modal = true;
    TVI.Popup.overlay = 25;
    TVI.Popup.width = 720;
    TVI.Popup.setTemplate(

        '<div class="TVI-popup-inner">' +
            '<div class="moduleTitleBar TVI-popup-header">' +
                '<h5>${title}</h5>' +
                '<div class="moduleTitleToolBar dark">' +
                    '<div class="buttonThin TVI-popup-close"><a href="#"><span class="icon16 icon16Cross"></span></a></div>' +
                '</div>' +
            '</div>' +
            '<div class="moduleContent TVI-popup-main clearfix">' +

                '${template}' +

            '</div>' +
            '<div class="moduleFooterBar TVI-popup-footer">' +
                '<div class="moduleFooterToolBar light">' +

                    '{for b in buttons}' +
                        '<a class="TVI-button leftStack ${b.cls}" href="#">${b.text}</a>' +
                    '{/for}' +

                '</div>' +
            '</div>' +
        '</div>'

    );





    /* Methods */

    var init = function() {

        /* Constructor */

        TVI.preLoadImages("/i/themeChooserPanelBack.png"); //DEVTEMP
        TVI.preLoadImages("/i/themeChooserPanelBottom.png"); //DEVTEMP

        /* Styles for non default buttons */
        TVI.Components.Button.styles.button32 = {
            leftEndWidth: 11,
            leftIconWrapperWidth: 28,
            leftPadding: 0,
            leftPaddingWithIcon: 12,
            rightEndWidth: 11,
            rightIconWrapperWidth: 28,
            rightPadding: 0,
            rightPaddingWithIcon: 12,
            iconClass: 'icon24',
            hoverClass: 'button32Hover',
            activeClass: 'button32Active'
        };


        // Hover events for thin buttons
        TVI.event('.buttonThin', 'mouseover', function() {
            $(this).addClass('buttonThinHover');
        });
        TVI.event('.buttonThin', 'mouseout', function() {
            $(this).removeClass('buttonThinHover');
            $(this).removeClass('buttonThinActive');
        });

        TVI.event('.buttonThin', 'mousedown', function() {
            $(this).addClass('buttonThinActive');
        });
        TVI.event('.buttonThin', 'mouseup', function() {
            $(this).removeClass('buttonThinActive');
        });


        //set minimum height for themes
        $('#themeBack').css('min-height', $(window).height());


        initAccount();

        initButtons();

        initEvents();

        initThemes();

        TVI.Components.initialize($('BODY'));

    };





    var initAccount = function() {

        /* setup account login */

        cmp.masterLoginForm = new TVI.Form({

            ID: 'masterLoginForm',
            handler: login

        });

        //get controls
        var emailEl = $('#masterLoginForm-email-control');
        var passwordEl = $('#masterLoginForm-password-control');

        //check browser hasn't cached values and remove backgrounds
        if (emailEl.val() !== '') { emailEl.css('background-position', '-100px'); }
        if (passwordEl.val() !== '') { passwordEl.css('background-position', '-100px'); }

        //set watermarks
        var on = function() {

            $(this).css('background-position', '-100px');

        };

        var off = function() {

            if ($(this).val() !== '') { return; }

            $(this).css('background-position', '0px');

        };

        emailEl.focus(on);
        passwordEl.focus(on);

        emailEl.blur(off);
        passwordEl.blur(off);

    };





    var initButtons = function() {

        TVI.event('.btnLoginRegister', 'click', loginRegister);

    };





    var initEvents = function() {

        //handle popup show event
        TVI.addListener('TVI.Popup.onShow', onPopupShow);

        //handle accountChange event
        TVI.addListener('accountChanged', onAccountChanged);

    };





    var initThemes = function() {

        TVI.event('#themeChooserButton', 'click', function() {

            $('#themeChooserPanel').slideDown('fast');

            $(this).addClass('open');

        });

        $(document).click(function(e) {

            var clicked = $(e.target);
            var controlClicked = clicked.parents('#themeChooser');

            // Has the user clicked on the theme chooser itself?
            if (controlClicked.length > 0) {
                return;
            }

            $('#themeChooserPanel').slideUp('fast');
            $('#themeChooserButton').removeClass('open');

        });

        TVI.event('#themeChooserPanel A', 'click', themeChanged);

    };





    var onPopupShow = function(params) {

        /* Handles the popup shown event */

        TVI.Components.initialize(params.el);

        $('#TVI-popup').bgIframe();

    };





    var getSetting = function(name) {

        return settings[name];

    };





    var login = function(valid) {

        /* Handles master login form submit */

        //check fields aren't empty
        if (cmp.masterLoginForm.field('email').val() === '' || cmp.masterLoginForm.field('password').val() === '') { return; }

        //submit form
        cmp.masterLoginForm.submit({

            url: '/Handlers/App.Account.aspx/login',
            success: function(d) {

                $('#accountBoxOut').hide();

                $('#accountBoxIn .welcome').html('Welcome back, ' + d.firstname);
                $('#accountBoxIn').show();

                cmp.loggedIn = true;

                TVI.fireEvent('accountChanged', d);

            },
            failure: function(d) {

                $('#masterLoginForm .links').hide();
                $('#masterLoginForm .errors').show();

                setTimeout(function() {

                    $('#masterLoginForm .links').show();
                    $('#masterLoginForm .errors').hide();

                }, 2000);

                cmp.loggedIn = false;

            }

        });

    };





    var loginRegister = function(template, loaded) {

        /* opens the login/register popup */

        //check template has loaded
        if (loaded !== true) {

            //check local cache
            if (App.popups['loginRegister'] !== undefined) {

                loginRegister(App.popups['loginRegister'], true);

                return;

            }

            //load template from handler
            TVI.ajax({

                url: '/Handlers/App.Popups.aspx/template',
                data: {
                    name: 'loginRegister'
                },
                responseType: 'text',
                success: function(d) {

                    App.popups['loginRegister'] = d;

                    loginRegister(d, true);

                }

            });

            return;

        }

        //show popup
        TVI.Popup.show({

            title: 'Register / Login',
            template: template,
            success: function() {

                //build forms
                cmp.popupRegisterForm = new TVI.Form({

                    ID: 'popupRegisterForm',
                    handler: popupRegister

                });

                cmp.popupLoginForm = new TVI.Form({

                    ID: 'popupLoginForm',
                    handler: popupLogin

                });

            }

        });

    };





    var onAccountChanged = function(d) {

        /* Handles the accountChanged event */

        //if logged in
        if (d && d.ID > 0) {

            //check if redirecting
            if (App.redirect !== '') {

                window.location.href = App.redirect;

                return;

            }

            //set account
            $('#accountBoxIn .welcome').html('Welcome back, ' + d.firstname);

            $('#accountBoxOut').hide();
            $('#accountBoxIn').show();

            //set theme
            setTheme(d.theme);

            App.loggedIn = true;

            return;

        }

        //logged out
        $('#accountBoxOut').show();
        $('#accountBoxIn').hide();

        App.loggedIn = false;

    };





    var popupLogin = function(valid) {

        /* Handles the login/register popup login form submit */

        $('#popupLoginForm .errors').hide();

        //validate form
        if (valid !== true) {

            cmp.popupLoginForm.validate({

                success: function() {

                    popupLogin(true);

                },
                failure: function(d) {

                    cmp.popupLoginForm.error(d.errors);

                    $('#popupLoginForm .errors').show();

                }

            });

            return;

        }

        //submit form
        cmp.popupLoginForm.submit({

            url: '/Handlers/App.Account.aspx/login',
            success: function(d) {

                TVI.Popup.close();

                TVI.fireEvent('accountChanged', d);

            },
            failure: function(d) {

                $('#popupLoginForm .errors').show();

                cmp.popupLoginForm.error(d.errors);

            }

        });

    };





    var popupRegister = function(valid) {

        /* Handles the login/register popup register form submit */

        $('#popupRegisterForm .errors').hide();

        //validate form
        if (valid !== true) {

            cmp.popupRegisterForm.validate({

                success: function() {

                    popupRegister(true);

                },
                failure: function(d) {

                    cmp.popupRegisterForm.error(d.errors);

                    $('#popupRegisterForm .errors').show();

                }

            });

            return;

        }

        //submit form
        cmp.popupRegisterForm.submit({

            url: '/Handlers/App.Account.aspx/register',
            success: function(d) {

                TVI.Popup.close();

                TVI.fireEvent('accountChanged', d);

            },
            failure: function(d) {

                $('#popupRegisterForm .errors').show();

                cmp.popupRegisterForm.error(d.errors);

            }

        });

    };





    var setMenu = function(name) {

        /* Sets the main menu active tab */

        TVI.ready(function() {

            $('#topMenu A').removeClass('active');

            $('#topMenu LI.' + name + ' A').addClass('active');


        });

    };





    var setTheme = function(name) {

        /* Change the  */

        $('HTML').attr('class', name);

    };





    var themeChanged = function() {

        /* Handles the theme click event */

        //get theme data
        var data = TVI.meta($(this));

        //change background
        setTheme(data.theme);

        //save theme to account
        TVI.ajax({

            url: '/Handlers/App.Account.aspx/saveTheme',
            data: {
                theme: data.theme
            }

        });

        //close themes
        $('#themeChooserPanel').slideUp('fast');
        $('#themeChooserButton').removeClass('open');

    };





    /* Public */

    TVI.apply(cmp, {

        /* Properties */

        popups: {},

        /* Methods */

        loginRegister: function() {

            loginRegister();

        },

        menu: function(name) {

            setMenu(name);

        },

        setting: function(name) {

            return getSetting(name);

        }

    });


    TVI.ready(init);


    return cmp;


} ();





/* Preload Script */

(function($) {
    var cache = [];
    // Arguments are image paths relative to the current page.
    $.preLoadImages = function() {
        var args_len = arguments.length;
        for (var i = args_len; i--; ) {
            var cacheImage = document.createElement('img');
            cacheImage.src = arguments[i];
            cache.push(cacheImage);
        }
    }
})(TVI);

// Background IFRAME script - Stops SELECT tags popping through layers in IE6
(function($) {
    $.fn.bgIframe = $.fn.bgiframe = function(s) {

	    if (navigator.userAgent.indexOf('MSIE 6.0') > 0) {
		    s = $.extend({
			    top     : 'auto', // auto == .currentStyle.borderTopWidth
			    left    : 'auto', // auto == .currentStyle.borderLeftWidth
			    width   : 'auto', // auto == offsetWidth
			    height  : 'auto', // auto == offsetHeight
			    opacity : true,
			    src     : 'javascript:false;'
		    }, s || {});
		    var prop = function(n){return n&&n.constructor==Number?n+'px':n;},
		        html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+
		                   'style="display:block;position:absolute;z-index:-1;'+
			                   (s.opacity !== false?'filter:Alpha(Opacity=\'0\');':'')+
					           'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+
					           'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+
					           'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+
					           'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+
					    '"/>';
		    return this.each(function() {
			    if ( $('> iframe.bgiframe', this).length == 0 )
				    this.insertBefore( document.createElement(html), this.firstChild );
		    });
	    }
	    return this;
    }; 
})(jQuery);
