﻿/*
DAPMX core 0.1.5
Copyright 2008,2009 Maxim Sajin <joox@dapmx.org>
Regarding licensing information please refer http://dapmx.org
*/

var isIE=(navigator.appName == 'Microsoft Internet Explorer');
if(!window.onload) window.onload=function(){dapDocument(document.body,daQueryString())}

function daOver(e){evStop(e);enstyle(this,"over")}
function daOut(e) {evStop(e);destyle(this,"over")}

function fail(reason,node){throw new Error("dap error <"+(node&&node.nodeName)+"> :: "+reason,false,0)}

daActivateNode=(!isIE) ? function(handler,events,node){
		handler=handler?da4(da1(handler),window):daEvent;
		enstyle(node,"ui");
		node.addEventListener("mouseover",daOver,false);
		node.addEventListener("mouseout",daOut,false);
		if(events)for(var i in events)node.addEventListener(events[i],handler,false);
		else node.addEventListener("click",handler,false);
}	:	function(handler,events,node){ //I hate IE
		handler=handler?da4(da1(handler),window):daEvent;
		enstyle(node,"ui");
		node.onmouseover=daOver;
		node.onmouseout=daOut;
		if(events)for(var i in events)node["on"+events[i]]=handler;
		else node.onclick=handler;
}

function daQueryString(){
	var qs,nv,hash={};
	if(qs=location.href.split("?")[1])for(var i in qs=qs.split("&"))nv=qs[i].split("="),hash[nv[0]]=decodeURI(nv[1]);
	return hash;
}

function daAdopt(node){
	if(node.ownerDocument==document)return node;
	var n=newElem(node.nodeName);
	for(var a=node.attributes,i=0;i<a.length;i++)n.setAttribute(a[i].nodeName,a[i].nodeValue);
	if(isIE&&(a=node.getAttribute("class")))n.className=a;//I hate IE
	return n;
}

function xhrExecute(url,form,method,async){
	if(!method)method="get";
	if(!form)form="";
	if(!async)async=false;
	var req=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Msxml2.XMLHTTP');	
	switch(method.toLowerCase()){
	//	case"soap":
		case"post":
			req.open(method,url,async);
			req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			req.send(form);
			break;
		case"get":
			req.open(method,url+form,async);
			req.setRequestHeader("Content-Type","text/xml");
			req.send(null);
			break;
	}
	try{
		if(req.responseXML)return req.responseXML.documentElement;
		else alert(url+" returned:\n"+req.responseText);
	}catch(e){alert("Failed with URL: ["+url+"]\n"+e.description)}
	return emptyXML;
}
	
var emptyPath=[""],emptyXML=document.createElement("empty"),E=[],dapx={},
spaces=/\s+/g, leadspace=/^\s+/, tailspace=/\s+$/,
step_junk=/((\s*\/\/\/[^;]*)|(;\s*);)+/g, step_sep="; ",
xLFW=/\n\s*/, xWSC=/\s*:/;

function daEvent(e){evStop(e);da22.u(this);return true};
function evStop(e){if(e)e.stopPropagation();else event.cancelBubble=true};
function enstyle(node,cls){if(node.className)node.className+=" "+cls;else node.className=cls;return node};
function destyle(node,cls){if(node.className)node.className=node.className.replace(new RegExp("\\s*"+cls,"g"),"");return node};

function newElem(e){return document.createElement(e)};
function newText(t){return document.createTextNode(t)};
function newElemText(e,t){var e=newElem(e);e.appendChild(newText(t));return e};
function newStub(c){return document.createComment(c)};
function daMute(node){var n=newStub(node.nodeName);n.P=node.P;n.$=node.$;n.dn=node.dn;return n};
function daAdd($,tag,value){$.D[0][tag]=value;};

function daL(a){for(var i=a.length,L=[a[--i]];i-->0;L=[a[i],L]);return L;};
function daModel(node,model){return model[0](node,model[1]||model);};

function daConcat(feed,separator){
	var a,out=[];
	for(var i in feed)if(a=feed[i].value)out.push(a);
	return out.join(dap.pun[separator]||separator);
};

function daSplit(value,separator){
	if(value instanceof Array)for(var i in value)value[i]=daSplit(value[i],separator);
	else if(value&&value.split)value=value.split(separator);
	return value;
};

function daTrim(str){
	if(str&&str.replace)return str.replace(leadspace,"").replace(tailspace,"");
};

