(function($) {
$.extend(true, React, {
	PCNLValidator : {
		init: function()
		{
			React.PCNLValidator.bindFileUploaders();
			React.PCNLValidator.bindProgressUpdate();
			React.PCNLValidator.bindSiteEntryRegistration();
			React.PCNLValidator.bindFormSubmitThrobber();
			
			React.PCNLValidator.bindAddressSelectorToggle();
			React.PCNLValidator.bindAddressColumnToggle();
			
			React.PCNLValidator.bindDtmSelectorToggle();
			
			React.PCNLValidator.bindModuleButtons();
			
			React.PCNLValidator.bindContainerToggle();
			React.PCNLValidator.bindColumnCheckboxToggle();
			React.PCNLValidator.detectFlashMessage();
			
			React.PCNLValidator.bindValidationReload();
		},	
		triggerValidatorUpdate: function()
		{
			React.PCNLValidator.bindDtmSelectorToggle();
		},		
		detectFlashMessage: function()
		{			
			if ($('.no-flash-detected-warning').length > 0
				&& swfobject.getFlashPlayerVersion().major < 9)
			{
				$('.no-flash-detected-warning').removeClass('hidden');
			}		
		},		
		bindFormSubmitThrobber: function()
		{
			$('form').live('submit', function() {
				$(this).find('dt#formSubmit-label').addClass('submitting');
				return true;
			});
			
			$(window).bind('unload', function(event) {
				$('dt#formSubmit-label.submitting').removeClass('submitting');
			});
			
			$(document).bind('keyup', function(event) {
				if (event.keyCode == 27) 
					$('dt#formSubmit-label.submitting').removeClass('submitting');
			});
		},		
		bindColumnCheckboxToggle: function ()
		{
			$('.column-toggle').live('change', function() {
				var columnTable = $('#' + this.id + '-columns');
				var columnChange = columnTable.find('td.field-name').length;
				if (!this.checked)
					columnChange = -columnChange;
					
				columnTable.toggleClass('hidden');
				
				$(columnTable.attr('aggregate')).each(function() {
					$(this).html(parseInt($(this).html()) + columnChange)				
				});
			});
		},		
		bindContainerToggle: function()
		{	
			$('.toggle-container').live('click', function(elem) {
				var elem = $(this);
				
				elem.toggleClass('i-magnify-plus');
				elem.toggleClass('i-magnify-minus');
				if (elem.attr('toggleText') != undefined)
				{
					var desc = elem.text();
					elem.text(elem.attr('toggleText'));
					elem.attr('toggleText', desc);
				}			
	
				var container = elem.parent('dd').nextAll('dd.container').first();
				
				if (container.is(":hidden"))
					container.slideDown();
				else
					container.slideUp();
			});
		},	
		bindModuleButtons: function()
		{
			$('a.addModule').live('click', function () {
				var newModule = $(this).closest('div.validation-module').clone();
				var addedContainer = $('#modules-added');

				var addedModules = addedContainer.find('.validation-module');
				if (addedModules.length >= 1)
					addedModules.addClass('validation-module-small', 400);

				addedContainer.append(newModule);
				newModule.find('a.addModule, a.removeModule').parent().toggleClass('hidden');
				newModule.addClass('validation-module-small');
				newModule.hide();
				newModule.slideDown(400);				
				
				React.PCNLValidator.updateModulesList();
			});
			
			$('a.removeModule').live('click', function () {
				var oldModule = $(this).closest('div.validation-module');
				var addedContainer = $('#modules-added');
				
				oldModule.removeAttr('moduleid');
				oldModule.slideUp(400, function() {oldModule.remove()});
				
				React.PCNLValidator.updateModulesList();
			});
			
			$('a.lookModule').live('click', function () {
				var module = $(this).closest('div.validation-module');
				module.toggleClass('validation-module-small', 400);
				module.find('.description').show();
			});
		},
		updateModulesList: function()
		{
			var modules = $('#modules-added div.validation-module[moduleid]').map( 
					function() {return $(this).attr('moduleid');} 
			).get().join('-');
			
			$('#modules').val(modules);
			$('#modules').closest('dl').find('dd.container-error').hide();
			
			if (modules == '')
			{
				$('#modules-added .validation-module-empty').slideDown();				
				$('.validation-module-select').hide();				
				$('#modules-list').slideDown();
			}
			else
			{
				$('.validation-module-select').show();
				$('#modules-added .validation-module-empty').slideUp();				
			}
		},
		bindAddressSelectorToggle: function()
		{
			$('input.address-toggle').live('click', function () {
					var select = $(this).closest('td').find('.address-select');
					select.toggleClass('collapsed');
					if ($(this).is(':checked'))
						select.find('select').removeAttr('disabled');
					else
						select.find('select').attr("disabled",  true);
				}
			);
		},
		bindAddressColumnToggle: function()
		{
			$('input:checkbox[data-columns]').live('change', function () {
				var parent = $(this).closest('div.sideinfo');
				var columns = parent.find('table.list.subsection-address-' + $(this).data('columns'));
				if ($(this).is(':checked'))
					columns.removeClass('hidden');
				else
					columns.addClass('hidden');
				
				React.PCNLValidator.updateAddressColumnCount(parent);
			});

			// trigger now to apply cached form inputs
			$('input:checkbox[data-columns]').trigger('change');
		},
		updateAddressColumnCount: function()
		{
			var columns = 0;
			$('div.sideinfo').each(function() {
				var newColumns = $(this).find('dd.columns table:not(.hidden) tbody tr').length;
				columns = columns + newColumns;
				$(this).find('.new-column-count').html(newColumns);
				$(this).find('.column-count').html(columns);
			});
		},

		bindDtmSelectorToggle: function()
		{
			$('select[id$="-fromField"]').bind('change', function () {
				var parent = $(this).closest('div.sideinfo');
				var columns = parent.find('#fromValue-label, #fromValue-element');
				if ($(this).val() == 'fixed')
					columns.removeClass('hidden');
				else
					columns.addClass('hidden');
			});
			
			$('select[id$="-toField"]').bind('change', function () {
				var parent = $(this).closest('div.sideinfo');
				var columns = parent.find('#toValue-label, #toValue-element');
				if ($(this).val() == 'fixed')
					columns.removeClass('hidden');
				else
					columns.addClass('hidden');
			});
			
			$('select[id$="-fromField"]').trigger('change');
			$('select[id$="-toField"]').trigger('change');
			
		},
		bindFileUploaders: function()
		{
			React.FileUploadify.simpleFileUpload(
				'body.Validation-selectFile input[type=hidden]#file-value',
				{
					'sizeLimit' : 8097152,
					'fileExt'	: '*.csv;*.xls;*.xlst',
					'fileDesc'	: 'Selecteer bestand',
					'buttonText' : 'Selecteer',
					'onProgress' : function (event, queueID, fileObj, data) 
					{
						var parent = $(event.target).parent();
						parent.next('ul.errors').remove();
					
						if (data.percentage == 100)
						{
							if (parent.find('div.process').length == 0)
							{
								parent.find('span.percentage').after('<div class="process">Verwerken...</div>');
							}
						}
					},
					'onError' : function(event, id, file)
					{
						$('#file-current').addClass('file-empty').slideUp(400);
					},

					'onComplete' : function(event, id, file, result)
					{
						var fileResult = React.FileUploadify.fileUploadCompleted(event, id, file, result);
						var oldInfo = $('#file-current');
						var newInfo = (
							(fileResult.id && fileResult.information) ?
							$(fileResult.information) :
							$('<div id="file-current" class="file-empty"></div>')
						);
						
						oldInfo.attr('id', null);
						newInfo.hide().insertAfter(oldInfo);
						oldInfo.slideUp(400, function () {
							oldInfo.remove();
							newInfo.slideDown(400);
						});
						
						$("#" + $(event.target).attr('id') + id).slideUp(400);
					
						return fileResult;
					}
				}
			);
		},
		bindProgressUpdate: function()
		{
			var elem = $('#progress-steps');
			if (!elem) return;
			React.PCNLValidator.progressIntervalId = setInterval(React.PCNLValidator.updateProgress, 10000);
			$('#progress-steps h3').live('click', React.PCNLValidator.updateProgress);
			
			var progress = $('#progress-steps .progress-meter');
			if (progress) 
				progress.children('.meter').progressbar({ value: parseInt(progress.attr('progress')) });
		},
		updateProgress: function()
		{
			var elem = $('#progress-steps');
			if (elem.hasClass('updating'))
			{
				return;
			}
			if (!elem.attr('refresh'))
			{
				clearInterval(React.PCNLValidator.progressIntervalId);
				return;
			}
	
			if (!React.PCNLValidator.progressIntervalId)
				React.PCNLValidator.bindProgressUpdate();
			
			elem.addClass('updating');
			elem.removeClass('aborted');
			$.get(
				elem.attr('refresh'), function(result) 
				{ 
					if (result['redirect'])
					{
						window.location.replace(result['redirect']);
						elem.removeClass('updating');
					}
					else if (result['fragment'])
					{
						elem.replaceWith(result['fragment']);
						
						var progress = $('#progress-steps .progress-meter');
						if (progress) 
							progress.children('.meter').progressbar({ value: parseInt(progress.attr('progress')) });
					}
					else
					{
						clearInterval(React.PCNLValidator.progressIntervalId);
						React.PCNLValidator.progressIntervalId = null;
						elem.removeClass('updating');
						elem.addClass('aborted');
					}
				}
			);
		},
		updateValidationForm: function()
		{
			var elem = $('#validation-container');
			
			if (elem.hasClass('updating'))
			{
				return;
			}
			
			elem.addClass('updating');
			$('#validation-container form').ajaxSubmit({
				url: elem.attr('refresh'),
				dataType: 'json',
				success: function(result)
				{
					if (!result)
					{
						elem.find('dt.updating').toggleClass('updating aborted');
					}
					else if (result['redirect'])
					{
						window.location.replace(result['redirect']);
						elem.find('dt.updating').toggleClass('updating');
					}
					else if (result['fragment'])
					{
						elem.replaceWith(result['fragment']);
						React.PCNLValidator.triggerValidatorUpdate();
					}
					else if (result['exception'])
					{
						elem.find('dt.updating').toggleClass('updating aborted');
						elem.prepend($(result['exception']).wrap('<div class="exception"/>'));
					}
					else
					{
						elem.find('dt.updating').toggleClass('updating aborted');
					}
				}			 
			});
		},
		bindValidationReload: function()
		{
			$('.validation-reload').live('change', function() {
				$(this).closest('dd').prev('dt').addClass('updating');
				React.PCNLValidator.updateValidationForm(this);
			});
		},		
		bindSiteEntryRegistration: function()
		{
			var elems = $('#isClient-none, #isClient-postcode, #isClient-webservices');
			if (!elems) return;
			elems.bind('click', function () {
				var inputElem = $(this);
				inputElem.closest('dl').find('dt, dd').each(function() {
					var tag = $(this);
					var id = tag.attr('id');
					if (id != 'isClient-label' && id != 'isClient-element')
					{
						if (inputElem.attr('value') == 'none' && (id == 'invoiceNumber-label' || id == 'invoiceNumber-element' || id == 'clientNumber-label' || id == 'clientNumber-element'))
							tag.hide('slow');
						//else if (inputElem.attr('value') != 'none' && (id == 'kvk-label' || id == 'kvk-element'))
						//	tag.hide('slow');
						else
							tag.show('slow');
					}
				});
			});
			
			$('#isClient-none').closest('dl').find('dt, dd').each(function() {
				var tag = $(this);
				if (tag.attr('id') != 'isClient-label' && tag.attr('id') != 'isClient-element')
				{
					tag.hide();
				}
			});
			
			$(elems, ':checked').each(function() {
				$(this).click();
			});		
		}
	}
});
})(jQuery);
