Skip to content

Instantly share code, notes, and snippets.

@mattly
Created April 6, 2009 05:39
Show Gist options
  • Save mattly/90645 to your computer and use it in GitHub Desktop.
Save mattly/90645 to your computer and use it in GitHub Desktop.
Autosaver = function(formele, options) {
var form = $(formele);
var settings = $.extend({
checkDirtyTime: 2000,
saveTime: 15000,
statusEle: '.save-status',
serialize: function(observing) {
var elements = $('[name=]', form);
if (observing) { elements = elements.not('[name=_rev],[name=_id]'); }
return elements.serialize();
},
afterSaved: function(data) {
if ($('[name=_rev]').val() == '') {
form.attr('action', form.attr('action') + data._id);
}
$('[name=_rev]', form).val(data._rev);
}
}, options);
var status = function() {
var status = $('.save-status', form);
var saveButton = $('.save-button', form);
return {
dirty: function() { saveButton.removeClass('disabled'); },
saving: function() {
status.html('saving...');
saveButton.addClass('disabled');
},
saved: function() {
var now = new Date;
status.html("saved at <span class='date' strftime='%H:%M'>" + now.toString() + "</span>");
}
};
}();
var observer = function() {
var serialized = serialize();
var dirty = false;
var saving = false;
function serialize() { return settings.serialize(true); }
function checkForChanges() {
var current = serialize();
if (saving || dirty || current == serialized) {
setTimeout(checkForChanges, settings.checkDirtyTime);
} else {
dirty = true;
serialized = current;
status.dirty();
setTimeout(save, settings.saveTime);
}
};
function reset() {
dirty = false;
saving = false;
checkForChanges();
};
reset();
return {
isDirty: function() { return dirty; },
isSaving: function() { return saving; },
saving: function() {
saving = true;
serialized = serialize();
},
reset: reset
};
}();
function save() {
if (observer.isSaving()) { return; }
$.ajax({
url: form.attr('action'),
type: 'POST',
cache: false,
dataType: 'json',
data: settings.serialize(),
beforeSend: function() {
observer.saving();
status.saving();
},
// error: function(request, status, error) { console.log('error! :: '+ status); },
success: function(data, responseStatus) {
status.saved();
observer.reset();
settings.afterSaved(data);
}
});
};
return {
status: status,
observer: observer,
save: save
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment