﻿/**
* Confirm plugin 1.2
*
* Copyright (c) 2007 Nadia Alramli (http://nadiana.com/)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*/

/**
* For more docs and examples visit:
* http://nadiana.com/jquery-confirm-plugin
* For comments, suggestions or bug reporting,
* email me at: http://nadiana.com/contact/
*/

jQuery.fn.confirm = function(options) {
    options = jQuery.extend({
        msg: 'Are you sure?',
        stopAfter: 'never',
        wrapper: '<span></span>',
        eventType: 'click',
        dialogShow: 'show',
        dialogSpeed: '',
        timeout: 0
    }, options);
    options.stopAfter = options.stopAfter.toLowerCase();
    if (!options.stopAfter in ['never', 'once', 'ok', 'cancel']) {
        options.stopAfter = 'never';
    }
    options.buttons = jQuery.extend({
        ok: 'Yes',
        cancel: 'No',
        wrapper: '<a href="#"></a>',
        separator: '/'
    }, options.buttons);

    // Shortcut to eventType.
    var type = options.eventType;

    return this.each(function() {
        var target = this;
        var $target = jQuery(target);
        var timer;
        var saveHandlers = function() {
            var events = jQuery.data(target, 'events');
            if (!events) {
                // There are no handlers to save.
                return;
            }
            target._handlers = new Array();
            for (var i in events[type]) {
                target._handlers.push(events[type][i]);
            }
        }

        // Create ok button, and bind in to a click handler.
        var $ok = jQuery(options.buttons.wrapper)
      .append(options.buttons.ok)
      .click(function() {
          // Check if timeout is set.
          if (options.timeout != 0) {
              clearTimeout(timer);
          }
          $target.unbind(type, handler);
          $target.show();
          $dialog.hide();
          // Rebind the saved handlers.
          if (target._handlers != undefined) {
              jQuery.each(target._handlers, function() {
                  $target.click(this);
              });
          }
          // Trigger click event.
          $target.click();
          if (options.stopAfter != 'ok' && options.stopAfter != 'once') {
              $target.unbind(type);
              // Rebind the confirmation handler.
              $target.one(type, handler);
          }
          return false;
      })

        var $cancel = jQuery(options.buttons.wrapper).append(options.buttons.cancel).click(function() {
            // Check if timeout is set.
            if (options.timeout != 0) {
                clearTimeout(timer);
            }
            if (options.stopAfter != 'cancel' && options.stopAfter != 'once') {
                $target.one(type, handler);
            }
            $target.show();
            $dialog.hide();
            return false;
        });

        if (options.buttons.cls) {
            $ok.addClass(options.buttons.cls);
            $cancel.addClass(options.buttons.cls);
        }

        var $dialog = jQuery(options.wrapper)
    .append(options.msg)
    .append($ok)
    .append(options.buttons.separator)
    .append($cancel);

        var handler = function() {
            jQuery(this).hide();

            // Do this check because of a jQuery bug
            if (options.dialogShow != 'show') {
                $dialog.hide();
            }

            $dialog.insertBefore(this);
            // Display the dialog.
            $dialog[options.dialogShow](options.dialogSpeed);
            if (options.timeout != 0) {
                // Set timeout
                clearTimeout(timer);
                timer = setTimeout(function() { $cancel.click(); $target.one(type, handler); }, options.timeout);
            }
            return false;
        };

        saveHandlers();
        $target.unbind(type);
        target._confirm = handler
        target._confirmEvent = type;
        $target.one(type, handler);
    });
}

