/* problemata.com */

var EVER_VISITED_COOKIE = 'visited';

/* First-time notice, hide link. */
window.addEvent('domready', function() {
    var setVisited = (function(ev) {
        ev = new Event(ev);
        var el = $(ev.target);
        var note = el.getParent('.first-time');
        Cookie.write(EVER_VISITED_COOKIE, 'yes', { duration: 90 });
        note.dispose();
        ev.stop();
    });
    $$('.first-time a').addEvents({
        click: setVisited
    });
});

/* If there are form fields with errors, focus on the first. */
window.addEvent('domready', function() {
    $$('.error').some(function(el) {
        el.focus();
        return false;
    });
});

/* For qlist_view. */
window.addEvent('domready', function() {
    var showOne = (function(ev) {
        var ev = new Event(ev);
        var el = $(ev.target);
        var href = el.href;
        var id = href.substr(href.indexOf('#') + 1);
        $(id).addClass('show');
        el.getParent('.answer-hint').dispose();
        ev.stop();
    });
    var showAll = (function(ev) {
        ev = new Event(ev);
        $(document.body).addClass('show');
        $$('.answer-hint').each(function(el) {
            el.dispose();
        });
        $$('.btn-show-answers').each(function(el) {
            el.dispose();
        });
        ev.stop();
    });
    $$('.answer-hint a.btn-show-answer').addEvents({
        click: showOne
    });
    $$('.btn-show-answers').addEvents({
        click: showAll
    });
});

/* For qlist_edit. */
window.addEvent('domready', function() {
    var nextIndex = $$('.number').length - 1;
    var substitute = (function(base, index) {
        var patterns = new Hash({
            'name': /^(questions-).*(\..*)$/
        });
        var numberContainer = base.getElement('.number');
        var number = index + 1;
        numberContainer.set('text', number);
        var recurse = (function(nodes) {
            nodes.each(function(node) {
                patterns.each(function(pattern, property) {
                    var value = node.getProperty(property);
                    if (value != null) {
                        value = value.replace(pattern, '$1' + index + '$2')
                        node.setProperty(property, value);
                    }
                });
                recurse(node.getChildren());
            });
        });
        base.setProperty('id', 'edit-' + index);
        recurse(base.getChildren());
    });
    var addQuestion = (function(ev) {
        var template = $('edit--1');
        var answer = template.clone();
        answer.setProperty('id', 'edit-' + nextIndex);
        answer.getElement('.btn-remove-question').addEvents({
            click: removeQuestion
        });
        substitute(answer, nextIndex++);
        $('answers').adopt(answer);
    });
    var removeQuestion = (function(ev) {
        ev = new Event(ev);
        var block = $(ev.target).getParent('[id^=edit]');
        var removeIndex = block.getProperty('id').replace(/^\D+/, '') - 0;
        block.dispose();
        /* renumber. */
        for (var index = removeIndex + 1; index < nextIndex; index++) {
            var name = 'edit-' + index;
            substitute($(name), index - 1);
        }
        --nextIndex;
    });
    $$('.btn-add-question').addEvents({
        click: addQuestion
    });
    $$('.btn-remove-question').addEvents({
        click: removeQuestion
    });
});

/** OpenID logins. */
var LoginManager = new Class({
    initialize: function() {
        if ($('openid-form')) {
            this.base = $('openid-form');
            this.form = this.base.getParent('form');
            this.urlField = $('id_openid_url');
            this.interactive = $('openid-interactive');
            this.forUsername = this.interactive.getElement('p.for-username');
            this.forCustom = this.interactive.getElement('p.for-custom');
            this.field = this.interactive.getElement('input');
            this.providerLabel = this.forUsername.get('text')
            this.setup();
        }
    },
    setup: function() {
        this.base.removeClass('h');
        this.urlField.addClass('h');
        $$('#openid-buttons a').addEvent(
            'click', this.providerClick.bindWithEvent(this)
        );
        this.form.removeEvents('submit');
        this.form.addEvent(
            'submit', this.fillEndpoint.bindWithEvent(this)
        );
    },
    fillEndpoint: function(ev) {
        ev = new Event(ev);
        /* Get active provider. */
        var active = $('openid-buttons').getElement('a.active');
        this.interactive.getElement('button').disabled = false;
        if (active) {
            var href = active.getProperty('href');
            var url = '';
            if (!this.field.value) {
                ev.stop();
                return;
            }
            if (href == '#') {
                url = this.field.value;
            } else if (href.contains('{username}')) {
                url = href.replace('{username}', this.field.value)
            }
            this.urlField.value = url;
        }
    },
    showInteractive: function(providerName) {
        if (providerName) {
            this.forUsername.set('text', 
                this.providerLabel.replace('{{ provider }}', providerName)
            );
            this.forCustom.addClass('h');
            this.forUsername.removeClass('h');
        } else {
            this.forCustom.removeClass('h');
            this.forUsername.addClass('h');
        }
        this.interactive.removeClass('h');
        this.field.focus();
    },
    providerClick: function(ev) {
        ev = new Event(ev);
        ev.stop();
        var link = $(ev.target);
        var href = link.getProperty('href');
        var title = link.getProperty('title');
        /* Select a button. */
        $$('#openid-buttons a').removeClass('active');
        link.addClass('active');
        /* Interactive? */
        if (href == '#') {
            this.showInteractive();
        } else if (href.contains('{username}')) {
            this.showInteractive(title);
        } else {
            this.urlField.value = href;
            this.form.removeEvents();
            this.form.submit();
        }
    }
});
window.addEvent('domready', function() {
    new LoginManager();
});

