jQuery.extend(
{
	defaults:
	{
		postfix: '',
		buttons:
		[
			{text: 'OK',value: true},
			{text: 'Cancel',value: false}
		], 
		onLoad: function(){},
		onSubmit:function(){return true},
		onHide: function(){},
		opacity: 0.5,
		zIndex: 999,
		overlaySpeed:100,
		modalSpeed:100,
		focus: 0,
		message: false,
		url: null,
		data: null,
		width: 400,
		height: null,
		appendTo: 'body',
		results: null,
		delay: 0,
		isHandlable: true,
		isClosable: true,
		isResizable: true,
		drawOverlay: true
	},
	setModalDefaults: function(obj)
	{
		jQuery.defaults = jQuery.extend({},jQuery.defaults,obj);
	},
	modal: function(options)
	{
		options = jQuery.extend({},jQuery.defaults,options);
		
		if(options.drawOverlay)
		{
			var overlay = jQuery('<div class="modalOverlay' + options.postfix + ' modalOverlayDiv"></div>').css({
				position: 'absolute',
				top: 0,
				left: 0,
				width: '100%',
				height: jQuery(document).height(),
				display: 'none',
				zIndex: options.zIndex,
				opacity: options.opacity
			}).appendTo('body').fadeIn(options.overlaySpeed).click(function(){
				jQuery.removeModals(options.modalSpeed);
			});
		}	

		var modal = jQuery('<div class="modal' + options.postfix + ' modalbox"></div>');
		if(options.isHandlable) modal.append('<div class=modalHandle></div>');
		if(options.isClosable) modal.find('.modalHandle').append('<div class=modalClose></div>');
		if(options.isResizable) modal.append('<div class=modalResize></div>');
				
		if(options.message)
		{
			modal.append('<div class=modalContent>' + options.message +'</div>');
			jQuery.drawModal(modal,options);
			if(window.init_fields) init_fields(modal);
			else if(window.init) init(modal);
			if(options.onLoad) options.onLoad();
			if(options.delay) setTimeout(function(){
				jQuery.removeModal(modal,options.modalSpeed,options.onHide);
			},options.delay);
		}
		if(options.url)
		{
			jQuery.drawLoading();
			jQuery('<div class=modalAjax></div>').appendTo(modal).load(options.url,options.data,function(data){
				jQuery.drawModal(modal,options);
				if(window.init_fields) init_fields(modal);
				else if(window.init) init(modal);
				if(options.onLoad) options.onLoad(data);
			});
		}
	},
	drawModal: function(modal,options){
		if(options.width) modal.width(options.width);
		if(options.height) modal.height(options.height);
		modal.css({
			position: 'absolute',
			display: 'none',
			zIndex: (options.zIndex + 1)
		}).appendTo(options.appendTo);
		//modal.find('.modalHandle').width(modal.width())
		var wh = parseInt(jQuery(window).height());
		if(modal.height() > wh)
		{
			modal.height(wh - 50).find('.modalAjax,.modalContent').css('overflow','auto').height(wh - 100);
		}
		var coords = jQuery.getCoords(modal);
		modal.css({left:coords.left,top:coords.top}).fadeIn(options.modalSpeed);
		modal.find('.modalClose').click(function(){
			jQuery.removeModal(modal,options.modalSpeed,options.onHide);
		});
		
		if(options.buttons)
		{
			var bdiv = '<div class=modalButtons>';
			var values = [];
			for(i in options.buttons)
			{
				values[i] = options.buttons[i].value;
				bdiv += '<input type=button class="modalButton" id=modalButton' + i + ' value="' + options.buttons[i].text + '">';
			}
			bdiv += '</div>';
			modal.append(bdiv);
			if(options.results)
			{
				var results = jQuery('<div class=modalResults></div>').appendTo(modal);
			}
			if(options.focus != null) modal.find(':input.modalButton')[options.focus].focus();
			modal.find(':input.modalButton').click(function(){
				var value = jQuery(this).attr('id').replace(/\D/g,'');
				value = parseInt(value);
				value = values[value];
				
				var inputs = [];
				modal.find('.modalContent,.modalAjax').find(':text,:radio:checked,textarea').each(function(){
					var input_name = jQuery(this).attr('name');
					inputs[input_name] = jQuery(this).val();
				})
				
				if(options.onSubmit)
				{
					var result = options.onSubmit(value,inputs,modal,results);
					if(result === true)
					{
						jQuery.removeModal(modal,options.onHide);
					}
				}
			})
		}
		jQuery.removeLoading();
		
	},
	removeModal: function(obj,speed,callback){
		jQuery('.modalOverlayDiv').remove();
		jQuery(obj).remove();
	},
	removeModals: function(speed){
		if(!speed) speed = 'fast';
		jQuery('.modalOverlayDiv').remove();
		jQuery('.modalbox').fadeOut(speed,function(){jQuery(this).remove()});
	},
	drawLoading: function(){
		var loading = jQuery('<div id=loading><img src="/lib/images/loading.gif"></div>');
		var coords = jQuery.getCoords(loading);
		loading.css({
			'left': coords.left,
			'top': coords.top,
			position: 'absolute',
			zIndex: 30000
		}).appendTo('body');
	},
	removeLoading: function(){
		jQuery('#loading').remove();
	},
	getCoords: function(obj){
		var left_coord = jQuery(document).scrollLeft() + (jQuery(window).width() - obj.width()) / 2;
		var top_coord = jQuery(document).scrollTop() + (jQuery(window).height() - obj.height()) / 2;
		return {
			'left': left_coord,
			'top': top_coord
		}
	}
});