// solata core javascript file

var modalwindowone;
var modalwindowcentered;
var replacementlist = new Array();



// load initial html bar replacements
function onload_solata8() {
    prepmodalone();
    prepmodalwindowcentered();
	
	/*
	modalwindowcentered = new Control.Modal($('modal-link-two'),{
           position: 'absolute',
           containerClassName: 'popcenter',
           overlayClassName: 'popcenter'
        });
	*/
	
	s8_add_to_replacement_list('pr-pageheader');
	s8_add_to_replacement_list('pr-leftmenu');
	
	s8_onload_replacements();
}
function prepmodalone() {
    // make sure cm is inited. IE issues, call out of sequence the events for some reason. so lets make sure this happens.
    Control.Modal.load();

    modalwindowone = new Control.Modal($('modal-link-one'),{
        overlayCloseOnClick: false,
        opacity: 0.8,
        position: 'relative',
        containerClassName: 'popregct',
        overlayClassName: 'popregov'
        	
    });
	
}
function prepmodalwindowcentered() {
    // make sure cm is inited. IE issues, call out of sequence the events for some reason. so lets make sure this happens.
    Control.Modal.load();

    modalwindowcentered = new Control.Modal($('modal-link-two'),{
        overlayCloseOnClick: false,
        opacity: 0.8,
        position: 'absolute',
        containerClassName: 'popcenterwsct',
        overlayClassName: 'popcenterwsov'
    });
	
}

function s8_add_to_replacement_list(id) {
	replacementlist.push(id);
}

// replace all onload replacements now.
function s8_onload_replacements() {
	// get all divs with classes onload-replacement
	var replacements = $$(".onload-replacement");
	
	// with each one, move its content to the dest.
	for(var i=0;i<replacements.length;i++) {
		var srcid = replacements[i].id;
		var destid = srcid.substr(6);		// remove "onload-"
		s8_html_switch(srcid, destid);
	}
}

// replace all items set for page-replacement
function s8_page_replacements() {
	
	// faster implementation. use named list instead of $$.  $$ is really really really slow in IE6.
	replacementlist.each(function(destid){
		//var destid = destitem.id;
		//var destid = $(destitem).id;
		var srcid = "replacement-"+destid
		var odest = $(destid);
		var osrc = $(srcid);
		if(!osrc && !odest) return;	// if none of them exist, dont break the page
		if(!osrc) {
			// if there is nothing to replace it with, blank out the content and hide it.
			Element.update(odest, "");
			Element.hide(odest);
		}
		else {
			// replace the contents, and make it visible
			s8_html_switch(srcid, destid);
			Element.show(odest);	
		}

		//alert(destid.id);
		//alert(odest);alert(osrc);
	});
	return;

	// OLD 2007.04.13
	// this is the data that needs to be replaced.
	// get all divs with classes page-replaceable
	//alert(destlist);
	//alert(destlist.length);
	// with each one, move its content to the dest.
	var destlist = $$(".page-replaceable");
	for(var i=0;i<destlist.length;i++) {
		var destid = destlist[i].id;
		var srcid = "replacement-"+destid
		var odest = $(destid);
		var osrc = $(srcid);

		if(!osrc) {
			// if there is nothing to replace it with, blank out the content and hide it.
			Element.update(odest, "");
			Element.hide(odest);
		}
		else {
			// replace the contents, and make it visible
			s8_html_switch(srcid, destid);
			Element.show(odest);	
		}
	}
//alert('4');
	// leave unused items in the pr-buffer until next time. TODO remove innerhtml if not needed this may be useful though in the future for secret items
}

// add debug text to the debug element, if there is some sent out here
function s8_add_debug(json) {
	if(!json.debug) return;
	if(!$('page-debug')) return;
	h = $A(json.debug);
	h.each(function(node){
		new Insertion.Top('page-debug', '<div class="debugitem">'+node+'</div>');
	});
}

function s8_add_error(message) {
	if(!$('page-debug')) return;
	new Insertion.Top('page-debug', '<div class="erroritem"><pre>'+message+'</pre></div>');
}


// take content out of srcid, and put it in destid.
// copy content to string, delete srcid content, the place it.
function s8_html_switch(srcid, destid) {
	var osrc = $(srcid);
	var odest = $(destid);
	if(!osrc || !odest) return;
	var buf = osrc.innerHTML;
	//osrc.innerHTML = "";
	//odest.innerHTML = buf;
	Element.update(osrc, "");
	Element.update(odest, buf);
	//dest.innerHTML = osrc.innerHTML;
	
}

