G.adv={url:'/domino/jungle.xml',init:function(){	var m=this,v,o,i,a=m.data=G.load(m.url),mv,mw,j,vv,p	o=$$('message',a);v=m.message={};for(i=0;i<o.length;i++)v[$a(o[i],'key')]=G.text(o[i]).split('|')	o=$$('word',a);mv=m.moves={};mw=m.voc={}	for(i=0;i<o.length;i++){		p=o[i];v=G.text(p).split(',');vv=v[0]		if($a(p,'move')=='1')mv[v[0]]=vv		for(j=0;j<v.length;j++)mw[v[j]]=vv	}	m.index('object','obj');m.index('location','loc');m.index('action','act')	v=m.msg('title');G.d.title=v;m.put('adv-title',v)	m.put('adv-button',m.msg('enter'));m.put('adv-footer',m.msg('footer'))	document.onkeypress=G.adv.onKey	m.newGame();m.doDesc()},index:function(a,b){var m=this,o=$$(a,m.data),v=m[b]={},i;for(i=0;i<o.length;i++)v[$a(o[i],'key')]=o[i]},newGame:function(){ 	var m=this,o=m.obj,i,v=m.vars={},n,p	for(p in o)v[p]=$a(o[p],'start')	m.current=$$('location',m.data)[0]},onEnter:function(){	var m=G.adv,v=$('inbox').value,o=v.split(' '),p=0,w1,w2,ww,loc	if(m.pending)return m.doDesc()	if(v=='')return m.doReady('waiting')	while(p<o.length && !w1){w1=m.voc[o[p]];p++}	if(!w1)return m.doReady('dontunderstand')	if(m.moves[w1]){loc=m.exits[w1];return loc?m.doGoto(loc):m.doReady('cantmove')}	while(p<o.length && !w2){w2=m.voc[o[p]];p++}	m.secondWord=w2	ww=w1;if(w2)ww+=' '+w2	if(m.act[ww])m.doAction(ww);else m.doAction(w1+' *')	m.doReady()},onKey:function(a){var o=a||window.event;if(o.keyCode==13)G.adv.onEnter()},/* actions */doDesc:function(){var m=this;m.pending=null;m.exits={};m.put('adv-out',m.getText(m.current));m.doReady()},doTake:function(a){	var m=this,v=$a(a,'object'),n=$a(m.current,'key'),w	switch(m.vars[v]){	case n:m.vars[v]='CARRIED';m.doDesc();w=$a(a,'caption');return m.p(w?w:m.msg('taken'))	case 'CARRIED':return m.p(m.msg('alreadycarried'))	}	return m.p(m.msg('nothere'))},doDrop:function(a){	var m=this,o=$a(a,'object'),v=m.vars[o],n=$a(m.current,'key'),oc=$a(a,'caption')	if(v=='CARRIED'){m.vars[o]=n;m.doDesc();return m.p(oc?oc:m.msg('dropped'))}	return m.p(m.msg('donthave'))},doInventory:function(){	var m=this,v=m.getAt('CARRIED');if(v=='')return m.p(m.msg('nothingcarried'))	return m.p('<b>'+m.msg('youcarry')+'</b><ul>'+v+'</ul>')},doExamine:function(){	var m=this,w=m.secondWord,n=m.vars[w]	if(n==$a(m.current,'key')||n=='CARRIED')return m.p(G.text(m.obj[w]))	return m.p(m.msg('nothere'))},doReady:function(a){	var m=this,o=$('adv-out'),f=$('inbox')	if(a)m.add(m.p(m.msg(a)))	o.scrollTop=o.scrollHeight;m.put('whatnext',m.msg('whatnext'));f.value='';f.focus()},doGoto:function(a){	var m=this,v;m.abort=false	v=m.getChildren(a);if(m.abort){m.add(v);m.doReady();return}	m.current=m.loc[$a(a,'to')]	if(v=='')m.doDesc();else{m.add(v+m.p(m.msg('continue')));m.pending=true}},doAction:function(a){	var m=this,o=m.act[a];if(!o)return m.add(m.msg('cantdo'))	m.add(m.getChildren(o));m.doReady()},/* supporting functions */getExits:function(a){	var m=this,o=$$('exit',a),v=[],i,p,x0,x2	if(o.length==0)return	v.push('<p><b>'+m.msg('exits')+'</b><ul>')	for(i=0;i<o.length;i++){		p=o[i];x0=$a(p,'go');x2=x0.split(',')		for(j=0;j<x2.length;j++)m.exits[x2[j]]=p		v.push('<li>'+x0+' to '+$a(p,'to')+'</li>')	}	v.push('</ul></p>')	return v.join('\n')},getText:function(a){	var m=this	switch(a.nodeName){	case 'location':return '<h2>'+($a(a,'caption')||$a(a,'key'))+'</h2>'+m.getChildren(a)+m.getObjects(a)	case '#text':return m.p(G.text(a))	case 'br':return '<br/>'	case 'goto':m.current=m.loc[$a(a,'location')];m.pending=true;return m.p(m.msg('continue'))	case 'exits':return m.getExits(a)	case 'quit':m.newGame();m.abort=true;m.pending=true;return m.p(m.msg('gameover'))	case 'inventory':return m.doInventory()	case 'abort':m.abort=true;return ''	case 'describe':return m.doDesc()	case 'examine':return m.doExamine()	case 'if':return m.getChildren(m.getIf(a)?$$('do',a)[0]:$$('else',a)[0])	case 'destroy':m.vars[$a(a,'object')]='NULL';return m.doDesc()	case 'make':m.vars[$a(a,'object')]=$a(a,'value');return m.doDesc()	case 'take':return m.doTake(a)	case 'drop':return m.doDrop(a)	}	return '##'+a.nodeName+':'+G.text(a)+'##<br />'},getIf:function(a){	var m=this,o=$a(a,'test').split(' '),v=m.vars[o[0]],h=$a(m.current,'key')	switch(o[1]){		case 'PRESENT':return v==h || v=='CARRIED'		case 'CARRIED':return v=='CARRIED'		case 'IS':return v==o[2]	}	return false},getChildren:function(a){var m=this,o=a.childNodes,i,v=[];if(o)for(i=0;i<o.length;i++)v.push(m.getText(o[i]));return v.join('\n')},getObjects:function(a){var m=this,v=m.getAt($a(a,'key'));return v?('<p><b>'+m.msg('also')+'</b><ul>'+v+'</ul></p>'):''},getAt:function(a){		var m=this,o=m.vars,v=[],p		for(p in o)if(o[p]==a)v.push('<li>'+$a(m.obj[p],'caption')+'</li>')		return v.join('\n')},add:function(a){$('adv-out').innerHTML+=a},msg:function(a){var m=this,v=m.message[a],n=v.length;return (n>1)?v[m.random(n)]:v},put:function(a,b){$(a).innerHTML=b},p:function(a){return '<p>'+a+'</p>'},random:function(a){return parseInt(Math.random()*a)}}
