/*!
 * (c) 2010 SysIQ, Inc. All rights reserved.
 *
 * This product is protected by United States laws,
 * international copyright treaties and all other applicable
 * national or international laws.
 *
 * This software may not, in whole or in part, be copied,
 * photocopied, translated, modified, or reduced to any
 * electronic medium or machine readable form
 * without the prior written consent of SysIQ, Inc.
 *
 * Filename: jquery.popup.js
 * Author:   Kostyuk Kirill
 */

(function($) {

var defaults = {
    pageLimits: {
        top: 0,
        right: 0,
        bottom: 0,
        left: 0
    },
    alignment: {
        vertical: "top",
        horizontal: "left"
    },
    selectors: {
        mainContainer: ""
    }
};

/*function getBodyScrollTop() {
    return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}

function getBodyScrollLeft() {
    return self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
}*/
    
$.fn.floatPosition = function(settings) {

    var vpScroll = $.viewportScroll(),
        vpDims = $.viewportDimensions(),
        currentPosition = {},
        elem = this;

    if (settings.alignment.vertical == "top") {
        if (elem.offset().top <= vpScroll.top) {
            if (vpScroll.top <= settings.pageLimits.top) {
                currentPosition.top = settings.pageLimits.top;
            } else {
                currentPosition.top = vpScroll.top;
            }
        } else {
            if (vpScroll.top > settings.pageLimits.top) {
                currentPosition.top = vpScroll.top;
            } else {
                currentPosition.top = settings.pageLimits.top;
            }
        }
    }

    if (settings.alignment.vertical == "bottom") {
        currentPosition.top = vpScroll.top + vpDims.height - elem.outerHeight() - settings.pageLimits.bottom;
    }

    if (settings.alignment.horizontal == "left") {
        if (elem.offset().left <= vpScroll.left) {
            if (vpScroll.left <= settings.pageLimits.left) {
                currentPosition.left = settings.pageLimits.left;
            } else {
                currentPosition.left = vpScroll.left;
            }
        } else {
            if (vpScroll.left > settings.pageLimits.left) {
                currentPosition.left = vpScroll.left;
            } else {
                currentPosition.left = settings.pageLimits.left;
            }
        }
    }

    if (settings.alignment.horizontal == "right") {
        currentPosition.left = vpScroll.left + vpDims.width - elem.outerWidth() - settings.pageLimits.right;
    }

    return currentPosition;
};

$.fn.fixedPosition = function(settings) {
    var elem = this;

    var vpScroll = $.viewportScroll(),
        vpDims = $.viewportDimensions();

    var mainContainer = $(settings.selectors.mainContainer),
        mainContainerDims = {
            height: mainContainer.outerHeight(),
            width: mainContainer.outerWidth()
        };

    var doc = $(document),
        docDims = {
            height: doc.height(),
            width: doc.width()
        };

    var newPosition = {};

    if (settings.alignment.vertical == "top") {
        if (vpScroll.top < settings.pageLimits.top) {
            newPosition.top = settings.pageLimits.top - vpScroll.top;
        } else {
            newPosition.top = 0;
        }
    }
    if (settings.alignment.vertical == "bottom") {
        if ((vpScroll.top + vpDims.height) < (docDims.height - settings.pageLimits.bottom)) {
            newPosition.top = vpDims.height - elem.outerHeight();
        } else {
            newPosition.top = docDims.height - vpScroll.top - settings.pageLimits.bottom - elem.outerHeight();
        }
    }
    if (settings.alignment.horizontal == "left") {
        if (vpScroll.left < settings.pageLimits.left) {
            newPosition.left = settings.pageLimits.left - vpScroll.left;
        } else {
            newPosition.left = 0;
        }
    }
    if (settings.alignment.horizontal == "right") {
        /*settings.pageLimits.right = docDims.width - mainContainer.offset().left - mainContainerDims.width;
        if ((vpScroll.left + vpDims.width) < (docDims.width - settings.pageLimits.right)) {
            newPosition.left = vpDims.width - elem.outerWidth();
        } else {
            newPosition.left = docDims.width - vpScroll.left - settings.pageLimits.right - elem.outerWidth();
        }*/
        if (docDims.width > mainContainerDims.width) {
            newPosition.left = mainContainer.offset().left + mainContainerDims.width - elem.outerWidth();
        } else {
            newPosition.left = mainContainerDims.width - elem.outerWidth();
        }
    }
    elem.css({top : newPosition.top, left : newPosition.left, position: "fixed"});
    return newPosition;
};

$.eventShortcut("update");
$.eventShortcut("updateFixed");

$.fn.sidePopup = function(opts) {
    var self = this;
    var settings = $.extend(true, {}, defaults, opts);

    self.update(function() {
        var eventTimeOld = 0;
        var eventTimeNew = 0;
        var pos = {};
        $(window).scroll(function () {
            eventTimeNew = new Date().getTime();
            pos = self.floatPosition(settings);
        });
        setInterval(function(){
            if (eventTimeNew > eventTimeOld){
                if (self.is(":visible")) {
                    self.animate({top: pos.top, left: pos.left}, {duration: "normal"});
                } else {
                    self.css({top: pos.top, left: pos.left});
                }
                eventTimeOld = eventTimeNew;
            }
        }, 250);
    });

    self.updateFixed(function() {
        $(window).scroll(function () {
            self.fixedPosition(settings);
        });
        $(window).resize(function () {
            self.fixedPosition(settings);
        });
    });

    return self;
}

})(jQuery);
