/**
 * A simple jQuery plugin allows an element to be locked in it's position
 * when the scrollHeight reaches teh specified limit.
 *
 * @author Fortunato Geelhoed <fortunato@crudigital.com.au>
 */
(function($) {
    $.fn.lock = function(options) {
        var element = $(this);
        var defaults = {
            offset: 3,
            debug: false,
            lockAt: 101,
            zIndex: 99,
            limit: false,
            limitTo: 420
        };
        options = $.extend(defaults, options);

        var initialize = function() {
            if ($.meta) { // support MetaData plugin
                options = $.extend({}, options, this.data());
            }
            //var clone = element.clone();
            var originalPosition = element.css('position');
            var originalTop = element.css('top');
            var originalzIndex = element.css('z-index');

            triggerAt = element.position().top - options.lockAt;
            $(window).scroll(function () {


                //console.log($(window).scrollTop());
                

                scrollBottom = $(document).height()-($(window).scrollTop()+$(window).height());
                //console.log(scrollBottom);
                if ($(window).scrollTop() > triggerAt) {
                    if (options.limit && scrollBottom < (options.limitTo-$(element).height())) {
                        //console.log('!!');
                        if($.browser.msie && $.browser.version=="6.0") {
                            element.css({
                                'position': 'absolute',
                                'z-index': options.zIndex,
                                'top': 'auto'
                            });
                        } else {
                            element.css({
                                'position': 'fixed',
                                'bottom': options.limitTo+'px',
                                'top': 'auto',
                                'z-index': options.zIndex
                            });
                        }
                    } else {
                        if($.browser.msie && $.browser.version=="6.0") {
                            element.css({
                                'position': 'absolute',
                                'z-index': options.zIndex,
                                'top': ($(window).scrollTop()+options.lockAt)+'px'
                            });
                        } else {
                            element.css({
                                'position': 'fixed',
                                'top': options.lockAt+'px',
                                'z-index': options.zIndex
                            });
                        }
                    }
                } else {
                    // restore to initial state
                    /*
                    element.css({
                        'position': 'relative',
                        'top': 0
                    });
                    */
                    element.css({
                        'position': originalPosition,
                        'top': originalTop,
                        'z-index': originalzIndex
                    });
                    //element = clone;
                    //alert(element.css('position'));
                }
            });
        }

        /**
         * Debug Logging
         * @param {Object} data
         */
        var log = function(data){
            if (options.debug) {
                try {
                    console.log("%o: %o", data, this);
                } catch (e) {
                    $('BODY').append($("<div class='error'>" + data + "</div>"));
                }
            }
        };
        initialize();

        return this;
    }
})(jQuery);