renewalDateDefault = '' ; // DEFAULT
(function ($) {
	
	/**
	 * ajaxForm function
	 * This handles the submitting of the form
	 */
	$.fn.xf_ajaxForm = function (options) {
	
		/**
		 * Options
		 */
		var defaults = {
	        url				: 'none',			// url to send form to...
	        resetFields		: false,			// Reset all fields when successful
	        fadeInErrors	: false,			// Fade the errorMsg in?
	        success			: function(){},   	// Called when successful
	        everySuccess	: function(){},		// Called at every success of ajax... for extending purposes
	        before			: function(){},    	// Called before ajax is sent
	        updateCols		: '',				// Id of the row and col to be updated (e.g. <index>-<value>,<index>-<value>)
	        timeout			: 12000,			// Timeout amount
	        useTimeout		: true,				// Use Ajax Timeout?
            debugMode       : false             // Put debugmode on/off?
	    } ;
			
	var options = $.extend(defaults, options) ; 
		
	/**
	 * Submit Handler on this form
	 */
		$(this).submit(function(e){
			// Get form id and serialize the form
			var formId = $(this).attr('id') ;
			var formValues = $(this).serialize() ;
			
			// Show ajax loading + zero error message
			$('#' + formId + '_ajax_load').show() ;
			$('#' + formId + '_errorMsg').html('') ;

            // Optional before callback
            options.before() ;
            
            if (options.useTimeout == false)
            {
                options.timeout = 999999999 ;
            }
            
			// Start ajax
			$.ajax({
				type	: "POST",
				url		: options.url,
				data	: formValues,
				dataType: 'json',
				timeout	: options.timeout,
				success	: function(data){
					// Hide ajax loading + enable fields again
					$('#' + formId + '_ajax_load').hide() ;
					$('#' + formId).find('input').attr('disabled', '') ;
					$('#' + formId).find('textarea').attr('disabled', '') ;
					$('#' + formId).find('select').attr('disabled', '') ;
					
					// Any error messages?
					if ((data.errorMsg != undefined && data.errorMsg != '') || data.error == 'Y')
					{
						$('#' + formId + '_errorMsg').html(data.errorMsg) ;
						
						if (options.fadeInErrors == true)
						{
							$('#' + formId + '_errorMsg').hide().fadeIn('slow') ;
						}
					}
					else
					{
						// No errors... must be successful!
						if (options.resetFields == true)
						{
							$('#' + formId).xf_cleanForm() ;
						}
						
						// Execute the success function
						// [data] is for custom funcs.
						options.success(data.listHtml, data.data) ;
						
						// Update Cols
						if (options.updateCols != '')
						{
							updateCols = data.updateCols.split(',') ;
						    for(i = 0; i < updateCols.length; i++){
								column = updateCols[i].split('^') ;
								$('#' + options.updateCols + ' td:eq(' + column[0] + ')').html(column[1]) ;
							}
						}
					}
		
					// Invalid fields to highlight?
					if (data.invalidFields != undefined && data.invalidFields != '')
					{
						var invalidFields = data.invalidFields.split(",");
		
						for(i = 0; i < invalidFields.length; i++){
							$('#' + formId).find('[name="' + invalidFields[i] + '"][required="Y"]').attr('class', 'forminputs_red') ;
						}
					}
					
					// Execute the everySuccess function
					options.everySuccess(data.data) ;
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
                
					if (options.useTimeout == true && textStatus == 'timeout')
					{
						// Error with ajax
						// Hide ajax loading + show message
						$('#' + formId + '_ajax_load').hide() ;
						$('#' + formId + '_errorMsg').html('Theres a problem with your last request, please try again') ;
						
						// Enable fields again
						$('#' + formId).find('input').attr('disabled', '') ;
						$('#' + formId).find('textarea').attr('disabled', '') ;
						$('#' + formId).find('select').attr('disabled', '') ;
					}
                    
                    if (options.debugMode == true)
                    {
                        alert('Notify Sent\nPlease report this error: ' + XMLHttpRequest + ' - ' + textStatus + ' - ' + errorThrown) ;
                    }
				}
			});            

            // Disable fields + redo required fields
            // BUG: This has been moved to after the ajax sender
            // because of weird bug... doesnt like disabling of submit buttons?!?!?
            $(this).find('input').attr('disabled', 'disabled') ;
            $(this).find('textarea').attr('disabled', 'disabled') ;
            $(this).find('select').attr('disabled', 'disabled') ;
            $(this).find('input[required="Y"]').attr('class', 'forminputs_green') ;
            
			return false ; // Disable the forms action ability
			
		});
	};
  
	//--------------------------------------------------
	
	/**
	 * Template form function
	 *
	 * Example:
	 * $('#addSubscriberFormContainer').xf_templateForm({ template:'subscribersFormTemplate', 
	 *												    formId:'addSubscriberForm' }) ;
	 *
	 */
	$.fn.xf_templateForm = function (options) {
		
		/**
		 * Options
		 */
		var defaults = {
			template: '',
			formId: '',
			submitBtn: '  Add  '
		} ;
			
		var options = $.extend(defaults, options) ; 
		
		if (options.template != '' && options.formId != '')
		{
			var containerId = $(this).attr('id') ;
			
			$(this).html($('#' + options.template).html()) ;
			$(this).find('form').attr('id', options.formId) ;
			$(this).find('#ajax_load').attr('id', options.formId + '_ajax_load') ;
			$(this).find('#errorMsg').attr('id', options.formId + '_errorMsg') ;
			$(this).find('input[required="Y"]').attr('class', 'forminputs_green') ;
			$(this).find('input[type="submit"]').attr('value', options.submitBtn) ;
		
			$(this).find('.cancel').click(function(){
				$('#' + containerId).slideUp() ;
				return false ;
			}) ;
		}
		
	}
  
	//--------------------------------------------------
  
	/**
	 * Get values from ajax and populate a form
	 */
	$.fn.xf_ajaxFillForm = function (options) {
		var defaults = {
			url: 'this/url/doesnt/exist',
			success: function(){}
		};
		
		var options = $.extend(defaults, options);
		var formId = 'form#' + $(this).attr('id') ;
		
		$.ajax({
			type: "POST",
			url: options.url,
			dataType: 'json',
			success: function(data){
			
				$(formId).find('input').each(function(){
					
					name = $(this).attr('name') ;
					$(this).attr('value', data.values[name]) ;
					
				});	
				
				$(formId).find('textarea').each(function(){
					
					name = $(this).attr('name') ;
					$(this).attr('value', data.values[name]) ;
					
				});
				
				$(formId).find('select').each(function(){
					
					name = $(this).attr('name') ;
					selectVal = data.values[name + 'id'] ;
					
					if (selectVal == undefined)
					{
						selectVal = data.values[name] ;
					}
					
					$(this).selectOption(selectVal) ;
					
				});
				
				// Call success function
				options.success() ;
				
			},
			error: function(XMLHttpRequest, textStatus, errorThrown){
				
				// error
				alert('Theres a problem with your last request, please try again') ;
				
			}
		});	
	}
  
	//--------------------------------------------------
  
	/**
	 * Clean form function
	 */
	$.fn.xf_cleanForm = function () {
		$(this).find('input[type!="submit"]').each(function(){ $(this).attr('value', '') ; });
		$(this).find('textarea').each(function(){ $(this).attr('value', '') ; });
		$(this).find('input[required="Y"]').attr('class', 'forminputs_green') ;
		$(this).find('input[type="checkbox"]').attr('checked', '') ;
        
		$(this).find('select').each(function(){
			
			$(this).selectFirstOption() ;
			
		});
		
		formId = $(this).attr('id') ;
		$('#' + formId + '_ajax_load').hide() ;
		$('#' + formId + '_errorMsg').html('') ;
		
		// Special fields
		if (renewalDateDefault != undefined)
		{
			$(this).find('input[name="renewaldate"]').attr('value', renewalDateDefault) ;
		}
	}
  
	//--------------------------------------------------
  
	/**
	 * Stripe Rows
	 */
	$.fn.stripeRows = function(options) {
		var defaults = {
			evenColor: '#F2F2F2',   // EFF8DA
			oddColor: '#FFFFFF'
		};
		
		var options = $.extend(defaults, options);
		
		$(this).find('tbody tr:even.record').css("background-color", defaults.evenColor) ;
		$(this).find('tbody tr:odd.record').css("background-color", defaults.oddColor) ;
		
		return this ;
	};
 
	//--------------------------------------------------
	
	/**
	 * Select a option in selectbox
	 *
	 * this = selectbox
	 * @param string
	 * @return this
	 */
	$.fn.selectOption = function(value) {
		$(this).find('option').attr('selected', '') ;
		$(this).find('option[value="' + value + '"]').attr('selected', 'selected') ;
		return this ;
	};
	
	//--------------------------------------------------
	
	/**
	 * Select FIRST option in selectbox
	 *
	 * this = selectbox
	 * @return this
	 */
	$.fn.selectFirstOption = function() {
		$(this).find('option').attr('selected', '') ;
		$(this).find('option:first').attr('selected', 'selected') ;
		return this ;
	};
	
	//--------------------------------------------------
	
	/**
	 * Add option to selectbox
	 *
	 * this = selectbox
	 * @param string
	 * @param string - if undefined = value
	 */
	$.fn.addOption = function(value, label) {
		if (label == undefined)
		{
			label = value ;
		}
		
		//id = $(this).attr('id') ;
		$(this).append('<option value="' + value + '">' + label + '</option') ;
		return this ;
	};
 
})(jQuery);