/*
 * jQuery Fast Confirm
 * version: 1.1.1 (2010-11-11)
 * @requires jQuery v1.3.2 or later
 *
 * Examples and documentation at: http://blog.pierrejeanparra.com/jquery-plugins/fast-confirm/
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
;(function($) {
	
	$.fn.fastConfirm = function(options) {
		var params;
		
		if (!this.length) {
			return this;
		}
			
		$.fastConfirm = {
			defaults: {
				position: 'bottom',
				offset: {top: 0, left: 0},
				zIndex: 10000,
				questionText: "Are you sure?",
				proceedText: "Yes",
				cancelText: "No",
				fastConfirmClass: "fast_confirm",
				onProceed: function(trigger) {},
				onCancel: function(trigger) {}
			}
		};
		
		params = $.extend($.fastConfirm.defaults, options || {});
		
		return this.each(function() {
			var offset,
				topOffset,
				leftOffset,
				trigger = this,
				$confirmYes = $('<button class="' + params.fastConfirmClass + '_proceed">' + params.proceedText + '</button>'),
				$confirmNo = $('<button class="' + params.fastConfirmClass + '_cancel">' + params.cancelText + '</button>'),
				$confirmBox = $('<div class="' + params.fastConfirmClass + '"><div class="' + params.fastConfirmClass + '_arrow_border"></div><div class="' + params.fastConfirmClass + '_arrow"></div>' + params.questionText + '<br/></div>'),
				$arrow = $('div.' + params.fastConfirmClass + '_arrow', $confirmBox),
				$arrowBorder = $('div.' + params.fastConfirmClass + '_arrow_border', $confirmBox),
				confirmBoxArrowClass,
				confirmBoxArrowBorderClass,
				offset = $(trigger).offset();
			
			if (!$(trigger).data('fastconfirm_binded')) {
				// Register actions
				$confirmYes.click(function() {
					params.onProceed(trigger);
					$(trigger).removeData('fastconfirm_binded');
					$(this).closest('div.' + params.fastConfirmClass).remove();
				});
				
				$confirmNo.click(function() {
					params.onCancel(trigger);
					$(trigger).removeData('fastconfirm_binded');
					$(this).closest('div.' + params.fastConfirmClass).remove();
				});
				
				// Append the confirm box to the body. It will not be visible as it is off-screen by default. Positionning will be done at the last time
				$confirmBox.append($confirmYes).append($confirmNo);
				$('body').append($confirmBox);
				
				// Calculate absolute positionning depending on the trigger-relative position 
				switch (params.position) {
					case 'top':
						confirmBoxArrowClass = params.fastConfirmClass + '_bottom';
						confirmBoxArrowBorderClass = params.fastConfirmClass + '_bottom';
						
						$arrow.addClass(confirmBoxArrowClass).css('left', $confirmBox.outerWidth()/2 - $arrow.outerWidth()/2);
						$arrowBorder.addClass(confirmBoxArrowBorderClass).css('left', $confirmBox.outerWidth()/2 - $arrowBorder.outerWidth()/2);
						
						topOffset = offset.top - $confirmBox.outerHeight() - $arrowBorder.outerHeight() + params.offset.top;
						leftOffset = offset.left - $confirmBox.outerWidth()/2 + $(trigger).outerWidth()/2 + params.offset.left;
						break;
					case 'right':
						confirmBoxArrowClass = params.fastConfirmClass + '_left';
						confirmBoxArrowBorderClass = params.fastConfirmClass + '_left';
						
						$arrow.addClass(confirmBoxArrowClass).css('top', $confirmBox.outerHeight()/2 - $arrow.outerHeight()/2);
						$arrowBorder.addClass(confirmBoxArrowBorderClass).css('top', $confirmBox.outerHeight()/2 - $arrowBorder.outerHeight()/2);
						
						topOffset = offset.top + $(trigger).outerHeight()/2 - $confirmBox.outerHeight()/2 + params.offset.top;
						leftOffset = offset.left + $(trigger).outerWidth() + $arrowBorder.outerWidth() + params.offset.left;
						break;
					case 'bottom':
						confirmBoxArrowClass = params.fastConfirmClass + '_top';
						confirmBoxArrowBorderClass = params.fastConfirmClass + '_top';
						
						$arrow.addClass(confirmBoxArrowClass).css('left', $confirmBox.outerWidth()/2 - $arrow.outerWidth()/2);
						$arrowBorder.addClass(confirmBoxArrowBorderClass).css('left', $confirmBox.outerWidth()/2 - $arrowBorder.outerWidth()/2);
						
						topOffset = offset.top + $(trigger).outerHeight() + $arrowBorder.outerHeight() + params.offset.top;
						leftOffset = offset.left - $confirmBox.outerWidth()/2 + $(trigger).outerWidth()/2 + params.offset.left;
						break;
					case 'left':
						confirmBoxArrowClass = params.fastConfirmClass + '_right';
						confirmBoxArrowBorderClass = params.fastConfirmClass + '_right';
						
						$arrow.addClass(confirmBoxArrowClass).css('top', $confirmBox.outerHeight()/2 - $arrow.outerHeight()/2);
						$arrowBorder.addClass(confirmBoxArrowBorderClass).css('top', $confirmBox.outerHeight()/2 - $arrowBorder.outerHeight()/2);
						
						topOffset = offset.top + $(trigger).outerHeight()/2 - $confirmBox.outerHeight()/2 + params.offset.top;
						leftOffset = offset.left - $confirmBox.outerWidth() - $arrowBorder.outerWidth() + params.offset.left;
						break;
				}
				
				// Make the confirm box appear right where it belongs
				$confirmBox.css({
					top: topOffset,
					left: leftOffset,
					zIndex: params.zIndex
				});
				
				$(trigger).data('fastconfirm_binded', true);
			}
		});
	};

})(jQuery);
