// Global helper functions for enhanced page display
window.changed = false;
var ajaxSuccessMessage = "CHANGES SAVED";
var ajaxWaitMessage = "Saving Changes - Please Wait &nbsp; ";
var ajaxWaitMessageElement = document.createElement('span');
ajaxWaitMessageElement.setAttribute('id', 'ajaxSaveChanges');
var ajaxFormErrorsMessage = '<ul class="errors"><li>Unable to save changes. Please review and try again.</li></ul>';


$(document).ready(function() {	
	hookUpFormElements($('form'));
});	

function hookUpFormElements(scope){
//	$('label.required', scope).before('<span class="req">*</span>');
	$('form.confirm', scope).find('input, select, textarea').bind('change', onElementChangeHandler);
	$('.submit', scope).bind('click', function(evt){window.changed = false;});
	$('button.submit', scope).bind('click', submitHandler);
	$('button.upload', scope).bind('click', uploadHandler);
	$('input[type=submit]', scope).bind('click', submitHandler);
	$('input[type=radio]', scope).parent('label').addClass('radio');
}


function onElementChangeHandler(evt){
	if(!window.changed) window.changed = true;
}

function submitHandler(evt){
	var evt = evt || event;
	var el = evt.currentTarget || evt.srcElement;
	$(".error").removeClass("error"); // remove class from input elements
	$(".errors").remove(); // remove error messages
	evt.preventDefault();		
	var form = $(el).parents('form')[0];	
	var formAction = $(form).attr("action");
	var formMethod = $(form).attr("method").toUpperCase();
	var formEncType = $(form).attr("enctype").toUpperCase();
	var isAjax = $(form).hasClass('ajaxForm');
	var formData = $(form).serialize();	
	if(isAjax){
		if (typeof savePreProcess == 'function') {
		/// added by AGS to allow forms to be blanked on send (or any other pre-send processing)
			savePreProcess( formData );
		}
		$('#jquerystatusbar').remove();
		if($('#jquerystatusbar', $(form)).length == 0) $('fieldset.formactions:last', $(form)).before("<div id='jquerystatusbar'></div>");
		$('#jquerystatusbar', $(form)).removeClass('error').removeClass('success');
		ajaxWaitMessageElement.innerHTML = ajaxWaitMessage;
		$('#jquerystatusbar', $(form)).css({display:'none'}).html(ajaxWaitMessageElement);		
		$('#jquerystatusbar', $(form)).stop().slideDown(500).fadeIn(500);
		$.throbberShow({ajax:true, parent:$("#ajaxSaveChanges"), image:"/website/static/source/img/icons/ajax-loader-arrows.gif", delay:0});
		$.ajax({
			type: formMethod,
			url: formAction,
			data: formData,
			dataType: "json",
			success: function(data){ 
			/// hide any throbbers
				// alert('throbberHide = '+  typeof throbberHide );
			    if ( typeof throbberHide == 'function' ) {
			    	$.throbberHide();
			    }
				if (! data) {
					// csv export may result in no data returned to calling function
					return;
				}
				if ( data.zapp_result == 'error'){
					// error
					$('#jquerystatusbar', $(form)).css({display:'none'}).addClass('error').html(data.zapp_message); 
					$('#jquerystatusbar', $(form)).stop().fadeIn(500);
				} else if ( data.zapp_result == 'validationerror') {
					// server-side validation errors
					var errorSummary = procServerValidation(data.zapp_message, data.formid);
					$('#jquerystatusbar', $(form)).css({display:'none'}).addClass('error').html(errorSummary); 
					$('#jquerystatusbar', $(form)).stop().attr('style','').fadeIn(500);
				} else {
				/// update form
					if (typeof saveCallback == 'function') {
						saveCallback(data);
					}
					$('#jquerystatusbar', $(form)).css({display:'none'}).addClass('success').html(ajaxSuccessMessage); 
					$('#jquerystatusbar', $(form)).stop().fadeIn(500).delay(3000).slideUp(500);
					
				}
			},
			error: function(){
				$('#jquerystatusbar', $(form)).css({display:'none'}).addClass('error').html("There has been a problem communicating with the server, please try again."); 
				$('#jquerystatusbar', $(form)).stop().fadeIn(500);
			}	
		});	
	}else{		
		form.submit();
	}
}

