Created
April 6, 2009 05:39
-
-
Save mattly/90645 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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