var dap={

	pun	:{concat:"",space:" ",comma:",",colon:":",semi:";",dot:".",bar:"|",mesh:"#",star:"*",lf:"\n",lf2:"\n\n"},

	model:{
		daplist	:daL([da9,da8]),
		dataset	:daL([da9,da10]),
		library	:daL([da10,da9,da8]),
		config	:daL([da10])
	},

	convert	:{
		""	:function(value){return String(value)},
		
		esc	:function(value){return escape(value)},		/// escape
		usc	:function(value){return unescape(value)},	/// unescape
		pun	:function(value){return dap.pun[value]},
				
		"?"	:function(bool){return bool?true:false},	/// test
		"!"	:function(bool){return bool?false:true},	/// test inverse
		"#"	:function(bool){return bool?"+":"-"},		/// test as +/-
		
		"+?":function(num){return parseFloat(num)>0},	/// test positive
		"-?":function(num){return parseFloat(num)<0},	/// test negative
		"0?":function(num){return parseFloat(num)==0},	/// test zero
		
		"+"	:function(num){return (num=parseFloat(num))?String(Math.abs(num)):""},	/// abs
		"-"	:function(num){return (num=parseFloat(num))?String(-num):""},			/// neg
		"~"	:function(num){return (num=parseFloat(num))?(num>0?"+":"-"):"0"},		/// sgn
		
		count:function(ds){if(ds instanceof Array && ds.length>0)return ds.length},	/// rowset length
		
		csv	:function(value){return daSplit(value,",")},	/// x1,x2,x3 (comma-separated values)
		bar	:function(value){return daSplit(value,"|")},	/// x1|x2|x3 (bar-separated values)
		nvp	:function(value){return daSplit(daSplit(value,";"),":")},	/// x1:y1:z1;xN:yN:zN (named after "name:value"-pairs)
		lfc	:function(cdata){return daSplit(daSplit(daTrim(cdata),xLFW),xWSC)}, /// linefeed-colon
			
		"#get"	:function(url){return xhrExecute(url,null,"get")},					/// raw XML
		"#cfg"	:function(url){return daModel(xhrExecute(url),dap.model.config)},	/// XML as a tree
		"#dat"	:function(url){return daModel(xhrExecute(url),dap.model.dataset)},	/// XML as a rowset
		"#lib"	:function(url){	/// XML as dap extension library
					var xml=xhrExecute(url),dapns=xml.nodeName,lib=daModel(xml,dap.model.library),x;
					xml.ownerDocument.documentElement.setAttribute("dapns",dapns);
					if(lib[""])	/// root's CDATA section of the lib is eval'd, the result is integrated into dap namespace
						try{for(var i in x=eval(lib[""]))if(dap[i])dap[i][dapns]=x[i];}catch(e){fail("problem with lib: "+url+"\n"+e)}
					return lib;
				}
	},
	
	flatten	:{
		"void"	:function(feed){},
		"" 		:function(feed){var d={};for(var i in feed)if(a=feed[i].tag)d[a[0]]=feed[i].value;return d},	/// flat datum {@a:v1,@b:v2}

		"+"		:function(feed){var sum=0;for(var i in feed)sum+=parseInt(feed[i].value);return String(sum)},
		"-"		:function(feed){var sub=2*parseInt(feed[0].value);for(var i in feed)sub-=parseInt(feed[i].value);return String(sub)},

		"?"		:function(feed){for(var i in feed)if(feed[i].value)return feed[i].value;return false},	/// first non-empty
		"!"		:function(feed){for(var i in feed)if(!feed[i].value)return true; return false},			/// succeeds if empty token found

		"?@"	:function(feed){for(var i in feed){var v=feed[i].value,t=feed[i].tag;for(var j in t)if(v==t[j])return true}return false},		/// any match
		"!@"	:function(feed){for(var i in feed){var v=feed[i].value,t=feed[i].tag;for(var j in t)if(v==t[j])break;return false}return true},	/// all match
		
		eq		:function(feed){for(var i in feed)if(feed[i].value!=feed[0].value)return false;return true},
		asc		:function(feed){var a=parseInt(feed[0].value);for(var i in feed)if(a<(a=parseInt(feed[i].value)))return false;return true},
		dsc		:function(feed){var a=parseInt(feed[0].value);for(var i in feed)if(a>(a=parseInt(feed[i].value)))return false;return true},
		
		concat	:function(feed){var string="";for(var i in feed)if(feed[i].value)string+=feed[i].value;return string},
		space	:function(feed){return daConcat(feed," ")},
		url		:function(feed){var url="",a,n;for(var i in feed)if(a=feed[i].value)url+=(n=feed[i].tag)?"&"+n[0]+"="+encodeURI(a):a;return url},//
		
		"@"		:function(feed){	/// switch-case selector; anonymous token is a switch, consequent named tokens are cases
					var out=[],match,f,t;
					for(var i in feed)if(t=(f=feed[i]).tag)for(var j in t)if(t[j]==match)out.push(f.value);else;else match=f.value;
					return out;
				}
				
	},

	mapper	:{ /// see dap mappers reference at http://dapmx.org/0.1.5/#mappers
		""	:function(value,alias,node,$){},
		"!"	:function(value,alias,node,$){da22.d(node,value,$)},
		"?"	:function(value,alias,node,$){if(!alias)if(value)return;else;else for(var i=alias.length;i-->0;)if(value==alias[i])return;return E},
		attr:function(value,alias,node,$){for(var i=alias.length;i-->0;)node.setAttribute(alias[i],value)},
		ui	:function(value,alias,node,$){daActivateNode(value,alias,node)},

		"-"	:function(value,alias,node,$){for(var i=alias.length;i-->0;)$.D[0][alias[i]]=$.D[0][alias[i]]?false:value||true},
		"+"	:function(value,alias,node,$){for(var i=alias.length;i-->0;)$.D[0][alias[i]]=$.D[0][alias[i]]?value||true:false},

		"%"	:function(value,alias,node,$){for(var i=alias.length;i-->0;)daAdd($,[alias[i]],value)},//da20($.D,alias[i])=value
		"~"	:function(value,alias,node,$){if(alias)value=da6(value,alias);for(var i in value)daAdd($,i,value[i])},//da20($.D,tag)=value[i]
		"*"	:function(value,alias,node,$){return alias?da7(value,alias):value}
	}
	
};

