var APPLICATIONS = {
	common: {
		init: function() {
			$('img[alt]:not([title])').each(function() {
				this.title = this.alt;
			});
			$('a:has(img)').addClass('nohover');
			$('select').selectbox();
			$('input[placeholder]').addPlaceholder();
			window.setInterval("updateClock()", 1000);
		},
		makeSortable: function() {
			var handle = $('section > h2:first-child');
			$('aside').sortable({
				axis: 'y',
				handle: handle,
				start: function(e, ui) {
					$('section').css('background-color', '#FFEDB9');
				},
				stop: function(e, ui) {
					var params = $('aside').sortable('serialize', {expression: '(.+)-(.+)'});
					$.get('/ajax/sort?' + params, function(data) {
						$('section').css('background-color', '');
					});
				}
			});
			handle.css('cursor', 'n-resize');
		}
	},
	comicOfTheDay: {
		init: function() {
			$('a[rel="fancybox"]').fancybox({
				'hideOnContentClick': true,
				'overlayColor'		: '#000',
				'overlayOpacity'	: 0.5,
				'speedIn'			: 600,
				'speedOut'			: 600
			});
			$('a[rel="next"]').click(function() {
				loadComic('next');
				return false;
			});
			$('a[rel="prev"]').click(function() {
				loadComic('prev');
				return false;
			});
			window.onpopstate = function(event) {
				window.location = document.location;
			};
		},
		makeDraggable: function() {
			$('a[rel="fancybox"]').draggable({
				helper: 'clone',
				start: function(e, ui) {
					var width = ui.helper.children().width();
					var height = ui.helper.children().height();
					ui.helper.children().width(200).height(200 * height / width);
				},
				cursorAt: {top:40, left:100}
			});
			$('#tweetbox').droppable({
				accept: 'a[rel="fancybox"]',
				activeClass: 'drop_target',
				drop: function(ev, ui) {
					sendShout('[comic=' + ui.draggable.attr('name') + ']');
				}
			});
		}
	},
	comics: {
		init: function() {
			$('a[rel="gallery"]').each(
				function() {
					$(this).attr('href', $('img', this).attr('src'));
				}).fancybox({
					'hideOnContentClick': true,
					'overlayColor'		: '#000',
					'overlayOpacity'	: 0.5,
					'speedIn'			: 600,
					'speedOut'			: 600
				});
		}
	},
	content: {
		makeEditable: function(page) {
			$('#editme').editable('/content/save/' + page, {
				name		: 'content',
				type		: 'textarea',
				height		: '450px',
				onblur		: 'ignore',
				loadurl		: '/content/load/' + page,
				loadtext	: 'Inhalt wird geladen...',
				submit		: 'Speichern',
				cancel		: 'Abbrechen'
//				callback: function() { location.href = page; }
			});
		}
	},
	countdown: {
		init: function(args) {
			countdown = args.timer;
			window.setInterval("updateCountdown(" + args.id + ")", 100);
		}
	},
	favourites: {
		init: function() {
			$('.favourites > ul > li').droppable({
				accept		: '.product',
				activeClass	: 'drop_target',
				drop		: function(ev, ui) {
					var position = $(this).attr('id');
					$.get('/ajax/setFavourite/' + position.replace('pos', '') + '/' + ui.draggable.attr('id'), function(json) {
						if (json.status == 500) {
							window.alert('Die Favoriten konnten nicht gespeichert werden.\n\nFEHLER: ' + json.message);
							return false;
						}

						$('.favourites li[id="' + position + '"] > span').html('<a href="' + json.href + '">' + json.name + '</a>');
					}, 'json');
				}
			});
		}
	},
	map: {
		init: function(args) {
			$('#map').gMap({
				address		: args.address,
				scrollwheel	: true,
				zoom		: 15,
				markers		: args.markers
			});
		}
	},
	offers: {
		init: function() {
			$('a.fancybox').fancybox({
				autoDimensions		: true,
				padding				: 0,
				hideOnOverlayClick	: false,
				overlayColor		: '#000',
				overlayOpacity		: 0.5,
				speedIn				: 600,
				speedOut			: 600,
				titleShow			: false
			});
		}
	},
	products: {
		init: function(args) {
			$('span[title][title!=""]').tooltip({track:true, fade:250}).css('border-bottom', '1px dotted #7F0000');
			$('.product').draggable({helper:'clone', revert:'invalid'});
			$('form[name="itemModifier"]').find(':submit').remove().end().find('select').change(function() {
				setItemsModifier($(this).val());
			});
			if (args.highlight !== '')
				$('div[id^=item_' + args.highlight + '-]').parent().parent().css('background-color', '#FFEDB9');

			var activeButton = $('#productTabs ul a[href="' + window.location.hash + '"]');
			var index = activeButton.length ? activeButton.closest('ul').find('a').index(activeButton) : 0;

			$('#productTabs').find('> div:not(:eq(' + index + '))').hide().end().find('ul li a').click(
				function(event) {
					event.preventDefault ? event.preventDefault() : event.returnValue = false;
					var button = $(this);
					if (button.hasClass('tabActive'))
						return false;

					window.location.hash = button.attr('href');
					button.closest('ul').find('a.tabActive').removeClass('tabActive').end().end().addClass('tabActive');
					var activeTabs = button.closest('div').find('> div:visible');

					if (activeTabs.length > 0) {
						activeTabs.fadeOut(function() {
							$(this).siblings(button.attr('href')).fadeIn();
						});
					}
					else {
						$(button.attr('href')).fadeIn();
					}

				}).filter(':eq(' + index + ')').addClass('tabActive');
		},
		edit: function(args) {
			$(args.subcategories).sortable({
				axis: 'y',
				start: function(event, ui) {
					$(ui.item).addClass('draggable');
				},
				update: function(event, ui) {
					$(ui.item).removeClass('draggable').find('input.subcategoryId').val(ui.item.parent().attr('id').substr(3)).end().parent().add(ui.sender).each(function() {
						$(this).find('tr').removeClass().filter(':even').addClass('even').end().filter(':odd').addClass('odd');
						$(this).find('input.sortId').each(function(i) {
							$(this).val(i + 1);
						});
					});
				},
				connectWith: '.connectedSubcategories',
				cursor: 'n-resize',
				handle: 'img.handler',
				opacity: 0.7
			});
			$(args.categories).sortable({
				axis: 'y',
				update: function(event, ui) {
					$(ui.item).find('> thead input.categoryId').val(ui.item.parent().attr('id').substr(3)).end().parent().add(ui.sender).each(function() {
						$(this).find('br').remove().end().find('table').after('<br/><br/>').each(function(i) {
							$(this).find('> thead input.sortId').val(i + 1);
						});
					});
				},
				connectWith: '.connectedCategories',
				cursor: 'n-resize',
				handle: 'img.handler',
				opacity: 0.7
			});
			$('#productsEditor thead :checkbox').change(function() {
				$(this).parents('#productsEditor table').toggleClass('disabled').find('tbody :checkbox').attr('checked', $(this).attr('checked')).change();
			});
			$('#productsEditor tbody :checkbox').change(function() {
				$(this).parents('#productsEditor tr').find(':text').attr('readonly', !$(this).attr('checked'));
			});
		}
	},
	quickstart: {
		init: function() {
			navigator.geolocation.getCurrentPosition(getLocation, null, {enableHighAccuracy:true});
			function getLocation(pos) {
				var select = $('select[name="shop"]');
				if (select.val() === '') {
					select.attr('disabled', 'disabled');
					$.post('/ajax/findNearestShop', {latitude:pos.coords.latitude, longitude:pos.coords.longitude}, function(json) {
						if (json !== false) {
							select.val(json.keyword);
							$('option[value="' + json.keyword + '"]', select).text(json.name + ' [nur ' + (json.distance * 1000) + ' m entfernt]');
						}
						select.removeAttr('disabled').change();
					}, 'json');
				}
			}
		}
	},
	shoppingCart: {
		init: function(args) {
			cartType = args.type;
			$('#shoppingCart').droppable({
				accept: '.product',
				activeClass: 'drop_target',
				drop: function(ev, ui) {
					addItemToCart(args.id, ui.draggable.attr('id'));
				}
			});
			$('.product a').click(function() {
				addItemToCart(args.id, $(this).parent().attr('id'));
				return false;
			});
			$('a.decrease:not(#clear)').live('click', function() {
				removeItemFromCart(args.id, $(this).attr('id'));
				return false;
			});
			$('a#clear').live('click', function() {
				deleteAllCartItems(args.id);
				return false;
			});
		}
	},
	statistics: {
		init: function() {
			$('table.stats').tablesorter({
				sortList:    [
					[1,0],
					[0,0]
				],
				widgets:    ['zebra']
			});
		}
	},
	tweetbox: {
		init: function() {
			$('#tweetbox').droppable({
				accept: '.product',
				activeClass: 'drop_target',
				drop: function(ev, ui) {
					sendShout('[order=' + ui.draggable.attr('id') + ']');
				}
			});
		}
	}
};

var UTIL = {
	init: function() {
		UTIL.exec('common');
		$('script').each(function() {
			var script = $(this).data();
			if (!jQuery.isEmptyObject(script))
				UTIL.exec(script.controller, script.action, script.args);
		});
	},
	exec: function(controller, action, args) {
		var ns = APPLICATIONS,
			method = action || 'init';

		if (controller !== '' && ns[controller] && typeof ns[controller][method] === 'function') {
			ns[controller][method](args);
		}
	}
};

$(UTIL.init);
