//
// create closure
//
(function($) {
	var $this;

	//
	// plugin definition
	//
	$.fn.extend({
		
		fade_out: function(options, call_back) { 

			$.fade_out_pvars.opt = $.extend({},$.fade_outSetup.defaults, options);		// extend options
			$this = $(this);
			$.fade_out_pvars.callback = call_back;

			new $.fade_outSetup();
		}

	});

	//
	// private function for debugging
	//
	function debug(msg) {
		if (window.console && window.console.log)
		window.console.log(msg);
		window.status = msg.srcElement;
	};

	//
	// plugin setup
	//
	$.fade_outSetup = function() {
		$this.css({
			opacity: 1
		});
		var frate = $.fade_out_pvars.opt.frate;
		if (frate <= 0) frate = 10;
		var interval = parseInt(1000 / frate, 10);
		if (interval < 1) interval = 1;
		var spd = $.fade_out_pvars.opt.speed;
		if (spd <= 0) speed = 1000;
/*
		var diff = $this.css('opacity') / (spd / interval);
		if (diff < 0.01) diff = 0.01;
		$.fade_out_pvars.diff = diff;
		$.fade_out_pvars.cur_val = 1;
		$.fade_out_pvars.timerid = window.setInterval(function() {
			if ($.fade_out_pvars.cur_val == 0) {
				window.clearInterval($.fade_out_pvars.timerid);
				$.fade_out_pvars.timerid = 0;
				if ($.fade_out_pvars.callback) $.fade_out_pvars.callback();
			} else {
				var new_val = $.fade_out_pvars.cur_val - $.fade_out_pvars.diff;
				if (new_val < 0) new_val = 0;
				$this.css({opacity: new_val});
				$.fade_out_pvars.cur_val = new_val;
			}
		}, interval);
*/
		var diff = (Math.PI / 2) / (spd / interval);
		$.fade_out_pvars.diff = diff;
		$.fade_out_pvars.cur_val = 0;
		$.fade_out_pvars.timerid = window.setInterval(function() {
			if ($.fade_out_pvars.cur_val >= (Math.PI/2)) {
				window.clearInterval($.fade_out_pvars.timerid);
				$.fade_out_pvars.timerid = 0;
				if ($.fade_out_pvars.callback) $.fade_out_pvars.callback();
			} else {
				var new_val = $.fade_out_pvars.cur_val + $.fade_out_pvars.diff;
				if (new_val > (Math.PI/2)) {
					new_val = Math.PI/2;
				}
				$this.css({opacity: (1-Math.sin(new_val))});
				$.fade_out_pvars.cur_val = new_val;
			}
		}, interval);
	};
	//
	// plugin defaults
	//
	$.fade_outSetup.defaults = {
		frate: 18,
		speed: 1000
	};
	$.fade_out_pvars = {
		timer_id: 0,
		cur_val: 1,
		diff: 0,
		opt: null
	};



//
// end of closure
//
})(jQuery);