function dapDocument(root,data){
	root.parentNode.$={};
	root.parentNode.replaceChild(da14(da8(root),{S:[{}],D:[data]}),root);
}

//
function da0(a){return a.split(",")};function da1(a,b){if(!a)return emptyPath;var c=a.split(".");if(!c[0])c[0]=b||"";return c.reverse()};function da2(a,b){var i=a.length;while(i-->0)a[i]=da1(a[i],b);return a};function da3(a,b){var c=da0(a),i=c.length;while(i-->0)c[i]=da1(c[i],b);return c};function da4(a,o){var i=a.length;while(o&&i-->0)o=o[a[i]];return o};function da5(b,c){var i=b.length,a;while(i-->0)if(a=da4(b[i],c))b[i]=a;else return;return b};function da6(a,b){var c={};if(a instanceof Array)for(var i in a)c[b[i]]=a[i];else c[b[0]]=a;return c};function da7(a,b){var c=[];for(var d in a)c.push(da6(a[d],b));return c};function da8(a){return{da25:a}};function da9(b,c){var d=[],m0,m1;if(c)m0=c[0],m1=c[1]||c;for(var n=b.childNodes,i=0,a;i<n.length;i++)switch(n[i].nodeType){case 1:d.push(m0?m0(n[i],m1):n[i]);break;case 3:case 4:if((a=n[i].nodeValue).replace(spaces,""))d.push(a);break}return d};function da10(b,c){var d={},t=null,text="",m0,m1;if(c)m0=c[0],m1=c[1]||c;for(var a=b.attributes,i=0;i<a.length;i++)d[t=a[i].nodeName.toLowerCase()]=a[i].nodeValue;for(var n=b.childNodes,i=0;i<n.length;i++)switch(n[i].nodeType){case 1:d[t=n[i].nodeName.toLowerCase()]=m0?m0(n[i],m1):n[i];break;case 3:case 4:if((a=n[i].nodeValue).replace(spaces,""))text+=a;break}if(t)d[""]=text;else return text;return d};function da11(a,b){if(a&&b)for(var i in a)if(a[i]==b[i])return true;return};function da12(a,b){for(var i=0,nodes=a.childNodes,n;i<nodes.length;i++)if((n=nodes[i])&&n.$)if(da11(b,n.dn))try{a.replaceChild(da14(n.P,n.$),n)}catch(e){if(!e.lineNumber)fail(e.message)}else if(da11(b,n.$.S[0]))da12(n,b)};function da13(P){P.da23=daModel(P.da25,dap.model.daplist);P.da24=da16s(P.da25,P.da25&&daDown);P.da25=daAdopt(P.da25)};function da14(P,$){if(P.nodeType)return P;if(!P.da25)return newText(P);if(!P.da24)da13(P);var b=P.da25.cloneNode(false),a;b.P=P;if(a=da17(b,P.da24.d,$={S:$.S,D:$.D}))b=a(b);b.$=$;return b};function da16s(b,c){var d={};var e=b.ownerDocument.documentElement.getAttribute("dapns"),a;if((a=b.getAttribute("d"))||c)d.d=da16(a,e,c),b.removeAttribute("d");if(a=b.getAttribute("u"))d.u=da16(a,e),b.removeAttribute("u");return d};function da16(b,c,R){if(!b)return R;var d=b.replace(step_junk,"").split(step_sep),a;for(var s=d.length;s-->0;R=[e,R,d[s]])if(a=d[s]){var e=[];var f=a.split(" ");var g;for(var t=f.length;t-->0;e.push(g))if(a=f[t]){g={};if((a=a.split("=")).length>1)g.value=a[1];if((a=a[0].split(":")).length>1)g.convert=da5(da3(a[1],c),dap.convert)||fail("missing converter "+a[1]+" :: "+b);if((a=a[0].split("@")).length>1)g.alias=da0(a[1]);if((a=a[0].split("$"))[0])g.field=da1(a[0],c);if(a.length>1)g.local=a[1]?da1(a[1]):g.field||emptyPath;g.alias=(g.alias=="")?null:g.alias?g.alias:g.local||(t&&g.field)}else g=t?null:{};if(g.value!=null)g.value=da4(da1(g.value,c),dap.flatten)||fail("missing flattener "+g.value+" :: "+b);else if(f.length==1)g.value=dap.flatten["void"];g.field=g.field?da4(g.field,dap.mapper)||fail("missing mapper "+g.field+" :: "+b):dap.mapper[""]}return R};function da17(b,R,$,d){if(!R)return;var S=$.S,D=$.D,D0,S0,step;if((D0=D[0])instanceof Array)for(var i=0;i<D0.length;i++)da17(b,R,{S:S,D:[D0[i],D]},d);else for(D0=null;R&&!D0;R=R[1])if(step=R[0]){var i=step.length;var e=step[--i],a;for(var f=[],token,value;i-->0;f.push(token))if(token=step[i]){value=token.value;if(a=token.field)value=da19(D,a)||value||"";if(a=token.local)if(value!=null)da20(S0||d?S:(S=$.S=[S0={},S]),a,d,value);else value=(da19(S,a,!d&&(b.dn||(b.dn={})))||fail(a+" unaccessible :: "+R[2],b))[a[0]];if(a=token.convert)for(var c=a.length;c-->0;value=a[c](value));token={tag:token.alias,value:value}}else token={value:b.P.da23};var g=e.convert,target=e.local?{S:S,D:[da20(S,e.local,d),D]}:$;if(e.value){value=e.value(f);if(g)for(var c=g.length;c-->0;value=g[c](value));if(D0=e.field(value,e.alias,b,target))da17(b,R[1],{S:S,D:[D0,D]},d)}else for(var i in f){value=f[i].value;if(g)for(var c=g.length;c-->0;value=g[c](value));if(D0=e.field(value,f[i].tag||e.alias,b,target))da17(b,R[1],{S:S,D:[D0,D]},d)}if((D0 instanceof Array)&&(D0.length==0))return daMute}else return true};function da18($,a){if(!$)return;var b;if((b=$[0][a])!=null)return b;if(b=da18($[1],a))return $[0][a]=b};function da19($,a,b){var i=a.length,tag=a[--i],d=da18($,tag),th=0;if(!d)return;if(b)b[tag]=d,th++;while(d&&(i-->th))d=d[a[i]];return d};function da20($,b,c,e){var i=b.length,tag=b[--i],d=c?(da18($,tag)):$[0][tag],a;if(!d)d=$[0][tag]={};for(a=d;i-->0;a=a[b[i]]||(a[b[i]]={}));if((a[b[0]]!=(a[b[0]]=e))&&c)c[tag]=d;return a};function da21(a,b,c){for(var i=b.length,tag=b[--i];i-->0;a=a[b[i]]||(a[b[i]]={}));a[tag]=c};var da22={d:function(a,P,$){if(!P)return;if(P instanceof Array)for(var i=0;i<P.length;da22.d(a,P[i++],$));else a.appendChild(da14(P,$))},u:function(b){for(var c=b,S,a,n,ch={};(n=b.parentNode).$;b=n){if(!a)a=da17(b,b.P.da24.u,b.$,ch);if(n.$.S!=S&&da11(ch,(S=b.$.S)[0]))c=b}da12(c,ch)}},daDown=da16("! ");