function uploadHandler(evt){
	var evt = evt || event;
	var el = evt.currentTarget || evt.srcElement;
	$(".error").removeClass("error");
	evt.preventDefault();		
	var form = $(el).parents('form')[0];
	var formAction = $(form).attr("action");
	var formMethod = $(form).attr("method").toUpperCase();
	var formEncType = $(form).attr("enctype").toUpperCase();
	var isAjax = $(form).hasClass('ajaxForm');
	if(isAjax){
		if($('#jquerystatusbar').length == 0) $(form).prepend("<div id='jquerystatusbar'></div>");
		$('#jquerystatusbar').removeClass('error').removeClass('success');
		$(form).ajaxSubmit({
			type: formMethod,
			url: formAction,
			data: $(form).serialize(),
			dataType: "json",
			iframe:true,
			success: function(data){ 
				if ( data.zapp_result == 'error'){
					// error
					$('#jquerystatusbar').css({display:'none'}).addClass('error').html(data.zapp_message); 
					$('#jquerystatusbar').stop().slideDown(500).fadeIn(500);
				} else if ( data.zapp_result == 'validationerror') {
					// server-side validation errors
					var errorSummary = procServerValidation(data.zapp_message, data.formid);
					$('#jquerystatusbar').css({display:'none'}).addClass('error').html(errorSummary); 
					$('#jquerystatusbar').stop().slideDown(500).fadeIn(500);
				} else {
				/// update form
					if (typeof saveCallback == 'function') {
						saveCallback(data);
					}
					$('#jquerystatusbar').css({display:'none'}).addClass('success').html("CHANGES SAVED"); 
					$('#jquerystatusbar').stop().slideDown(500).fadeIn(500).delay(5000).slideUp(500);
					
				}
			},
			error: function(){
				$('#jquerystatusbar').css({display:'none'}).addClass('error').html("There has been a problem communicating with the server, please try again."); 
				$('#jquerystatusbar').stop().slideDown(500).fadeIn(500);
			}	
		});	
	}else{
		form.submit();
	}
}



/**
 * @TODO - tidy up HTML tags etc
 * @param jsonErrorMessages
 * @return HTML formatted summary of error messages
 */
function XprocServerValidation( serverErrors, formid ) {
	if (!serverErrors) {
		return "";
	}
	var summary = "";
	if (formid == null) {
		formid = '';
	}
	if (typeof serverErrors == 'object') {
		var scope = (formid != '')? $('#'+formid): $('body');
		for (var prop in serverErrors) {
			if(serverErrors.hasOwnProperty(prop)){
				var propName = prop.toString();
				$(":input[name="+propName+"]", scope).addClass('error');
				summary += '<p>' + serverErrors[prop].label + ' ';
				var messages = serverErrors[prop].messages;
				for (var errorItem in messages) {
					if(messages.hasOwnProperty(errorItem)){
						summary += serverErrors[prop].messages[errorItem] +' ';
					}
				}
				summary += '</p>';
			}
		}
	}
	return summary;
};


/**
 * Adds error class and message to each input with validation errors
 * @param jsonErrorMessages
 * @return HTML message stating form contains errors
 * Note: behaviour changed from previous version that returned a summary of errors
 */
function procServerValidation( serverErrors, formid ) {
/// remove previous error messages
	$(".errors").remove();	
	if (!serverErrors) {
		return "";
	}
	if (formid == null) {
		formid = '';
	}
	var scope = (formid != '')? $('#'+formid): $('body');
	if (typeof serverErrors == 'object') {		
		for (var prop in serverErrors) {			
			if(serverErrors.hasOwnProperty(prop)){				
				var propName = prop.toString();
				$(":input[name="+propName+"]", scope).addClass('error');
				
				var summary = '<ul class="errors">';
				var messages = serverErrors[prop].messages;
				for (var errorItem in messages) {
					if(messages.hasOwnProperty(errorItem)){
						summary += '<li>' +serverErrors[prop].messages[errorItem] +'</li>';						
					}
				}
				summary += '</ul>';
				$(":input[name="+propName+"]", scope).after(summary);
				
			}
		}
	}
	return ajaxFormErrorsMessage;
	// return summary;
};

/**
 * clear default value from text or password input
 */
function clearDefault(ipt) {
	if ((typeof ipt != 'object') || (ipt.type != 'text'  && ipt.type != 'password')) {
		// alert(ipt.type);
		return;
	}
	if (ipt.value == ipt.defaultValue) {
		ipt.value = "";
	};
}


$(document).ready(function() {	
	$('#reg_dpa_opt_out-element p').append(" We do not like spam and will not pass your details on to a third-party. Plus, if you ever change your mind you have the option to update your profile or unsubscribe at any time in your Account.");
});

