(function($){
	
	var defaults = {
		'text'		: '',
		'overlay'	: true,
		'txtCancel'	: 'Cancel',
		'txtClose'	: 'Close',
		'txtOk'		: 'OK',
		'htmlCancel': null,
		'htmlClose'	: null,
		'htmlOk'	: null,
		'buttons'	: 'ok cancel',
		'onCancel'	: null,
		'onClose'	: null,
		'onOk'		: null,
		'onSubmit'	: null,
		'onInit'	: null,
		'className'	: null,
		'closeOnClick': false,
		'left'		: null,
		'top'		: null,
		'overlayColor' : null,
		'overlayOpacity' : null,
		'toolbar'	: false,
		'toolbarClose' : true,
		'dialogType'	: 'msg'
		
	};
	
	$.fn.jDialogBox = function(o){
		
		var options = $.extend(defaults, o || {});
		
		function _initBox(el){
			var $box = $('#jDialogBox');
			if ($box.size()) return $box;
			var html = '<div id="jDialogBox" class="js-dialog-box"><div class="mask"></div><div class="box-wrapper">'
				+ (options.toolbar ? '<div class="toolbar"></div>' : '')
				+ '<div class="box dialog-'+options.dialogType+'"><div class="text"></div>'
				+ '<div class="actions"></div><div class="clear" style="clear: both"></div></div></div></div>';
			$box = $(html);
			if (options.toolbar){
				if (options.toolbarClose) 
					$box.find('div.toolbar:first').append('<a href="#close" class="close js-btn-close" title="'+options.txtClose+'"></a>');
			}
			if (options.className) $box.addClass(options.className);
			
			$box.find('> .mask:first').each(function(){
				if (options.overlayColor) $(this).css('background-color', options.overlayColor);
				if (options.overlayOpacity) $(this).css('opacity', options.overlayOpacity);
				if (!options.overlay) $(this).remove();
			});
			
			$box.find('div.box:first div.text').append(options.text);
			var arr = options.buttons.split(' '), $act = $box.find('div.box:first div.actions');
			for (var i=0; i<arr.length; i++){
				var name = arr[i].substr(0, 1).toUpperCase() + arr[i].substr(1, arr[i].length - 1);
				var $btn = $(options['html'+name] ? options['html'+name] 
					: '<input type="button" name="'+arr[i]+'" value="'+options['txt'+name]+'" class="'+arr[i]+' dialog-button" />');
				if (!$btn.is('.js-btn-'+arr[i])) $btn.addClass('js-btn-'+arr[i]);
				$btn.appendTo($act);
			}
			
			$box.unbind('close').bind('close',function(event){
				$box.remove();
			});
			
			$box.find('div.mask:first').unbind('click').click(function(){
				if (options.closeOnClick) $box.trigger('close');
				return true;
			});
			
			$box.find('.js-btn-cancel, .js-btn-close').unbind('click').click(function(){
				$box.trigger('close');
				if (typeof options.onClose == 'function') options.onClose.call(this);
				if (typeof options.onSubmit == 'function') options.onSubmit.call(this, false);
				return false;
			});
			
			$box.find('.js-btn-ok').click(function(){
				$box.trigger('close');
				if (typeof options.onOk == 'function') options.onOk.call(this);
				if (typeof options.onSubmit == 'function') options.onSubmit.call(this, true);
				return false;
			});
			
			$box.prependTo(el);
			return $box;
		}
		
		function _resizeBox($box){
			$box.height(getWindowSize('height'));
			$box.find('div.box-wrapper').each(function(){
				if (options.left || options.top){
					$(this).css({
						'left'	: options.left+'px',
						'top'	: (options.top > 10 ? options.top : 10)+'px'
					});
				} else {
					var top = (getWindowSize('windowHeight')-$(this).height())/2;
					$(this).css({
						'left'	: (getWindowSize('windowWidth')-$(this).width())/2+getWindowScroll('left')+'px',
						'top'	: (top > 10 ? top : 10)+'px'
					});
				}
			});
		};
		
		return this.each(function(){
			var $container = $(this);
			/*
			var $box = $container.find('.js-dialog-box:first');
			if (!$box.size())
			*/
			var $box = _initBox($container);
			
			if ($box) _resizeBox($box);
			
			if (typeof options.onInit == 'function') options.onInit.call($box.get(0));
		});
	}

})(jQuery)

