/***************************************************************************** * Version stuff. This makes Version object looks like a static class. */ var Version = new Object(); var __ua = navigator.userAgent; var __ie = __ua.indexOf( "MSIE" ); Version.NN = __ua.indexOf( "Gecko" ) + 1 ? parseFloat( __ua.substring( __ua.lastIndexOf( "/" ) + 1 ) ) : __ua.indexOf( "Mozilla" ) + 1 && !( __ie + 1 ) ? parseFloat( __ua.substring( __ua.indexOf( "/" ) + 1, __ua.indexOf(" ") ) ): 0; Version.IE = __ie + 1 ? parseFloat( __ua.substring( __ie + 5, __ua.indexOf( ";", __ie + 5 ) ) ) : 0; Version.JS = window.clearInterval ? 1.2 : window.blur ? 1.1 : 1.0; delete __ua; delete __ie; Version.ie = function( v ) { return ( ( v <= this.IE ) || ( !v && this.IE ) ) ? true : false; } Version.nn = function( v ) { return ( ( v <= this.NN ) || ( !v && this.NN ) ) ? true : false; } Version.js = function( v ) { return v <= this.JS ? true : false; } /***************************************************************************** * Others */ function assert( testValue ) { if( ! eval( testValue ) ) alert( "Assertion failed!" ); } /***************************************************************************** * Error reporting for NN, for convenience sake. */ if( Version.NN < 6 ) { window.onerror = function( msg, url, line ) { var s = "Error: " + msg + " on line: " + line + "\n" + "URL: " + url; alert( s ); return true; } } /***************************************************************************** * Misc */ function uclen( s ) { var len = 0; for( i = 0; i < s.length; i++ ) len += ( s.charCodeAt( i ) > 127 ) ? 2 : 1; return len; } function xdebug( object ) { var s = ''; for( f in object ) s += f + ':' + object[f] + '
'; var win = window.open(); win.document.open(); win.document.write( s ); win.document.close(); } var p_time1, p_time2; function p_start() { p_time1 = new Date().getTime(); } function p_stop() { p_time2 = new Date().getTime(); return ( p_time2 - p_time1 ); }