(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','');
		$(this).voCheckWarnings();
	};
	
	/**
	 * Form Type Setup happens below here
	 */
	
	$.fn.voFormCustom = function()
	{
		var $formObject = $(this);
		
		function formatErrorMessage( data_error_message, data_dom_error )
		{
			// 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;
				}
				$('#error-message').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{
				$('#error-message').fadeOut('fast');
			}
		};
		
		if( $('#error-message',$formObject).length == 0 ){
			$formObject.prepend('<div id="error-message" style="display:none;" />');
		}
		if( $('#success-message',$formObject).length == 0 ){
			$formObject.prepend('<div id="success-message" style="display:none;" />');
		}
		
		function success( data )
		{
			$('.waiting-for-results',$formObject).hide();
			if( data.error_message ){
				formatErrorMessage(data.error_message, data.dom_error);
			}else if( data.success_message ){
				$('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>');
		
		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 varString = '&actionPath=/action/public/cms/file-upload-public' 
						+ '&id=' + id
						+ '&relate=post'
						+ '&allowedExt=*.jpg; *.jpeg; *.png; *.gif; *pdf; *doc; *mp3'
						+ '&allowedExtDescr=Images (*.jpg; *.jpeg; *.png; *.gif; *pdf; *doc; *mp3)';
			
			var $fileObject = $('<div class="file-uploader'+id+'"></div>');
			$fileObject.hover(function(){
				voFile.settings.ulDom = '.stage'+id+' ul';
				//$.voMessage.debug(voFile.settings.ulDom);
			});
			var $flashObject = $('<object></object>')
									.attr({
										'classid':'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',
										'codebase':'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
										'width':'46',
										'height':'18',
										'align':'middle'
									});
				$flashObject.append('<param name="allowScriptAccess" value="always" />');
				$flashObject.append('<param name="allowFullScreen" value="false" />');
				$flashObject.append('<param name="FlashVars" value="" />')
					.attr('value',function(){
						return $(this).attr('value') + varString;
					});
				$flashObject.append('<param name="wmode" value="transparent" />');
				$flashObject.append('<param name="movie" value="/admin/theme/default/flash/multiFileUploader.swf?v=20" />');
				$flashObject.append('<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />');
			var $embedObject = $('<embed></embed>')
					.attr({
						'src':'/admin/theme/default/flash/multiFileUploader.swf?v=20',
						'quality':'high',
						'bgcolor':'#ffffff',
						'width':'46',
						'height':'18',
						'name':'fileUploaderBar',
						'align':'middle',
						'allowScriptAccess':'always',
						'allowFullScreen':'false',
						'type':'application/x-shockwave-flash',
						'pluginspage':'http://www.macromedia.com/go/getflashplayer',
						'wmode':'transparent'
					})
					.attr('src',function(){
						return $(this).attr('src') + '?' + varString;
					});
			
				$flashObject.append($embedObject);
			$fileObject.append($flashObject);
	
			var $fileStage = $('<div class="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>');
			$fileObject.append($fileStage);
			
			return $fileObject;
		}
		
		function submitSuccess( data, status )
		{
			$spinner.hide();
			if(data.message){ $('.message',$formObject).show().html(data.message); }
			$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();
});

/**
 * Functions that are called from Flash
 * @param id
 * @return
 */

// voFile object setting and call publically for Flash file
	
	voFile.setInterface = function( loadingObject, data )
	{
		$(loadingObject).setFileInterface( data.file );
	};
	
	function addFileToDom( id, fileName )
	{
		voFile.addFileToDom( id, fileName );
	};
	
	// Set Progress Bar
	function setProgressBar( id, percent )
	{
		voFile.setProgressBar( id, percent );
	};
	
	function loadThumbnail( id, flashEvent )
	{
		voFile.loadThumbnail( id, flashEvent );
		//$.voMessage.debug(id);
	};

	function fileLoader( json )
	{
		//$.voMessage.debug(json);
	};