// replace contents of destid with srcid.
function s8_html_copy(srcid, destid) {
	var osrc = $(srcid);
	var odest = $(destid);
	if(!osrc || !odest) return;
	Element.update(odest, osrc.innerHTML);
}

// common function to call ajrefresh with the current url
// upd 20070414
function s8_call_ajrefresh() {
	s8_simple_callback(s8_tokenurl('ajrefresh'), 's8_modal_wait_hide', 'Please Wait, loading...');
	return false;
}
function s8_call_ajgetsearchform() {
	s8_simple_callback(s8_tokenurl('ajgetsearchform'), 's8_modal_wait_hide', 'Please Wait, loading...');
	return false;
}
function s8_call_ajpostsearchform(formname) {
	s8_simple_callbackform(s8_tokenurl('ajpostsearchform'), formname, 's8_after_ajpostsearchform', 'Searching, Please Wait...');
	return false;
}
function s8_after_ajpostsearchform() {
	// if searchcomplete, show the listbrowse.
	// otherwise we're done.
	if(requestbucket["a"].json.searchcomplete) {
		return s8_call_ajlistbrowse();
	}
	else {
		return s8_modal_wait_hide();
	}
}

// upd 20070414
function s8_call_ajlistbrowse() {
	s8_simple_callback(s8_tokenurl('ajlistbrowse'), 's8_modal_wait_hide', 'Loading Results...');
	return false;
}

// upd 20070414
function s8_call_ajlistbrowse_changepage(newrow) {
	s8_simple_callbackparams(s8_tokenurl('ajlistbrowse'), 'rown='+newrow, 's8_modal_wait_hide', 'Loading Results...');
	return false;
}

// replaces url_s8_ajtoken's url (ajtoken) 
function s8_tokenurl(ajfuncname) {
	newurl = url_s8_ajtoken;
	newurl = newurl.replace('ajtoken', ajfuncname);
	return newurl;	
}

// call item focus, then if successful redirect to the url spefified in ajitemdocuredirect
// upd 2007.04.14
function s8_call_ajfocusredirect_key(gkey) {
	s8_simple_callbackparams(s8_tokenurl('ajitemfocus'), 'gkey='+gkey, 's8_after_ajfocusredirect', 'Preparing Item, please wait...');
	return false;
}
function s8_call_ajfocusredirect_pos(gpos) {
	s8_simple_callbackparams(s8_tokenurl('ajitemfocus'), 'gpos='+gpos, 's8_after_ajfocusredirect', 'Preparing Item, please wait...');
	return false;
}
function s8_after_ajfocusredirect() {
	// if itemloaded, redirect out.
	// otherwise we're done. (error!) TODO
	if(requestbucket["a"].json.loadcomplete) {
		window.location = url_s8_ajitemfocusredirect;
		return false;
	}
	else {
		return s8_modal_wait_hide();
	}
}

function s8_call_ajfocusrefresh_pos(gpos) {
	s8_simple_callbackparams(s8_tokenurl('ajitemfocus'), 'gpos='+gpos, 's8_after_ajfocusrefresh', 'Preparing Item, please wait...');
	return false;
}
function s8_after_ajfocusrefresh() {
	// if itemloaded, refresh the UI
	// otherwise we're done. (error!) TODO
	if(requestbucket["a"].json.loadcomplete) {
		s8_call_ajrefresh();
		return false;
	}
	else {
		return s8_modal_wait_hide();
	}
}

function s8_call_ajposteditform(formname) {
	s8_simple_callbackform(s8_tokenurl('ajposteditform'), formname, 's8_after_ajposteditform', 'Saving, Please Wait...');
	return false;
}
function s8_after_ajposteditform() {
	// if savecomplete, show somewhere else
	// otherwise we're done.
	if(requestbucket["a"].json.savecomplete) {
		return s8_simple_callback(s8_tokenurl('ajposteditformcomplete'), 's8_modal_wait_hide', 'Loading Page...');
	}
	else {
		return s8_modal_wait_hide();
	}
}

