(function($){
	var jmodalObject;
	var jIgnoreEscape;
	
	$.fn.jmodal = function (options) {
		return $.jmodal(this, options);
	};
	
	$.jmodal = function(data, options) {
		var defaults = {
			width: 400,
			height: 300,
			top: null,
			left: null,
			overflow: 'auto',
			textAlign: 'left',
			modalColor: '#FFFFFF',
			borderStyle: 'solid',
			borderWidth: '3',
			maskColor: '#000000',
			borderColor: '#DADADA',
			padding: 5,
			opacity: 60,
			showClose: true,
			closeOffsetTop: -15,
			closeOffsetLeft: -15,
			autoFit: true,
			ignoreEscape: false
		};
		var options = $.extend(defaults, options);
		jIgnoreEscape = options.ignoreEscape;
		
		//resize div if larger than window size
		if ( options.autoFit == true ){
			if ( options.width != 'auto' ) {
				if ( (options.width * 1) > ($(window).width() - 25) ){
					options.width = ($(window).width() - 25);
				};
			};
			if ( options.height != 'auto' ) {
				if ( (options.height * 1) > ($(window).height() - 25) ){
					options.height = ($(window).height() - 25);
				};
			};
		};
		
		//calculations to center div in window
		if ( options.top == null ){
			options.top = $(window).height()/2-options.height/2;
			options.top = Math.round((options.top * 1) + $(window).scrollTop());
		};
		if ( options.left == null ){
			options.left = $(window).width()/2-options.width/2;
			options.left = Math.round((options.left * 1) + $(window).scrollLeft());
		};
		
		//set height / width if auto option supplied
		if ( options.height == 'auto' ){
			options.height = null;
		} else {
			options.height = options.height + 'px';
		};
		if ( options.width == 'auto' ){
			options.width = null;
		} else {
			options.width = options.width + 'px';
		};
		
		//set padding
		if ( options.padding != '' && options.padding != null ){
			options.padding += 'px';
		};
		
		//eval object type
		if (typeof data == 'object') {
			jmodalObject = $(data);
		} else {
			if ( $('#jmodalWindow').length == 0 ){
				$("body").append('<div id="jmodalWindow"></div>');
			};
			jmodalObject = $("#jmodalWindow");
			$("#jmodalWindow").html(data);
		};
		
		//append divs to body if they don't already exist
		if ( $('#jmodalMask').length == 0 ){
			$("body").append('<div id="jmodalMask"></div>');
			$("#jmodalMask").bind("click", function(e){
				return $.jmodal.close();
			});
			$("body").append('<div id="jmodalClose"></div>');
			$("#jmodalClose").bind("click", function(e){
				return $.jmodal.close();
			});
		};
		
		//style & display jmodalObject
		var cssObject = {}, cssName = null, cssValue = null;
			cssObject['position'] = 'absolute';
			cssObject['top'] = options.top + 'px';
			cssObject['left'] = options.left + 'px';
			cssObject['z-index'] = '8001';
			if ( options.height != null ) { cssObject['height'] = options.height };
			if ( options.width != null ) { cssObject['width'] = options.width };
			if ( options.padding != null ) { cssObject['padding'] = options.padding };
			if ( options.textAlign != null ) { cssObject['text-align'] = options.textAlign };
			if ( options.borderStyle != null || options.borderWidth != null || options.borderColor != null ) { cssObject['border'] = options.borderStyle + ' ' + options.borderWidth + 'px ' + options.borderColor };
			if ( options.modalColor != null ) { cssObject['background-color'] = options.modalColor };
			if ( options.overflow != null ) { cssObject['overflow'] = options.overflow };
		$(jmodalObject).css(cssObject);
		$("#jmodalMask").css({'height':$(document).height()+'px','background-color':options.maskColor,'opacity':(options.opacity / 100),'filter':'alpha(opacity='+options.opacity+')'});
		$(jmodalObject).show('fast');
		$("#jmodalMask").show('fast');
		if ( options.showClose ){
			$("#jmodalClose").css({'top':(parseInt(options.top)+parseInt(options.closeOffsetTop))+'px','left':(parseInt(options.left)+parseInt(options.closeOffsetLeft))+'px'}).show();
		};
	};
	
	$.jmodal.close = function (obj) {
		$(jmodalObject).hide('fast');
		$("#jmodalMask").hide();
		$("#jmodalClose").hide();
	};
	
	$(document).keyup(function(event){
		if ( $(jmodalObject).is(':visible') && event.keyCode == 27 && jIgnoreEscape == false ) {
			return $.jmodal.close();
		}
	});

})(jQuery);
