| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | /*! * 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);
 |