if(typeof(Prototype) == "undefined")
	throw "Portal requires Prototype to be loaded.";
if(typeof(Effect) == "undefined")
	throw "Portal requires Effects to be loaded.";
if(typeof(Sortable) == "undefined")
	throw "Portal requires Sortable to be loaded.";


var Portal = Class.create();

Portal.prototype = {

	initialize : function (settings, options, data) {
		// set options
		this.setOptions(options);
		
		// set blocks to their positions
		this.applySettings(settings);
		
		// set styles of blocks
		this.set_styles();
		
		// load data to blocks
		this.loadData(data);
						
		// if editor is enabled we proceed
		if (!this.options.editorEnabled) return;
		
		// get all available columns
		var columns = $(this.options.portal).getElementsByClassName(this.options.column);
		
		// loop trough columns array
		$A(columns).each(function(column) {
			
			// create sortable
			Sortable.create(column, {
				containment : $A(columns),
				constraint  : this.options.constraint,
				ghosting	: this.options.ghosting,
				tag 		: this.options.tag,
				only 		: this.options.block,
				dropOnEmpty : this.options.droponempty,
				handle 		: this.options.handle,
				hoverclass 	: this.options.hoverclass,
				scroll		: this.options.scroll,
				onUpdate 	: function (container) {
					
					// if we dont have a save url we dont update
					if (!this.options.saveurl) return;
					
					// reset styles
					this.set_styles();
					
					// if we are in the same container we do nothing
					if (container.id == this.options.blocklist) return;
					
					// get blocks in this container
					var blocks = container.getElementsByClassName(this.options.block);
					
					// serialize all blocks in this container
					var postBody = container.id + ':';
					postBody += $A(blocks).pluck('id').join(',');
					postBody = 'value=' + escape(postBody);
					
					// save it to the database
					new Ajax.Request(this.options.saveurl, { method: 'post', postBody: postBody });
										
				}.bind(this)
			});
			
		}.bind(this));
		
		
		//-----------//
		// get all blocks
		var blocks = $(this.options.portal).getElementsByClassName(this.options.block);
		
		// loop trough blocks
		$A(blocks).each(function(block, i) {			
		
			var items = [
				{
					name: 'Edit',
					className: 'edit', 
					callback: function() {
						panel.load_sub_panel('mt_config', 'get', 'block='+block.id);
				}
				},{
					name: 'Delete',
					className: 'delete', 
					callback: function() {
						
						if (confirm('Are you sure you want to remove this item and all of its data?')) {
							if (confirm('FINAL WARNING: This action can not be undone, are you sure?!')) {
								new Ajax.Request('/congresses/delete_block/id='+block.id, { method: 'post', postBody: 'block='+block.id }); $(block.id).hide();
							}
						}
				}
				}
			];
			
			new Proto.Menu({
				selector : $(block.id),
				className : 'menu desktop',
				menuItems : items
			});
		}.bind(this));
				
	},
	
	set_styles : function () {
		
		// get all blocks
		var blocks = $(this.options.portal).getElementsByClassName(this.options.block);
		
		// loop trough blocks
		$A(blocks).each(function(block) {
			if (block.up().hasClassName('dir-vertical')) {
				
				block.removeClassName('block-horizontal').addClassName('block-vertical');
			} else {
				block.removeClassName('block-vertical').addClassName('block-horizontal');
			}
			if (block.up().hasClassName('width-small')) {
				
				block.removeClassName('width-wide').addClassName('width-small');
			} else {
				block.removeClassName('width-small').addClassName('width-wide');
			}
		}.bind(this));
		
	},
	
	applySettings : function (settings) {
		// apply settings to the array
		for (var container in settings) {
                    	settings[container].each(function (block) { if (!$(container)) { console.log('Block '+container+' not found') } else { $(container).appendChild($(block)); }  });
		}
	},
	
	setOptions : function (options) {
		// set options
		this.options = {
			tag				: 'div',
			editorEnabled 	: false,
			portal			: 'portal',
			column			: 'portal-column',
			block			: 'block',
			content			: 'content',
			configElement	: 'config',
			configSave		: 'save-button',
			configCancel	: 'cancel-button',
			configSaved		: 'config-saved',
			handle			: 'draghandle',
			hoverclass		: false,
			scroll			: window,
			remove			: 'option-remove',
			config			: 'option-edit',
			blocklist		: 'portal-column-block-list',
			blocklistlink	: 'portal-block-list-link',
			blocklisthandle : 'block-list-handle',
			saveurl			: false,
			constraint		: false,
			ghosting		: false,
			droponempty		: true
		}
		
		Object.extend(this.options, options || {});
	},
	
	makeParams : function (block_id) {
		
		var block = $('ident_'+block_id);
		
		var lm = $A(block.classNames());
		var it = '/classes=' + lm.join(',');
		
		return it;
		
	},
	
	loadData : function (data) {

		for (var type in data) {
			
			for (var block_id in data[type]) {
			
				var blockname = data[type][block_id];
				
				var params = this.makeParams(block_id);
				
					switch (type) {
						
						case 'abstracts':
							new Ajax.Updater(block_id + '-content', '/abstracts/data='+block_id + params, { evalScripts : true });
						break;
						
						case 'sponsors':
							new Ajax.Updater(block_id + '-content', '/sponsors/data='+block_id + params, { evalScripts : true });
						break;
						
						case 'tours':
							new Ajax.Updater(block_id + '-content', '/tours/data='+block_id + params, { evalScripts : true });
						break;
						
						case 'hotels':
							new Ajax.Updater(block_id + '-content', '/hotels/data='+block_id + params, { evalScripts : true });
						break;
						
						case 'newsletter':
							new Ajax.Updater(block_id + '-content', '/newsletter/data='+block_id + params, { evalScripts : true });
						break;
						
						case 'contact':
							new Ajax.Updater(block_id + '-content', '/contact/data='+block_id + params, { evalScripts : true });
						break;
						
						case 'registration':
							new Ajax.Updater(block_id + '-content', '/registrations/data='+block_id + params, { evalScripts : true });
						break;
						
						default:							
							new Ajax.Updater(block_id + '-content', '/congresses.module/'+type+'/data='+block_id + params, { evalScripts : true });
					}
				
				
				//console.log(type, block_id, blockname, params);
			}
			
		}
	}
};

