$(document).ready(function() {
	
	function handleDialog() {
		$('.action-dialog-selector').click(function() {
			var element = $(this);
			var dialogClassName = 'dialog';
			
			if (element.hasClass('dialog-large')) {
				dialogClassName += ' large';
			}
			
			var bgDialog = $('<div>')
				.attr({ className: 'bgDialog spinner', id: 'bgDialog' })
				.css('width', $(window).width())
				.css('height', $(window).height());
			
			$('body').append(bgDialog);
			bgDialog.show();
		
			var dialog = $('<div>')
				.attr({ className: dialogClassName });
			
			dialog.load($(this).attr('href'), function() {
				$('body').append(dialog);
				dialog.show();
				bgDialog.removeClass('spinner');
				$(window).resize();
			
				handleBgDialog(dialog, bgDialog);
				handleFancyboxPlugin();
				handleCountrySelector(dialog, bgDialog, element);
				if (element.hasClass('selectable')) handleSelectableDialog(dialog, bgDialog, element);
				if (element.hasClass('paginable')) handleAjaxPagination(dialog, bgDialog, element);
				if (element.hasClass('autocomplete')) handleCountryAutocomplete(dialog, bgDialog, element);
				if (element.hasClass('amountable')) handleAmountInput(element);
			});
			
			return false;
		});
	}
	
	function handleBgDialog(dialog, bgDialog) {
		bgDialog.click(function() {
			dialog.remove();
			$(this).remove();
		});
	}
	
	function handleWaitingDialog() {
		$('.waiting-dialog').click(function() {
			var reason = $('.dialogReason:first');
			
			var bgDialog = $('<div>')
				.attr({ className: 'bgDialog spinner', id: 'bgDialog' })
				.css('width', $(window).width())
				.css('height', $(window).height())
				.css('display', 'block')
				.append(reason);
				
			$('body').append(bgDialog);
		});
	}
	
	function handleSelectableDialog(dialog, bgDialog, element) {
		$('ul.selectable a').click(function() {
			element.empty().html($(this).html());
			$('#' + element.attr('id') + 'To').val($(this).attr('alt'));
			
			if (element.hasClass('amountable')) {
				if ($('#' + element.attr('id') + 'Submit').hasClass('disabled') && ($('#' + element.attr('id') + 'Value').val() > 0)) $('#' + element.attr('id') + 'Submit').attr('disabled', false).removeClass('disabled');
			} else {
				if ($('#' + element.attr('id') + 'Submit').hasClass('disabled')) $('#' + element.attr('id') + 'Submit').attr('disabled', false).removeClass('disabled');
			}

			bgDialog.click();
			return false;
		});
	}
	
	function handleAmountInput(element) {
		var submitButton = $('#' + element.attr('id') + 'Submit');
		
		$('input.amountInput').keyup(function() {
			if (($(this).val().length) && (parseInt($(this).val(), 10) > 0)) {
				submitButton.attr('disabled', false).removeClass('disabled');
			} else {
				submitButton.attr('disabled', true).addClass('disabled');
			}	
		});
	}
		
	function handleAjaxPagination(dialog, bgDialog, element) {
		var container = $('#pagination-container');
		
		var bgSpinner = $('<div>')
			.attr({ className: 'bgSpinner' })
			.css('width', container.width() + 20)
			.css('height', container.height() + 20);
		
		$('.paging.ajax-enabled a').die('click').live('click', function() {
			container.prepend(bgSpinner);
			container.load($(this).attr('href') + ' #pagination-content', function() {
				bgSpinner.remove();
				handleAjaxPagination(dialog, bgDialog, element);
				handleCountrySelector(dialog, bgDialog, element);
				if (element.hasClass('selectable')) handleSelectableDialog(dialog, bgDialog, element);
			});
			return false;
		});
	}
	
	function handleCountrySelector(dialog, bgDialog, element) {
		var container = $('#country-selector');
		
		var bgSpinner = $('<div>')
			.attr({ className: 'bgSpinner' })
			.css('width', container.width() + 20)
			.css('height', container.height() + 20);
		
		$('#country-selector a').die('click').live('click', function() {
			container.prepend(bgSpinner);
			$('#pagination-container').load($(this).attr('href') + ' #pagination-content', function() {
				bgSpinner.remove();
				handleAjaxPagination(dialog, bgDialog, element);
				handleCountrySelector(dialog, bgDialog, element);
				if (element.hasClass('selectable')) handleSelectableDialog(dialog, bgDialog, element);
			});
			return false;
		});
	}
	
	function handleCountryAutocomplete(dialog, bgDialog, element) {
		$('#CountrySearch').focus(function() { $(this).val(''); });
		
		$('#CountrySearchForm').submit(function() {
			$.get($(this).attr('action'), { term: $('#CountrySearch').val() }, function(data) {
				$('#pagination-container').empty().html(data);
				handleAjaxPagination(dialog, bgDialog, element);
				handleCountrySelector(dialog, bgDialog, element);
				if (element.hasClass('selectable')) handleSelectableDialog(dialog, bgDialog, element);
			});
			return false;
		});
		
		$('#CountrySearch').autocomplete({
			source: APPROOT + $('#CountryPartner').val() + '/countries/get.json',
			minLength: 2,
			select: function(event, ui) {				
				var flag = $('<img>').attr({ src: APPROOT + 'img/resources/flags/' + ui.item.iso.toLowerCase() + '.gif' });
				element.empty().append(flag).append('&nbsp;').append(ui.item.label);
				$('#' + element.attr('id') + 'To').val(ui.item.value);
				if ($('#' + element.attr('id') + 'Submit').hasClass('disabled')) $('#' + element.attr('id') + 'Submit').attr('disabled', false).removeClass('disabled');
				bgDialog.click();
			}
		});
	}
	
	function handleFancyboxPlugin() {
		$('img.sizable').parent('a').fancybox({ type: 'image' });
		$('div.sizable a').fancybox({ type: 'image' });
		$('a.sizable').fancybox({ type: 'ajax' });
		$('.img-wrapper a.sizable').fancybox({ type: 'image' });
	}
	
	function handlejQueryUiPlugin() {
		$('.tabs').tabs();
	}
	
	$(window).resize(function() {
		var bgDialog = $('#bgDialog');
		var dialog = $('.dialog');
		
        var windowWidth = $(window).width();
        var windowHeight = $(window).height();
        
        var dialogWidth = dialog.width();
        var dialogHeight = dialog.height();
        
        var leftAdjustment = (windowWidth - dialogWidth) / 2;
        var topAdjustment = (windowHeight - dialogHeight) / 2;

        bgDialog.css("width", windowWidth);
        bgDialog.css("height", windowHeight);
        
        dialog.css("left", leftAdjustment + 'px');
        dialog.css("top", topAdjustment + 'px');
	});
			
	function Initialize() {
		handleDialog();
		handleWaitingDialog();
		handleFancyboxPlugin();
		handlejQueryUiPlugin();
	}
	
	// ==============
	// = Initialize =
	// ==============
	Initialize();
});