function s8_call_aj(ajfunc, message) {
	desturl = url_s8_ajcall.replace("@@ajcall@@", ajfunc);
	s8_simple_callback(desturl, 's8_modal_wait_hide', message);
	return false;
}
function s8_call_ajparams(ajfunc, params, message) {
	desturl = url_s8_ajcall.replace("@@ajcall@@", ajfunc);
	s8_simple_callbackparams(desturl, params, 's8_modal_wait_hide', message);
	return false;
}
function s8_call_ajparamsform(ajfunc, params, formname, message) {
	desturl = url_s8_ajcall.replace("@@ajcall@@", ajfunc);

	s8_modal_wait_show(message);
	
	requestbucket["a"] = {
		url: desturl,
		parameters: params,
		addform: formname,
		callbackfunction: 's8_modal_wait_hide',
		callbackstate: '0'
	};
	call_bucket("a");

	return false;
}
function s8_call_ajform(ajfunc, formname, message) {
	desturl = url_s8_ajcall.replace("@@ajcall@@", ajfunc);

	s8_modal_wait_show(message);
	
	requestbucket["a"] = {
		url: desturl,
		addform: formname,
		callbackfunction: 's8_modal_wait_hide',
		callbackstate: '0'
	};
	call_bucket("a");

	return false;
}


function s8_ri(o) {
	Element.addClassName(o, 'thover');
	//dojo.html.prependClass(o, 'thover');
}
function s8_ro(o) {
	Element.removeClassName(o, 'thover');
	//dojo.html.removeClass(o, 'thover');
}


var s8modalwaitvisible = false;

/**
 * dialog wait message / popup handler
 * pop the dialog if it is not showing. if it is showing, update the message.
 *
 *
 */
function s8_modal_wait_show(messagehtml) {
	
	if(!modalwindowone) {
		
		prepmodalone();
	}
	modalwindowone.open();
	modalwindowone.update(messagehtml);
	return false;	
	
	// OLDcode 2007.04.13
	if(!s8modalwaitvisible) {	
		s8modalwaitvisible = true;
		// NOTE in px. TODO calculate approx ems to handle screen resizing
		Dialog.info(messagehtml, {windowParameters: {className: "alert", opacity: 1.00, top: 5, left: 525, width:250, height:26, showEffect: Effect.Appear, hideEffect: Element.hide}, showProgress: true});
	}
	else {
		Dialog.setInfoMessage(messagehtml);
	}
}

// closees the popup window
function s8_modal_wait_hide() {
	if(!modalwindowone) {
		
		prepmodalone();
	}

	modalwindowone.close();
	return false;	
	
	// OLDcode 2007.04.13
	Dialog.closeInfo();
	s8modalwaitvisible = false;
	return false;
}

function s8_modal_center_show(messagehtml) {
	if(!modalwindowcentered) {
		prepmodalwindowcentered();
	}
	modalwindowcentered.open();
	modalwindowcentered.update(messagehtml);
	return false;	
}
// closees the popup window
function s8_modal_center_hide() {
	if(!modalwindowcentered) {
		prepmodalwindowcentered();
	}
	modalwindowcentered.close();
	return false;
}
function s8_modal_center_show_ext(url) {
	// get the content and put it in the buffer.
	var myAjax = new Ajax.Request(
	url, 
	{
		method: 'get', 
		onComplete: aftercenterload
	});
}				

function aftercenterload(r) {
	s8_modal_center_show(r.responseText);
}


/**
 * calls the url provided, in bucket a, with the return callback function and message
 *
 */
function s8_token_callback(tokenname, callbackfunction, message) {
	url = s8_tokenurl(tokenname);
	s8_modal_wait_show(message);
	requestbucket["a"] = {
		url: url,
		callbackfunction: callbackfunction,
		callbackstate: '0'
	};
	call_bucket("a");
}
function s8_token_callbackform(tokenname, formname, callbackfunction, message) {
	url = s8_tokenurl(tokenname);
	return s8_simple_callbackform(url, formname, callbackfunction, message);
}
function s8_simple_callback(url, callbackfunction, message, wtype) {
	if(message != null && message.length) { 
		if(wtype=='centered') {
			s8_modal_center_show(message);
		}
		else {
			s8_modal_wait_show(message); 
		}
	}

	requestbucket["a"] = {
		url: url,
		callbackfunction: callbackfunction,
		callbackstate: '0'
	};
	call_bucket("a");
}
function s8_simple_callbackform(url, formname, callbackfunction, message, wtype) {
	if(message.length) { 
		if(wtype=='centered') {
			s8_modal_center_show(message);
		}
		else {
			s8_modal_wait_show(message); 
		}
	}
	
	requestbucket["a"] = {
		url: url,
		addform: formname,
		callbackfunction: callbackfunction,
		callbackstate: '0'
	};
	call_bucket("a");
	return false;
}
function s8_simple_callbackparams(url, params, callbackfunction, message) {
	s8_modal_wait_show(message);
	
	requestbucket["a"] = {
		url: url,
		parameters: params,
		callbackfunction: callbackfunction,
		callbackstate: '0'
	};
	call_bucket("a");
}

