var gZOO_ErrorMsg = '';
var gZOO_ErrorMsgCallback = null;
var gZOO_ErrorReported = 0;

function ZOO_ReportError( log )
{
	if ( gbDebug ) { DebugOutput( log ); return; } // requires common.js -- move function to this file?
	log = escape( StringMakeHTMLSafe(log) );
	
	var xmlhttp = GetHTTP( false );
	if (!xmlhttp) return;

	log = '/log_error.pl?err='+log;
	if (log.length>8000) log=log.substring(0,8000);

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

function ZOO_OnError( msg, url, lno )
{   
	if ( gbDebug ) { return false; }
	
    if (gZOO_ErrorReported>3) return true;
    ++gZOO_ErrorReported;
	
	
	if ( url && (typeof url) == 'string' )
	{
		var regURL = new RegExp( url );
		if ( !regURL.test( /zooescape.com/i ) )
		{
			if ( gZOO_OtherErrorHandler )
			{
				gZOO_OtherErrorHandler( msg, url, lno );
			}
			return false;
		}
	}
	
    var log = 'url: '+ document.location+'\nerror: '+ msg +'\nfile: '+ url +'\nline: '+ lno +'\nreferer: ' + (document.referrer?document.referrer:'-');
    log += '\n'+ ZOO_GetCallStack();
	if ( msg && (typeof msg) == 'object' )
	{
	    log += '\nEvent info:';
//		for (var i in msg) {if(i.indexOf('error')==0) log += '\n\tevent.' + i + ': ' + msg[i];}
		for (var i in msg) 
		{
			log += '\n\tevent.' + i + ': ' + msg[i];
			var index = i.toLowerCase();
			if ( index == 'currenttarget' )
			{
				log += ', url=' + msg[i].URL;
			}
			else
			if ( index == 'srcelement' || index == 'target' )
			{
				log += ', uri=' + msg[i].src;
				if ( msg[i].src.search( /^http\:\/\/pagead2.googlesyndication.com/) != -1 ) 	{ return false; } // google ads barfing on Safari/Mac
				if ( msg[i].src.search( /^http\:\/\/www.google-analytics.com\/ga.js/) != -1 ) 	{ return false; } // google ads barfing on Safari/Mac
			}
		}
	
	}
    var evt = window.event;
    if ( evt ) 
	{
	    log += '\nEvent info:';
		for (var i in evt) {if(i.indexOf('error')==0) log += '\n\tevent.' + i + ': ' + evt[i];}
	}
    if (gZOO_ErrorMsg) log += '\nError msg: ' + gZOO_ErrorMsg;
    if ((typeof gZOO_ErrorMsgCallback)=='function') log += '\nError callback msg: '+ gZOO_ErrorMsgCallback();
    ZOO_ReportError( log );
//    return true;
	return false;
}

var gZOO_OtherErrorHandler = window.onerror;
window.onerror = ZOO_OnError;

function ZOO_GetCallStack()
{
    var out = 'Call stack:\n';
    var f = ZOO_GetCallStack.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;
}
