var AGDA = new Class({
    initialize: function() {
        $$('form').each(function(frm) {
            frm.addEvent('submit', function(e) {
                if (this.get('_submitted')) {
                    e = new Event(e);
                    e.stop();
                } else {
                    this.set('_submitted', true);
                }
            });
        });
        $$('a.external').each(function(link) {
            link.target = '_blank';
        });
        $$('.autorefresh').each(function(link) {
            link.onchange = function() {
                this.form.submit();
            }
        });
        $$('div.slider').each(function(div) {
            div.fx = new Fx.Slide(div);
            div.fx.hide();
        });
        $$('a.slidercontrol').each(function(link) {
            link.tgt = link.href.replace(/^.*?#/, '');
            link.addEvent('click', function(evt) {
                evt = new Event(evt);
                evt.stop();
                if ($(link.tgt)) {
                    $(link.tgt).fx.toggle();
                }
            });
        });
        if ($('searchkeywords')) {
            $('searchkeywords').addEvent('focus', this.clearSearch);
        }
        if ($('searchkeywordsrelated')) {
            $('searchkeywordsrelated').addEvent('focus', this.clearSearch);
        }
        if ($('searchkeywordsbtn')) {
            var img = new Element('img');
            img.setProperty('src', '/img/common/icon-search-on.png');
            $('searchkeywordsbtn').dflt = $('searchkeywordsbtn').src;
            $('searchkeywordsbtn').addEvent('mouseover', function() {
                this.src = '/img/common/icon-search-on.png';
            });
            $('searchkeywordsbtn').addEvent('mouseout', function() {
                this.src = this.dflt;
            });
        }
    },
    
    clearSearch: function(event) {
        var event = new Event(event);
        this.removeEvents('focus');
        if (this.value == 'Search AGDA for...' || this.value == 'Search this section for...') {
            this.value = '';
        }
    }
});

var AGDA_Form = new Class({
    initialize: function() {
        $$('form select[class*=conditional-]').each(function(el) {
            el.conditional = new Hash();
            var conditionals = el.getProperty('class').split(' ');
            for (var loop = 0; loop < conditionals.length; loop++) {
                var value = conditionals[loop].split('-');
                var prefix = value.shift();
                if (prefix == 'conditional' && value.length >= 2) {
                    var id      = el.getProperty('id');
                    var cnd     = $(id);
                    var val     = value.shift();
                    var name    = value.join('-');
                    var tgt     = $(name);
                    if (tgt) {
                        if (tgt.hasClass('closed')) {
                            tgt.removeClass('closed');
                            tgt.get('slide').hide();
                        }
                        tgt.toggle = this.toggle;
                        cnd.conditional.set(val, tgt);
                    }
                }
            }
            el.toggle = this.toggle;
            el.addEvent('change', el.toggle);
            el.fireEvent('change');
        }.bind(this));
    },
    toggle: function() {
        var value = this.get('value');
        var opn                 = $A([]);
        var cls                 = $A([]);
        this.conditional.each(function(val, key) {
            if (!opn.contains(val)) {
                if (value == key) {
                    if (cls.contains(val)) {
                        cls.erase(val);
                    }
                    opn.include(val);
                } else {
                    cls.include(val);
                }
            }
        });
        opn.each(function(el) {
            el.removeClass('closed');
            el.get('slide', {duration: 'long', transition: 'bounce:out', link: 'chain', onComplete: null}).slideIn();
        });
        cls.each(function(el) {
            el.get('slide', {duration: 'short', transition: 'quad:in', link: 'chain', onComplete: function() {
                el.addClass('closed');
            }}).slideOut();
        });
    }
});

var AGDA_Validator = new Class({
    validateHook:               null,
    validateEvent:              null,
    form:                       null,
    trigger:                    null,
    messages:                   null,
    valid:                      false,
    options: {
        spinner: '/img/common/spinner.gif'
    },
    button:                     null,

    initialize: function(frm) {
        this.form = $(frm);
        this.messages           = new Hash();
        this.trigger            = null;
        this.button             = null;
        this.valid              = false;
        if (!this.form) {
            return false;
        }
        this.resetHook          = this.reset.bindWithEvent(this);
        this.form.set('send', {
            async:              false,
            url:                this.form.getProperty('action') + '?format=json',
            onComplete:         this.notify.bind(this),
            onError:            this.error.bind(this)
        });
        this.form.getElements('.next input').each(function(next) {
            next.addEvent('click', this.validate.bindWithEvent(this, next));
        }.bind(this));
        this.form.getElements('.next button').each(function(next) {
            next.addEvent('click', this.validate.bindWithEvent(this, next));
        }.bind(this));
    },
    validate: function(e, trigger) {
        this.validateEvent  = new Event(e);
        this.trigger        = trigger;
        if (this.trigger.getElement('img')) {
            this.button         = this.trigger.getElement('img').get('src');
            this.trigger.getElement('img').set('src', this.options.spinner);
        } else {
            this.button         = this.trigger.get('src');
            this.trigger.set('src', this.options.spinner);
        }
        this.messages.each(function(el) {
            el.destroy();
        });
        this.messages.empty();
        this.cleanup();
        this.form.send();
    },
    reset: function(e) {
        e                       = new Event(e);
        el                      = e.target;
        key                     = el.get('name');
        if (this.messages.has(key)) {
            this.messages.get(key).destroy();
            this.messages.erase(key);
            this.cleanup();
        }
        el.removeEvent('blur', this.resetHook);
        el.removeEvent('change', this.resetHook);
    },
    cleanup: function() {
        $$('form select[class^=conditional-]').each(function(sel) {
            if (sel.toggle) {
                sel.toggle();
            }
        });
    },
    notify: function(json, xml) {
        var obj = JSON.decode(json);
        if (obj.response) {
            if (obj.response == 'true') {
                return true;
            } else {
                var keys = JSON.decode(obj.response);
                for (var key in keys) {
                    var el = this.form.getElement('[name^=' + key + ']');
                    if (el) {
                        var msgs = keys[key];
                        var ul = el.getParent().getElement('ul.errors');
                        if (!ul) {
                            var ul = new Element('ul').addClass('errors').injectAfter(el);
                        } else {
                            ul.empty();
                        }
                        for (var msg in msgs) {
                            var li = new Element('li').set('text', msgs[msg]).injectInside(ul);
                        }
                        this.messages.set(key, ul);
                        ul.highlight('#ddf', '#fff');
                        el.addEvent('blur', this.resetHook);
                        el.addEvent('change', this.resetHook);
                        this.cleanup();
                    }
                }
            }
        }
        this.validateEvent.stop();
        if (this.trigger.getElement('img')) {
            this.trigger.getElement('img').set('src', this.button);
        } else {
            this.trigger.set('src', this.button);
        }
    },
    error: function() {
        alert('error');
    }
});

window.addEvent('domready', function() {
    new AGDA();
    new AGDA_Form();
});