Event.observe(window, 'mousemove', function () {
	checkPortSizes();
});

function checkPortSizes() {
	var w = document.viewport.getDimensions();
	if ($('sub-content-target')) {
		var p = $('sub-content-target').getDimensions();
	} else {
		var p = false;
	}
	if ($('mainContainer')) {
		var s = $('mainContainer').getDimensions();
	} else {
		var s = false;
	}
	
	if (p.height > w.height) {
		if ($('panel')) {
			$('panel').setStyle({'height' : p.height + 'px'});
			$('sub-content').setStyle({'height' : p.height + 'px'});
			if ($('sub-content-target')) {
				$('sub-content-target').setStyle({'height' : p.height + 'px'});	
			}
		}
	}
	
	if (s.height > p.height) {
		if ($('panel')) {
			$('panel').setStyle({'height' : s.height + 'px'});
			$('sub-content').setStyle({'height' : s.height + 'px'});
			if ($('sub-content-target')) {
				$('sub-content-target').setStyle({'height' : s.height + 'px'});						
			}
		}
	}
	
	if (p.height == s.height) {
		if ($('panel')) {
			$('panel').setStyle({'height' : (p.height+p.height) + 'px'});
			$('sub-content').setStyle({'height' : (p.height+p.height) + 'px'});
			if ($('sub-content-target')) {
				$('sub-content-target').setStyle({'height' : (p.height+p.height) + 'px'});						
			}
		}
	}
}
