/**
 * jQuery Easy Confirm Dialog plugin 1.1
 *
 * Copyright (c) 2010 Emil Janitzek (http://projectshadowlight.org)
 * Based on Confirm 1.3 by Nadia Alramli (http://nadiana.com/)
 *
 * Samples and instructions at: 
 * http://projectshadowlight.org/jquery-easy-confirm-dialog/
 *
 * This script is free software: you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by the Free 
 * Software Foundation, either version 3 of the License, or (at your option)
 * any later version.
 */  
(function($) {
  $.easyconfirm = { };
  $.easyconfirm.locales = { };
  $.easyconfirm.locales.enUS = {
    title: 'Are you sure?',
    text: 'Are you sure that you want to perform this action?',
    button: ['Cancel', 'Confirm'],
    closeText: 'close'
  };
  
	$.fn.easyconfirm = function(options) {
	  var options = jQuery.extend({
	    eventType: 'click',
	    icon: 'help'
	  }, options);
	  
	  var locale = jQuery.extend({}, $.easyconfirm.locales.enUS, options.locale);
  
	  // Shortcut to eventType.
	  var type = options.eventType;
  
	  return this.each(function() {
	    var target = this;
	    var $target = jQuery(target);
    
      // If no events present then and if there is a valid url, then trigger url change
	    var urlClick = function() {
	      if (target.href) {
	        var length = String(target.href).length;
	        if (target.href.substring(length-1,length) != '#')
	          document.location = target.href;
	      }
	    }
    
	    // If any handlers where bind before triggering, lets save them and add them later
	    var saveHandlers = function() {
	      var events = jQuery.data(target, 'events');
	      if (events) {        
	        target._handlers = new Array();
	        for (var i in events[type]) {
	          target._handlers.push(events[type][i]);
	        }
      
	        $target.unbind(type); 
	      }
	    }
	    // Re-bind old events
	    var rebindHandlers = function() {
	      if (target._handlers != undefined) {
	        jQuery.each(target._handlers, function() {
	          $target.bind(type, this);
	        });
	      }
	    }
      
      
      var dialog = (options.dialog == undefined || typeof(options.dialog) != 'object') ? 
                     $('<div class="dialog confirm">'+ locale.text +'</div>'):
                     options.dialog;
      
      var buttons = { };
      buttons[locale.button[1]] = function() { 
        // Unbind overriding handler and let default actions pass through
        $target.unbind(type, handler);
      
        // Close dialog
        $(dialog).dialog("close");
      
        // Check if there is any events on the target
        if (jQuery.data(target, 'events')) {                           
          // Trigger click event.
          $target.click();                                      
        } else {
          // No event trigger new url
          urlClick();
        }
      
        init();

      };
      buttons[locale.button[0]] = function() { 
        $(dialog).dialog("close"); };
      
	    $(dialog).dialog({ autoOpen: false,
			                   resizable: false,
	                       draggable: true,
	                       closeOnEscape: true,
	                       width: 'auto',
	                       height: 120,
	                       minHeight: 120,
	                       maxHeight: 200,
	                       buttons: buttons,
	                       title: locale.title,
	                       closeText: locale.closeText,
	                       modal: true});
    
	    // Handler that will override all other actions
	    var handler = function(event) {
	      $(dialog).dialog('open');
	      event.stopImmediatePropagation();
	      event.preventDefault();
	      return false;
	    }
    
	    var init = function() { 
	      saveHandlers();
	      $target.bind(type, handler);
	      rebindHandlers();
	    }
    
	    init();

	  });
  
	}
})(jQuery);
