var GroupChecker = Class.create({
    initialize: function (input, inputs, btns) {
        this.input  = input;
        this.inputs = inputs;
        this.btns   = btns;
        this.children = $A(document.getElementsByClassName(input.id));
        this.input.observe('click', this.click.bindAsEventListener(this));
    },

    click: function () {
        this.children.each(function (child) { child.checked = this.input.checked; }.bind(this));
        this.btns.each(function (btn) {
            btn.disabled = !this.inputs.any(function (input) { return input.checked; }.bind(this));
        }.bind(this));
    }
});

var CloseBtn = Class.create({
    className: 'close',

    initialize: function (modal) {
        this.modal = modal;
        $A(document.getElementsByClassName('close')).each(this.close.bind(this));
    },

    close: function (anchor) {
        anchor.observe('click', this.modal.remove.bindAsEventListener(this.modal));
    }
});

var DialogCheckbox = Class.create({
    initialize: function (input, all, btns, limit) {
        if (limit == undefined) {
            limit = 3;
        }
        this.input = input;
        this.all   = all;
        this.btns  = btns;
        this.limit = limit;

        $(this.input).observe('click', this.check.bind(this));
        this.check();
    },

    check: function () {
        var count  = this.all.inject(0, function (acc, input) { return input.checked ? acc+1 : acc; });
        if (count >= this.limit) {
            this.all.each(function (input) { if (!input.checked) { input.disabled = true; } });
        } else {
            this.all.each(function (input) { input.disabled = false; });
        }
        this.btns.each(function (btn) { btn.disabled = (count == 0); });
    }
});

var DialogForm = Class.create({
    initialize: function (obj) {
        this.obj     = obj;
        this.btns    = $A(document.getElementsByClassName('btnAdSearch'));
        this.inputs  = $A(document.getElementsByName(this.obj.getKind() + '[]'));
        this.anchors = $A(document.getElementsByClassName(this.obj.getKind() + 'Link'));
    },

    initAllChecker: function () {
        $A(document.getElementsByClassName('checkAll')).each(function (input) { new GroupChecker(input, this.inputs, this.btns); }.bind(this));
    },

    initAnchorEvent: function (ret) {
        if (ret === undefined) {
            ret = false;
        }
        var dialog = this;
        this.anchors.each(function (anchor) {
            anchor.observe('click', function () {
                var hash = {};
                var id = anchor.id.match(/\d+/)[0];
                hash[id] = $(dialog.obj.getKind() + '_name_' + id).innerHTML;
                dialog.obj.update($H(hash));
            });
        });
    },

    initAnchorEventForLine: function (ret) {
        if (ret === undefined) {
            ret = false;
        }
        var dialog = this;
        this.anchors.each(function (anchor) {
            anchor.observe('click', function () {
                var hash = {};
                var id = anchor.id.match(/\d+/)[0];
                hash[id] = $(dialog.obj.getKind() + '_name_' + id).innerHTML;
                dialog.obj.tmp = $H(hash);
                dialog.obj.change();
                stationMgr.inactive();
                stationMgr.clear();
                stationModalDialog.remove();
            });
        });
    },

    initFormEvent: function (ret) {
        if (ret === undefined) {
            ret = false;
        }
        var dialog = this;
        this.btns.each(function (btn) {
            btn.observe('click', function () {
                var hash = {};
                dialog.inputs.each(function (input) {
                    if (input.checked) {
                        hash[input.value] = $(dialog.obj.getKind() + '_name_' + input.value).innerHTML;
                    }
                });
                if ($H(hash).size() > 0) {
                    dialog.obj.update($H(hash));
                }
            });
        });
    },

    initFormCheckbox: function (limit) {
        this.inputs.each(function (input) { new DialogCheckbox(input, this.inputs, this.btns, limit) }.bind(this));
    },

    initSearchButton: function () {
        $A(this.inputs).each(function (input) {
            input.observe('click', function () {
                var count = this.inputs.inject(0, function (acc, another) { return another.checked ? acc+1 : acc; });
                this.btns.each(function (btn) { btn.disabled = (count == 0); });
            }.bindAsEventListener(this));
        }.bind(this));
    }
});

var PageLink = Class.create({
    initialize: function (obj) {
        this.links = $A(document.getElementsByClassName(this.className));
        this.obj   = obj;
        this.links.each(function (link) {
            link.observe('click', this.action.bindAsEventListener(this));
        }.bind(this));
    }
});

var PrevPageLink = Class.create(PageLink, {
    className: 'prevPage',

    action: function () {
        this.obj.prev();
    }
});

var NextPageLink = Class.create(PageLink, {
    className: 'nextPage',

    action: function () {
        this.obj.next();
    }
});

