/*

Life as Me: Flash Message jQuery Plugin
Copyright (c) 2008 Alice Dawn Bevan-McGregor. All Rights Reserved.

Permission is granted to use and modify this file as long as this original header remains intact.

For additional information on the site design used by Life as Me, please see the following website:

    http://www.lifeasme.com/corporate/site-design/

Changelog:

    1.0     Initial release.
    1.1     Updated to use setTimeout vs. the elem.animate() hack.
    
Upcoming features:

    - Multiple message support.  This requires creating a new flash div for each message and stacking them.
*/


jQuery.Flash = function(element){
    this.element = $(element);
    this.timeout = undefined;
    
    this.defaults = {klass: 'information', message: '', interval: 15000};
    
    var content = $('<div class="yui-t1 doc4"></div>');
    
    content.append('<div class="yui-main"><div class="yui-b"><div></div></div></div>');
    content.append('<div class="yui-b"></div>');
    content.append('<div style="clear: both;"><!-- IE --></div>');
    
    this.element.hide()
        .click(function(){ jQuery.flash.hide(); })
        .hover(function(){ jQuery.flash.onOver(); }, function(){ jQuery.flash.onLeave(); })
        .append(content);
};

jQuery.Flash.version = 1.1;

jQuery.Flash.prototype.onOver = function() {
    this.element.addClass('over');
}

jQuery.Flash.prototype.onLeave = function() {
    this.element.removeClass('over');
    
    if ( this.element.hasClass('expired') ) this.hide();
}

jQuery.Flash.prototype.onTimeout = function() {
    this.element.addClass('expired');
    if ( ! this.element.hasClass('over') ) this.hide();
}

jQuery.Flash.prototype.show = function(interval) {
    this.element.fadeIn(1000);
    
    if ( ! this.element.hasClass('error') ) {
        if ( this.timeout ) {
            clearTimeout(this.timeout);
            this.timeout = undefined;
        }
        this.timeout = window.setTimeout(function(){ jQuery.flash.onTimeout() }, interval);
    }
}

jQuery.Flash.prototype.hide = function() {
    if ( this.timeout ) {
        clearTimeout(this.timeout);
        this.timeout = undefined;
    }
    
    this.element.fadeOut(1000).removeClass('expired').removeClass('over');
}

jQuery.Flash.prototype.message = function(options) {
    var empty = {};
    var settings = jQuery.extend(empty, this.defaults, options);
    
    this.element.removeClass('expired');
    
    if ( this.element.is(":visible") ) {
        if ( this.timeout ) {
            clearTimeout(this.timeout);
            this.timeout = undefined;
        }
        
        this.element.fadeOut(1000, function(){ jQuery.flash.message(settings);});
        return;
    }
    
    this.element.attr('class', settings.klass);
    this.element.find('.yui-b div').html(settings.message);
    
    this.show(settings.interval);
}
jQuery.Flash.prototype.subtle = function(message) { this.message({klass: 'subtle', message: message}); }
jQuery.Flash.prototype.error = function(message) { this.message({klass: 'error', message: message}); }
jQuery.Flash.prototype.failure = function(message) { this.message({klass: 'failure', message: message}); }
jQuery.Flash.prototype.fail = function(message) { this.message({klass: 'failure', message: message}); }
jQuery.Flash.prototype.warning = function(message) { this.message({klass: 'warning', message: message}); }
jQuery.Flash.prototype.warn = function(message) { this.message({klass: 'warning', message: message}); }
jQuery.Flash.prototype.information = function(message) { this.message({klass: 'information', message: message}); }
jQuery.Flash.prototype.info = function(message) { this.message({klass: 'information', message: message}); }
jQuery.Flash.prototype.success = function(message) { this.message({klass: 'success', message: message}); }

$(function(){ jQuery.flash = new jQuery.Flash('#flash'); });
