var count = 1;
var updateTrans = 0;
var waitingTrans = 0;
var fx = [];
var errHTML = 	"<p>Sorry, we are not able to process your request "+
		"at this time. Please try again shortly, or contact a system administrator "+
		"if the problem persists.</p>";
var redirHTML = "<p>Please wait while we forward you...</p>";
var submitting = { };

function updateContentFromAjax(text, contentId, failed) {
	if(text && $(contentId)) {
		if(failed) {
			var fwd = text.getResponseHeader("X-Forward-Client");

			if(fwd && fwd == "true") {
				var loc = text.getResponseHeader("Location");
				if(loc) {
					var currError = $(contentId).getElement("#ajaxError");
					if(currError) {
						currError.setHTML(redirHTML);
					} else $(contentId).setHTML(
						 "<div id='ajaxError' class='ajaxWaiting message'>"+redirHTML+"</div>"
					);
					setTimeout(function( ) { document.location = loc; }, 1000);
					return;
				}
			}

			var currError = $(contentId).getElement("#ajaxError");
			if(currError) {
				currError.setHTML(errHTML);
			} else $(contentId).setHTML(
				 "<div id='ajaxError' class='errors message'>"+errHTML+"</div>"+
				$(contentId).innerHTML
			);			
			//Eval scripts
			var scripts = $ES('script', $(contentId).innerHTML);
			for(id in scripts) { if(scripts[id].innerHTML) { eval(scripts[id].innerHTML); } }

		} else {
			$(contentId).setHTML("<a id='update"+count+"'></a>"+text);
			//Eval scripts
			var scripts = $ES('script', text);
			for(id in scripts) { if(scripts[id].innerHTML) { eval(scripts[id].innerHTML); } }

			var docloc = document.location.toString( ).replace(/#update\d+/, "");
			document.location=docloc+"#update"+count;

			count++;
		}
	}
}

function setContentUpdateTransition(type) {
	if(!type) var type = 1;

	switch(type) {
		case 1:	
		case 2:
			updateTrans = type;
			break;
		default:
			updateTrans = 0;
	}

}

function setWaitingUpdateTransition(type) {
	if(!type) var type = 1;

	switch(type) {
		case 1:	
		case 3:	
			waitingTrans = type;
			break;
		default:
			updateTrans = 0;
	}

}

function transitionContent(type, id, out) {
	var div = $(id);
	if(div) {
		
		switch(type) {
			case 1:
				if(out) fx[id] = new Fx.Style(div, 'opacity', {wait: false}).start(1, 0);
					else fx[id] = new Fx.Style(div, 'opacity', {wait: false}).start(0, 1);
				break;
			case 2:
				if(!fx[id]) fx[id] = new Fx.Slide(div,  {mode: 'horizontal', duration: 300});
					else fx[id].stop( );
				if(out) fx[id].slideOut( ); else fx[id].slideIn( );
				break;
			case 3:
				if(!fx[id]) fx[id] = new Fx.Slide(div,  {duration: 300});
					else fx[id].stop( );
				if(out) fx[id].slideOut( ); else fx[id].slideIn( );
				break;
			default:
				if(out) div.setStyle("display", "none");
					else div.setStyle("display", "block");
		}
	}
}

function sendForm(formId, resultId, waitingId, completeFunc, contentHolder) {
	if(!$(formId)||submitting.formId) return;
	submitting.formId = true;
	var opts = { evalScripts: true };
	if(resultId) {
		opts.update = $(resultId);
		$(resultId).setStyle("display", "none");
	}

	opts.onComplete = function(a) {
		submitting.formId = false;
		transitionContent(updateTrans, contentHolder, false);
		if(waitingId) {
			transitionContent(waitingTrans, waitingId, true);
		}
		if(typeof completeFunc == "string") {
			setTimeout(completeFunc, 1);
		} else {
			completeFunc.call(this, a, contentHolder);
		}		
	};

	opts.onFailure = function(a) { 
		submitting.formId = false;
		transitionContent(updateTrans, contentHolder, false);
		if(waitingId) {
			transitionContent(waitingTrans, waitingId, true);
		}	
		if(typeof completeFunc != "string") {
			completeFunc.call(this, a, contentHolder, true);
		}			
        };

	transitionContent(updateTrans, contentHolder, true);
	if(waitingId) {
		if($(waitingId) && $(waitingId).getStyle("display", "none"))
			$(waitingId).setStyle("display", "block");
		transitionContent(waitingTrans, waitingId, false);
	}

	$(formId).send(opts);
}
