(function ($)
{
	$.voForm = function()
	{
		$('.voForm').each(function(i,o){
			if( isNaN($(this).attr('rel')) ){
				$(o).voFormCustom();
			}else{
				$(o).voForm();
			}
		});
	};
	
	
	/**
	 * VALIDATION Functions
	 */
	$.fn.voCheckWarnings = function( buttonValue )
	{
		var $submitButton = $('.submit',this);
		if( $('.warning:visible',this).length > 0 ){
			
			$submitButton.addClass('disabled').attr('disabled','disabled');
			
			if($submitButton.attr('data-validate')){
				$submitButton.text($submitButton.attr('data-validate'));
			}else{
				$submitButton.text('* Fill in required fields');
			}
		}else{
			$submitButton.removeClass('disabled').removeAttr('disabled').text( buttonValue );
		}
	};
	
	$.fn.voFormValidation = function()
	{
		var $formObject = $(this);
		
		var $submitButton = $('.submit',this);
		var buttonValue = $submitButton.text() ? $submitButton.text() : 'Submit';
		
		var requiredFlag = '<span class="required-flag">*</span>';
		$('.required-flag',this).remove();
		$(':input.required',this)
			.prev('label').addClass('required')
			.append(requiredFlag)
			.parents('li').addClass('warning');
		
		$(this).voCheckWarnings( buttonValue );
		
		function setRequired()
		{
			if($(this).is('.required')){
				if( $(this).val() ){
					$(this).parents('li:first').removeClass('warning');
				}else{
					$(this).parents('li:first').addClass('warning');
				}
				$formObject.voCheckWarnings( buttonValue );
			}
		};
		
		$(':input:not([type="hidden"]).required',this).each(setRequired).bind('keyup change',setRequired);
		//$(':input:visible.required',this).each(setRequired).bind('keyup change',setRequired);
	};
	
	$.fn.voFormReset = function()
	{
		$(':input',this).not('[type="hidden"]').val('');
		$(':checked',this).attr('checked','');
		$('.voFiles ul li',this).remove();
		$(this).voCheckWarnings();
	};
	
	/**
	 * Form Type Setup happens below here
	 */
	
	$.fn.formatErrorMessage = function( data_error_message, data_dom_error, customContainer )
	{
		// By default an .error-message div container is set in a voForm.
		// Custom container gives the option to set a container for the error
		// message to go to outside of voForm block.
		var $errorContainer = ! customContainer ? $('.error-message',this) : customContainer;
		// Move to top of page
		$('html, body').animate({scrollTop:0}, 'slow');
		
		if(data_error_message){
			var error_message = '';
			if(typeof(data_error_message) == 'object'){
				$.each(data_error_message,function(i,message){
					error_message += '<div>'+message+'</div>';
				});
			}else{
				error_message = data_error_message;
			}
			$errorContainer.html(error_message).fadeIn('fast');
		
			$(':input.error').removeClass('error');
			$.each(data_dom_error,function(i,class_name){
				$(':input.'+class_name).addClass('error');
				$(':input.'+class_name).keyup(function(e){
					if( $(this).val() == '' ){
						$(this).addClass('error');
					}else{
						$(this).removeClass('error');
					}
				});
			});
		}else{
			$errorContainer.fadeOut('fast');
		}
	};
	
	$.fn.voFormCustom = function( id )
	{
		var $formObject = $(this);
		
		// Give each message box a unique id.
		if( $('.error-message',$formObject).length == 0 ){
			$formObject.prepend('<div class="error-message" style="display:none;" />');
		}
		if( $('.success-message',$formObject).length == 0 ){
			$formObject.prepend('<div class="success-message" style="display:none;" />');
		}
		
		function success( data )
		{
			$('.waiting-for-results',$formObject).hide();
			if( data.error_message ){
				$formObject.formatErrorMessage(data.error_message, data.dom_error);
			}else if( data.success_message ){
				$('.error-message',$formObject).hide();
				$('html, body').animate({scrollTop:0}, 'slow');
				$('.success-message',$formObject).html(data.success_message).fadeIn('fast',function(){
					setTimeout(function(){
						$('.success-message',$formObject).fadeOut('fast');
					},7000);
				});
			}
			
			if($formObject.attr('data-html')){
				$($formObject.attr('data-domReplace'))
					.load(
						$formObject.attr('data-html'),
						{'id':$formObject.find('input[name="id"]').val()},
						function( loadedData ){ 
							$(this).setDataDisplay( data );
							if(data.message){ $('.message',this).show(); }
							$.voForm(); } // Important to re-run voForm for cases where the $formObject is being replace by return data
					);
			}else{
				$(this).setDataDisplay( data );
			}
		};
		
		if( $formObject.attr('rel') ){
			$('.submit',this).unbind('click').click(function( e ){
				var requiredArray = [];
				$(':input.required',$formObject).each(function(i,obj){
					requiredArray.push($(obj).attr('name'));
				});
				$.voAjax({
					'actionController':$formObject.attr('rel'),
					'dataContainer':$formObject,
					'dataObject':{'required_input':$.toJSON(requiredArray)},
					'beforeSend':[function(){ $('.waiting-for-results',$formObject).show(); }],
					'success':[success],
					'global':false
				});
			});
		}
		
		$formObject.voFormValidation();
	};
	
	$.fn.voForm = function()
	{
		$formObject = $(this);
		var $spinner = $('<span class="pending-spinner" style="display:none;"><img src=\'/admin/theme/default/img/spinner-small.gif\' /></span>');
		// Give each message box a unique id.
		if( $('.error-message',$formObject).length == 0 ){
			$formObject.prepend('<div class="error-message" style="display:none;" />');
		}
		if( $('.success-message',$formObject).length == 0 ){
			$formObject.prepend('<div class="success-message" style="display:none;" />');
		}
		
		function initSuccess( data, status )
		{
			if(data.group_array){
				$formObject.addClass('vo-form-id-'+data.id);
				var fragment = document.createDocumentFragment();
				
				$.each(data.group_array,function(i,group){
					if(group.enabled == 1){
						var $fieldset = $('<fieldset class="group-id-'+i+'" />');
						$fieldset.append('<legend>'+group.name+'</legend>');
						$fieldset.append('<ul class="question"></ul>');
						
						$.each(group.question_array, function(i, question){
							if(question.enabled == 1){
								var $fieldsetLi = $('<li id="q'+i+'"><label for="data['+i+']">'+question.question+'</label></li>');
								$fieldset.append($fieldsetLi);
								switch(question.type){
									case 'text':
										$fieldsetLi.append('<input type="text" name="data['+i+']" value="" />');
									break;
									
									case 'select':
										if(question.option_array){
											$fieldsetLi.append('<select name="data['+i+']" />');
											$.each(question.option_array,function(j,option){
												if(option.enabled == 1){
												$('select',$fieldsetLi).append('<option value="'+j+'">'
																			+option.option
																			+'</option>');
												}
											});
											
										}
									break;
									
									case 'checkbox':
										if(question.option_array){
											$fieldsetLi.append('<ul class="option checkbox"></ul>');
											$.each(question.option_array,function(j,option){
												if(option.enabled == 1){
												$('ul',$fieldsetLi).append('<li id="o'+j+'">'
																			+'<input type="checkbox" name="data['+i+'][]" value="'+j+'" />'
																			+'<label>'+option.option+'</label>'
																			+'</li>');
												}
											});
											
										}
									break;
									
									case 'radio':
										if(question.option_array){
											$fieldsetLi.append('<ul class="option radio"></ul>');
											$.each(question.option_array,function(j,option){
												if(option.enabled == 1){
												$('ul',$fieldsetLi).append('<li id="o'+j+'">'
																			+'<input type="radio" name="data['+i+'][]" value="'+j+'" />'
																			+'<label>'+option.option+'</label>'
																			+'</li>');
												}
											});
											
										}
									break;
									
									case 'textarea':
										$fieldsetLi.append('<textarea name="data['+i+']"></textarea>');
									break;
									
									case 'file':
										// check validation array
										$.each(question.validation_array,function(j,validate){
											switch(validate.name){
												case 'file_upload_limit':
													$fieldsetLi.data('file_upload_limit',validate.parameter);
												break;
											}
										});
										$fieldsetLi.append('<input type="hidden" name="data['+i+']" value="Files" style="display:none;" />');
										$fieldsetLi.append(setupFileUploader(i));
									break;
								}
								if(question.required == 1){
									$(':input',$fieldsetLi).addClass('required');
								}
							// Add the note element
								if(question.note){
									$fieldsetLi.append('<div class="note">'+question.note+'</div>');
								}						
								$('ul:first',$fieldset).append($fieldsetLi);
							}
						});
						
						fragment.appendChild( $fieldset.get(0) );
					}
				});
				
				$formObject.append( fragment );
				
				// Button procedure
				var $ajaxResponse = $('<div class="message" />');
				var $buttonObject = $('<div class="buttons" />');
				var $submitButton = $('<button type="button" class="submit">Submit</button>');
				
				
				var getSubmissionName = function()
				{
					return $(':input[name="data['+data.submission_name_question+']"]').val();
				};
				
				var getSubmissionEmail = function()
				{
					return $(':input[name="data['+data.submission_email_question+']"]').val();
				};
				
				$submitButton.click(function(e){
					$.voAjax({
						dataContainer: $formObject,
						dataObject:{'form_id':data.id,'from_name':getSubmissionName(),'from_email':getSubmissionEmail()},
						actionController:'/action/public/cmn/submit-form',
						beforeSend:[function(){ $spinner.show(); }],
						success:[submitSuccess]
					});
				});
				
				$buttonObject.append($submitButton);
				$formObject.append($ajaxResponse);
				$formObject.append($buttonObject);
				$buttonObject.append($spinner);
			}
			$formObject.voFormValidation();
		};
		
		// Setup flash object variables
		function setupFileUploader( id )
		{
			var vofile = new voFile();
			vofile.settings.ulDom = '.stage'+id+' ul';
			var $fileObject = $('<div class="file-uploader'+id+'"></div>');
	
			var $fileStage = $('<div class="voFiles stage'+id+'"></div>').append(
						'<ul rel="'+id+'">'
							+'<!-- File Template'
							+'<li>'
								+'<div class="image icon">'
									+'<img class="photo" src="" />'
									+'<img class="default" src="/admin/theme/default/img/footer-fish-icon.png" />'
									+'<img class="pdf" src="/admin/theme/default/img/pdf-icon-50.png" />'
									+'<img class="doc" src="" />'
									+'<img class="mp3" src="" />'
								+'</div>'
								+'<span class="name"></span>'
								+'<div class="image-controls">'
									+'<div class="underlay"></div>'
									+'<button class="ui-state-default ui-corner-all click-delete delete">'
										+'<span class="ui-icon ui-icon-trash"></span>'
									+'</button>'
								+'</div>'
							+'</li>'
							+'-->'
						+'</ul>');
			
			var $uploadButton = $('<input type="file" id="media-upload-button-'+id+'" class="media-upload-button" multiple="true" />');
			
			var vofile = new voFile({
				'action':'/action/public/cms/file-upload-public',
				'ulDom':$('ul', $fileStage)
			});
			vofile.setInterface = function( loadingObject, data )
			{
				$(loadingObject).setFileInterface( data.file );
				//$.log(data.file);
			};
			
			$uploadButton.change( vofile.uploadFiles );
			$uploadButton.focus(function(){ $(this).val(""); });

			if( typeof(FileReader) == 'function' ){
				$fileStage.get(0).addEventListener('dragover',function(event){
					event.preventDefault();
				},true);
				
				$fileStage.get(0).addEventListener('dragenter',function(event){
					event.preventDefault();
				},true);
				
				$fileStage.get(0).addEventListener('drop',function(event){
					event.preventDefault();
					var dt = event.dataTransfer;
					var files = dt.files;
					
					vofile.uploadFiles( files );
				},true);
			}
			
			var $buttonLabel = $('<label class="media-upload-label"></label>');
			$buttonLabel.append($uploadButton);
			$fileObject.append($buttonLabel,$fileStage);
			return $fileObject;
		};
		
		function submitSuccess( data, status )
		{
			$spinner.hide();
			if( data.error_message ){
				$formObject.formatErrorMessage(data.error_message, data.dom_error);
			}else if( data.success_message ){
				$('.error-message',$formObject).hide();
				$('html, body').animate({scrollTop:0}, 'slow');
				$('.success-message',$formObject).html(data.success_message).fadeIn('fast',function(){
					setTimeout(function(){
						$('.success-message',$formObject).fadeOut('fast');
					},7000);
				});
			}
			$formObject.voFormReset();
			$formObject.voFormValidation();
		};
		
		$.ajax({
			type:'POST',
			url:'/action/public/cmn/get-form',
			dataType:'json',
			data:{'form_id':$(this).attr('rel')},
			success:initSuccess
		});
		
		return this;
	};
	//<div class="voForm" rel="" />
	
// Set Files
	$.fn.checkFileUploadLimit = function( limit ){
		var fileCount = $('li',this).length;
		var $fileUploaderObject = $(this).parent().siblings('object');
		if( fileCount < limit ){
			$fileUploaderObject.show();
		}else{
			$fileUploaderObject.hide();
		}
	};
	
	$.fn.setFileInterface = function( file )
	{
		var $rowContainer = $(this).parent();
		var questionId = $rowContainer.attr('rel');
		var rowObject = $(this);
		var fileUploadLimit = $('#q'+questionId).data('file_upload_limit');
		// Call the show/hide function for the uploader object.
		if( fileUploadLimit > 0 ){
			$rowContainer.checkFileUploadLimit( fileUploadLimit );
		}
		
		$(this).setDataDisplay( file );
		$(this).append('<input type="hidden" name="file['+questionId+']['+file.id+'][name]" value="'+file.name+'" style="display:none;" />')
			.append('<input type="hidden" name="file['+questionId+']['+file.id+'][caption]" value="'+file.caption+'" style="display:none;" />')
			.append('<input type="hidden" name="file['+questionId+']['+file.id+'][extension]" value="'+file.extension+'" style="display:none;" />');
		
		$('img', this).hide();
		// Handle image here
		if( $.inArray(file.extension,['jpg','jpeg','png','gif']) != -1 ){
			
			$(this).find('.icon .photo')
				.attr('src',file.thumb)
				.attr('title','Original Dimensions: ' + file.original_actual_width + ' X ' + file.original_actual_height + '\r\n'+  
								'Type: ' + file.extension + '\n' +
								'Original: ' + file.original_size
					)
				.show();
		}else{
		// All other files here
			if($('.icon .'+file.extension,this).is(':hidden')){
				$(this).find('.icon .'+file.extension).show();
			}else{
				$(this).find('.icon .default').show();
			}
		}
		
		$('.delete', this).click(function(){
			if(confirm('Are you sure you want to delete this file?')){
				$(rowObject).remove();
				$rowContainer.checkFileUploadLimit( fileUploadLimit );
			}
		});
		
		$(this).hover(function(e){
			$('.image-controls',this).fadeIn('fast');
		},
		function(){
			$('.image-controls',this).fadeOut('fast');
		});
	};
	
})(jQuery);

$(document).ready(function(){
	$.voForm();
});

