var Application = {

    helpSelector : 'a.help',
    pageTracker  : null,

    startup : function()
    {
        Application.setupHelp();
        Application.setupLabels();
        Application.setupForms();
        Application.setupLocale();
        Application.setupReminders();

        document.observe('ui:event', function(e) {
            if (typeof Application.pageTracker != 'undefined') {
                Application.pageTracker._trackEvent('User Interface', e.memo.action, e.memo.label);
            }
        });
    },

    setupLabels : function()
    {
        $$('.label-container').each(function(container) {
            container.observe('mousedown', function(e) {
                var elt = Event.element(e);

                if (!elt.hasClassName('label-container'))
                    elt = elt.up('.label-container');

                if (elt) {
                    elt.previous().checked = true;
                }
            });
        });
    },

    setupHelp : function()
    {
        if ($$(Application.helpSelector).size() > 0) {
            Application.loadJs('http://a.webhost.org/c/js/Tooltip.js', function() {
                new Tooltip(Application.helpSelector, {
                    showDelay : 0.3
                });
            });
        }
    },

    setupForms : function()
    {
        $$('input[name=captcha]').each(function(elt) {
            elt.writeAttribute('autocomplete', 'off');
        });

        if ($$('form.protected').size() > 0) {
            Application.loadJs('http://a.webhost.org/c/js/FormProtector.js', function() {
                $$('form.protected').each(function (form) {
                    new FormProtector(form);
                });
            });
        }

        $$('input[type=button].clipboard').each(function (elt) {
            elt.observe('click', function(e) {
                var button = Event.element(e);
                var id = button.identify();
                var block = $(id + '_');

                if (block) {
                    block.activate();

                    var message = '';
                    var content = $F(block);

                    if (Prototype.Browser.IE) {
                        window.clipboardData.setData('Text', content);
                        message = 'Text copied to clipboard';
                    }
                    else if (/Mac/i.test(navigator.userAgent)) {
                        message = 'Press Command-C to copy this text to your clipboard after pressing OK';
                    }
                    else {
                        message = 'Press Control-C to copy this text to your clipboard after pressing OK';
                    }

                    if (message.length > 0) {
                        alert(message);
                    }
                }
            });
        });

    },

    setupLocale : function()
    {
        var locale = $('locale');

        if (locale) {
            locale.setStyle({ 'visibility' : 'visible' });
            locale.hide();

            var localeSelector = $('locale-selector');
            var pos            = localeSelector.positionedOffset();

            locale.setStyle({ left : pos.left + 'px', right : 'auto' });

            localeSelector.observe('click', function(e) {
                locale.toggle();
                Event.stop(e);

                if (locale.visible()) {
                    Event.element(e).up().addClassName('open');

                    if (currency) {
                        currency.hide();
                        currencySelector.up().removeClassName('open');
                    }
                }
                else {
                    Event.element(e).up().removeClassName('open');
                }
            });
        }

        var currency = $('currency');

        if (currency) {
            currency.setStyle({ 'visibility' : 'visible' });
            currency.hide();

            var currencySelector = $('currency-selector');

            currencySelector.observe('click', function(e) {
                currency.toggle();
                Event.stop(e);

                if (currency.visible()) {
                    Event.element(e).up().addClassName('open');
                    if (locale) {
                        locale.hide();
                        localeSelector.up().removeClassName('open');
                    }
                }
                else {
                    Event.element(e).up().removeClassName('open');
                }
            });

            currency.select('a').each(function (link) {
                link.observe('click', function(e) {
                    Event.stop(e);

                    var newCurrency = link.innerHTML;

                    document.fire('ui:event', { 'action' : 'Set Currency', 'label' : newCurrency });

                    var amounts = $$('.currency-conversion').invoke('readAttribute', 'rel');

                    var options = {
                        method     : 'post',
                        parameters : {
                            'currency'  : newCurrency,
                            'amounts[]' : amounts
                        },
                        onSuccess : function(transport) {
                            var json = transport.responseJSON;

                            if (json.error) {
                                return;
                            }

                            currencySelector.update(json.currency + ' - ' + json.name);

                            $$('.currency-conversion').each(function (elt) {
                                var amount = elt.readAttribute('rel');

                                if (json.conversions[amount]) {
                                    elt.update(json.conversions[amount]);
                                }
                                else {
                                    elt.update('');
                                }
                            });
                        }
                    };

                    new Ajax.Request('/settings/currency', options);

                    currency.hide();
                    currencySelector.up().removeClassName('open');
                    currencySelector.update('Updating...');

                    currency.select('a').invoke('removeClassName', 'selected');
                    link.addClassName('selected');
                });
            });
        }
    },

    setupReminders : function()
    {
        $$('.reminder a.dismiss').each(function(link) {
            link.observe('click', function(e) {
                Event.stop(e);
                var link = Event.element(e);
                new Ajax.Request(link.readAttribute('href'), {});

                link.up('.reminder').hide();
            });
        });
    },

    loadJs : function(path, onload)
    {
        var script = new Element('script', {
            src  : path,
            type : 'text/javascript'
        });

        if (Prototype.Browser.IE) {
            Event.observe(script, 'readystatechange', function(e) {
                if (this.readyState == 'loading')
                    return;

                onload();
            });
        }
        else
            Event.observe(script, 'load', onload);

        $$('head')[0].insert(script);
    }
};

Event.observe(document, 'dom:loaded', Application.startup);

