var bob;var cgd_request_verion=9;var cgd_database=gk_get_glop(6,0);var cgd_numid=0;var cgd_bd=0;var cgd_bd_not_found=0;var cgd_error='';var cgd_b_loading=0;var cgd_node=[];var cgd_movelist=[];var cgd_movelist_reset;var cgd_sort_moves=2;var cgd_limit_personal_moves=-1;var DB={GAMEKNOT:0,WORLD:1,PERSONAL_W:2,PERSONAL_B:3};function init_page(main_div_name,b_flip){if(cgd_bd&&cgd_movelist.length>0){cgd_movelist_reset=cgd_movelist.slice();}if(cgd_bd>0){if(cgd_database==DB.PERSONAL_B&&!b_flip)cgd_database=DB.PERSONAL_W;else
if(cgd_database==DB.PERSONAL_W&&b_flip)cgd_database=DB.PERSONAL_B;}else{if(cgd_database==DB.PERSONAL_B)b_flip=1;if(cgd_database==DB.PERSONAL_W)b_flip=0;}if(!main_div_name)var main_div_name='cgd';bob=new ichess_create(14,main_div_name);var moves='';for(var i=0;i<cgd_movelist.length;i++){moves+=move_and_promo(cgd_movelist[i].move);}bob.init_moves_and_promos(moves);bob.init_options(0,0,0,0,1,1);bob.b_force_legal_moves=0;bob.b_force_short_notation=0;bob.b_freestyle=0;bob.b_allow_new_moves=1;bob.callback_get_buttons_below_board=function(){return '';};bob.callback_get_links_below_board=function(){return '';};bob.callback_validate_move=cgd_callback_validate_move;bob.callback_record_move=cgd_callback_record_move;bob.go(b_flip,-1);var o=bob.get_obj('below-board');if(!o)return;var info_width=bob.board_frame_size;o.innerHTML='';o.style.visibility='visible';o.style.display='';o.style.textAlign='left';o.style.width=info_width+'px';o.style.padding='5px';update_board_header();if(window.addEventListener){window.addEventListener('keydown',handle_keydown,false);}else{window.onkeydown=document.onkeydown=handle_keydown;}setTimeout('init_database()',1);}function init_database(){if(cgd_error){cgd_pop_message(cgd_error,5000);transition_to_node(0);}else{transition_to_fen();}}function personal_db_hide_update(){var o=gk_get_el('personal-db-form');if(!o)return;o.style.display='none';o.style.visibility='hidden';}function personal_db_request_update(){var o=gk_get_el('personal-db-form');if(!o)return;o.style.display='';o.style.visibility='visible';}function personal_db_request_submit(frm){var o=gk_get_el('personal-db-form');if(o)o.style.display='none';var o=gk_get_el('personal-db-info');if(o)o.innerHTML='<em class=imp>Your personal games database will be updated within 24 hours. You will receive a notification message as soon as it is done.</em>';if(!frm)return;var iu=0;if(frm.pdb_include_unrated)iu=frm.pdb_include_unrated.checked?1:0;var it=0;if(frm.pdb_include_timeouts)it=frm.pdb_include_timeouts.checked?1:0;var mm=5;if(frm.pdb_min_moves)mm=to_int(frm.pdb_min_moves.value);var params=[];params.push('rv='+cgd_request_verion);params.push('h='+cgd_database);params.push('nid='+cgd_numid);params.push('pdb=1');params.push('iu='+iu);params.push('it='+it);params.push('mm='+mm);gk_request_remote_data('/chess-games-database.pl?'+params.join('&'));}function show_db_menu(el){var txt='';for(var db=0;db<=3;db++){if(db==cgd_database)continue;var db_name=get_db_name(db);txt+='<a href="javascript:void(0)" onClick="switch_to_db('+db+');">Switch to '+db_name+'</a><br>';}gui_pop_menu(txt,el,1,0);}function hide_db_menu(el){gui_pop_menu_remove_delayed();}function get_db_name(db){if(db==DB.GAMEKNOT)return 'GameKnot';if(db==DB.WORLD)return 'World';if(db==DB.PERSONAL_W)return 'Personal/W';if(db==DB.PERSONAL_B)return 'Personal/B';return 'Unknown';}function handle_keydown(evt){if(!evt)var evt=window.event;var key=evt.keyCode||evt.which;switch(key){case 8:case 63234:case 37:if(cgd_movelist.length>0&&get_cur_move_num()>=0){transition_move_back();}break;case 63235:case 39:if(cgd_movelist.length>0){transition_move_forward();}break;case 63273:case 36:case 38:break;case 63275:case 35:case 40:break;default:return true;}evt.cancelBubble=true;if(evt.stopPropagation)evt.stopPropagation();if(evt.preventDefault)evt.preventDefault();return false;}function update_board_header(){var o=bob.get_obj('header');if(!o)return;var iq='';var qq=gk_get_el('db-info-'+cgd_database);if(qq){iq='<img src="/img/q.png" class=img-q onMouseOver="pb_show(event,unescape(\''+escape(qq.innerHTML)+'\'))" style="vertical-align: top">';}o.style.padding='4px';var t='<table border=0 cellpadding=0 cellspacing=0><tr><td nowrap width='+(30+bob.board_frame_size)+'>';t+='<div style="padding: 2px;">Database: <a href="javascript:void(0)" onMouseOver="show_db_menu(this)" onMouseOut="hide_db_menu(this)" style="border: 1px solid #555566; padding: 1px 4px;"><span style="font-size: 16px; font-weight: bold; font-family: arial, sans-serif;">'+get_db_name(cgd_database)+'</span> &#9660;</a> '+iq+'</div>';t+='</td><td nowrap valign="bottom"><div id="header-menu"></div></td></tr></table>';o.innerHTML=t;for(var i=0;;i++){o=gk_get_el('db-info-'+i);if(!o)break;if(i==cgd_database){o.style.display='';o.style.visibility='visible';}else{o.style.display='none';o.style.visibility='hidden';}}o=gk_get_el('personal-db-info');if(o){if(cgd_database==DB.PERSONAL_W||cgd_database==DB.PERSONAL_B){o.style.display='';}else{o.style.display='none';}}}function switch_to_db(db){cgd_database=db;cgd_node=[];for(var i=0;i<cgd_movelist.length;i++){cgd_movelist[i].node=-1;}if(cgd_database==DB.PERSONAL_W){if(bob.b_flip)bob.flip();}else
if(cgd_database==DB.PERSONAL_B){if(!bob.b_flip)bob.flip();}else{personal_db_hide_update();}load_global_options();gk_glop[6]=cgd_database;save_global_options();update_board_header();transition_to_fen();}function transition_to_fen(move_num){if(move_num==undefined)var move_num=get_cur_move_num();if(move_num<0){transition_to_node(0);return;}show_loading();cgd_update_movelist();var params=[];params.push('rv='+cgd_request_verion);params.push('h='+cgd_database);params.push('nid='+cgd_numid);params.push('f='+escape(bob.encode_fen()));gk_request_remote_data('/chess-games-database.pl?'+params.join('&'),'fen:'+move_num,cgd_remote_data_received);}function move_and_promo(mv){var mv=mv.substr(0,5);while(mv.length<5)mv+='-';return mv;}function get_cur_move_num(){var cur_move_num=bob.current_move-1;return cur_move_num;}function get_current_node(offset_behind){var mn=get_cur_move_num()-(offset_behind?offset_behind:0);if(mn<0)return 0;if(mn>=cgd_movelist.length){report_error('Move list too short in get_current_node()! size='+cgd_movelist.length+', current move='+mn);return-1;}return cgd_movelist[mn].node;}function cgd_submit_new_move(mv){var n=get_cur_move_num();if(n<0)n=0;if(n<cgd_movelist.length){cgd_movelist.splice(n,cgd_movelist.length-n);}cgd_movelist.push({node:mv.goto_node,move:mv.move,note:mv.note});transition_to_node(mv.goto_node);}function select_move(n){if(get_current_node()<0)return;var cur_node=cgd_get_node();if(n<0||n>=cur_node.moves.length){report_error('Move index out of range: '+n+', expected max: '+cur_node.moves.length+', node: '+cur_node.id);return;}var mv=cur_node.moves[n];bob.submit_move(mv.move);}function cgd_pop_message(msg,duration){if(!duration)var duration=1000;gui_pop_message(msg,bob.board,duration);}function cgd_callback_validate_move(x1,y1,x2,y2,promo){if(get_current_node()<0)return false;var move=bob.chess_encode_move(x1,y1,x2,y2,promo);if(cgd_b_loading){cgd_pop_message('Loading data, please wait...',1000);return false;}var cur_node=cgd_get_node();if(!cur_node.b_loaded){cgd_pop_message('Loading data, please wait...',1000);return false;}for(var i=0;i<cur_node.moves.length;i++){var mv=cur_node.moves[i];if(mv.move==move)return true;}cgd_pop_message('Move not found in the database...',1000);return false;}function cgd_callback_record_move(){var move=bob.chess_get_last_move();var cur_node=cgd_get_node(get_current_node(1));for(var i=0;i<cur_node.moves.length;i++){var mv=cur_node.moves[i];if(mv.move==move){cgd_submit_new_move(mv);return;}}report_error('Move not found in cgd_callback_record_move()!');}function show_loading(){if(cgd_b_loading)return;cgd_b_loading=1;var o=bob.get_obj('right_pane');if(!o)return;o.innerHTML='<img src="/img/wait.gif" class=img-wait> Loading...';}function transition_to_node(node){if(get_current_node()!=node)report_error('Nodes do not match in transition_to_node()! got='+node+', expected='+get_current_node());var node=get_current_node();if(node<0){setTimeout("redraw_page()",100);return;}show_loading();cgd_update_movelist();var cur_node=cgd_get_node();if(cur_node.b_loaded){setTimeout("redraw_page()",300);return;}var params=[];params.push('rv='+cgd_request_verion);params.push('h='+cgd_database);params.push('nid='+cgd_numid);params.push('n='+node);gk_request_remote_data('/chess-games-database.pl?'+params.join('&'),'node:'+node,cgd_remote_data_received);}function transition_to_parent_node(node,move){if(node<0){report_error('Unexpected node in transition_to_parent_node(): '+node);return;}show_loading();var params=[];params.push('rv='+cgd_request_verion);params.push('h='+cgd_database);params.push('nid='+cgd_numid);params.push('n='+node);params.push('mv='+escape(move));gk_request_remote_data('/chess-games-database.pl?'+params.join('&'),'parent:'+node,cgd_remote_data_received);}function cgd_update_movelist(){var o=bob.get_obj('below-board');if(!o)return;o.innerHTML='';var cur_move_num=get_cur_move_num();var t='<div>';for(var i=0;i<cgd_movelist.length;i++){var mv=cgd_movelist[i];var lbl=i%2?'':(i/2+1)+'. ';if(i==cur_move_num){t+=lbl+'<b>'+mv.note+'</b> ';}else{var col=i<=cur_move_num?'ffffdd':'aaaaaa';t+='<a href="javascript:void(0)" onClick="transition_to_move('+i+')" style="color: #'+col+';">'+lbl+mv.note+'</a> ';}}t+='</div>';t+='<div style="text-align: center; padding: 5px 0px; white-space: nowrap;">'+get_options_menu()+'</div>';var hm=gk_get_el('header-menu');if(hm)hm.innerHTML=get_options_menu(1);var co=get_chess_opening_info(get_current_node());if(co)co='Chess opening:<br>'+co;t+='<div id="chess-opening-info">'+co+'</div>';o.innerHTML=t;}function get_options_menu(b_short){var options=[];if(cgd_movelist.length>0&&get_cur_move_num()>=0)options.push('&laquo; back|transition_move_back()|go back one move');if(get_current_node()!=0)options.push('start|transition_to_start()|reset the board to the starting position');if(cgd_bd){options.push('reset|transition_to_reset()|reset the board to the original position');options.push('back to game|/chess.pl?bd='+cgd_bd+'&rnd='+Math.random()+'|return to the game');}if(!b_short){options.push('FEN&hellip;|cgd_show_fen(this)|FEN notation for the current position on the board');options.push('flip|cgd_flip_board()|flip the board');}for(var i=0;i<options.length;i++){var a=options[i].split('|');var title=a[2];if(!title)title='';else title=' title="'+title+'"';if(a[1].charAt(0)=='/')options[i]='<a href="'+a[1]+'"'+title+'>'+a[0]+'</a>';else options[i]='<a href="javascript:void(0)" onClick="'+a[1]+'"'+title+'>'+a[0]+'</a>';}if(!options.length)return '';return '[ '+options.join(' | ')+' ]';}function get_chess_opening_info(node_id,new_move){if(node_id<=0)return '';var node=cgd_get_node(node_id);if(!node.eco){var eco=0;var eco_move=0;var max_move=get_cur_move_num();if(max_move>=cgd_movelist.length)max_move=cgd_movelist.length-1;var search_moves=[];for(var i=0;i<=max_move;i++){search_moves.push(cgd_movelist[i].move.substr(0,4));}if(new_move)search_moves.push(new_move.substr(0,4));for(var i=0;i<search_moves.length;i++){var mv=search_moves[i];var en=eco_node[eco_move];var link=en[mv];if(!link)break;eco=link[0];eco_move=link[1];}node.eco=eco;}var info=eco_info[node.eco];var t=info[1]+' ('+info[0]+')';if(info[2].length>0)t+=', '+info[2];var url=convert_to_url_path(t);return '<a href="/chess-opening'+url+'?nd='+node.eco+'" target="_blank">'+t+'</a>';}function cgd_show_fen(el){var fen=gk_html_safe(bob.encode_fen());var txt='<table border=0 cellspacing=4 cellpadding=0><tr><td align="center"><textarea name="fen" wrap="soft" readonly class=ftx style="width: 450px; height: 35px;" onClick="select();">'+fen+'</textarea></td></tr><tr><td align="center"><INPUT TYPE="button" VALUE=" OK " onClick="gui_pop_form_remove();"></td></tr></table>';gui_pop_form(txt,el,{'dir':0,'align':1,'header':'FEN notation for the current position on the board:'});}function transition_move_back(){if(cgd_b_loading)return;var n=get_cur_move_num();if(n>0)transition_to_move(n-1);else
transition_to_start();}function transition_move_forward(){if(cgd_b_loading)return;var n=get_cur_move_num();if((n+1)>=cgd_movelist.length)return;transition_to_move(n+1);}function transition_to_start(){bob.init_moves_and_promos('');bob.reset_all();transition_to_node(0);}function transition_to_reset(){if(!cgd_bd)return;if(!cgd_movelist_reset||!cgd_movelist_reset.length)return;cgd_movelist=cgd_movelist_reset.slice();var moves='';for(var i=0;i<cgd_movelist.length;i++){moves+=move_and_promo(cgd_movelist[i].move);}bob.init_moves_and_promos(moves);bob.reset_all();setTimeout('transition_to_fen();',1);}function transition_to_move(n){if(n<0||n>=cgd_movelist.length){report_error('Unexpected move number in transition_to_move(): '+n+', total moves: '+cgd_movelist.length);return;}var moves='';for(var i=0;i<=n;i++){moves+=move_and_promo(cgd_movelist[i].move);}bob.init_moves_and_promos(moves);bob.reset_all();var mv=cgd_movelist[n];if(mv.node<0){transition_to_fen(n);}else{transition_to_node(mv.node);}}function cgd_get_node(n){if((typeof n)=='undefined')var n=get_current_node();if(n<0){report_error('Unexpected node requested in cgd_get_node(): '+n+', current: '+get_current_node());}if((typeof cgd_node[n])!='undefined'){return cgd_node[n];}var new_node={id:n,moves:[],b_loaded:0,rating:0,white_wins:0,draws:0,black_wins:0,total_games:0,bd:0,game_info:'',eco:0};cgd_node[n]=new_node;return new_node;}function cgd_remote_data_received(node,txt){if(!txt)return;var mode='';var params=node.split(':');if((params[0]=='parent')||(params[0]=='node')||(params[0]=='fen')){mode=params[0];var node=to_int(params[1]);}var data=txt.split('\n');if(data[0]!='cgd.1.0'){report_error('Unexpected server signature: '+data[0]+'\n'+txt);return;}if(mode=='node'){if(to_int(data[1])!=node){report_error('Unexpected node id in remote_data_received(), got: '+data[1]+', expected: '+node);return;}}else
if(mode=='parent'){var new_node=to_int(data[1]);if(new_node<0){cgd_pop_message('Position not found in the database');}else{for(var i=1;i<cgd_movelist.length;i++){if(cgd_movelist[i].node==node){if(cgd_movelist[i-1].node<0)cgd_movelist[i-1].node=new_node;break;}}}node=new_node;}else
if(mode=='fen'){var move_num=node;node=to_int(data[1]);if(node<0){cgd_pop_message('Position not found in the database');}else{if(move_num>=0&&move_num<cgd_movelist.length){cgd_movelist[move_num].node=node;}}}if(node>=0){var cur_node=cgd_get_node(node);cur_node.moves=[];for(var i=2;i<data.length;i++){var l=data[i].split('|');var n=to_int(l[0]);if(!n)continue;cur_node.moves.push({goto_node:n,move:l[1],note:l[2]});var new_node=cgd_get_node(n);new_node.rating=to_int(l[3]);new_node.white_wins=to_int(l[4]);new_node.draws=to_int(l[5]);new_node.black_wins=to_int(l[6]);new_node.bd=to_int(l[7]);new_node.game_info=unescape(l[8]);new_node.total_games=new_node.white_wins+new_node.draws+new_node.black_wins;}cur_node.b_loaded=1;}setTimeout("redraw_page()",300);}function cgd_flip_board(){bob.flip();}function database_move_mouse_over(elm,idx){var cur_node=cgd_get_node();if(idx>=0&&idx<cur_node.moves.length){var mv=cur_node.moves[idx];hilite_move(mv.move);var o=gk_get_el('chess-opening-info');if(o){var co=get_chess_opening_info(mv.goto_node,mv.move);if(co)o.innerHTML='Chess opening:<br>'+co;}}elm.style.backgroundColor='#404055';}function database_move_mouse_out(elm){hilite_move();var o=gk_get_el('chess-opening-info');if(o){var co=get_chess_opening_info(get_current_node());if(co)co='Chess opening:<br>'+co;o.innerHTML=co;}if(elm)elm.style.backgroundColor='';}function cgd_change_sort(idx){if(Math.abs(cgd_sort_moves)==idx){cgd_sort_moves=-cgd_sort_moves;}else{cgd_sort_moves=idx;}redraw_page();}function sort_moves_func(_a,_b){var a=cgd_node[_a.goto_node];var b=cgd_node[_b.goto_node];var dir=1;var sort_by=cgd_sort_moves;if(cgd_sort_moves<0){sort_by=-cgd_sort_moves;dir=-1;}if(sort_by==1){if(_a.move>_b.move)return dir;if(_a.move<_b.move)return-dir;}else
if(sort_by==3){if(a.rating>b.rating)return-dir;if(a.rating<b.rating)return dir;}else
if(sort_by==4){var ap=(a.white_wins-a.black_wins)/a.total_games;var bp=(b.white_wins-b.black_wins)/b.total_games;if(ap>bp)return-dir;if(ap<bp)return dir;}else
if(sort_by==5){var ap=a.draws/a.total_games;var bp=b.draws/b.total_games;if(ap>bp)return-dir;if(ap<bp)return dir;}if(a.total_games>b.total_games)return-dir;if(a.total_games<b.total_games)return dir;if(a.bd>b.bd)return dir;if(a.bd<b.bd)return-dir;return 0;}function redraw_page(){cgd_b_loading=0;if(bob.movers_active()){setTimeout('redraw_page()',100);return;}var o=bob.get_obj('right_pane');if(!o)return;var w=120;var h=16;var c_bg='#505060';var min_w=30;o.style.width='500px';o.style.textAlign='left';var cols=[[50,'Move'],[55,'Games'],[55,'Rating'],[2*w+5,'Wins, <span style="color: #ffffff; border: 2px solid #ffffff;">white</span> vs. <span style="color: #000000; border: 2px solid #000000;">black</span>'],[50,'Draws']];var num_cols=cols.length;var all=[];all.push('<table border=0 cellspacing=1 cellpadding=3>');all.push('<tr bgcolor="#666699">');for(var i=0;i<cols.length;i++){var wd=cols[i][0];var title=cols[i][1];var idx=i+1;var cur_sort='';if(cgd_sort_moves==idx)cur_sort='&darr;';else
if(cgd_sort_moves==-idx)cur_sort='&uarr;';if(cur_sort)cur_sort='<div style="float: right; margin: -1px; padding: 0px;">'+cur_sort+'</div>';all.push('<td'+(wd>0?' width='+wd:'')+' nowrap>'+cur_sort+'<a href="javascript:void(0)" onClick="cgd_change_sort('+idx+')"  onMouseOver="pb_show(event,\'Click to sort by this column\')" class=sml style="font-weight: bold; vertical-align: middle; color: #fff;">'+title+'</a></td>');}all.push('</tr>');if(cgd_limit_personal_moves>0&&(cgd_database==DB.PERSONAL_W||cgd_database==DB.PERSONAL_B)&&(get_cur_move_num()>=cgd_limit_personal_moves)){all.push('<tr><td colspan='+num_cols+' style="padding: 4px;"><i>Please subscribe to <a href="/premium.pl" target="_blank">premium membership</a> to have full access to a more detailed personal chess database (past the first 2 moves).</i></td></tr>');}else
if(get_current_node()>=0){var num_moves=0;var cur_node=cgd_get_node();cur_node.moves.sort(sort_moves_func);for(var i=0;i<cur_node.moves.length;i++){var mv=cur_node.moves[i];var node=cgd_get_node(mv.goto_node);num_moves++;all.push('<tr align=center onMouseOver="database_move_mouse_over(this,'+i+')" onMouseOut="database_move_mouse_out(this)">');if(node.bd&&node.total_games<=1){all.push('<td><a href="javascript:void(0)" onClick="show_game('+node.bd+');">'+mv.note+'</a></td>');var res='&frac12;-&frac12;';var col='';var bcol=c_bg;if(node.white_wins){res='1-0';col='#000';bcol='#fff';}else if(node.black_wins){res='0-1';bcol='#000';}var stl='height:'+h+'px;padding: 0px 4px; background-color:'+bcol+';';if(col)stl+='color:'+col+';';all.push('<td><table border=0 cellpadding=0 cellspacing=0><tr><td style="'+stl+'">'+res+'</td></tr></table></td><td colspan='+(num_cols-2)+'>'+node.game_info+'</td>');}else{var delta=node.white_wins-node.black_wins;var txt_w=pct(node.white_wins,node.total_games);var txt_b=pct(node.black_wins,node.total_games);var g_w;var g_b;if(delta>=0){var ww=Math.floor(w*delta/node.total_games);if(ww<1)ww=1;var wf=w-ww;var tw=txt_w;var tf='<div></div>';if(wf<min_w){tw='<div></div>';tf='<span style="color: #000000">'+txt_w+'</span>';}g_w='<td style="text-align: left; width: '+wf+'px;">'+tw+'</td><td style="width: '+ww+'px; background: #ffffff; text-align: left;">'+tf+'</td>';g_b='<td style="text-align: right; width: '+w+'px;">'+txt_b+'</td>';}else{var ww=Math.floor(w*-delta/node.total_games);if(ww<1)ww=1;var wf=w-ww;var tb=txt_b;var tf='<div></div>';if(wf<min_w){tb='<div></div>';tf=txt_b;}g_w='<td style="text-align: left; width: '+w+'px;">'+txt_w+'</td>';g_b='<td style="width: '+ww+'px; background: #000000; text-align: right;">'+tf+'</td><td style="text-align: right; width: '+wf+'px;">'+tb+'</td>';}var g='<table class=row style="background: '+c_bg+'; width: '+(2*(w+2))+'px;"><tr style="border: 2px solid '+c_bg+';" class=sml>'+g_w+g_b+'</tr></table>';var lbl=mv.note;if(!lbl||lbl.length<4)lbl='&nbsp;'+lbl+'&nbsp;';all.push('<td><a href="javascript:void(0)" onClick="database_move_mouse_out();select_move('+i+');">'+lbl+'</a></td><td>'+format_number(node.total_games)+'</td><td>'+node.rating+'</td><td>'+g+'</td><td>'+pct(node.draws,node.total_games)+'</td>');}all.push('</tr>');}if(num_moves==0){all.push('<tr><td colspan='+num_cols+'>No moves found in the database...</td></tr>');}}all.push('</table>');o.innerHTML=all.join('');cgd_update_movelist();}function hilite_move(move){bob.hilite_move(move);}function pct(v,total){if(total==0)total=1;return Math.floor(100*v/total)+'%';}function show_game(bd){var mv=get_cur_move_num()+2;var b_flip=bob.b_flip;if(cgd_database==DB.WORLD){popa('x'+bd,b_flip,mv);}else{popa(bd,b_flip,mv);}}function format_number(n){if(n<1000)return n;var s=String(n);var out='';for(var i=s.length;i>0;i-=3){var st=i-3;if(st<0)st=0;out=s.substring(i-3,i)+(out.length?','+out:'');}return out;}function convert_to_url_path(t){var t=t.toLowerCase();t=t.replace(/(\'|\"|&quot;|&#039;)+/g,'');t=t.replace(/\W+/g,'-');t=t.replace(/(^\-+|\-+$)/g,'');if(!t)return '';return '/'+t+'.pl';}function report_error(msg){gk_log_error(msg);}
