
function ri(o) {
	//alert(o);
	//o.addClassName('thover');
}
function ro(o) {
	//o.removeClassName('thover');
}



function update_breadcrumb() {
	var bc = $("rp_breadcrumb");
	if(!bc) return;
	var onewbctext = $("ct_breadcrumb");
	if(onewbctext) {
		Element.update("rp_breadcrumb", onewbctext.innerHTML);
	}
}

function update_statusmessage() {
	var bc = $("rp_statusmessage");
	if(!bc) return;
	var onewbctext = $("ct_statusmessage");
	if(onewbctext) {
		Element.update("rp_statusmessage", onewbctext.innerHTML);
	}
}

function set_statusmessage(html) {
	var bc = $("rp_statusmessage");
	if(!bc) return;
	Element.update("rp_statusmessage", html);
}

function set_progressmessage(html) {
	Element.update("ct_progresstemplatemessage", html);
	set_statusmessage($("ct_progresstemplate").innerHTML);
}
function clear_progressmessage() {
	set_statusmessage('');
}

Event.observe(window, 'load', update_breadcrumb, false);
Event.observe(window, 'load', update_statusmessage, false);

var requestbucket = new Object;

/**
 * execute the ajax request for the directives given.
 *
 */
function call_bucket(bucketid) {
	// set the status to in-progress
	requestbucket[bucketid].outstatus = 1;

	// get the callback function to run
	successfn = eval('onsuccess_bucket_'+bucketid);

	// params?
	parameters = (requestbucket[bucketid].parameters) ? requestbucket[bucketid].parameters : '';

	// form
	//formparameters = (requestbucket[bucketid].addform) ? Form.serialize(requestbucket[bucketid].addform) : '';
	formparameters = '';
	if(requestbucket[bucketid].addform) {
		//alert(requestbucket[bucketid].addform);
		
		//alert('b');
		formparameters = 	Form.serialize(requestbucket[bucketid].addform);
		
		//f = $("oneform");
		//f = document.getElementById("oneform");
		//alert(f);
		//return false;
		//alert($F("account_contact_firstname"));
		//formparameters = f.serialize();
		//alert('c');
	}
	parameters = (parameters.length) ? (parameters+'&'+formparameters) : parameters+formparameters;
	
	// call the function
	var myAjax = new Ajax.Request(
		requestbucket[bucketid].url, 
		{
			method: 'post',
			parameters: parameters,
			onSuccess: successfn
		}
	);
	
}

function onsuccess_bucket_a(req) { onsuccess_bucket_general('a', req); }
function onsuccess_bucket_b(req) { onsuccess_bucket_general('b', req); }
function onsuccess_bucket_c(req) { onsuccess_bucket_general('c', req); }
function onsuccess_bucket_d(req) { onsuccess_bucket_general('d', req); }
function onsuccess_bucket_e(req) { onsuccess_bucket_general('e', req); }
function onsuccess_bucket_f(req) { onsuccess_bucket_general('f', req); }
function onsuccess_bucket_g(req) { onsuccess_bucket_general('g', req); }
function onsuccess_bucket_general(bucketid, req) {
	
	// set the status to complete.
	requestbucket[bucketid].outstatus = 2;
	
	// what kind of response did we get?
	if(req.responseText.charAt(0)=='{') {
		json = eval('(' + req.responseText + ')');
		// TODO also should be error handling here for data error.
		requestbucket[bucketid].json = json;
	}
	else {
		// data error.
		requestbucket[bucketid].dataerror = 1;
		requestbucket[bucketid].responseText = req.responseText;
		add_error(req.responseText);
		s8_add_error(req.responseText);
		s8_modal_wait_hide();		// always release the ui on error
		run_bucket_callback(bucketid);
		return;
	}

	// special functions - html auto-replacement
	if(requestbucket[bucketid].htmlreplacement) {
		replace_html(json);
	}

	// page-replacement right here
	// conditional if file is included!
	
	if(requestbucket[bucketid].json.page_replacement_buffer) {
		// place the page replacement buffer into the object model from the json
		pbuf = $("pr-buffer");

		Element.update(pbuf, requestbucket[bucketid].json.page_replacement_buffer);
		// do the replacements
		s8_page_replacements();
	}

	// auto error handling if specified??

	// debug output if any
	add_debug(json);

	s8_add_debug(json);

	// done. run callback if any.
	run_bucket_callback(bucketid);
}

function run_bucket_callback(bucketid) {
	fnstring = '';
	if(requestbucket[bucketid].callbackfunction) {
		fnstring = requestbucket[bucketid].callbackfunction;
	}
	if(requestbucket[bucketid].callbackstate) {
		fnstring += '('+requestbucket[bucketid].callbackstate+');';
	}
	else {
		fnstring += '();';
	}
	if(fnstring.length) {
		eval(fnstring);
	}
}

function add_error(html) {
	if(!$('rp_debugoutput')) return;
	new Insertion.Top('rp_debugoutput', '<div>'+html+'</div>');
}
function add_debug(json) {
	if(!json.debug) return;
	if(!$('rp_debugoutput')) return;
	h = $A(json.debug);
	h.each(function(node){
		new Insertion.Top('rp_debugoutput', '<div>'+node+'</div>');
	});
}













