var fabrikPackage = new Class({
	
	initialize: function(){
		
		this.options = Object.extend({
			liveSite 	:'',
			'mooversion':1.1,
			'tmpl':'components/com_fabrik/views/package/tmpl/default/images/'
		}, arguments[0] || {});
		
		this.blocks = $H();
	},

	startLoading: function(senderBlock, msg){
		msg = $pick(msg, 'loading');
		
		if($type(senderBlock) !== false){
			if($type(senderBlock) === 'element'){
				senderBlock = senderBlock.id;
			}
			// is it in a mocha mt1.2 window?
			var b = this.blocks.get(senderBlock);
			if(b.options.winid !=='' && this.options.mooversion > 1.1){
				var win = MochaUI.Windows.instances.get(b.options.winid);
				win.showSpinner();
			}else{
				if($type($(senderBlock).getParent().getElement('.fbPackageStatus')) === false){
					var i = new Element('img', {'src':this.options.liveSite + this.options.tmpl + 'ajax-loader.gif'});
					var s = new Element('span').appendText(msg);
					var d = new Element('div', {'class':'fbPackageStatus'}).adopt(i).adopt(s).injectAfter($(senderBlock));
				}
				var s = $(senderBlock).getParent().getElement('.fbPackageStatus');
				s.getElement('img').setStyle('opacity', '1');
				s.getElement('span').setText(msg);
				s.effect('opacity', {'duration':500}).start(0, 1);
			}
		}
	},
	
	stopLoading: function(senderBlock, msg){
		msg = $pick(msg, 'complete');
		if($type(senderBlock) !== false){
		// is it in a mocha mt1.2 window?
			var b = this.blocks.get($(senderBlock).id);
			if(b.options.winid !=='' && this.options.mooversion > 1.1){
				var win = MochaUI.Windows.instances.get(b.options.winid);
				win.hideSpinner();
			}else{
				var s = $(senderBlock).getParent().getElement('.fbPackageStatus');
				s.getElement('span').setText(msg);
				s.getElement('img').setStyle('opacity', '0');
				var fx = s.effects({duration: 1000, transition: Fx.Transitions.Sine.easeInOut});
				fx.start(
						{'opacity': '0'}
				).chain(function(){
					this.start({
						'opacity': 1
					});
				}).chain(function(){
					this.start({
						'opacity': 0
					});
				});
			}
		}
	},

	addBlock: function( blockid, block ){
		this.blocks.set(blockid, block);
	},
	
	removeBlock: function( blockid ){
		// attempt to remove block? from memory
		this.blocks.set(blockid, null);
		this.blocks.remove( blockid );
	},
	
	// bind a block object to listen to another block objects messages
	
	bindListener:function(fromId, toId){
		this.blocks.each(function(val, key){
			if(toId == key){
				val.addListenTo(fromId);
			}
		});	
	},
	
	// broadcast messages to all blocks
	// @TODO really tables and forms etc should Implement an abstract observable class
	
	sendMessage:function(senderBlock, task, taskStatus, json, msg){
		msg = $pick(msg, 'complete');
		if($type(json) !== 'object'){
			json = Json.evaluate(json);
		}
		this.stopLoading(senderBlock, msg);
		this.blocks.each(function(block, key){
			block.receiveMessage( senderBlock, task, taskStatus, json );
		});
	},
	
	submitfabrikTable: function(tableid, task){
		this.blocks.each(function(block, key){
			if(key == 'table_' +  tableid){
				this.startLoading($('table_' +  tableid));
				if(block.submitfabrikTable(task) === false){
					this.stopLoading();
				}
			}
		}.bind(this));
	},
	
	openRedirectInMocha: function(url){
		opts = {};
		opts.loadMethod = 'xhr';
		opts.contentURL = url;
		if(this.options.mooversion > 1.1){
			var win = new MochaUI.Window(opts);
		}else{
			document.mochaDesktop.newWindow(opts);
		}
		this.stopLoading();
	},
	
	resizeMocha:function(win)
	{
		var myfx = new Fx.Scroll(window).toElement(win);
		//resize //@TODO add check to ensure window size isnt greater than browser window
		var windowEl = $(win);
		if (this.options.mooversion > 1.1) {
			var currentInstance = MochaUI.Windows.instances.get(windowEl.id);
			var contentWrapperEl = currentInstance.contentWrapperEl;
			var contentEl = currentInstance.contentEl;
		} else {
			contentWrapperEl = windowEl.getElement('.mochaContent');
			contentEl = windowEl.getElement('.mochaScrollerpad');
		}
		var h = contentEl.offsetHeight < window.getHeight() ? contentEl.offsetHeight : window.getHeight();
		var w = contentWrapperEl.getSize().scrollSize.x + 40 < window.getWidth() ? contentWrapperEl.getSize().scrollSize.x + 40 : window.getWidth();
		contentWrapperEl.setStyle('height', h);
		contentWrapperEl.setStyle('width', w);
		if (this.options.mooversion > 1.1) {
			currentInstance.drawWindow(windowEl);
		} else {
			document.mochaDesktop.drawWindow(windowEl);
		}
	}
});