// calls a same-page ajax function

function s8_token_param_callback(tokenname, params, callbackfunction) {
	url = s8_tokenurl(tokenname);
	requestbucket["b"] = {
		url: url,
		parameters: params,
		callbackfunction: callbackfunction,
		callbackstate: '0'
	};
	call_bucket("b");
}

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,hjson) { onsuccess_bucket_general('a', req,hjson); }
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,hjson) {
	
	// check for session timeout
	if(hjson) {
		if(hjson.sessiontimeout) {
			window.location = hjson.sessiontimeouturl;
			return;	
		}
	}
	
	// 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].json.htmlreplacement) {
		replace_html_group(json.htmlreplacement);
	}

	// page-replacement right here
	// conditional if file is included!
	
	if(requestbucket[bucketid].json.page_replacement_buffer) {
		
		// NEW 2007.05.25
		// dont insert into content, then move it around, causes problems in FF with iframe. 
		// this was not good practice anyway
		// parse out html pieces from the template file, and place them in content
		// TODO performace would it be faster to smarty fetch, then parse and output as an array, instead of JS processing?
		//s = requestbucket[bucketid].json.page_replacement_buffer;
		//a = s.match(/<ajax-pagereplacement\:pr-pageheader\b[^>]*>(.*?)<\/ajax-pagereplacement\:pr-pageheader>/gm);
		//alert(a);
		
/*
		s = requestbucket[bucketid].json.page_replacement_buffer;
		contentchunksbegin = s.match(/<ajax-pagereplacement\:(.*)>/gm);
		contentchunksend = s.match(/<\/ajax-pagereplacement\:(.*)>/gm);
		if(contentchunksbegin.length != contentchunksend.length) {
			// TODO error.
			// unbalanced file, abort with error.
		}
		
		// with each of the chunks, replace the content
		n = contentchunksbegin.length;
		for(i=0;i<n;i++) {
			//alert(contentchunksbegin[i]);	
			pstart = s.indexOf(contentchunksbegin[i]);
			pend = s.indexOf(contentchunksend[i]);
			content = s.substring(pstart+contentchunksbegin[i].length, pend);
			//alert(content);
			id = contentchunksbegin[i].match(/<ajax-pagereplacement\:(.*)>/)[1];
			//alert(id);
			elem = $(id);
			if(elem) {
				Element.update(elem, content);	
				Element.show(elem);	
			}
			
		}
		// TODO hide the rest of the elements.

		
		return;
*/		
		// 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 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;
		});
		
	}

	function replace_html_group(jarray) {
		h = $H(jarray);
		
		h.each(function(node){
			rp = $(node.key);
			if(!rp) return;		// none by that name, skip.
			rp.innerHTML = node.value;
		});
		
	}


function photogo() {
	s8_modal_center_show('this is it ');
}

function sol_tk(o) {
	o = $(o);	// get it in prototype! readattribute is bung in IE7 without this.
	url = o.href;
	//alert(url);
	
	tk = o.readAttribute('tk');
	// alert(tk);
	
	nogo = o.readAttribute('nogo');
	
	var arnd = Math.random() + "";
	var num = arnd * 1000000000000000000;

	dest = encodeURI('/tk?tk='+tk+'&target='+url+'&rn='+num);
	//alert(dest);
	
	//if(document.images) { (new Image()).src=dest; shortdelay(300); }
     new Ajax.Request(
     dest,
     {
     	method: 'get'
     });
	
	shortdelay(400);
	
	// flash ad placeholder - a href is for tracking only, don't follow link.
	if(nogo==1) return false;
	
	return true;	
}

function sol_tk_direct(o, tk) {
	o = $(o);	// get it in prototype! readattribute is bung in IE7 without this.
	url = o.href;
	//alert(url);
	
	// alert(tk);
	
	nogo = o.readAttribute('nogo');
	
	var arnd = Math.random() + "";
	var num = arnd * 1000000000000000000;

	dest = encodeURI('/tk?tk='+tk+'&target='+url+'&rn='+num);
	//alert(dest);
	
	//if(document.images) { (new Image()).src=dest; shortdelay(300); }
     new Ajax.Request(
     dest,
     {
     	method: 'get'
     });
	
	shortdelay(400);
	
	// flash ad placeholder - a href is for tracking only, don't follow link.
	if(nogo==1) return false;
	
	return true;	
}

function shortdelay(mseconds) {
	var currentTime = new Date();
	var endTime = currentTime.getTime() + mseconds;
	while (currentTime.getTime() < endTime) {
		currentTime = new Date();
	}
}

