Container = {
	containerSelector: '.container',
	wrapperSelector: '.container > tbody > tr > td',
	moduleSelector: '.container .module',
	containers: undefined,
	wrappers: undefined,
	modules: undefined,
	mouseoverWrapper: undefined,
	mouseoutWrapper: undefined,
	mouseoverModule: undefined,
	moveModule: undefined,
	move: true,
	isAdmin: false,
	align: {
		1: 'left',
		2: 'right',
		3: 'both',
		left: 1,
		right: 2,
		both: 3
	},
	init: function() {
		console.log('init');
		jQuery.get('is_admin.php', null, function(text) {
			if(text == '1') {
		
				Container.index();
				
				$('<div class="glass"></div>')
					.css('cursor', 'move')
					.css('opacity', '0.6')
					.prependTo(Container.modules);
				$('<div class="remove"></div>')
					.html('<div><div><div><div>x</div></div></div></div>')
					.css('cursor', 'pointer')
					.click(Container.remove)
					.prependTo(Container.modules);
				$(".container .left, .container .left .module").data('align', Container.align.left);
				$(".container .right, .container .right .module").data('align', Container.align.right);
				$(".container .both, .container .both .module").data('align', Container.align.both);
				
				Container.modules.each(function() {
					$(this).data('id', $('> input[name=\'id\']', this).attr('value'));
				});
				
				$(document).mouseup(Container.documentMouseup);
				Container.wrappers.mouseover(Container.wrapperMouseover);
				Container.wrappers.mouseout(Container.wrapperMouseout);
				Container.modules.mousedown(Container.moduleMousedown);
				Container.modules.mouseover(Container.moduleMouseover);
				Container.modules.mouseout(Container.moduleMouseout);
				Container.modules.each(function() {
					this.onselectstart = function() { return false; };
				});
				
				$('#admin', Container.containers).slideDown();
				$('#admin form[name=\'add\']', Container.containers).submit(Container.add);
				$('#admin form[name=\'save\']', Container.containers).submit(Container.save);
			} else {
				alert('Du har inte tillgång till admin-verktygen för den här sidan');
			}
		});
	},
	add: function() {
		
		var content = $('textarea[name=\'content\']', this).attr('value');
		var align = $('input[name=\'align\']:checked', this).attr('value');
		$('input[type=\'text\'], input[type=\'radio\'], textarea', this).attr('value', '');
		console.log(content, align);
		Container.containers.each(function() {
			var module = $('<div class="module"></div>')
				.data('align', align)
				.html(content)
				.mousedown(Container.moduleMousedown)
				.mouseover(Container.moduleMouseover)
				.mouseout(Container.moduleMouseout);
			module[0].onselectstart = function() { return false; };
			$('<div class="glass"></div>')
				.css('cursor', 'move')
				.css('opacity', '0.6')
				.prependTo(module);
			$('<div class="remove"></div>')
				.html('<div><div><div><div>x</div></div></div></div>')
				.css('cursor', 'pointer')
				.click(Container.remove)
				.prependTo(module);

			console.log(module);
			if(align == Container.align.both) {
				var tr = $('<tr></tr>').prependTo($('> tbody', this));
				$('<td colspan="2" class="both"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr).append(module);
			} else {
				var tr = $('> tbody > tr:first-child', this);
				if(tr.length == 0 || $('> td', tr).length == 1) {
					tr = $('<tr></tr>').prependTo($('> tbody', this));
					$('<td class="left"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
					$('<td class="right"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
				}
				$('td.'+Container.align[align], tr).prepend(module);
			}
			var data = '{'+
				'align:'+align+','+
				'content:'+content+','+
			'}';
			jQuery.post('add.php', {module: data}, function(text) {
				alert('add.php:\n'+text);
				//var data = json(text);
				//module.data('id', data.id);
			})

		});
		
		return false;
	},
	remove: function() {
		var module = $(this).parent();
		var tr = module.parent().parent();
		var id = module.data('id');
		
		module.remove();
		if($('> td > div', tr).length == 0) {
			tr.remove();
		}
		var data = '[{id:'+id+'}]';
		jQuery.post('remove.php', {modules: data}, function(text) {
			alert('remove.php:\n'+text);
		})
	},
	save: function() {
		var modules = new Array();
		$(Container.moduleSelector).each(function() {
			var obj = $(this);
			console.log(obj);
			modules.push('{id:'+obj.data('id')+',index:'+obj.data('index')+',align:'+obj.data('align')+'}');
		});
		jQuery.post('save.php', {'modules': '['+modules.join(',')+']'}, function(text) {
			alert('save.php:\n'+text);
		})
		return false;
	},
	index: function() {
		//console.log('index');
		Container.containers = $(Container.containerSelector);
		Container.wrappers = $(Container.wrapperSelector);
		Container.modules = $(Container.moduleSelector);
		
		var i = 0;
		Container.modules.each(function() {
			$(this).data('index', i++);
		});
		$('.container > tbody > tr').each(function() {
			if($('> td > div',this).length == 0) {
				$(this).remove();
			}
		});
	},
	documentMouseup: function() {
		//console.log('containerMouseup');
		if(Container.moveModule) {
			Container.moveModule.removeClass('active');
			$('.glass', Container.moveModule).css('opacity', 0.6);
		}
		Container.moveModule = undefined;
	}, 
	wrapperMouseover: function(e) {
		console.log('wrapperMouseover', e.clientX);
		Container.mouseoverWrapper = $(this);
		if(Container.mouseoverModule)
			return false;
		
		if(Container.moveModule && Container.move) {
			
			if(Container.moveModule.data('align') == Container.align.both) {
				//console.log('wrapper both');
				var align = $(this).data('align');
				var modules = $('.module', this);
				var sideAlign = align == Container.align.left ? Container.align.right : Container.align.left;
				var sideModules = $('.' +Container.align[sideAlign]+ ' .module', $(this).parent());

					var last = $(modules[modules.length-1]);
					var lastTop = last.offset().top;
					var lastHeight = last.height();
					var sideMoveModules = new Array();
					for(var i = sideModules.length-1; i >= 0 && $(sideModules[i]).offset().top+$(sideModules[i]).height() >= lastTop+lastHeight; i--) {
						sideMoveModules[i] = sideModules[i];
					}
					
					var tr = $(this).parent().next().next();
					if(tr.length == 0 || $('> td', tr).length == 1) {
						tr = $('<tr></tr>').insertAfter($(this).parent().next());
						$('<td class="left"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
						$('<td class="right"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
					}
					
					var sideTd = $('.' + Container.align[sideAlign], tr);
					sideTd.prepend(sideMoveModules);

				
			} else {
				//console.log('wrapper lr');
				Container.moveModule.data('align', $(this).data('align'));
				$(this).append(Container.moveModule);
			}
			Container.index();
		}
		return true;
	},
	wrapperMouseout: function(e) {
		//console.log('wrapperMouseout', e.clientX);
		Container.mouseoutWrapper = $(this);
	},
	moduleMousedown: function() {
		//console.log('moduleMousedown');
		Container.moveModule = $(this);
		Container.moveModule.addClass('active');
		$('.glass', Container.moveModule).css('opacity', 0.2);
		this.blur();
		return false;
	}, 
	moduleMouseover: function() {
		console.log('moduleMouseover');
		Container.mouseoverModule = $(this);
		
		if(Container.moveModule && Container.mouseoverModule[0] != Container.moveModule[0] && Container.move) {
			Container.move = false;
			var moveModuleAlign = Container.moveModule.data('align');
			var mouseoverModuleAlign = Container.mouseoverModule.data('align')
			var moveModuleIndex = Container.moveModule.data('index');
			var mouseoverModuleIndex = Container.mouseoverModule.data('index');
			//console.log(moveModuleAlign, mouseoverModuleAlign);
			//console.log(moveModuleIndex, mouseoverModuleIndex);
			if(moveModuleAlign == mouseoverModuleAlign) {
				//console.log('move=mouse');
				if(moveModuleIndex < mouseoverModuleIndex) {
					//console.log('after');
					if(moveModuleAlign == Container.align.both) {
						var over = Container.moveModule.parent().parent().prev();
						var under = Container.moveModule.parent().parent().next();
						$('.' + Container.align[Container.align.left], under).prepend($('.' + Container.align[Container.align.left] + ' .module', over));
						$('.' + Container.align[Container.align.right], under).prepend($('.' + Container.align[Container.align.right] + ' .module', over));
						Container.mouseoverModule.parent().parent().after(Container.moveModule.parent().parent());				
					} else {
						Container.mouseoverModule.after(Container.moveModule);
					}
				} else {
					//console.log('before');
					if(moveModuleAlign == Container.align.both) {
						var over = Container.moveModule.parent().parent().prev();
						var under = Container.moveModule.parent().parent().next();
						$('.' + Container.align[Container.align.left], over).append($('.' + Container.align[Container.align.left] + ' .module', under));
						$('.' + Container.align[Container.align.right], over).append($('.' + Container.align[Container.align.right] + ' .module', under));
						Container.mouseoverModule.parent().parent().before(Container.moveModule.parent().parent());				
					} else {
						Container.mouseoverModule.before(Container.moveModule);
					}
				}
			} else if(moveModuleAlign == Container.align.both) {
				//console.log('move=both');
				
				var align = Container.mouseoverModule.data('align');
				var modules = $('.module', Container.mouseoverModule.parent());
				var sideAlign = align == Container.align.left ? Container.align.right : Container.align.left;
				var sideModules = $('.' +Container.align[sideAlign]+ ' .module', Container.mouseoverModule.parent().parent());

				if(moveModuleIndex < mouseoverModuleIndex) {
					//console.log('after');
					
					var first = $(modules[0]);					
					var firstTop = first.offset().top;
					var firstHeight = first.height();
					
					var sideMoveModules = new Array();
					for(var i = 0; i < sideModules.length && $(sideModules[i]).offset().top+$(sideModules[i]).height() <= firstTop+firstHeight; i++) {
						sideMoveModules[i] = sideModules[i];
					}
					
					var tr = Container.mouseoverModule.parent().parent().prev().prev();
					if(tr.length == 0 || $('> td', tr).length == 1) {
						tr = $('<tr></tr>').insertBefore(Container.mouseoverModule.parent().parent().prev());
						//console.log('assign');
						$('<td class="left"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
						$('<td class="right"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
					}
					var td = $('.' + Container.align[align], tr);
					var sideTd = $('.' + Container.align[sideAlign], tr);
					
					td.append(first);
					sideTd.append(sideMoveModules);
					
				} else {
					//console.log('before');
					
					var last = $(modules[modules.length-1]);
					var lastTop = last.offset().top;
					var sideMoveModules = new Array();
					for(var i = sideModules.length-1; i >= 0 && $(sideModules[i]).offset().top >= lastTop; i--) {
						sideMoveModules[i] = sideModules[i];
					}
					
					var tr = Container.mouseoverModule.parent().parent().next().next();
					if(tr.length == 0 || $('> td', tr).length == 1) {
						tr = $('<tr></tr>').insertAfter(Container.mouseoverModule.parent().parent().next());
						$('<td class="left"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
						$('<td class="right"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
					}
					
					var td = $('.' + Container.align[align], tr);
					var sideTd = $('.' + Container.align[sideAlign], tr);
					
					td.prepend(last);
					sideTd.prepend(sideMoveModules);
				}
				
			} else if(mouseoverModuleAlign == Container.align.both) {
				console.log('over=both');
				if(moveModuleIndex < mouseoverModuleIndex) {
					//console.log('after');
					var tr = Container.mouseoverModule.parent().parent().next();
					if(tr.length == 0 || $('> td', tr).length == 1) {
						tr = $('<tr></tr>').insertAfter(Container.mouseoverModule.parent().parent());
						$('<td class="left"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
						$('<td class="right"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
					}
					$('.' + Container.align[moveModuleAlign],tr).prepend(Container.moveModule);				
				} else {
					//console.log('before');
					var tr = Container.mouseoverModule.parent().parent().prev();
					if(tr.length == 0 || $('> td', tr).length == 1) {
						tr = $('<tr></tr>').insertBefore(Container.mouseoverModule.parent().parent());
						$('<td class="left"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
						$('<td class="right"></td>').mouseover(Container.wrapperMouseover).mouseout(Container.wrapperMouseout).appendTo(tr);
					}
					$('.' + Container.align[moveModuleAlign], tr).append(Container.moveModule);				
				}
			} else {
				//console.log('left,right');
				Container.moveModule.data('align', Container.mouseoverModule.data('align'));
				Container.mouseoverModule.before(Container.moveModule);				
			}
			Container.index();
			Container.move = true;
		}
	},
	moduleMouseout: function(e) {
		//console.log('moduleMouseout');
		Container.mouseoverModule = undefined;
	}
}
	
