/*!
 * 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: 250,
            downeasing: "linear",
            openduration: 750,
            openeasing: "linear",
            closeduration: 750,
            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);

