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($('fbPackageStatus')){
			$('fbPackageStatus').getElement('span').setText(msg);
			$('fbPackageStatus').show();
			$('fbPackageStatus').effect('opacity', {'duration':500}).start(0, 1);
		}else{
			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 !==''){
					if(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));
						}
						$(senderBlock).getParent().getElement('.fbPackageStatus').effect('opacity', {'duration':500}).start(0, 1);
					}
				}
			}
		}
	},
	
	stopLoading: function(senderBlock){
		if($('fbPackageStatus')){
			$('fbPackageStatus').effect('opacity', {'duration':500}).start(1, 0);
			$('fbPackageStatus').hide();
		}
		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.effect('opacity', {
					'duration':500
				}).start(1, 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
	
	sendMessage:function(senderBlock, task, taskStatus, json){
		if($type(json) !== 'object'){
			json = Json.evaluate(json);
		}
		this.stopLoading(senderBlock);
		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));
				block.submitfabrikTable(task);
			}
		}.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();
	}
});
