// 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');


//Extend String Class to allow Proper case conversion.
String.prototype.toProperCase = function () {
	if(typeof this.toLowerCase == 'function'){ 
		return this.toLowerCase().replace(/^(.)|\s(.)/g, function ($1) { 
			return $1.toUpperCase(); 
		});
	}
}

//Extend Array Class to allow removal of specific values from an array
Array.prototype.removeByValue = function (val, all) {
	if(typeof all != 'boolean'){
		all = false;
	}
	for (var i = 0; i < this.length; i++){
		if (this[i] == val){
			this.splice(i, 1);
			if(!all){ 
				break;
			}
			i--;
		}
	}
	return this;
}

$(document).ready(function() {
	$('body').addClass('js-enhanced');
	$('body').addClass(getBrowserClass());
	
	//IE Fix: Limit width of element to the max-width value;
	$('select').each(function(){
		var w = $(this).outerWidth(); //current element width
		var mw = parseInt($(this).css('maxWidth')); //value of css max-midth property
		w = (w > mw)? mw : w;
		$(this).css({width:w+"px"});
	});
	
	//Add 'active' class to current menu item;
	$('.main-navigation a, .tab-menu a, .section-menu a').each(function(i){
		var url = escape(window.location.toString());
		var href = escape($(this).attr('href'));
		if(url.search(href) != -1){
			$(this).parent().addClass('active');
		};
	});
	
	//Add lightbulb image to active submenu item;
	$('.section-menu a').each(function(i){
		$(this).css({position:'relative'}).prepend('<img class="lightbulb" src="/images/icons/lightbulb.gif" alt="" />');
	});
	
	hookUpFormElements($('body'));
	
	$("#login-form input:text").bind('focus', focusHandler);
	$("#login-form input:text").bind('blur', blurHandler);
	
	//Swap out password fields for text fields to display default content (swap back on focus);
	$("#login-form input:password").each(function(i){
		 if ($(this).val() == '' || $(this).val() == this.defaultValue) {
			 var name = $(this).attr('name');
			 var id = $(this).attr('id');
			 var classes = $(this).attr('class');
			 $(this).replaceWith("<input maxlength='50' name='"+name+"' type='text' id='"+id+"' value='password...' class='"+classes+"' />")
			 $("#"+id)[0].defaultValue = "password...";
			 $("#"+id).bind('focus', passwordFocusHandler);
		}else{
			 $("#"+id).bind('blur', passwordBlurHandler);
		}
	});
	$("#login-form input:text").each(function(i){
		toggleDefaultStyle.apply($(this));
	});
});	

function getBrowserClass(){
  var b = "";
  var v = "";
  for(i in $.browser){
     if(typeof($.browser[i]) == 'boolean' && $.browser[i] == true) b = i.toString();   
  }
  if( $.browser.msie){ b = "ie ie"; v = parseInt($.browser.version).toString(); }
  return b+v;
}

function focusHandler(evt){
	if($(this)[0].value == this.defaultValue){
		$(this)[0].value = "";
	}else if($(this).text() == this.defaultValue){
		$(this).text("");
		}; 
	toggleDefaultStyle.apply($(this));
}

function blurHandler(evt){
	if($(this).val() == ""){
		$(this)[0].value = this.defaultValue;
	}else if($(this).val() == ""){
		$(this).val(this.defaultValue); ;
	};
	toggleDefaultStyle.apply($(this));
}

function passwordFocusHandler() {
	var name = $(this).attr('name');
	var id = $(this).attr('id');
	var classes = $(this).attr('class');
	var defaultVal = "password...";
	$(this).replaceWith("<input maxlength='50' name='"+name+"' type='password' id='"+id+"' value='"+defaultVal+"' class='"+classes+"' />");
	$("#"+id).trigger('focus');
	$("#"+id)[0].defaultValue = defaultVal;
	$("#"+id).bind('blur', passwordBlurHandler).focus().val('');
	toggleDefaultStyle.apply($("#"+id));
}

function passwordBlurHandler() {
	var name = $(this).attr('name');
	var id = $(this).attr('id');
	var classes = $(this).attr('class');
	var defaultVal = "password...";
	if ($(this).val() == '') {
		$(this).replaceWith("<input maxlength='50' name='"+name+"' type='text' id='"+id+"' value='"+defaultVal+"' class='"+classes+"' />");
		$("#"+id)[0].defaultValue = defaultVal;
		$("#"+id).bind('focus', passwordFocusHandler);
		toggleDefaultStyle.apply($("#"+id));
	}; 
}

function toggleDefaultStyle(){
	if(($(this).val() == $(this)[0].defaultValue) && !$(this).hasClass("isDefault")){
		$(this).addClass("isDefault");
	}else{
		$(this).removeClass("isDefault");
	};
}


function hookUpFormElements(scope){
	$('label.required', scope).before('<span class="req">*</span>');
	$('form.confirm', scope).find('input, select, textarea').bind('change', onElementChangeHandler);
	$('.main-navigation a, .tab-menu a, .section-menu a', scope).bind('click', confirmNavigation);
	$('.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');
	decorateButtons(scope);
}

function onElementChangeHandler(evt){
	if(!window.changed) window.changed = true;
}

function confirmNavigation(evt){
	if(window.changed){
		var answer = confirm("You have unsaved changes on the current page, are you sure you want to discard these?");
		if(answer) window.changed = false;
		return answer;
	}
	return true;
}


function decorateButtons(scope){
	$('.btn', scope).each(function(){
		var btn = $(this);
		if(!btn.hasClass('jqbtn')){
			btn.addClass('jqbtn')
			var container = (btn.parent('dt, dd, a, span').length > 0 )? btn.parent() : {};
			var theClass = (btn.hasClass('green'))? 'green btncontainer' : (btn.hasClass('red'))? 'red btncontainer' : 'plaintext btncontainer' ;
			var alignment = (btn.hasClass('fl'))? 'fl' : (btn.hasClass('fr'))? 'fr' : '';
			container.addClass(theClass).addClass(alignment);
		}
	});
}

function enableForm(id){
	var form = $('#'+id);
	form.find(':disabled').each(function(){
		$(this).attr('disabled', '').removeClass('disabled');
	});
	$('select', form).each(function(){
		$(this).css({display:''}).next('input').remove();
	})
	$('.formactions', form).css({display:'block'});
}

function disableForm(id){
	var form = $('#'+id);
	form.find(':enabled').each(function(){
		$(this).attr('disabled', 'disabled').addClass('disabled');
	});
	$('select', form).each(function(){
		var selected = $(this).val();
		$(this).css({display:'none'});
		if(!$(this).next().hasClass('clone')){
			$(this).after("<input type='text' disabled='disabled' class='clone disabled' class='tf medium' value='"+selected+"' />");
		}else{
		$(this).next().val(selected);
		}
	});
	$('.formactions', form).css({display:'none'});
}

function submitHandler(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');
	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:"/images/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().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 procServerValidation( 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;
};



