(function(){ var Monitor = function () { var base = this; base.$el = $("#minotaur"); base.timeout = null; base.delay = 500; base.objects = {}; base.init = function () { base.$el.addClass('saved'); base.$el.click(base.save); } base.watch = function (object) { base.objects[object.type] = base.objects[object.type] || {}; base.objects[object.type][object.id] = object; base.clear(); base.timeout = setTimeout(base.save, base.delay); } base.clear = function () { if (base.timeout) clearTimeout(base.timeout); base.timeout = false; } base.save = function () { var saving = false; base.clear(); for (var type in base.objects) { for (var id in base.objects[type]) { if (base.timeout) return; var obj = base.objects[type][id]; if (obj) obj.save(function(){ base.$el.removeClass('unsaved saving').addClass('saved'); saving = true; }); base.objects[type][id] = false; } } if (saving) { base.$el.removeClass('unsaved saved').addClass('saving'); } else { base.$el.removeClass('unsaved saving').addClass('saved'); } base.objects = {}; } base.init(); } window.Minotaur = new Monitor (); })()