/*  Window.Growl, version 2.0: http://icebeat.bitacoras.com
 *  Daniel Mota aka IceBeat <daniel.mota@gmail.com>
 *	Updated to 1.2b2 by Paul Streise <paulstreise@gmail.com>
 *  Updated to 1.2 by Lennart Pilon (http://ljpilon.nl)
--------------------------------------------------------------------------*/
var Gr0wl = {};

Gr0wl.Base = new Class({
	Implements: Options,	
	options: {
		image: '',
		title: '',
		text: '',
		duration: 5
	},
	
	initialize: function(image, options) {
		this.image = new Asset.image(image, { onload: this.create.bind(this) });
		this.setOptions(options);
		return this.show.bind(this);
	},
	
	create: function(styles) {
		this.image.setStyles(
			{
				'position':'absolute',
				'display':'none'
			}
			).setOpacity(0).injectInside(document.body);
		this.block = new Element('div').setStyles(
			$extend(
			{
				'position': 'absolute',
				'display': 'none',
				'z-index':'999', 'background-color': '#1c1f25',
				'-moz-border-radius': '10px',
				'-webkit-border-radius': '10px',
				'-webkit-box-shadow': '5px 5px 5px #000',
				'color':'#fff'
			},
			styles.div)
			).setOpacity(0).injectInside(document.body);
		new Element('img').setStyles(styles.img).injectInside(this.block);
		new Element('h3').setStyles(styles.h3).injectInside(this.block);
		new Element('p').setStyles(styles.p).injectInside(this.block);
	},
	
	show: function(options) {
		options = $merge(this.options, options);
		options.position = this.getPosition();
		
		var elements = [this.block.clone()];
		elements.each(function(e, i) {
			e.injectInside(document.body);
			e.setStyles(options.position);
			//if(i) 
				e.getFirst().setProperty('src', options.image).getNext().set('html', options.title).getNext().set('html', options.text);
		});
		new Fx.Elements(elements, {duration:400}).start({
			'0': { 'opacity': 0.9 }
		});
		this.hide.delay(options.duration*1000, this, [elements]);
	},
	
	hide: function(elements, effect) {
		var effects = new Fx.Elements(elements, {duration:400, onComplete: function() {
			this.elements[0].empty().erase();
		}}).start({'0': effect });
	},

	getPosition: function() {
		return {'top': '200px', 'right':'200px', 'display':'block'};
	}
});

Gr0wl.Smoke = new Class ({
	Extends: Gr0wl.Base,	
	create: function() {
		this.queue = [];
		this.parent({
			div:{
					'width':'298px',
					'height':'100px'	
				},
			img:{
					'float':'left',
					'margin':'12px'
				},
			h3:	{
					'margin':'0',
					'padding':'10px 0px',
					'font-size':'13px',
					'color':'#009900',
					'font-weight':'bold'
				},
			p:	{
					'margin':'0px 10px',
					'font-size':'12px'
				}
		});
	},
	getPosition: function() {
		var last = this.queue.getLast(),
		delta = window.getScroll()['y']+10+(last*110);
		var pos = {'top':delta+'px', 'right':'10px', 'display':'block'};
		this.queue.push(last+1);
		return pos;
	},

	hide: function(elements) {
		this.queue.shift();
		this.parent(elements,{ 'opacity': 0 });
	}
});

Gr0wl.Bezel = new Class ({
	Extends: Gr0wl.Base,
	Implements: Chain,
	create: function() {
		this.i=0;
		this.parent({
			div:
			{
				'width': '480px',
				'text-align':'center'
			},
			img:
			{
				'float':'left',
				'padding-top': '10px',
				'margin':'12px'
			},
			h3:
			{
				'margin': '0',
				'padding':'0px',
				'padding-top': '10px',
				'font-size': '14px'
			},
			p:
			{
				'margin': '15px',
				'font-size': '14px'
			}
		});
	},
	
	getPosition: function(options) {
		var scroll = window.getScroll();		
		var top = scroll['y']+(window.getHeight()/2)-100,
		left = scroll['x']+(window.getWidth()/2)-200;
		return {'top':top+'px', 'left':left+'px', 'display':'block'};
	},
	/*
	show: function(options) {
		this.i++;
		this.chain(this.parent.pass(options,this));
		if(this.i==1) this.callChain();
	},*/
		
	hide: function(elements) {
		this.queue.delay(400,this);
		this.parent(elements, { 'opacity': 0, 'margin-top': [0,50] });
	},
	
	queue: function() {
		this.i--;
		this.callChain();
	}
});

Gr0wl.Bezel.implement(new Chain);

var Growl = function(options) {
	if(Growl[options.type]) Growl[options.type].call(options);
	else Growl.Smoke(options);
};
