var gk_error_msg = '';
var gk_error_msg_callback = null;

function gk_report_error(url)
{
    var xmlhttp;
    while (1)
    {
	try { xmlhttp = new XMLHttpRequest(); } catch(e) { xmlhttp=null; }
	if (xmlhttp) break;
	try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { xmlhttp=null; }
	if (xmlhttp) break;
	try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { xmlhttp=null; }
	break;
    }
    if (!xmlhttp) return;

    xmlhttp.open( 'HEAD', url, true );  // asynch
    xmlhttp.onreadystatechange = function(){}; // don't care
    xmlhttp.send( null );
}

var gk_error_reported = 0;

function gk_on_error( msg, url, lno )
{   
//!!!
    if (msg=='Error loading script') return true;
    
    if (gk_error_reported>3) return true;
    gk_error_reported++;
    var log = 'url: '+document.location+'\nerror: '+msg+'\nfile: '+url+'\nline: '+lno+'\nreferer: '+(document.referrer?document.referrer:'-');
    log += '\n'+gk_get_call_stack();

    log += '\nEvent info:';
    var evt = window.event;
    for (var i in evt) { if(i.indexOf('error')==0) log += '\n\t'+i+': '+evt[i]; }
    
    if (gk_error_msg) log += '\nError msg: '+gk_error_msg;
    if ((typeof gk_error_msg_callback)=='function') log += '\nError callback msg: '+gk_error_msg_callback();

    if ((typeof msg)=='object')
    {
	log += '\nMessage is an object!';
	for (var k in msg) { log += '\n\t'+k+': '+msg[k]; }
    }
    
    log = 'http://gameknot.com/log_error.pl?'+escape(log);
    if (log.length>8000) log=log.substring(0,8000);
    gk_report_error( log );
    return true;
}

window.onerror = gk_on_error;

function gk_get_call_stack()
{
    var out = 'Call stack:\n';
    var f = gk_get_call_stack.caller;
    var depth=0;
    while(f && depth++<10)
    {
	var fn = String(f).split('\n')[0];
	if (fn.length>50) fn=fn.substring(0,50);
	out += '\t'+fn+'\n';
	f = f.caller;
	if (!f) break;
    }
    return out;
}

