/*
Meob  Copyright (C) 2006-2009  Sunil G Vanmullem
http://www.das-kuechen-studio.co.uk/solutions
	
	This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
	without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
	
	This code is free for non commercial use under the combined terms of the GNU General 
	Public License and the Creative Commons Attribution-Noncommercial-Share Alike License. 
	Should there be any conflict between these licenses, the Creative Commons 
	Attribution-Noncommercial-Share Alike License shall prevail.
		
	see GNU General Public License	see <http://www.gnu.org/licenses/>.
	see Creative Commons Attribution-Noncommercial-Share Alike License <http://creativecommons.org/licenses/>.

    Notes
		for source see meob-v8-src.js
*/
function INCLUDE_DATA(){this.put=INCLUDE_DATA_put;this.get=INCLUDE_DATA_get;this.get_index=INCLUDE_DATA_get_index;
this.Keys=new Array();this.Values=new Array()}function INCLUDE_DATA_get_index(d){var b,a,c;b=-1;for(a=0;
a<this.Keys.length;a++){c=this.Keys[a];if(c==d){b=a;break}}return b}function INCLUDE_DATA_put(c,b){var a;
a=this.get_index(c);if(a==-1){this.Keys.push(c);this.Values.push(b)}else{this.Values[a]=b}}function INCLUDE_DATA_get(c){var b,a;
b=this.get_index(c);if(b!=-1){a=this.Values[b]}else{a=null}return a}function PARSE_DATA(){this.TYPE_NONE=0;
this.TYPE_VAR=1;this.TYPE_REP=2;this.TYPE_TEXT=3;this.TYPE_IF=4;this.TYPE_INCLUDE=5;this.TYPE_IF_NOTEXISTS=6;
this.SUBTYPE_IFEXISTS=1;this.SUBTYPE_IFGREATER=2;this.SUBTYPE_IFLESS=3;this.SUBTYPE_IFEQUAL=4;this.SUBTYPE_IFNOT_EQUAL=5;
this.SUBTYPE_IFNOTEXISTS=6;this.DataType=this.TYPE_NONE;this.Name="";this.Operator=null;this.Operand=null;
this.Value=null;this.Filename=null;this.Tokens=null;this.LoopBreak=0;this.init_string=PARSE_DATA_init_string
}function PARSE_DATA_init_string(a){this.DataType=this.TYPE_TEXT;this.Name=null;this.Value=a}function MEOB(){this.ProjectID="MEOB";
this.QS_PREFIX="QS.";this.oData=new Object();this.sTemplate="";this.TOKENEND=".";this.INCLUDE="include";
this.REPEAT="repeat";this.IF="if";this.IF_NOT_EXIST="ifne";this.END_REPEAT="end repeat.";this.END_IF="end if.";
this.END_IF_NOT_EXIST="end ifne.";this.GREATER_THAN="gt";this.LESS_THAN="lt";this.EQUAL="eq";this.NOT_EQUAL="ne";
this.LOOP_BREAK_AT="loopbreak";this.LOOP_VAR_NAME="loop";this.LOOPKEY_VAR_NAME="loopkey";this.LOOP_BREAK_NOW="loopbreaknow";
this.LOOP_BREAK_NEXT="loopbreaknext";this.HIGHLIGHT_MISSING=false;this.SHOW_PROGRESS=false;this.ROOTNODE="MEOB";
this.in_if=false;this.in_repeat=false;this.includes=new INCLUDE_DATA();this.current_include=-1;this.parsed_data=null;
this.delim_start="[[";this.delim_end="]]";this.parse_div=MEOB_parse_div;this.read_data=MEOB_read_data;
this.read_query_string=MEOB_read_query_string;this.parse_static_xml=MEOB_parse_static_xml;this.parse_template=MEOB_parse_template;
this.parse_to=MEOB_parse_to;this.merge=MEOB_merge;this.set=MEOB_set;this.get=MEOB_get;this.get_token=MEOB_get_token;
this.make_token=MEOB_make_token;this.make_text_token=MEOB_make_text_token;this.alert=MEOB_alert;this.expand_key=MEOB_expand_key;
this.main=MEOB_main_step1;this.main_recv_template=MEOB_main_recv_template;this.main_recv_static=MEOB_main_recv_static;
this.main_parse_template=MEOB_main_parse_template;this.main_merge=MEOB_main_merge;this.main_fetch_includes=MEOB_main_fetch_includes;
this.main_recv_include=MEOB_main_recv_include;this.progress=MEOB_progress}function MEOB_get(a){return this.oData[a]
}function MEOB_set(b,a){this.oData[b]=a}function MEOB_parse_div(b){var d,f,a,c,e;for(a=0;a<b.childNodes.length;
a++){c=b.childNodes[a];e=c.nodeName.toUpperCase();if((e=="DIV")||(e=="DATA")){d=c.getAttribute("id");
f=c.innerHTML;this.set(d,f)}}}function MEOB_read_query_string(){var e,b,c,d,a;e=window.location.search;
if(e.length>0){e=decodeURI(e.substring(1));b=e.split("&");for(d=0;d<b.length;d++){a=b[d];c=a.split("=");
this.set(this.QS_PREFIX+c[0],c[1])}}}function MEOB_read_data(a,c){var b;b=a.getElementById(c);if(b==null){this.alert("couldnt find MEOB data in DIV with ID "+c);
exit}this.parse_div(b)}function MEOB_parse_static_xml(f){var i,c,b,d,k,j,h,a;var g,e;a=f.responseXML;
if(a==null){this.alert("no XML in file: "+f.url);return null}c=a.firstChild;if(c==null){f.responseXML.load(f.responseStream);
a=f.responseXML;c=a.firstChild;if(c==null){this.alert("couldnt find XML data: "+f.url);return null}}DEBUG_ALERT_LEVEL("found valid XML",SOME_DEBUG);
i=a.getElementsByTagName(this.ROOTNODE);if(i.length!=1){this.alert("unable to find MeOB element in file: poHttpReq.url");
return null}c=i[0];DEBUG_ALERT_LEVEL("found MeOB element",SOME_DEBUG);b=c.getElementsByTagName("div");
if(b==null){this.alert("couldnt find XML data in file: "+f.url);return null}if(b.length==0){this.alert("no actual data in the static file");
return null}DEBUG_ALERT_LEVEL("found this much data in XML:"+b.length,SOME_DEBUG);g=true;for(d=0;d<b.length;
d++){h=null;k=b[d];j=k.getAttribute("id");h=getNodeText(k);this.set(j,h)}return true}function MEOB_make_text_token(a){var b=new PARSE_DATA();
DEBUG_ALERT_LEVEL("text token: ",SOME_DEBUG);b.init_string(a);return b}function MEOB_parse_to(c,g,e){var d,f,b,a;
DEBUG_ENTER("parse to");f=false;d=this.delim_start+g+this.delim_end;DEBUG_ALERT_LEVEL("search: "+d,FULL_DEBUG);
b=c.indexOf(d,e);if(b==-1){this.alert("corrupt template - couldnt find "+g);aItems=this.make_text_token("##couldnt find "+g);
f=true;b=e}else{DEBUG_ALERT_LEVEL("found: "+d,FULL_DEBUG);a=c.substring(e,b);aItems=this.parse_template(a);
b+=d.length}DEBUG_EXIT("parse to");return[aItems,f,b]}function MEOB_get_token(i,e){var f,c,b,g;var h,d,j,a;
DEBUG_ENTER("get token");d=null;g=e;j=true;c=i.indexOf(this.delim_start,g);if(c==-1){DEBUG_ALERT_LEVEL("No more delimiters",FULL_DEBUG);
a=i.substring(e,i.length);h=this.make_text_token(a);j=false}if(j){if(c>g){a=i.substring(g,c);h=this.make_text_token(a)
}g=c}if(j){g+=this.delim_start.length;b=i.indexOf(this.delim_end,g);if(b==-1){this.alert("corrupt template -- missing end delimeter!");
j=false}}if(j){a=i.substring(g,b);DEBUG_ALERT_LEVEL("delimited: [["+a+"]]",FULL_DEBUG);g=b+this.delim_end.length;
d=this.make_token(a)}DEBUG_EXIT("get token");return[h,d,g]}function MEOB_make_token(a){var b,h;var c,j,e,i,g,f,d;
DEBUG_ENTER("make token");b=null;i=null;f=null;j=null;e=null;c=a.split(" ");j=null;e=null;if(c.length==3){g=c[0];
j=c[1];e=c[2]}else{g=a}h=g.indexOf(this.TOKENEND);if(h==-1){f=g}else{f=g.substring(0,h);i=g.substring(h+1)
}b=new PARSE_DATA();b.Name=null;b.Value=null;switch(f){case this.INCLUDE:DEBUG_ALERT_LEVEL("include token",MORE_DEBUG);
b.DataType=b.TYPE_INCLUDE;b.Filename=i;if(this.includes[i]==null){this.includes.put(i,b)}else{DEBUG_ALERT_LEVEL("already got this include",MORE_DEBUG)
}break;case this.REPEAT:DEBUG_ALERT_LEVEL("repeat token",MORE_DEBUG);b.DataType=b.TYPE_REP;b.Name=i;if(j==this.LOOP_BREAK_AT){DEBUG_ALERT_LEVEL("break at = "+e,FULL_DEBUG);
b.LoopBreak=e}break;case this.IF:DEBUG_ALERT_LEVEL("if token",MORE_DEBUG);b.DataType=b.TYPE_IF;b.Name=i;
if(j==null){d=b.SUBTYPE_IFEXISTS}else{switch(j){case this.GREATER_THAN:d=b.SUBTYPE_IFGREATER;break;case this.LESS_THAN:d=b.SUBTYPE_IFLESS;
break;case this.EQUAL:d=b.SUBTYPE_IFEQUAL;break;case this.NOT_EQUAL:d=b.SUBTYPE_IFNOT_EQUAL;break}b.Operand=e
}b.Operator=d;break;case this.IF_NOT_EXIST:DEBUG_ALERT_LEVEL("if not exist token",MORE_DEBUG);b.DataType=b.TYPE_IF_NOTEXISTS;
b.Name=i;break;default:DEBUG_ALERT_LEVEL("variable token",MORE_DEBUG);DEBUG_ALERT_LEVEL("[["+g+"]]",FULL_DEBUG);
b.DataType=b.TYPE_VAR;b.Name=g;break}DEBUG_EXIT("make token");return b}function MEOB_parse_template(e){var b,g,a,d,f;
var c=new Array();DEBUG_ENTER("Parse template");d=0;while(true){b=this.get_token(e,d);g=b[0];a=b[1];d=b[2];
if(g!=null){c.push(g)}if(a==null){break}switch(a.DataType){case a.TYPE_REP:case a.TYPE_IF:case a.TYPE_IF_NOTEXISTS:switch(a.DataType){case a.TYPE_REP:f=this.END_REPEAT+a.Name;
break;case a.TYPE_IF:f=this.END_IF+a.Name;break;case a.TYPE_IF_NOTEXISTS:f=this.END_IF_NOT_EXIST+a.Name;
break}aResult=this.parse_to(e,f,d);b=aResult[0];bIsText=aResult[1];iEndPos=aResult[2];if(bIsText){c.push(b)
}else{a.Tokens=b;d=iEndPos}}c.push(a)}DEBUG_EXIT("Parse template");return c}function MEOB_merge(o){var m,s,h,l,j,i,p,k;
var n,f,a,d,b,q,c,r;var e,t;var g;DEBUG_ENTER("merge");l="";for(m=0;m<o.length;m++){i=o[m];switch(i.DataType){case i.TYPE_NONE:break;
case i.TYPE_VAR:DEBUG_ENTER("var");k=i.Name;DEBUG_ALERT_LEVEL("TOKEN:var "+k,FULL_DEBUG);b=this.expand_key(k);
d=this.get(b);if(d==null){DEBUG_ALERT_LEVEL("missing key "+k,SOME_DEBUG);if(this.HIGHLIGHT_MISSING){l+="<font color=red><I>?"+k+"?</I></font>"
}}else{l+=d}DEBUG_EXIT("var");break;case i.TYPE_REP:DEBUG_ENTER("repeat");j="";if(this.in_repeat){this.alert("nested repeats not handled");
break}this.in_repeat=true;k=i.Name;DEBUG_ALERT_LEVEL("TOKEN:repeat "+k,FULL_DEBUG);s=1;h=0;while(true){n=k+"."+s;
this.set(this.LOOPKEY_VAR_NAME,n);if(i.LoopBreak>0){DEBUG_ALERT_LEVEL(" #### Column: ####"+h,FULL_DEBUG);
if(h==0){DEBUG_ALERT_LEVEL("**loop breaks now",FULL_DEBUG);this.set(this.LOOP_BREAK_NOW,"y")}else{this.set(this.LOOP_BREAK_NOW,"n")
}}if(i.LoopBreak>0){h++;if(h==i.LoopBreak){this.set(this.LOOP_BREAK_NEXT,"y");DEBUG_ALERT_LEVEL("**loop breaks next",FULL_DEBUG)
}else{f=k+"."+(s+1);a=this.get(f);if(a==null){DEBUG_ALERT_LEVEL("**loop breaks next",FULL_DEBUG);this.set(this.LOOP_BREAK_NEXT,"y")
}else{this.set(this.LOOP_BREAK_NEXT,"n")}}if(h>=i.LoopBreak){DEBUG_ALERT_LEVEL("**resetting column",FULL_DEBUG);
h=0}}d=this.get(n);if(d==null){break}j=this.merge(i.Tokens);l+=j;s++}if((s==1)&&(c==null)&&this.HIGHLIGHT_MISSING){l+="<font color=red><I>repeat ?"+n+"?</I></font>"
}this.in_repeat=false;DEBUG_EXIT("repeat");break;case i.TYPE_IF:DEBUG_ENTER("if");j="";if(this.in_if){this.alert("nested ifs not handled");
break}this.in_if=true;k=i.Name;b=this.expand_key(k);d=this.get(b);bProcess=false;DEBUG_ALERT_LEVEL("TOKEN:if '"+k+"' expanded to '"+b+"'",FULL_DEBUG);
if(i.Operator==i.SUBTYPE_IFNOTEXISTS){bProcess=(d==null)}else{if(d!=null){q=i.Operand;if(q!=null){q=this.expand_key(q);
c=this.get(q);if(c==null){c=q}}switch(i.Operator){case i.SUBTYPE_IFEXISTS:bProcess=true;break;case i.SUBTYPE_IFGREATER:bProcess=(d>c);
break;case i.SUBTYPE_IFLESS:bProcess=(d<c);break;case i.SUBTYPE_IFEQUAL:bProcess=(d==c);break;case i.SUBTYPE_IFNOT_EQUAL:bProcess=(d!=c);
break}}}if(bProcess){j=this.merge(i.Tokens)}l+=j;this.in_if=false;DEBUG_EXIT("if");break;case i.TYPE_INCLUDE:DEBUG_ENTER("include");
j="";e=i.Filename;DEBUG_ALERT_LEVEL("filename: "+e,FULL_DEBUG);g=this.includes.get(e);if(g.Tokens==null){this.alert("include has no tokens! "+e)
}else{j=this.merge(g.Tokens);l+=j}DEBUG_EXIT("include");break;case i.TYPE_TEXT:DEBUG_ENTER("text");l+=i.Value;
DEBUG_EXIT("text");break;default:}}DEBUG_EXIT("merge");return l}function MEOB_main_step1(){var a,c,b;
c=get_base_url();DEBUG_ENTER("step1");if(DEBUG_LEVEL>0){DEBUG_ALERT_LEVEL("debug level is "+DEBUG_LEVEL,DEBUG_LEVEL)
}this.read_data(document,this.ROOTNODE);this.read_query_string();DEBUG_ALERT_LEVEL("absorbed data from document",SOME_DEBUG);
b=this.get(this.ProjectID+".WriteTo");if(b==null){this.alert("DIV to write to not defined.");return}this.progress(1);
a=this.get(this.ProjectID+".Template");if(a==null){this.alert("TEMPLATE NOT DEFINED");return}DEBUG_ALERT_LEVEL("reading template",SOME_DEBUG);
read_remote_data(c+a,false,this,"main_recv_template");DEBUG_EXIT("step1")}function MEOB_main_recv_template(b){var a,c;
this.progress(2);DEBUG_ALERT_LEVEL("fetched template",SOME_DEBUG);this.sTemplate=b.responseText;c=get_base_url();
DEBUG_ALERT_LEVEL("reading remote static data",SOME_DEBUG);a=this.get(this.ProjectID+".Static");this.progress(3);
if(a){read_remote_data(c+a,true,this,"main_recv_static")}else{this.main_parse_template()}}function MEOB_main_recv_static(b){var a;
this.progress(4);DEBUG_ALERT_LEVEL("fetched remote static data",SOME_DEBUG);a=this.parse_static_xml(b);
this.progress(5);DEBUG_ALERT_LEVEL("parsed remote data",SOME_DEBUG);this.main_parse_template()}function MEOB_main_parse_template(){var b,a;
DEBUG_ENTER("main_parse_template");this.progress(6);b=this.get(this.ProjectID+".mergedelim.begin");a=this.get(this.ProjectID+".mergedelim.end");
if((b==null)||(a==null)){b=a="#"}this.delim_start=b;this.delim_end=a;this.parsed_data=this.parse_template(this.sTemplate);
this.sTemplate=null;DEBUG_ALERT_LEVEL("parsed template",SOME_DEBUG);this.progress(7);if(this.includes.Keys.length>0){DEBUG_ALERT_LEVEL("includes to process: "+this.includes.Keys.length,MORE_DEBUG);
this.current_include=0;this.main_fetch_includes()}else{DEBUG_ALERT_LEVEL("no includes found",MORE_DEBUG);
this.main_merge()}DEBUG_EXIT("main_parse_template")}function MEOB_main_fetch_includes(){var b,a;DEBUG_ENTER("main_fetch_includes");
this.progress(8);a=get_base_url();if(this.current_include<this.includes.Keys.length){DEBUG_ALERT_LEVEL("fetching include "+this.current_include,SOME_DEBUG);
b=this.includes.Keys[this.current_include];DEBUG_ALERT_LEVEL(a+b,FULL_DEBUG);read_remote_data(a+b,false,this,"main_recv_include")
}else{this.main_merge()}DEBUG_EXIT("main_fetch_includes")}function MEOB_main_recv_include(d){var c,e,a,b;
DEBUG_ENTER("Receive include");c=d.responseText;b=this.includes.Keys[this.current_include];e=this.parse_template(c);
DEBUG_ALERT_LEVEL("filename: "+b,FULL_DEBUG);if(e==null){DEBUG_ALERT_LEVEL("no tokens found in "+b,SOME_DEBUG)
}else{DEBUG_ALERT_LEVEL("got "+e.length+" tokens",MORE_DEBUG);a=this.includes.get(b);if(a==null){this.alert("no tokens in include "+b)
}a.Tokens=e;this.includes.put(b,a)}this.current_include++;this.main_fetch_includes();DEBUG_EXIT("Receive include")
}function MEOB_main_merge(){var a,c,b;DEBUG_ALERT_LEVEL("merging",SOME_DEBUG);b=this.merge(this.parsed_data);
this.progress(9);DEBUG_ALERT_LEVEL("merged",SOME_DEBUG);this.parsed_data=null;DEBUG_ALERT_LEVEL("setting title",SOME_DEBUG);
a=this.get("document.title");if(a==null){a="Unnamed "+this.ProjectID+" Document"}document.title=a;DEBUG_ALERT_LEVEL("removing stuff",SOME_DEBUG);
sJavaScript=strExtract(b,"<SCRIPT","SCRIPT>");b=strRemove(b,"<SCRIPT","SCRIPT>");b=strRemove(b,"<LINK",">");
DEBUG_ALERT_LEVEL(b,MORE_DEBUG);this.progress(10);DEBUG_ALERT_LEVEL("writing",SOME_DEBUG);c=this.get(this.ProjectID+".WriteTo");
if(c!=null){oDiv=document.getElementById(c);try{oDiv.innerHTML=b}catch(d){alert("unable to populate DIV with HTML - possibly malformed templates... or IE")
}}else{document.write(b)}DEBUG_ALERT_LEVEL("wrote merged",SOME_DEBUG)}function MEOB_expand_key(a){var b,g,c,i,d,f;
var h,e;i=a;if(this.in_repeat){g=this.get(this.LOOPKEY_VAR_NAME);if(a==this.LOOP_VAR_NAME){i=g}else{i=a.replace(this.LOOP_VAR_NAME+".",g+".")
}}if(i.indexOf(this.QS_PREFIX)==0){d=i.split(".");if(d.length>2){h=this.QS_PREFIX+d[1];e=this.get(h);
for(f=2;f<d.length;f++){e+="."+d[f]}i=e}}return i}function MEOB_alert(a){DEBUG_ALERT_LEVEL("FATAL ALERT::"+a,SOME_DEBUG);
DEBUG_ALERT(this.ProjectID+"::"+a,true)}function MEOB_progress(e){var c,a,d,b;if(!this.SHOW_PROGRESS){DEBUG_ALERT_LEVEL("progress: "+e,SOME_DEBUG)
}else{d='<table border="1" cellspacing="0" cellpadding="0" bordercolor="red" bgcolor="white" width="100%" height="5"><tr>';
for(b=0;b<e;b++){d=d+'<td bgcolor="red" width="10%" height="5"></td>'}for(b=e;b<=11;b++){d+='<td width="10%" bgcolor="white"></td>'
}d+="</tr></table>";c=this.get(this.ProjectID+".WriteTo");a=document.getElementById(c);if(a){a.innerHTML=d
}}};