function execute_bucket(bucketid) {
			
	// start wait
	if(requestbucket[bucketid].startmessage) {
		set_progressmessage(requestbucket[bucketid].startmessage);
	}
	popup_fade_on();
	
	// which bucket post-function to run when done?
	// we can't get the original request, so we fake it.
	successfn = eval('success_bucket_'+bucketid);
	
	// process now:
	requestbucket[bucketid].startstatus=1;
	
	if(requestbucket[bucketid].reqtype=='inf') {
		formqstr = requestbucket[bucketid].issubmit ? Form.serialize(requestbucket[bucketid].formid) : '';
		var myAjax = new Ajax.Request(
			requestbucket[bucketid].formurl, 
			{
					method: 'post',
					parameters: formqstr,
					onSuccess: successfn
				}
			);
	}
	if(requestbucket[bucketid].reqtype=='update') {
		var myAjax = new Ajax.Request(
			requestbucket[bucketid].formurl, 
			{
					method: 'get',
					onSuccess: successfn
				}
			);
	}
		
}
function bucket_call(bucketid, params) {
	
	// store this request in the bucket.
	requestbucket[bucketid] = params;
	
	execute_bucket(bucketid);
}	

function success_bucket_a(req,jsonheader) {	
	success_bucket_general('a', req,jsonheader);
}	
function success_bucket_b(req,jsonheader) {	
	success_bucket_general('b', req,jsonheader);
}	
function success_bucket_c(req,jsonheader) {	
	success_bucket_general('c', req,jsonheader);
}	
function success_bucket_d(req,jsonheader) {	
	success_bucket_general('d', req,jsonheader);
}	
function success_bucket_general(bucketid, req,jsonheader) {
	requestbucket[bucketid].startstatus=2;
	if(!jsonheader) {
		// just a bunch of stuff coming back.
		// assume error/dbg
		var bc = $("rp_debugoutput");
		if(!bc) alert(req.responseText);
		else Element.update("rp_debugoutput", req.responseText);

		popup_fade_off();
		return;
	}

	if(requestbucket[bucketid].reqtype=='inf' || requestbucket[bucketid].reqtype=='update' ) {
		if(jsonheader.isjson) {
			json = eval('(' + req.responseText + ')');
			replace_html(json);
		}
		else {
			alert('what is this?');
			alert(req.responseText);return;	// error/debug (include here for popup)	
		}
		if(requestbucket[bucketid].successmessage) {
			set_statusmessage(requestbucket[bucketid].successmessage);
		}
		
		if(requestbucket[bucketid].postprocess) {
			eval(requestbucket[bucketid].postprocess+"(bucketid, json);");
		}
	}
	
	
	
	
	popup_fade_off();
}



	function popup_fade_on() {
		Dialog.info("",
	               {windowParameters: {className: "alphacube", opacity: 0, width:250, height:100, showEffect: Effect.Appear, hideEffect: Element.hide}, showProgress: true});
	}
	function popup_fade_off() {
		Dialog.closeInfo();
	}
	function replace_html(json) {
		if(!json.html) return;
		h = $H(json.html);
		
		h.each(function(node){
			rp = $(node.key);
			if(!rp) return;		// none by that name, skip.
			rp.innerHTML = node.value;
		});
		
	}

	// ** common **
	// handles error case where json data was not returned with direction.
	function no_result(req, json) {
		$("pg_dbg").update("error: "+req.responseText);
	}
	function js_error(req, err) {
		$("pg_dbg").update("js error: "+err);
	}
	function json_error(errmsg) {
		$("pg_dbg").update("json error: "+errmsg);
	}

	function specialreplace(req) {
		$("special-replace").innerHTML = req.responseText;
		var someNodeList = $('special-replace').getElementsByTagName('div');
		var nodes = $A(someNodeList);
		nodes.each(function(node){
			if(node.id.indexOf('replace-')==0) {
				actualid = node.id.substr(8);
				$(actualid).innerHTML = node.innerHTML;
			}
		});			
	}
		
	// update timer message each second
	var sph_starttime;
	var sph_dlmessage;
	var sph_startmessage;
	var sph_stopcount;
	function sph_infotimeout() {
	  if(!sph_stopcount) {
	  	sph_updatemessage();
	  	setTimeout(sph_infotimeout, 1000);
	  }
	}
	function sph_updatemessage() {
		dy = new Date();
	  	sec = dy.getTime() - sph_starttime.getTime();

		if(!sph_stopcount) {
			Dialog.setInfoMessage("<h6>"+sph_dlmessage+"</h6>" + "<p>" +  Math.floor(sec/1000) + " seconds elapsed.</p>");
		}
		else {
			Dialog.setInfoMessage("<h6>"+sph_dlmessage+"</h6>");
		}
	}
	function sph_errorandclose(req) {
		sph_stopcount = true;
		sph_dlmessage = "Error running request.<br><a href=\"#\" onclick=\"sph_close(); return false;\">Close.</a>";
	}
	function sph_start() {
		sph_starttime = new Date();	
		sph_dlmessage = sph_startmessage;
		sph_stopcount = false;
		Dialog.info(sph_dlmessage,
	               {windowParameters: {className: "alphacube", width:250, height:100, showEffect: Effect.Appear, hideEffect: Element.hide}, showProgress: true});

		sph_updatemessage();
		setTimeout(sph_infotimeout, 1000);
	}
	function sph_close() {
		sph_dlmessage = "";
		Dialog.closeInfo();
	}



var modalwaitvisible = false;

/**
 * dialog wait message / popup handler
 * pop the dialog if it is not showing. if it is showing, update the message.
 *
 *
 */
function modal_wait_show(messagehtml) {
	if(!modalwaitvisible) {	
		modalwaitvisible = true;
		Dialog.info(messagehtml, {windowParameters: {className: "alert", opacity: 0.89, top: 17, left: 100, width:250, height:20, showEffect: Effect.Appear, hideEffect: Element.hide}, showProgress: true});
	}
	else {
		Dialog.setInfoMessage(messagehtml);
	}
}

/**
 * hides the popup if it is showing.
 *
 */
function modal_wait_hide() {
	Dialog.closeInfo();
	modalwaitvisible = false;
}


