123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- /*!
- * jQuery Plugin: Are-You-Sure (Dirty Form Detection)
- * https://github.com/codedance/jquery.AreYouSure/
- *
- * Copyright (c) 2012-2014, Chris Dance and PaperCut Software http://www.papercut.com/
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Author: chris.dance@papercut.com
- * Version: 1.9.0
- * Date: 13th August 2014
- */
- (function($) {
-
- $.fn.areYouSure = function(options) {
-
- var settings = $.extend(
- {
- 'message' : 'You have unsaved changes!',
- 'dirtyClass' : 'dirty',
- 'change' : null,
- 'silent' : false,
- 'addRemoveFieldsMarksDirty' : false,
- 'fieldEvents' : 'change keyup propertychange input',
- 'fieldSelector': ":input:not(input[type=submit]):not(input[type=button])"
- }, options);
- var getValue = function($field) {
- if ($field.hasClass('ays-ignore')
- || $field.hasClass('aysIgnore')
- || $field.attr('data-ays-ignore')
- || $field.attr('name') === undefined) {
- return null;
- }
- if ($field.is(':disabled')) {
- return 'ays-disabled';
- }
- var val;
- var type = $field.attr('type');
- if ($field.is('select')) {
- type = 'select';
- }
- switch (type) {
- case 'checkbox':
- case 'radio':
- val = $field.is(':checked');
- break;
- case 'select':
- val = '';
- $field.find('option').each(function(o) {
- var $option = $(this);
- if ($option.is(':selected')) {
- val += $option.val();
- }
- });
- break;
- default:
- val = $field.val();
- }
- return val;
- };
- var storeOrigValue = function($field) {
- $field.data('ays-orig', getValue($field));
- };
- var checkForm = function(evt) {
- var isFieldDirty = function($field) {
- var origValue = $field.data('ays-orig');
- if (undefined === origValue) {
- return false;
- }
- return (getValue($field) != origValue);
- };
- var $form = ($(this).is('form'))
- ? $(this)
- : $(this).parents('form');
- // Test on the target first as it's the most likely to be dirty
- if (isFieldDirty($(evt.target))) {
- setDirtyStatus($form, true);
- return;
- }
- $fields = $form.find(settings.fieldSelector);
- if (settings.addRemoveFieldsMarksDirty) {
- // Check if field count has changed
- var origCount = $form.data("ays-orig-field-count");
- if (origCount != $fields.length) {
- setDirtyStatus($form, true);
- return;
- }
- }
- // Brute force - check each field
- var isDirty = false;
- $fields.each(function() {
- $field = $(this);
- if (isFieldDirty($field)) {
- isDirty = true;
- return false; // break
- }
- });
-
- setDirtyStatus($form, isDirty);
- };
- var initForm = function($form) {
- var fields = $form.find(settings.fieldSelector);
- $(fields).each(function() { storeOrigValue($(this)); });
- $(fields).unbind(settings.fieldEvents, checkForm);
- $(fields).bind(settings.fieldEvents, checkForm);
- $form.data("ays-orig-field-count", $(fields).length);
- setDirtyStatus($form, false);
- };
- var setDirtyStatus = function($form, isDirty) {
- var changed = isDirty != $form.hasClass(settings.dirtyClass);
- $form.toggleClass(settings.dirtyClass, isDirty);
-
- // Fire change event if required
- if (changed) {
- if (settings.change) settings.change.call($form, $form);
- if (isDirty) $form.trigger('dirty.areYouSure', [$form]);
- if (!isDirty) $form.trigger('clean.areYouSure', [$form]);
- $form.trigger('change.areYouSure', [$form]);
- }
- };
- var rescan = function() {
- var $form = $(this);
- var fields = $form.find(settings.fieldSelector);
- $(fields).each(function() {
- var $field = $(this);
- if (!$field.data('ays-orig')) {
- storeOrigValue($field);
- $field.bind(settings.fieldEvents, checkForm);
- }
- });
- // Check for changes while we're here
- $form.trigger('checkform.areYouSure');
- };
- var reinitialize = function() {
- initForm($(this));
- }
- if (!settings.silent && !window.aysUnloadSet) {
- window.aysUnloadSet = true;
- $(window).bind('beforeunload', function() {
- $dirtyForms = $("form").filter('.' + settings.dirtyClass);
- if ($dirtyForms.length == 0) {
- return;
- }
- // Prevent multiple prompts - seen on Chrome and IE
- if (navigator.userAgent.toLowerCase().match(/msie|chrome/)) {
- if (window.aysHasPrompted) {
- return;
- }
- window.aysHasPrompted = true;
- window.setTimeout(function() {window.aysHasPrompted = false;}, 900);
- }
- return settings.message;
- });
- }
- return this.each(function(elem) {
- if (!$(this).is('form')) {
- return;
- }
- var $form = $(this);
-
- $form.submit(function() {
- $form.removeClass(settings.dirtyClass);
- });
- $form.bind('reset', function() { setDirtyStatus($form, false); });
- // Add a custom events
- $form.bind('rescan.areYouSure', rescan);
- $form.bind('reinitialize.areYouSure', reinitialize);
- $form.bind('checkform.areYouSure', checkForm);
- initForm($form);
- });
- };
- })(jQuery);
|