var CosMooPopup = new Class({
	Implements: [Options],
	

	version: '0.3.1',
 
	options: {
		id:'CosMooPopup',
		width: '300px',
		height: '200px',
		url: '',
		content: null,
		classPopup: '',
		classClose: 'closePopup',
		imgClose: 'immagini/grafica/cosmoopopup/chiudi.png',
		imgWait: 'immagini/grafica/cosmoopopup/wait.png',
		rootPath:'',
		modal: true,
		position: 'center',
		edge: '',
		zIndex: 5000,
		offset: {x: 0, y: 0},
		relativeTo: null,/*se settato a "elemento" la stycky win si posiziona rispetto all'elemento,
		 					se settato a "parent" la stycky si posizione rispetto al padre dell'elemento*/
		freccia: false,
		frecciaImg: 'immagini/grafica/cosmoopopup/freccia.png',
		frecciaPos: null,
		onComplete: null,
		onStickyReady: function(){return;},
		autoId: true,
		post: null,
		destroyOnClose: true
	},
 
	
	initialize: function(options)
	{
		this.setOptions(options);
		
	},
	
	attach: function(selector)
	{
		var obj = this;
		
		$$(selector).each(function(el){
			
			if(!el.hasClass("puntatore") && el.get('tag')!="a")
				el.addClass("puntatore");
			el.addEvent('click', function()
			{
				obj.show(el);
			});
			
		});
	},
	
	show: function(el)
	{
		var obj = this;
		
		var divCont = new Element('div', {'styles':{'width':obj.options.width, 'height':obj.options.height}});
		divCont.addClass(obj.options.classPopup);
		var divBody = new Element('div');
		divCont.grab(divBody);
		var waiter = new Element('img', {'src':obj.options.rootPath+obj.options.imgWait});
		waiter.setStyles({
			position: 'absolute',
			top: obj.options.height/2,
			left: obj.options.width/2
		});
		divBody.grab(waiter);
		
		if(obj.options.content)
		{
			divBody.empty();
			if($type(obj.options.content)=='string')
				divBody.set('html', obj.options.content);
			else
				divBody.grab(obj.options.content);
		}
		else
		{
			var postParam = new Hash();
			if (obj.options.autoId)
			{
				postParam.set('id',el.get('rel'));
			}
			if(obj.options.post)
			{
				if(postParam.getLength()>0)
				{
					postParam = postParam.combine(new Hash(obj.options.post));
				}
				else
				{
					postParam = new Hash(obj.options.post);
				}
			}
			var req = new Request.HTML({
				url: obj.options.url,
				async: true,
				evalScripts: true,
				onComplete: function(tree, elements, html, js) {
					divBody.set('html', html);
					
					if(obj.options.onComplete)
					{
						obj.options.onComplete();
					}
				},
				onFailure: function() {
					divBody.set('html', 'The Request has failed...');
				}
			}).post(postParam);
		}
		
		var divClose = new Element('div');
		divClose.addClass(obj.options.classClose);
		var imgClose = new Element('img',{'src':obj.options.rootPath+obj.options.imgClose, 'border':'0'});
		divClose.grab(imgClose);
		divCont.grab(divClose);
		
		if(obj.options.freccia)
		{
			var freccia = new Element('img',{'src':obj.options.rootPath+obj.options.frecciaImg, 'border':'0'});
			freccia.setStyles(obj.options.frecciaPos);
			freccia.setStyle('position','absolute');
			divCont.grab(freccia);
		}
		
		
		var relativeTo = obj.options.relativeTo;
		if(obj.options.relativeTo=="elemento")
			relativeTo = el;
		else if(obj.options.relativeTo=="parent")
			relativeTo = el.getParent();
		
		/*var stickys = $$('.StickyWinInstance');
		stickys.each(function(el){el.destroy();});*/
		
		var myChain = new Chain();
		var stickyOpts = {getWindowManager: function(){return null;}, closeClassName: obj.options.classClose, zIndex:obj.options.zIndex, maskTarget: obj.options.relativeTo, maskOptions: {'id':obj.options.id+'Mask', 'maskMargins': true, 'style':{'z-index':obj.options.zIndex-1}}, content: divCont, fadeDuration: 400, position: obj.options.position, relativeTo: relativeTo, offset: obj.options.offset, edge: obj.options.edge, destroyOnClose: obj.options.destroyOnClose};
		if(obj.options.modal)
		{
			myChain.chain(
			    function() { 
			    	obj.sticky = new StickyWin.Modal(stickyOpts);
			    	this.callChain();
			    },
			    function(){
			    	obj.options.onStickyReady();
			    }
			);
			myChain.callChain();
		}
		else
		{
			myChain.chain(
			    function() {
			    	stickyOpts.fadeDuration = 300;
			    	obj.sticky = new StickyWin.Fx(stickyOpts);
			    	this.callChain();
			    },
			    function() {	
			    	obj.options.onStickyReady();
			    }
			);
			myChain.callChain();
		}
		
		if(parseInt(obj.sticky.element.getStyle('top'))<0) obj.sticky.element.setStyle('top',10);
	},
	
	hide: function()
	{
		if (this.sticky) this.sticky.hide();
	}
});


