GlkOte=function(){var game_interface=null;var dom_context=undefined;var windowport_id='windowport';var gameport_id='gameport';var generation=0;var disabled=false;var loading_visible=null;var windowdic=null;var current_metrics=null;var currently_focussed=false;var last_known_focus=0;var last_known_paging=0;var windows_paging_count=0;var graphics_draw_queue=[];var resize_timer=null;var retry_timer=null;var perform_paging=true;var detect_external_links=false;var regex_external_links=null;var NBSP="\xa0";var max_buffer_length=200;var key_codes={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45};var terminator_key_names={escape:key_codes.KEY_ESC,func1:112,func2:113,func3:114,func4:115,func5:116,func6:117,func7:118,func8:119,func9:120,func10:121,func11:122,func12:123};var terminator_key_values={};var recording=false;var recording_state=null;var recording_handler=null;var recording_handler_url=null;var recording_context={};var image_cache={};function glkote_init(iface){if(!iface&&window.Game) iface=window.Game;if(!iface){glkote_error('No game interface object has been provided.');return;} if(!iface.accept){glkote_error('The game interface object must have an accept() function.');return;} game_interface=iface;if(!window.jQuery||!jQuery.fn.jquery){glkote_error('The jQuery library has not been loaded.');return;} var version=jQuery.fn.jquery.split('.');if(version.length<2||version[0]<1||(version[0]==1&&version[1]<9)){glkote_error('This version of the jQuery library is too old. (Version '+jQuery.fn.jquery+' found; 1.9.0 required.)');return;} for(var val in terminator_key_names){terminator_key_values[terminator_key_names[val]]=val;} if(false){perform_paging=false;} windowdic={};if(iface.windowport) windowport_id=iface.windowport;if(iface.gameport) gameport_id=iface.gameport;var el=$('#'+windowport_id,dom_context);if(!el.length){glkote_error('Cannot find windowport element #'+windowport_id+' in this document.');return;} el.empty();if(perform_paging) $(document).on('keypress',evhan_doc_keypress);$(window).on('resize',evhan_doc_resize);var res=measure_window();if(jQuery.type(res)==='string'){glkote_error(res);return;} current_metrics=res;detect_external_links=iface.detect_external_links;if(detect_external_links){regex_external_links=iface.regex_external_links;if(!regex_external_links){if(detect_external_links=='search'){regex_external_links=RegExp('\\b((?:https?://)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))','i');} else{regex_external_links=RegExp('^https?:','i');}}} if(iface.recording_url){recording=true;recording_handler=recording_standard_handler;recording_handler_url=iface.recording_url;} if(iface.recording_handler){recording=true;recording_handler=iface.recording_handler;recording_handler_url='(custom handler)';} if(recording){var qparams=get_query_params();var flag=qparams['feedback'];if(jQuery.type(flag)!='undefined'&&flag!='1'){recording=false;glkote_log('User has opted out of transcript recording.');} else{recording_state={sessionId:(new Date().getTime())+""+(Math.ceil(Math.random()*10000)),input:null,output:null,timestamp:0,outtimestamp:0} if(iface.recording_label) recording_state.label=iface.recording_label;if(iface.recording_format=='simple') recording_state.format='simple';else recording_state.format='glkote';glkote_log('Transcript recording active: session '+recording_state.sessionId+' "'+recording_state.label+'", destination '+recording_handler_url);}} send_response('init',null,current_metrics);} function measure_window(){var metrics={};var winsize,line1size,line2size,spansize,canvassize;var gameport=$('#'+gameport_id,dom_context);if(!gameport.length) return'Cannot find gameport element #'+gameport_id+' in this document.';$('#layouttestpane',dom_context).remove();metrics.width=gameport.width();metrics.height=gameport.height();metrics.width=gameport.width();metrics.height=gameport.height();var layout_test_pane=$('
',{'id':'layout_test_pane'});layout_test_pane.text('This should not be visible');layout_test_pane.css({position:'absolute',visibility:'hidden',left:'-1000px'});var line=$('
');line.append($('',{'class':"Style_normal"}).text('12345678'));var gridwin=$('
',{'class':'WindowFrame GridWindow'});var gridline1=line.clone().addClass('GridLine').appendTo(gridwin);var gridline2=line.clone().addClass('GridLine').appendTo(gridwin);var gridspan=gridline1.children('span');layout_test_pane.append(gridwin);var bufwin=$('
',{'class':'WindowFrame BufferWindow'});var bufline1=line.clone().addClass('BufferLine').appendTo(bufwin);var bufline2=line.clone().addClass('BufferLine').appendTo(bufwin);var bufspan=bufline1.children('span');layout_test_pane.append(bufwin);var graphwin=$('
',{'class':'WindowFrame GraphicsWindow'});var graphcanvas=$('');graphcanvas.attr('width',64);graphcanvas.attr('height',32);graphwin.append(graphcanvas);layout_test_pane.append(graphwin);gameport.append(layout_test_pane);var get_size=function(el){return{width:el.outerWidth(),height:el.outerHeight()};};winsize=get_size(gridwin);spansize=get_size(gridspan);line1size=get_size(gridline1);line2size=get_size(gridline2);metrics.gridcharheight=gridline2.position().top-gridline1.position().top;metrics.gridcharwidth=gridspan.width()/8;metrics.gridmarginx=winsize.width-spansize.width;metrics.gridmarginy=winsize.height-(line1size.height+line2size.height);winsize=get_size(bufwin);spansize=get_size(bufspan);line1size=get_size(bufline1);line2size=get_size(bufline2);metrics.buffercharheight=bufline2.position().top-bufline1.position().top;metrics.buffercharwidth=bufspan.width()/8;metrics.buffermarginx=winsize.width-spansize.width;metrics.buffermarginy=winsize.height-(line1size.height+line2size.height);winsize=get_size(graphwin);canvassize=get_size(graphcanvas);metrics.graphicsmarginx=winsize.width-canvassize.width;metrics.graphicsmarginy=winsize.height-canvassize.height;layout_test_pane.remove();metrics.outspacingx=0;metrics.outspacingy=0;metrics.inspacingx=0;metrics.inspacingy=0;if(game_interface.spacing!=undefined){metrics.outspacingx=game_interface.spacing;metrics.outspacingy=game_interface.spacing;metrics.inspacingx=game_interface.spacing;metrics.inspacingy=game_interface.spacing;} if(game_interface.outspacing!=undefined){metrics.outspacingx=game_interface.outspacing;metrics.outspacingy=game_interface.outspacing;} if(game_interface.inspacing!=undefined){metrics.inspacingx=game_interface.inspacing;metrics.inspacingy=game_interface.inspacing;} if(game_interface.inspacingx!=undefined) metrics.inspacingx=game_interface.inspacingx;if(game_interface.inspacingy!=undefined) metrics.inspacingy=game_interface.inspacingy;if(game_interface.outspacingx!=undefined) metrics.outspacingx=game_interface.outspacingx;if(game_interface.outspacingy!=undefined) metrics.outspacingy=game_interface.outspacingy;return metrics;} function glkote_update(arg){hide_loading();if(recording) recording_send(arg);if(arg.type=='error'){glkote_error(arg.message);return;} if(arg.type=='pass'){return;} if(arg.type=='retry'){if(!retry_timer){glkote_log('Event has timed out; will retry...');show_loading();retry_timer=delay_func(2,retry_update);} else{glkote_log('Event has timed out, but a retry is already queued!');} return;} if(arg.type!='update'){glkote_log('Ignoring unknown message type '+arg.type+'.');return;} if(arg.gen==generation){glkote_log('Ignoring repeated generation number: '+generation);return;} if(arg.genrealbottom) newtopunseen=realbottom;if(win.topunseen=frameel.get(0).scrollHeight){win.needspaging=false;} else{win.needspaging=true;}} var moreel=$('#win'+win.id+'_moreprompt',dom_context);if(!win.needspaging){if(moreel.length) moreel.remove();} else{if(!moreel.length){moreel=$('
',{id:'win'+win.id+'_moreprompt','class':'MorePrompt'});moreel.append('More');var morex=win.coords.right+20;var morey=win.coords.bottom;moreel.css({bottom:morey+'px',right:morex+'px'});$('#'+windowport_id,dom_context).append(moreel);}}}}});readjust_paging_focus(false);disabled=false;if(arg.disable||arg.specialinput){disabled=true;jQuery.each(windowdic,function(winid,win){if(win.inputel){win.inputel.prop('disabled',true);}});} var newinputwin=0;if(!disabled&&!windows_paging_count){jQuery.each(windowdic,function(winid,win){if(win.input){if(!newinputwin||win.id==last_known_focus) newinputwin=win.id;}});} if(newinputwin){var focusfunc=function(){var win=windowdic[newinputwin];if(win.inputel){win.inputel.focus();}};defer_func(focusfunc);}} function accept_windowset(arg){jQuery.each(windowdic,function(winid,win){win.inplace=false;});jQuery.map(arg,accept_one_window);var closewins=jQuery.map(windowdic,function(win,winid){if(!win.inplace) return win;});jQuery.map(closewins,close_one_window);} function accept_one_window(arg){var frameel,win;if(!arg){return;} win=windowdic[arg.id];if(win==null){win={id:arg.id,type:arg.type,rock:arg.rock};windowdic[arg.id]=win;var typeclass;if(win.type=='grid') typeclass='GridWindow';if(win.type=='buffer') typeclass='BufferWindow';if(win.type=='graphics') typeclass='GraphicsWindow';var rockclass='WindowRock_'+arg.rock;frameel=$('
',{id:'window'+arg.id,'class':'WindowFrame '+typeclass+' '+rockclass});frameel.data('winid',arg.id);frameel.on('mousedown',arg.id,evhan_window_mousedown);if(perform_paging&&win.type=='buffer') frameel.on('scroll',arg.id,evhan_window_scroll);if(win.type=='grid'||win.type=='graphics') frameel.on('click',win.id,evhan_input_mouse_click);if(win.type=='buffer') frameel.attr({'aria-live':'polite','aria-atomic':'false','aria-relevant':'additions'});win.frameel=frameel;win.gridheight=0;win.gridwidth=0;win.input=null;win.inputel=null;win.terminators={};win.reqhyperlink=false;win.reqmouse=false;win.needscroll=false;win.needspaging=false;win.topunseen=0;win.coords={left:null,top:null,right:null,bottom:null};win.history=new Array();win.historypos=0;$('#'+windowport_id,dom_context).append(frameel);} else{frameel=win.frameel;if(win.type!=arg.type) glkote_error('Window '+arg.id+' was created with type '+win.type+', but now is described as type '+arg.type);} win.inplace=true;if(win.type=='grid'){var ix;if(arg.gridheight>win.gridheight){for(ix=win.gridheight;ix',{id:'win'+win.id+'_ln'+ix,'class':'GridLine'});el.append(NBSP);win.frameel.append(el);}} if(arg.gridheight',{id:'win'+win.id+'_canvas'});el.attr('width',win.graphwidth);el.attr('height',win.graphheight);win.frameel.css('background-color',win.defcolor);win.frameel.append(el);} else{if(win.graphwidth!=arg.graphwidth||win.graphheight!=arg.graphheight){win.graphwidth=arg.graphwidth;win.graphheight=arg.graphheight;el.attr('width',win.graphwidth);el.attr('height',win.graphheight);var canvas=el.get(0);if(canvas&&canvas.getContext){var ctx=canvas.getContext('2d');if(ctx){ctx.fillStyle=win.defcolor;ctx.fillRect(0,0,win.graphwidth,win.graphheight);ctx.fillStyle='#000000';}} win.frameel.css('background-color',win.defcolor);var funcarg=win.id;defer_func(function(){send_window_redraw(funcarg);});}}} var styledic;if(0){var width=arg.width;var height=arg.height;if(arg.type=='grid'){width-=current_metrics.gridmarginx;height-=current_metrics.gridmarginy;} if(arg.type=='buffer'){width-=current_metrics.buffermarginx;height-=current_metrics.buffermarginy;} if(width<0) width=0;if(height<0) height=0;styledic={left:arg.left+'px',top:arg.top+'px',width:width+'px',height:height+'px'};win.coords.left=arg.left;win.coords.top=arg.top;win.coords.right=current_metrics.width-(arg.left+arg.width);win.coords.bottom=current_metrics.height-(arg.top+arg.height);} else{var right=current_metrics.width-(arg.left+arg.width);var bottom=current_metrics.height-(arg.top+arg.height);styledic={left:arg.left+'px',top:arg.top+'px',right:right+'px',bottom:bottom+'px'};win.coords.left=arg.left;win.coords.top=arg.top;win.coords.right=right;win.coords.bottom=bottom;} frameel.css(styledic);} function close_one_window(win){win.frameel.remove();delete windowdic[win.id];win.frameel=null;var moreel=$('#win'+win.id+'_moreprompt',dom_context);if(moreel.length) moreel.remove();} var regex_initial_whitespace=new RegExp('^ ');var regex_final_whitespace=new RegExp(' $');var regex_long_whitespace=new RegExp(' +','g');function func_long_whitespace(match){var len=match.length;if(len==1) return' ';var res=new Array(len).join(NBSP);return res+' ';} function accept_contentset(arg){jQuery.map(arg,accept_one_content);} function accept_one_content(arg){var win=windowdic[arg.id];if(win==null){glkote_error('Got content update for window '+arg.id+', which does not exist.');return;} if(win.input&&win.input.type=='line'){glkote_error('Got content update for window '+arg.id+', which is awaiting line input.');return;} win.needscroll=true;if(win.type=='grid'){var lines=arg.lines;var ix,sx;for(ix=0;ix',{'class':'Style_'+rstyle});if(rlink==undefined){insert_text_detecting(el,rtext);} else{var ael=$('',{'href':'#','class':'Internal'});ael.text(rtext);ael.on('click',build_evhan_hyperlink(win.id,rlink));el.append(ael);} lineel.append(el);}}}} if(win.type=='buffer'){var text=arg.text;var ix,sx;if(win.inputel){win.inputel.detach();} var cursel=$('#win'+win.id+'_cursor',dom_context);if(cursel.length) cursel.remove();cursel=null;if(arg.clear){win.frameel.empty();win.topunseen=0;} if(text===undefined) text=[];for(ix=0;ix',{'class':'BufferLine'});divel.data('blankpara',true);divel.data('endswhite',true);win.frameel.append(divel);} else{divel=$(divel);} if(textarg.flowbreak) divel.addClass('FlowBreak');if(!content||!content.length){if(divel.data('blankpara')) divel.text(NBSP);continue;} if(divel.data('blankpara')){divel.data('blankpara',false);divel.empty();} for(sx=0;sx',{src:imgurl,width:''+rdesc.width,height:''+rdesc.height});if(rdesc.alttext) el.attr('alt',rdesc.alttext);else el.attr('alt','Image '+rdesc.image);switch(rdesc.alignment){case'inlineup':el.addClass('ImageInlineUp');break;case'inlinedown':el.addClass('ImageInlineDown');break;case'inlinecenter':el.addClass('ImageInlineCenter');break;case'marginleft':el.addClass('ImageMarginLeft');break;case'marginright':el.addClass('ImageMarginRight');break;default:el.addClass('ImageInlineUp');break;} if(rdesc.hyperlink!=undefined){var ael=$('',{'href':'#','class':'Internal'});ael.append(el);ael.on('click',build_evhan_hyperlink(win.id,rdesc.hyperlink));el=ael;} divel.append(el);divel.data('endswhite',false);continue;} glkote_log('Unknown special entry in line data: '+rdesc.special);continue;} rstyle=rdesc.style;rtext=rdesc.text;rlink=rdesc.hyperlink;} else{rstyle=rdesc;sx++;rtext=content[sx];rlink=undefined;} var el=$('',{'class':'Style_'+rstyle});rtext=rtext.replace(regex_long_whitespace,func_long_whitespace);if(divel.data('endswhite')){rtext=rtext.replace(regex_initial_whitespace,NBSP);} if(rlink==undefined){insert_text_detecting(el,rtext);} else{var ael=$('',{'href':'#','class':'Internal'});ael.text(rtext);ael.on('click',build_evhan_hyperlink(win.id,rlink));el.append(ael);} divel.append(el);divel.data('endswhite',regex_final_whitespace.test(rtext));}} var parals=win.frameel.children();if(parals.length){var totrim=parals.length-max_buffer_length;if(totrim>0){var ix,obj;win.topunseen-=parals.get(totrim).offsetTop;if(win.topunseen<0) win.topunseen=0;for(ix=0;ix',{id:'win'+win.id+'_cursor','class':'InvisibleCursor'});cursel.append(NBSP);$(divel).append(cursel);if(win.inputel){var inputel=win.inputel;var pos=cursel.position();var width=win.frameel.width()-(current_metrics.buffermarginx+pos.left+2);if(width<1) width=1;inputel.css({position:'absolute',left:'0px',top:'0px',width:width+'px'});cursel.append(inputel);}}} if(win.type=='graphics'){var draw=arg.draw;var ix;if(draw===undefined) draw=[];var docall=(graphics_draw_queue.length==0);for(ix=0;ix0){perform_graphics_ops(null);}}} function accept_inputcancel(arg){var hasinput={};jQuery.map(arg,function(argi){if(argi.type) hasinput[argi.id]=argi;});jQuery.each(windowdic,function(winid,win){if(win.input){var argi=hasinput[win.id];if(argi==null||argi.gen>win.input.gen){win.input=null;if(win.inputel){win.inputel.remove();win.inputel=null;}}}});} function accept_inputset(arg){var hasinput={};var hashyperlink={};var hasmouse={};jQuery.map(arg,function(argi){if(argi.type) hasinput[argi.id]=argi;if(argi.hyperlink) hashyperlink[argi.id]=true;if(argi.mouse) hasmouse[argi.id]=true;});jQuery.each(windowdic,function(tmpid,win){win.reqhyperlink=hashyperlink[win.id];win.reqmouse=hasmouse[win.id];var argi=hasinput[win.id];if(argi==null) return;win.input=argi;var maxlen=1;if(argi.type=='line') maxlen=argi.maxlen;var inputel=win.inputel;if(inputel==null){var classes='Input';if(argi.type=='line'){classes+=' LineInput';} else if(argi.type=='char'){classes+=' CharInput';} else{glkote_error('Window '+win.id+' has requested unrecognized input type '+argi.type+'.');} inputel=$('',{id:'win'+win.id+'_input','class':classes,type:'text',maxlength:maxlen});if(true) inputel.attr('autocapitalize','off');inputel.attr({'aria-live':'off'});if(argi.type=='line'){inputel.on('keypress',evhan_input_keypress);inputel.on('keydown',evhan_input_keydown);if(argi.initial) inputel.val(argi.initial);win.terminators={};if(argi.terminators){for(var ix=0;ixmaxwidth) width=maxwidth;inputel.css({position:'absolute',left:xpos+'px',top:pos.top+'px',width:width+'px'});win.frameel.append(inputel);} if(win.type=='buffer'){var cursel=$('#win'+win.id+'_cursor',dom_context);if(!cursel.length){cursel=$('',{id:'win'+win.id+'_cursor','class':'InvisibleCursor'});cursel.append(NBSP);win.frameel.append(cursel);} var pos=cursel.position();var width=win.frameel.width()-(current_metrics.buffermarginx+pos.left+2);if(width<1) width=1;inputel.css({position:'absolute',left:'0px',top:'0px',width:width+'px'});cursel.append(inputel);}});} function accept_specialinput(arg){if(arg.type=='fileref_prompt'){var replyfunc=function(ref){send_response('specialresponse',null,'fileref_prompt',ref);};try{var writable=(arg.filemode!='read');Dialog.open(writable,arg.filetype,arg.gameid,replyfunc);} catch(ex){GlkOte.log('Unable to open file dialog: '+ex);replyfunc=function(ref){send_response('specialresponse',null,'fileref_prompt',null);};defer_func(replyfunc);}} else{glkote_error('Request for unknown special input type: '+arg.type);}} function last_line_top_offset(el){var ls=el.children();if(!ls||!ls.length) return 0;return ls.get(ls.length-1).offsetTop;} function readjust_paging_focus(canfocus){windows_paging_count=0;var pageable_win=0;if(perform_paging){jQuery.each(windowdic,function(tmpid,win){if(win.needspaging){windows_paging_count+=1;if(!pageable_win||win.id==last_known_paging) pageable_win=win.id;}});} if(windows_paging_count){last_known_paging=pageable_win;} if(!windows_paging_count&&canfocus){var newinputwin=0;if(!disabled&&!windows_paging_count){jQuery.each(windowdic,function(tmpid,win){if(win.input){if(!newinputwin||win.id==last_known_focus) newinputwin=win.id;}});} if(newinputwin){var win=windowdic[newinputwin];if(win.inputel){win.inputel.focus();}}}} function glkote_get_interface(){return game_interface;} function glkote_set_dom_context(val){dom_context=val;} function glkote_get_dom_context(){return dom_context;} function glkote_log(msg){if(window.console&&console.log) console.log(msg);else if(window.opera&&opera.postError) opera.postError(msg);} function glkote_error(msg){var el=document.getElementById('errorcontent');remove_children(el);el.appendChild(document.createTextNode(msg));el=document.getElementById('errorpane');el.style.display='';hide_loading();} function glkote_extevent(val){send_response('external',null,val);} function retry_update(){retry_timer=null;glkote_log('Retrying update...');send_response('refresh',null,null);} function clear_error(){$('#errorpane',dom_context).hide();} function hide_loading(){if(loading_visible==false) return;loading_visible=false;var el=document.getElementById('loadingpane');if(el){el.style.display='none';}} function show_loading(){if(loading_visible==true) return;loading_visible=true;var el=document.getElementById('loadingpane');if(el){el.style.display='';}} function remove_children(parent){var obj,ls;ls=parent.childNodes;while(ls.length>0){obj=ls.item(0);parent.removeChild(obj);}} function last_child_of(obj){var ls=obj.children();if(!ls||!ls.length) return null;return ls.get(ls.length-1);} function insert_text_detecting(el,val){if(!detect_external_links){el.append(document.createTextNode(val));return;} if(detect_external_links=='match'){if(regex_external_links.test(val)){var ael=$('',{'href':val,'class':'External','target':'_blank'});ael.text(val);el.append(ael);return;}} else if(detect_external_links=='search'){while(true){var match=regex_external_links.exec(val);if(!match) break;if(match.index>0){var prefix=val.substring(0,match.index);el.append(document.createTextNode(prefix));} var ael=$('',{'href':match[0],'class':'External','target':'_blank'});ael.text(match[0]);el.append(ael);val=val.substring(match.index+match[0].length);} if(!val.length) return;} el.append(document.createTextNode(val));} function perform_graphics_ops(loadedimg,loadedev){if(graphics_draw_queue.length==0){glkote_log('perform_graphics_ops called with no queued ops'+(loadedimg?' (plus image!)':''));return;} while(graphics_draw_queue.length){var op=graphics_draw_queue[0];var win=windowdic[op.winid];if(!win){glkote_log('perform_graphics_ops: op for nonexistent window '+op.winid);graphics_draw_queue.shift();continue;} var ctx=undefined;var canvas=undefined;var el=$('#win'+win.id+'_canvas',dom_context);if(el.length){canvas=el.get(0);if(canvas&&canvas.getContext) ctx=canvas.getContext('2d');} if(!ctx){glkote_log('perform_graphics_ops: op for nonexistent canvas '+win.id);graphics_draw_queue.shift();continue;} var optype=op.special;switch(optype){case'setcolor':win.defcolor=op.color;break;case'fill':if(op.color===undefined) ctx.fillStyle=win.defcolor;else ctx.fillStyle=op.color;if(op.x===undefined){ctx.fillRect(0,0,canvas.width,canvas.height);win.frameel.css('background-color',ctx.fillStyle);} else{ctx.fillRect(op.x,op.y,op.width,op.height);} ctx.fillStyle='#000000';break;case'image':if(!loadedimg){var oldimg=image_cache[op.image];if(oldimg&&oldimg.width>0&&oldimg.height>0){loadedimg=oldimg;loadedev=true;} else{delete image_cache[op.image];}} if(!loadedimg){var imgurl=op.url;if(window.GiLoad&&GiLoad.get_image_url){var newurl=GiLoad.get_image_url(op.image);if(newurl) imgurl=newurl;} var newimg=new Image();$(newimg).on('load',function(ev){perform_graphics_ops(newimg,ev);});$(newimg).on('error',function(ev){perform_graphics_ops(newimg,null);});newimg.src=imgurl;return;} if(loadedev){image_cache[op.image]=loadedimg;ctx.drawImage(loadedimg,op.x,op.y,op.width,op.height);} loadedev=null;loadedimg=null;break;default:glkote_log('Unknown special entry in graphics content: '+optype);break;} graphics_draw_queue.shift();}} function delay_func(timeout,func) {return window.setTimeout(func,timeout*1000);} function defer_func(func) {return window.setTimeout(func,0.01*1000);} function inspect_deep(res){var keys=jQuery.map(res,function(val,key){return key;});keys.sort();var els=jQuery.map(keys,function(key){var val=res[key];if(jQuery.type(val)==='string') val="'"+val+"'";else if(!(jQuery.type(val)==='number')) val=inspect_deep(val);return key+':'+val;});return'{'+els.join(', ')+'}';} function inspect_shallow(res){var keys=jQuery.map(res,function(val,key){return key;});keys.sort();var els=jQuery.map(keys,function(key){var val=res[key];if(jQuery.type(val)==='string') val="'"+val+"'";return key+':'+val;});return'{'+els.join(', ')+'}';} function submit_line_input(win,val,termkey){var historylast=null;if(win.history.length) historylast=win.history[win.history.length-1];if(val&&val!=historylast){win.history.push(val);if(win.history.length>20){win.history.shift();}} send_response('line',win,val,termkey);} function send_response(type,win,val,val2){if(disabled&&type!='specialresponse') return;var winid=0;if(win) winid=win.id;var res={type:type,gen:generation};if(type=='line'){res.window=win.id;res.value=val;if(val2) res.terminator=val2;} else if(type=='char'){res.window=win.id;res.value=val;} else if(type=='hyperlink'){res.window=win.id;res.value=val;} else if(type=='mouse'){res.window=win.id;res.x=val;res.y=val2;} else if(type=='external'){res.value=val;} else if(type=='specialresponse'){res.response=val;res.value=val2;} else if(type=='redraw'){res.window=win.id;} else if(type=='init'||type=='arrange'){res.metrics=val;} if(!(type=='init'||type=='refresh'||type=='specialresponse')){jQuery.each(windowdic,function(tmpid,win){var savepartial=(type!='line'&&type!='char')||(win.id!=winid);if(savepartial&&win.input&&win.input.type=='line'&&win.inputel&&win.inputel.val()){var partial=res.partial;if(!partial){partial={};res.partial=partial;};partial[win.id]=win.inputel.val();}});} if(recording){recording_state.input=res;recording_state.timestamp=(new Date().getTime());} game_interface.accept(res);} function get_query_params(){var map={};var qs=location.search.substring(1,location.search.length);if(qs.length){var args=qs.split('&');qs=qs.replace(/\+/g,' ');for(var ix=0;ix=32&&keycode<=126)||keycode==13)){return;} ev.preventDefault();var frameel=win.frameel;frameel.scrollTop(win.topunseen-current_metrics.buffercharheight);var frameheight=frameel.outerHeight();var realbottom=last_line_top_offset(frameel);var newtopunseen=frameel.scrollTop()+frameheight;if(newtopunseen>realbottom) newtopunseen=realbottom;if(win.topunseen=frameel.get(0).scrollHeight){win.needspaging=false;var moreel=$('#win'+win.id+'_moreprompt',dom_context);if(moreel.length) moreel.remove();readjust_paging_focus(true);}} return;}} win=windowdic[last_known_focus];if(!win) return;if(!win.inputel) return;win.inputel.focus();if(win.input.type=='line'){if(keycode==13){submit_line_input(win,win.inputel.val(),null);ev.preventDefault();return;} if(keycode){if(keycode>=32){var val=String.fromCharCode(keycode);win.inputel.val(win.inputel.val()+val);} ev.preventDefault();return;}} else{var res=null;if(keycode==13) res='return';else if(keycode==key_codes.KEY_BACKSPACE) res='delete';else if(keycode) res=String.fromCharCode(keycode);if(res){send_response('char',win,res);} ev.preventDefault();return;}} function evhan_window_mousedown(ev){var winid=ev.data;var win=windowdic[winid];if(!win) return;if(win.inputel){last_known_focus=win.id;if(0){ev.preventDefault();win.inputel.focus();}} if(win.needspaging) last_known_paging=win.id;else if(win.inputel) last_known_paging=0;} function evhan_input_mouse_click(ev){var winid=ev.data;var win=windowdic[winid];if(!win) return;if(ev.button!=0) return;if(!win.reqmouse) return;var xpos=0;var ypos=0;if(win.type=='grid'){var lineel=$('#win'+win.id+'_ln'+0,dom_context);if(lineel.length){var linepos=lineel.offset();xpos=Math.floor((ev.clientX-linepos.left)/current_metrics.gridcharwidth);ypos=Math.floor((ev.clientY-linepos.top)/current_metrics.gridcharheight);} if(xpos>=win.gridwidth) xpos=win.gridwidth-1;if(xpos<0) xpos=0;if(ypos>=win.gridheight) ypos=win.gridheight-1;if(ypos<0) ypos=0;} else if(win.type=='graphics'){var canel=$('#win'+win.id+'_canvas',dom_context);if(canel.length){var pos=canel.offset();xpos=ev.clientX-pos.left;ypos=ev.clientY-pos.top;} if(xpos>=win.graphwidth) xpos=win.graphwidth-1;if(xpos<0) xpos=0;if(ypos>=win.graphheight) ypos=win.graphheight-1;if(ypos<0) ypos=0;} else{return;} ev.preventDefault();send_response('mouse',win,xpos,ypos);} function evhan_input_char_keydown(ev){var keycode=0;if(ev)keycode=ev.keyCode;if(!keycode)return true;var res=null;switch(keycode){case key_codes.KEY_LEFT:res='left';break;case key_codes.KEY_RIGHT:res='right';break;case key_codes.KEY_UP:res='up';break;case key_codes.KEY_DOWN:res='down';break;case key_codes.KEY_BACKSPACE:res='delete';break;case key_codes.KEY_ESC:res='escape';break;case key_codes.KEY_TAB:res='tab';break;case key_codes.KEY_PAGEUP:res='pageup';break;case key_codes.KEY_PAGEDOWN:res='pagedown';break;case key_codes.KEY_HOME:res='home';break;case key_codes.KEY_END:res='end';break;case 112:res='func1';break;case 113:res='func2';break;case 114:res='func3';break;case 115:res='func4';break;case 116:res='func5';break;case 117:res='func6';break;case 118:res='func7';break;case 119:res='func8';break;case 120:res='func9';break;case 121:res='func10';break;case 122:res='func11';break;case 123:res='func12';break;} if(res){var winid=$(this).data('winid');var win=windowdic[winid];if(!win||!win.input) return true;send_response('char',win,res);return false;} return true;} function evhan_input_char_keypress(ev){var keycode=0;if(ev)keycode=ev.which;if(!keycode)return false;var res;if(keycode==13) res='return';else res=String.fromCharCode(keycode);var winid=$(this).data('winid');var win=windowdic[winid];if(!win||!win.input) return true;send_response('char',win,res);return false;} function evhan_input_keydown(ev){var keycode=0;if(ev)keycode=ev.keyCode;if(!keycode)return true;if(keycode==key_codes.KEY_UP||keycode==key_codes.KEY_DOWN){var winid=$(this).data('winid');var win=windowdic[winid];if(!win||!win.input) return true;if(keycode==key_codes.KEY_UP&&win.historypos>0){win.historypos-=1;if(win.historyposrealbottom) newtopunseen=realbottom;if(win.topunseen=frameel.get(0).scrollHeight){win.needspaging=false;var moreel=$('#win'+win.id+'_moreprompt',dom_context);if(moreel.length) moreel.remove();readjust_paging_focus(true);return;}} function build_evhan_hyperlink(winid,linkval){return function(){var win=windowdic[winid];if(!win) return false;if(!win.reqhyperlink) return false;send_response('hyperlink',win,linkval);return false;};} return{version:'2.1.1',init:glkote_init,update:glkote_update,extevent:glkote_extevent,getinterface:glkote_get_interface,getdomcontext:glkote_get_dom_context,setdomcontext:glkote_set_dom_context,log:glkote_log,error:glkote_error};}();Dialog=function(){var dialog_el_id='dialog';var is_open=false;var dialog_callback=null;var will_save;var confirming;var editing;var editing_dirent;var cur_usage;var cur_usage_name;var cur_gameid;var cur_filelist;function dialog_open(tosave,usage,gameid,callback){if(is_open) throw'Dialog: dialog box is already open.';if(localStorage==null) throw'Dialog: your browser does not support local storage.';dialog_callback=callback;will_save=tosave;confirming=false;editing=false;editing_dirent=null;cur_usage=usage;cur_gameid=gameid;cur_usage_name=label_for_usage(cur_usage);var root_el_id='windowport';var iface=window.Game;if(window.GlkOte) iface=window.GlkOte.getinterface();if(iface&&iface.windowport) root_el_id=iface.windowport;var rootel=$('#'+root_el_id);if(!rootel.length) throw'Dialog: unable to find root element #'+root_el_id+'.';var screen=$('#'+dialog_el_id+'_screen');if(!screen.length){screen=$('
',{id:dialog_el_id+'_screen'});rootel.append(screen);} var frame=$('#'+dialog_el_id+'_frame');if(!frame.length){frame=$('
',{id:dialog_el_id+'_frame'});rootel.append(frame);} var dia=$('#'+dialog_el_id);if(dia.length) dia.remove();dia=$('
',{id:dialog_el_id});var form,el,row;form=$('
');form.on('submit',(will_save?evhan_accept_save_button:evhan_accept_load_button));dia.append(form);row=$('
',{'class':'DiaButtonsFloat'});el=$('