var FlavoredCheckbox = (function($) {

"use strict";

// makes Markdown FlavoredCheckbox interactive
// `container` is either a DOM element, jQuery collection or selector containing
// the Markdown content
// `retriever` is a function being passed the respective checkbox and a
// callback - the latter is expected to be called with the container's raw
// Markdown source
// `storer` is a function being passed the updated Markdown content, the
// respective checkbox and a callback
// both functions' are invoked with the respective `FlavoredCheckbox` instance as
// execution context (i.e. `this`)
// use like that::
//       var retriever = function(checkbox, callback) {
//        var url = '/checkbox_update_url';
//        $.get(url, callback);
//       }
//
//       var storer = function(markdown_txt, checkbox, callback) {
//        var url = '/checkbox_update_url';
//        $.ajax({
//            type: "put",
//            url: url,
//            data: markdown_txt,
//            success: callback
//        });
//       }
//       new FlavoredCheckbox("article", retriever, storer);

function FlavoredCheckbox(container, retriever, storer) {
        this.container = container.jquery ? container : $(container);
        this.retriever = retriever;
        this.storer = storer;
        this._used_class = '.flavored_checkbox_list'

        var checkbox_objects = $(this._used_class, container);
        checkbox_objects.find(this.checkboxSelector).prop("disabled", false);
        var self = this;
        checkbox_objects.on("change", this.checkboxSelector, function() {
                var args = Array.prototype.slice.call(arguments);
                args.push(self);
                self.onChange.apply(this, args);
        });
}
FlavoredCheckbox.prototype.checkboxSelector = "> li > input:checkbox";
FlavoredCheckbox.prototype.onChange = function(ev, self) {
        var checkbox = $(this).prop("disabled", true);
        var index = $("ul" + self.checkboxSelector, self.container).index(this);
        var reactivate = function() { checkbox.prop("disabled", false); };
        self.retriever(checkbox, function(markdown) {
            markdown = self.toggleCheckbox(index, markdown);
            self.storer(markdown, checkbox, reactivate);
        });
};
FlavoredCheckbox.prototype.toggleCheckbox = function(index, markdown) {
        var pattern = /^([*-]) \[([ x])\]/mg; // XXX: duplicates server-side logic!?
        var count = 0;
        return markdown.replace(pattern, function(match, prefix, marker) {
            if(count === index) {
                    marker = marker === " " ? "x" : " ";
            }
            count++;
            return prefix + " [" + marker + "]";
        });
};

return FlavoredCheckbox;

}(jQuery));