/*	XANJAX Copyright 2007,2008,2009, and Trademark, of David Chapman, openPC Labs.

	XANJAX IS FREE SOFTWARE released under GNU Affero General Public License Version 3.
	Read licence.txt distributed with XANJAX, or xanjax.org/license.html for details.
	IF YOU USE OR DISTRIBUTE OR CONVEY XANJAX YOU ARE LEGALLY BOUND BY ITS LICENCE.

	YOU MUST Comply with Copyright and Trademark Rights. DO NOT REMOVE THIS NOTICE */

// START - Xanjax JSON support extensions
	// function to convert JSON format "contexts" text to DOM object
	// dependencies objfyJSON(), crEl(), eltId() and var hsh; from xanjax.js (Xanjax Core)
			
function pushCSS(url,text){
	x$.rdrQue.css=url;
	x$.queHdlr();
}
function pushJSC(url,text){
	x$.rdrQue.jsc=url;
	x$.queHdlr();
}
function pushXML(url,text,xml){
	x$.rdrQue.xml=xml;
	x$.queHdlr();
}
function pushCtxt(url,json){
	var ctxts=x$.objfyJSON(json);
	for(var ctxt in ctxts){
		var ins=!ctxts[ctxt].context||hshMatch(ctxts[ctxt].context.split(",")); // flag context
		if(ctxts[ctxt].exclude&&hshMatch(ctxts[ctxt].exclude.split(","))) ins=false; // flag exclusion
		for(var key in ctxts[ctxt]){ // loop through keys
			if(typeof ctxts[ctxt][key]=="object"&&ctxt!="seo") x$.rdrQue.cntxts[key]=[key,ctxts[ctxt][key],ins];
			if(ins&&key=="extUrl"&&++x$.rdrQue.jobs) x$.xanXHR(ctxts[ctxt][key],pushCtxt);
			if(ins&&key=="cssUrl"&&++x$.rdrQue.jobs) x$.xanXHR(ctxts[ctxt][key],pushCSS);
			if(ins&&key=="jscUrl"&&++x$.rdrQue.jobs) x$.xanXHR(ctxts[ctxt][key],pushJSC);
	}	}
	x$.queHdlr();
	function hshMatch(ctxArray){//alert(x$.hsh);
		while(ctxArray.length)
			if(x$.hsh.match(ctxArray.shift())) return true;
		return false;
	}
}


function addContext(id,keys,ins,elm){
 for(var key in keys){
	switch(key){
	 case "context":break;
	 case "exclude":break;
	 case "tag":{
	  if(elm=x$.eltId(id)) elm.parentNode.removeChild(elm); if(!ins) return;
	 	else {keys[key].push({"id":id}); elm=x$.crEl.apply(null,keys[key]); break;}}
	 case key.match(/tags|.+_tags$/)+"":
	   for(var tag in keys[key])
			if(key=="tags") elm.appendChild(x$.crEl.apply(null,keys[key][tag]));
			else{ elm.appendChild(x$.crEl(key.replace("_tags","")));
			 			elm.lastChild.appendChild(x$.crEl.apply(null,keys[key][tag]));} break;
	 case "append":x$.eltId(keys[key]).appendChild(elm);return;
	 case "before":x$.eltId(keys[key]).parentNode.insertBefore(elm,x$.eltId(keys[key]));return;
	 case "first":x$.eltId(keys[key]).insertBefore(elm,x$.eltId(keys[key]).firstChild);return;
	 default: elm.appendChild(addContext(key,keys[key],ins)); // build inner element - recursive!
 }}return elm;
}

	// function to receive server event pushed JSON text list (can be single line or list of lines)
	// dependencies objfyJSON(), crEl(), eltId(), from xanjax.js (Xanjax Core) and filterList()
function jsonPushlet(url,JSONtext,xml){
 if(x$.eltId('datalist')){
 var list=filterList(x$.objfyJSON(JSONtext));	// keep connection alive, filter out server text
 for(var item in list)											// add server event pushed text
	x$.eltId('datalist').appendChild(x$.crEl('li',item+': '+list[item],{'class':'pushline'}));
}}
	// function to keep server push connection alive, filter out server text
	// called by jsonPushlet(); dependencies xanXHR(), from xanjax.js (Xanjax Core) and mpushlet.php
function filterList(list){
 if(list.callSID)
  x$.xanXHR('mpushlet.php?'+list.callSID,jsonPushlet);
 delete list.callSID;
 delete list.line;
 return list;
}
	// function to write JSON text as delimited/formatted text, optional extra delimiter
	// dependencies objfyJSON(), eltId(), from xanjax.js (Xanjax Core)
	// this function was built for quick and dirty JSON testing; it probably needs refining
function jsonWrite(JSONtext,elemID,itemDelim){
 var plainText="";
 var items=x$.objfyJSON(JSONtext);
 for(var key in items){
	if(arguments[3]) plainText+=key+arguments[3];				// add optional extra delimiter
	plainText+=items[key]+itemDelim;										// add delimiter (can be "")
 }
 plainText=plainText.slice(0,plainText.length-itemDelim.length);
 if(elemID) x$.eltId(elemID).firstChild.data+=plainText; // if elemID is null, don't insert to DOM
 return plainText;																		// text is always available as function return
}
// END - Xanjax JSON support extensions

