(function($){
	var defaults = {
			width    : 300,
			height   : 200,
			idPrefix : 'framebox-',
			zIndex	 : 10000
	};
	
	var methods = {
		init:function(options){
			
			
			var options = $.extend(options, defaults);
			
			/** Inserting elements to body **/
			if (!$('#' + options.idPrefix).length) {
				
				var overlay = '<div id="' + options.idPrefix + 'overlay" class="framebox-overlay" style="display:none;"></div>';
				var closeButton = '<div id="' + options.idPrefix + 'close-button" class="framebox-close-button"></div>';
				var contentDiv = '<div id="' + options.idPrefix + 'content" class="framebox-content"></div>';
				var modal = '<div id="' + options.idPrefix + 'modal" class="framebox-modal" style="display:none;">' + closeButton + contentDiv + '</div>';
				
				$('body').append(overlay + modal);
				
				$('#' + options.idPrefix + 'close-button').click(function(e){
					e.preventDefault();
					$.fn.framebox('close',options);
				});
			}
			
			
			
			return this.each(function(){
				$(this).data('options',options).click(function(e){
					e.preventDefault();
					$(this).framebox('open',$(this).attr('href'),$(this).data('options'));
				});
			});
		},
		
		open:function(href,options){
			options = $.extend(options,defaults);
			
			var width  = 0;
			var height = 0;
			
			if(href.match(/^[^?]+\?.*width=([0-9]+)[^0-9]*.*$/)) {
				width  = parseInt(href.replace(/^[^?]+\?.*width=([0-9]+)[^0-9]*.*$/,'$1'));
			} else {
				width = parseInt(options.width);
			}
			
			if(href.match(/^[^?]+\?.*height=([0-9]+)[^0-9]*.*$/)) {
				height = parseInt(href.replace(/^[^?]+\?.*height=([0-9]+)[^0-9]*.*$/,'$1'));
			} else {
				height = parseInt(options.height);
			}
			
			var top  = Math.max(0, parseInt((parseInt($(window).height()) - height) / 2));
			var left = Math.max(0, parseInt((parseInt($(window).width()) - width) / 2));
			
			$('#' + options.idPrefix + 'modal').css({
				'width'    : width,
				'height'   : height,
				'position' : 'fixed',
				'left'	   : left,
				'top'	     : top,
				'z-index'  : parseInt(options.zIndex) + 1
			}).show();
			
			$('#' + options.idPrefix + 'content').html('<iframe id="' + options.idPrefix + 'iframe" class="framebox-iframe" src="' + href + '"></iframe>');
			$('#' + options.idPrefix + 'close-button, #' + options.idPrefix + 'content').show();
			$('#' + options.idPrefix + 'overlay').css({'z-index' : parseInt(options.zIndex)}).show();
			
			return this;
		},
		
		close:function(options){
			var options = $.extend(options,defaults);
			
			$('#' + options.idPrefix + 'iframe').remove();
			$('#' + options.idPrefix + 'overlay, #' + options.idPrefix + 'modal, #' + options.idPrefix + 'close-button, #' + options.idPrefix + 'content').hide();
			return this;
		}
	};
	
	
	$.fn.framebox = function(method){
		
		if ( methods[method] ) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if ( typeof(method) == 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' + method + ' does not exists in jQuery.framebox');
		}
	};
	
})(jQuery);
