/**
*  jQuery.noticeAdd() and jQuery.noticeRemove()
*  These functions create and remove growl-like notices
*
*   Copyright (c) 2009 Tim Benniks
*
*  Permission is hereby granted, free of charge, to any person obtaining a copy
*  of this software and associated documentation files (the "Software"), to deal
*  in the Software without restriction, including without limitation the rights
*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
*  copies of the Software, and to permit persons to whom the Software is
*  furnished to do so, subject to the following conditions:
*
*  The above copyright notice and this permission notice shall be included in
*  all copies or substantial portions of the Software.
*
*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
*  THE SOFTWARE.
*
*  @author     Tim Benniks <tim@timbenniks.com>
*  @copyright  2009 timbenniks.com
*  @version    1.01: jquery.notice.js 1 2009-01-24 12:24:18Z timbenniks $
**/

/**
* Extended by danhorst
* http://github.com/danhorst/jquery-ui-notice/
* 
* Default styling and icons expect jQuery UI to be present. Examples:
* notice: jQuery.noticeAdd({text: 'This is just a notice.',    icon: 'ui-icon-info',  type:'ui-state-highlight'});
* error:  jQuery.noticeAdd({text: 'This is an error message.', icon: 'ui-icon-alert', type:'ui-state-error'});
**/

(function($)
{
  $.extend({
    noticeAdd: function(options)
    {
      var defaults = {
        inEffect:         {opacity: 'show'},    // in effect
        inEffectDuration: 600,                  // in effect duration in miliseconds
        stayTime:         5000,                 // time in miliseconds before the item has to disappear
        text:             '',                   // content of the item
        stay:             false,                // should the notice item stay or not?
        type:             'ui-state-highlight', // notice => ui-state-highlight, error => ui-state-error  are styled automatically by jQuery UI
        icon:             'ui-icon-info'        // notice => ui-icon-info,       error => ui-icon-alert   are styled automatically by jQuery UI
      };

      // declare varaibles
      var options, noticeWrapAll, noticeItemOuter, noticeItemInner, noticeItemClose;

      options         = $.extend({}, defaults, options);
      noticeWrapAll   = (!$('.notice-wrap').length) ? $('<div></div>').addClass('notice-wrap').appendTo('body') : $('.notice-wrap');
      noticeItemOuter = $('<div></div>').addClass('notice-item-wrapper');
      noticeItemInner = $('<div></div>')
                         .hide()
                         .addClass('notice-item ui-corner-all ' + options.type)
                         .appendTo(noticeWrapAll)
                         .html('<p>' + (options.icon ? ('<span class="icon ui-icon ' + options.icon + '"/>') : '') + options.text +'</p>')
                         .animate(options.inEffect, options.inEffectDuration)
                         .wrap(noticeItemOuter);
      noticeItemClose = $('<div></div>')
                         .addClass('notice-item-close ui-icon ui-icon-circle-close')
                         .prependTo(noticeItemInner)
                         .click(function() { $.noticeRemove(noticeItemInner); });

      // hmmmz, zucht
      if(navigator.userAgent.match(/MSIE 6/i))
      {
        noticeWrapAll.css({top: document.documentElement.scrollTop});
      }

      if(!options.stay)
      {
        setTimeout(function()
        {
          $.noticeRemove(noticeItemInner);
        },
        options.stayTime);
      }
    },

    noticeRemove: function(obj)
    {
      obj.animate({opacity: '0'}, 600, function()
      {
        obj.parent().animate({height: '0px'}, 300, function()
        {
          obj.parent().remove();
        });
      });
    }
  });
})(jQuery);
