|
|
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));
|
|
|
|