
/*
* SlideNote
* A jQuery Plugin for flexible, customizable sliding notifications.
*
* Copyright 2010 Tom McFarlin, http://tommcfarlin.com
* Released under the MIT License
* More information: http://slidenote.info
*/

(function($) {

    $.slideNoteCount = 0;

    $.fn.slideNote = function(options) {

        $.slideNoteCount += this.length;

        var opts = $.extend({}, $.fn.slideNote.defaults, $.fn.slideNote.private, options);

        return this.each(function() {

            var $note = _init(this, opts);
            var oDoc = $.browser.msie === true ? window : document;

            if (opts.where == 0) {
                $note.trigger('slideIn');
            }

            $(oDoc).scroll(function() {
                if ($(this).scrollTop() === 0) {
                    opts.bIsClosed = false;
                }

                if ($(this).scrollTop() > opts.where) {
                    if (!$note.is(':visible') && !opts.bIsClosed) {
                        $note.trigger('slideIn');

                    }
                } else if ($(this).scrollTop() <= opts.where && $note.queue('fx')[0] !== 'inprogress') {
                    if ($note.is(':visible')) {
                        $note.trigger('slideOut');

                    }
                }
            });
        });

    };

    function _init(obj, opts) {

        obj.notificationCount = 0; // added int to obj in order to maintain scope

        $(obj).toggle()
.css(opts.corner, -1 * $(obj).outerWidth())
.css({
    'position': 'fixed',
    'bottom': opts.position+ 'px',
    'background':opts.backgroundColor,
    'z-index':opts.stackOrder,
    'overflow': 'visible',
    '-moz-box-shadow':(opts.corner == 'right')? '-0.2em -0.2em 0.7em #333' : '0.2em -0.2em 0.7em #333', 
    '-webkit-box-shadow': (opts.corner == 'right')? '-0.2em -0.2em 0.7em #333' : '0.2em -0.2em 0.7em #333'
})



.bind('slideIn', function(evt) {
    _slideIn(evt, obj, opts);
})
.bind('slideOut', function(evt) {
    _slideOut(evt, obj, opts);
});

        _retrieveData(obj, opts);
        _addCloseImage(obj, opts);

        return $(obj);

    }

    // method to validate if the SlideNote Object's Notification Limit has been reached
    // we could modify this slightly to include all future logic surrounding
    // if we want to display the note given some specified criteria
    function _displayNote(obj, opts) {
        return (obj.notificationCount == 0 || obj.notificationCount != opts.notificationLimit) ? true : false;
    }

    function _slideIn(evt, obj, opts) {
        if (_displayNote(obj, opts)) {
            var direction = opts.corner === 'right' ? { 'right': 0} : { 'left': 0 };
            $(obj).show().animate(direction, 1000, 'swing');
            obj.notificationCount++; //increment notification by one after animate

        }
    }

    function _slideOut(evt, obj, opts) {

        var direction = opts.corner === 'right' ? { 'right': -1 * $(obj).outerWidth()} : { 'left': -1 * $(obj).outerWidth() };
        $(obj).animate(direction, 1000, 'swing', function() {
            if ($.slideNoteCount === 1) {
                $(obj).stop(true).hide();

            } else {
                $(obj).hide();
            }

        });

        if (opts.closeImage !== null && evt.target.id === $(obj).attr('id') + '_close') {
            opts.bIsClosed = true;
        }

    }

    function _retrieveData(obj, opts) {
        if (opts.url !== null) {
            if (opts.container.length !== 0 && opts.container.indexOf('#') === -1) {
                opts.container = '#' + opts.container;
            }

            var sUrl = opts.container.length === 0 ? opts.url : opts.url + ' ' + opts.container;
            $(obj).load(sUrl, function() {
                if (opts.closeImage !== null) {
                    _addCloseImage(obj, opts);
                }
            });
        }
    }

    function _addCloseImage(obj, opts) {

        var position = "";
        if (opts.corner == 'right') {
            position = 'float: left; margin-left: -2em; margin-top: -2em;';
        }
        else { position = 'position:relative;left:' + (($(obj).width()) - 8) + 'px;margin-top: -2em;'; }

        if (opts.closeImage !== null) {
            var oImg = document.createElement('img');
            $(oImg).attr('src', opts.closeImage)
                    .attr('alt', 'close')
                    .attr('style', '' + position)
                  
                    .attr('id', $(obj).attr('id') + '_close')
                    .hover(function() {
                        $(this).css('cursor', 'pointer');
                        $(this).css('margin-top', '-1.95em');
                    }, function() {
                        $(this).css('margin-top', '-2em');
                    })
                     .click(function(evt) {
                evt.stopPropagation();
                $(this).trigger('slideOut');
            });

            $(obj).prepend(oImg);
        }
    }
    $.fn.slideNote.defaults = {
        where: 640,
        corner: 'right',
        url: null,
        container: '',
        closeImage: null,
        notificationLimit: 2, // how many times do we want to display the note to the user? notification limit defaults to 0, effectively unlimited
        backgroundColor:'none',
        stackOrder:1,
        position:0
      
    };

    $.fn.slideNote.private = {
        _bIsClosed: false
    }

})(jQuery);


