/*!
 * Copyright (c) 2008 Yves Magnin (wdxperience(AT)gmail(DOT)com >> http://www.wdxperience.ch)
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 *
 * This is just my first plugin's jQuery. Sorry for imperfection's code and bugs.
 * Feel free to change and/or add functionalities
 *
 * $LastChangedDate: 2010-01-05 20:56 +0100 $
 * $Rev: 14 $
 *
 * Version: 0.2
 * jquery.cornads web page http://www.wdxperience.ch/jquery/cornads/
 * I hope this code is not a nightmare for you !
 *
 * Requires: jQuery 1.2.3+
 * Optional:
 *		jQuery easing plugin >> http://gsgd.co.uk/sandbox/jquery/easing/
 *
 */

(function($){

	var $$ = $.fn.cornads = function(options) {

		var defaults = {
			cornerwidth: 300,
			cornerheight: 300,
			hdecale: 125,
			vdecale: 125,
			downduration: 1000,
			downeasing: "linear",
			openduration: 1000,
			openeasing: "linear",
			closeduration: 1000,
			closeeasing: "linear",
			vertical: "top",
			_left_original: 0,
			_left_target: 0,
			_top_original: 0,
			_top_target: 0,
			_width_original: 0,
			_width_target: 0,
			_height_original: 0,
			_height_target: 0,
			_scrollYOffset: 0,
			_viewportWidth: 0,
			_viewportHeight: 0
		};
		var options = $.extend(defaults, options);


		return this.each(function() {


			/* variables definition */
			var obj = $(this);


			/* set default CSS attributes */
			$(obj)
				.css("overflow", "hidden")
				.css("position", "absolute")
				.css("width", (options.cornerwidth - options.hdecale)+"px")
				.css("height", options.cornerheight+"px")
				.css("top", -(options.cornerheight)+"px")
				.css("display", "block");


			/* initialize element into viewport */
			$$.moveItem(obj, options, false);


			/* define mouseover-out effect */
			$(obj).hover(
				function () {
					$(obj)
						.stop()
						.animate({
							top: options._top_target,
							width: options._width_target,
							height: options._height_target,
							left: options._left_target
						}, options.openduration, options.openeasing);
				},
				function () {
					$(obj)
						.stop()
						.animate({
							top: options._top_original,
							width: options._width_original,
							height: options._height_original,
							left: options._left_original
						}, options.closeduration, options.closeeasing, function (){
							//callback: Safari 3 on winXP, overflow was lost. Horizontal scrollbar appears after mouseout (?!?!)
							if ($.browser.safari) $(obj).css("overflow", "hidden");
						});
				}
			);


			/* scroll event */
			$(window).scroll( function (event){
				$$.moveItem(obj, options, true);
			});


			/* window resize event */
			$(window).resize(function (){
				$$.moveItem(obj, options, true);
			});
		});
	};


	/* move item into the new viewport */
	$$.moveItem = function (obj, options, itsamove){

		/* hide element before fix the new position */
		$(obj).hide();

		/* get vertical scroll position */
		options._scrollYOffset = $$.getScrollY();

		/* get new viewport size */
		options._viewportWidth = $.browser.safari ? $(document).width() : $(window).width();
		options._viewportHeight = $.browser.msie ? $(window).height() : window.innerHeight;

		/* compute vertical position */
		if (options.vertical == 'bottom'){
			options._top_target = options._viewportHeight + options._scrollYOffset - options.cornerheight;
			options._top_original = options._top_target + options.vdecale;
			options._height_target = options.cornerheight;
			options._height_original = options.cornerheight - options.vdecale;
		}else{
			options._top_original = -(options.vdecale) + options._scrollYOffset;
			options._top_target = options._top_original + options.vdecale;
			options._height_target = options.cornerheight;
			options._height_original = options.cornerheight;
		}

		/* compute horizontal position */
		options._left_original = Math.abs(options._viewportWidth - $(obj).width());
		options._left_target = options._left_original - options.hdecale;

		/* compute width element */
		options._width_original = $(obj).width();
		options._width_target = options._width_original + options.hdecale;

		/* set position and show element */
		if (itsamove){
			$(obj)
				.show()
				.animate({ top: options._top_original, left: options._left_original}, 200, "linear");
		}else{
			/* fired only after load or during page refresh */
			$(obj)
				.show()
				.css("left", options._left_original+"px")
				.css("height", options._height_original+"px")
				.animate({ top: options._top_original }, options.downduration, options.downeasing);
		}

		/*$("#debug").html(""
							+"<br />browser: "+options.b
							+"<br />position: "+options.vertical
							+"<br />width_original:"+options._width_original
							+"<br />width_target:"+options._width_target
							+"<br />horizon_original:"+options._left_original
							+"<br />horizon_target:"+options._left_target
							+"<br />top_original:"+options._top_original
							+"<br />top_target:"+options._top_target
							+"<br />viewportWidth:"+options._viewportWidth
							+"<br />viewportHeight:"+options._viewportHeight
							+"<br />scrollYOffset:"+options._scrollYOffset);
		/*console.log(options);*/
		/*console.log("width_original:"+width_original+", width_target:"+width_target
				+", horizon_original:"+horizon_original+", horizon_target:"+horizon_target
				+", top_original:"+top_original+", top_target:"+top_target);*/

	};


	/* function to get vertical scroll size */
	$$.getScrollY = function (){

		/* found on http://www.howtocreate.co.uk/tutorials/javascript/browserwindow */
		var scrOfY = 0;
		if (typeof(window.pageYOffset) == 'number') {
		  //Netscape compliant
		  scrOfY = window.pageYOffset;
		}else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		  //DOM compliant
		  scrOfY = document.body.scrollTop;
		}else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		  //IE6 standards compliant mode
		  scrOfY = document.documentElement.scrollTop;
		}
		return scrOfY;

	};

})(jQuery);
