// jQuery Alert Dialogs Plugin
//
// Version 1.1
//
// Cory S.N. LaViska
// A Beautiful Site (http://abeautifulsite.net/)
// 14 May 2009
//
// Visit http://abeautifulsite.net/notebook/87 for more information
//
// Usage:
//		jAlert( message, [title, callback] )
//		jConfirm( message, [title, callback] )
//		jPrompt( message, [value, title, callback] )
// 
// History:
//
//		1.00 - Released (29 December 2008)
//
//		1.01 - Fixed bug where unbinding would destroy all resize events
//
// License:
// 
// This plugin is dual-licensed under the GNU General Public License and the MIT License and
// is copyright 2008 A Beautiful Site, LLC. 
//
(function(jQuery) {
	
	jQuery.alerts = {
		
		// These properties can be read/written by accessing jQuery.alerts.propertyName from your scripts at any time
		
		verticalOffset: -75,                // vertical offset of the dialog from center screen, in pixels
		horizontalOffset: 0,                // horizontal offset of the dialog from center screen, in pixels/
		repositionOnResize: true,           // re-centers the dialog on window resize
		overlayOpacity: .01,                // transparency level of overlay
		overlayColor: '#FFF',               // base color of overlay
		draggable: true,                    // make the dialogs draggable (requires UI Draggables plugin)
		okButton: '&nbsp;OK&nbsp;',         // text for the OK button
		cancelButton: '&nbsp;Отмена&nbsp;', // text for the Cancel button
		dialogClass: null,                  // if specified, this class will be applied to all dialogs
		var1Button: '&nbsp;Вариант 1&nbsp;',
		var2Button: '&nbsp;Вариант 2&nbsp;',
		
		// Public methods
		
		alert: function(message, title, callback) {
			if( title == null ) title = 'Alert';
			jQuery.alerts._show(title, message, null, 'alert', function(result) {
				if( callback ) callback(result);
			});
		},
		
		confirm: function(message, title, callback) {
			if( title == null ) title = 'Confirm';
			jQuery.alerts._show(title, message, null, 'confirm', function(result) {
				if( callback ) callback(result);
			});
		},
			
		prompt: function(message, value, title, callback) {
			if( title == null ) title = 'Prompt';
			jQuery.alerts._show(title, message, value, 'prompt', function(result) {
				if( callback ) callback(result);
			});
		},

		mod_confirm: function(message, title, callback, var1, var2) {
			if( title == null ) title = 'Confirm';
			if( var1 != null ) jQuery.alerts.var1Button = var1;
			if( var2 != null ) jQuery.alerts.var2Button = var2;
			jQuery.alerts._show(title, message, null, 'mod_confirm', function(result) {
				if( callback ) callback(result);
			});
		},

		no_auth: function(callback) {
			jQuery.alerts._show('Необходима авторизация', '', null, 'no_auth', function(result) {
				if( callback ) callback(result);
			});
		},
		
		// Private methods
		
		_show: function(title, msg, value, type, callback) {
			jQuery.alerts._hide();
			jQuery.alerts._overlay('show');
			
			if (type == 'no_auth') {
				jQuery("BODY").append(
				  '<div id="nologin" class="popup_nologin">' +
					'<span class="close_pp" title="закрыть"></span>' +
					'<h3>' + title + '</h3>' +
					'<p>Чтобы воспользоваться данным сервисом, <a class="green" href="/main/auth/login/" onclick="window.location.replace(this.href+\'?back=\'+encodeURI(window.location.href)); return false;">авторизуйтесь</a>.</p>' +
					'<p>Если у вас нет учетной записи, пройдите <a class="red" href="/main/registration/">регистрацию</a>.</p>' +
				  '</div>');
				
				jQuery("#nologin").css({
					position: 'absolute',
					zIndex: 99999,
					padding: 0,
					margin: 0
				});

				var top = ((jQuery(window).height() / 2) - (jQuery("#nologin").outerHeight() / 2)) + jQuery.alerts.verticalOffset;
				var left = ((jQuery(window).width() / 2) - (jQuery("#nologin").outerWidth() / 2)) + jQuery.alerts.horizontalOffset;
				if( top < 0 ) top = 0;
				if( left < 0 ) left = 0;
				// IE6 fix
				if( jQuery.browser.msie && parseInt(jQuery.browser.version) <= 6 ) top = top + jQuery(window).scrollTop();
				jQuery("#nologin").css({
					top: top + 'px',
					left: left + 'px'
				});
				jQuery("#popup_overlay").height( jQuery(document).height() );

				JSFX.add('nologin');
				JSFX.start('nologin');
			} else {
				jQuery("BODY").append(
				  '<div id="popup_container">' +
					'<h1 id="popup_title"></h1>' +
					'<div id="popup_content">' +
					  '<div id="popup_message"></div>' +
					'</div>' +
				  '</div>');

				if( jQuery.alerts.dialogClass ) jQuery("#popup_container").addClass(jQuery.alerts.dialogClass);
				
				// IE6 Fix
				var pos = (jQuery.browser.msie && parseInt(jQuery.browser.version) <= 6 ) ? 'absolute' : 'fixed'; 
				
				jQuery("#popup_container").css({
					position: pos,
					zIndex: 99999,
					padding: 0,
					margin: 0
				});
				
				jQuery("#popup_title").text(title);
				jQuery("#popup_content").addClass(type);
				jQuery("#popup_message").text(msg);
				jQuery("#popup_message").html( jQuery("#popup_message").text().replace(/\n/g, '<br />') );
				
				jQuery("#popup_container").css({
					minWidth: jQuery("#popup_container").outerWidth(),
					maxWidth: jQuery("#popup_container").outerWidth()
				});

				jQuery.alerts._reposition();
			}
			
			
			jQuery.alerts._maintainPosition(true);
			
			switch( type ) {
				case 'alert':
					jQuery("#popup_message").after('<div id="popup_panel"><input type="button" value="' + jQuery.alerts.okButton + '" id="popup_ok" /></div>');
					jQuery("#popup_ok").click( function() {
						jQuery.alerts._hide();
						callback(true);
					});
					jQuery("#popup_ok").focus().keypress( function(e) {
						if( e.keyCode == 13 || e.keyCode == 27 ) jQuery("#popup_ok").trigger('click');
					});
				break;
				case 'no_auth':
					jQuery("#nologin .close_pp").click( function() {
						jQuery("#nologin").remove();
						jQuery.alerts._overlay('hide');
						jQuery.alerts._maintainPosition(false);
						JSFX.stop('nologin');
						if( callback ) callback();
					});
				break;
				case 'confirm':
					jQuery("#popup_message").after('<div id="popup_panel"><input type="button" value="' + jQuery.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + jQuery.alerts.cancelButton + '" id="popup_cancel" /></div>');
					jQuery("#popup_ok").click( function() {
						jQuery.alerts._hide();
						if( callback ) callback(true);
					});
					jQuery("#popup_cancel").click( function() {
						jQuery.alerts._hide();
						if( callback ) callback(false);
					});
					jQuery("#popup_ok").focus();
					jQuery("#popup_ok, #popup_cancel").keypress( function(e) {
						if( e.keyCode == 13 ) jQuery("#popup_ok").trigger('click');
						if( e.keyCode == 27 ) jQuery("#popup_cancel").trigger('click');
					});
				break;
				case 'prompt':
					jQuery("#popup_message").append('<br /><input type="text" size="30" id="popup_prompt" />').after('<div id="popup_panel"><input type="button" value="' + jQuery.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + jQuery.alerts.cancelButton + '" id="popup_cancel" /></div>');
					jQuery("#popup_prompt").width( jQuery("#popup_message").width() );
					jQuery("#popup_ok").click( function() {
						var val = jQuery("#popup_prompt").val();
						jQuery.alerts._hide();
						if( callback ) callback( val );
					});
					jQuery("#popup_cancel").click( function() {
						jQuery.alerts._hide();
						if( callback ) callback( null );
					});
					jQuery("#popup_prompt, #popup_ok, #popup_cancel").keypress( function(e) {
						if( e.keyCode == 13 ) jQuery("#popup_ok").trigger('click');
						if( e.keyCode == 27 ) jQuery("#popup_cancel").trigger('click');
					});
					if( value ) jQuery("#popup_prompt").val(value);
					jQuery("#popup_prompt").focus().select();
				break;
				case 'mod_confirm':
					jQuery("#popup_message").after('<div id="popup_panel"><input type="button" value="' + jQuery.alerts.var1Button + '" id="popup_var1" /> <input type="button" value="' + jQuery.alerts.var2Button + '" id="popup_var2" /> <input type="button" value="' + jQuery.alerts.cancelButton + '" id="popup_cancel" /></div>');
					jQuery("#popup_var1").click( function() {
						jQuery.alerts._hide();
						if( callback ) callback(1);
					});
					jQuery("#popup_var2").click( function() {
						jQuery.alerts._hide();
						if( callback ) callback(2);
					});
					jQuery("#popup_cancel").click( function() {
						jQuery.alerts._hide();
						if( callback ) callback(false);
					});
					jQuery("#popup_cancel").focus();
					jQuery("#popup_cancel").keypress( function(e) {
						if( e.keyCode == 27 ) jQuery("#popup_cancel").trigger('click');
					});
				break;
			}
			
			// Make draggable
			if( jQuery.alerts.draggable ) {
				try {
					jQuery("#popup_container").draggable({ handle: jQuery("#popup_title") });
					jQuery("#popup_title").css({ cursor: 'move' });
				} catch(e) { /* requires jQuery UI draggables */ }
			}
		},
		
		_hide: function() {
			jQuery("#popup_container").remove();
			jQuery.alerts._overlay('hide');
			jQuery.alerts._maintainPosition(false);
		},
		
		_overlay: function(status) {
			switch( status ) {
				case 'show':
					jQuery.alerts._overlay('hide');
					jQuery("BODY").append('<div id="popup_overlay"></div>');
					jQuery("#popup_overlay").css({
						position: 'absolute',
						zIndex: 99998,
						top: '0px',
						left: '0px',
						width: '100%',
						height: jQuery(document).height(),
						background: jQuery.alerts.overlayColor,
						opacity: jQuery.alerts.overlayOpacity
					});
				break;
				case 'hide':
					jQuery("#popup_overlay").remove();
				break;
			}
		},
		
		_reposition: function() {
			var top = ((jQuery(window).height() / 2) - (jQuery("#popup_container").outerHeight() / 2)) + jQuery.alerts.verticalOffset;
			var left = ((jQuery(window).width() / 2) - (jQuery("#popup_container").outerWidth() / 2)) + jQuery.alerts.horizontalOffset;
			if( top < 0 ) top = 0;
			if( left < 0 ) left = 0;
			
			// IE6 fix
			if( jQuery.browser.msie && parseInt(jQuery.browser.version) <= 6 ) top = top + jQuery(window).scrollTop();
			
			jQuery("#popup_container").css({
				top: top + 'px',
				left: left + 'px'
			});
			jQuery("#popup_overlay").height( jQuery(document).height() );
		},
		
		_maintainPosition: function(status) {
			if( jQuery.alerts.repositionOnResize ) {
				switch(status) {
					case true:
						jQuery(window).bind('resize', jQuery.alerts._reposition);
					break;
					case false:
						jQuery(window).unbind('resize', jQuery.alerts._reposition);
					break;
				}
			}
		}
		
	}
	
	// Shortuct functions
	jAlert = function(message, title, callback) {
		if (navigator.appVersion.indexOf("MSIE") != -1) {
			message = message.replace(/<br>/gi, "\n");
			message = message.replace(/<\/?[^>]+>/gi, '');
			alert(message);
			if (typeof(callback) == 'function') {
				callback();
			}
		} else {
			jQuery.alerts.alert(message, title, callback);
		}
	}
	
	jConfirm = function(message, title, callback) {
		if (navigator.appVersion.indexOf("MSIE") != -1) {
			message = message.replace(/<br>/gi, "\n");
			message = message.replace(/<\/?[^>]+>/gi, '');
			if(!window.confirm(message)) {
				if (typeof(callback) == 'function') {
					callback(false);
				}
			} else {
				if (typeof(callback) == 'function') {
					callback(true);
				}
			}
		} else {
			jQuery.alerts.confirm(message, title, callback);
		}
	};
		
	jPrompt = function(message, value, title, callback) {
		jQuery.alerts.prompt(message, value, title, callback);
	};

	jModConfirm = function(message, title, callback, var1, var2) {
		jQuery.alerts.mod_confirm(message, title, callback, var1, var2);
	};

	jNoAuth = function(callback) {
		jQuery.alerts.no_auth(callback);
	};
	
})(jQuery);