compatible=0;
core=new Object();
debugging=1;

function returnOne() { return(1); }

if(window.onerror) {
    core.olderror=window.onerror
    window.onerror=returnOne;
}


/* js implementations with archaic syntax will be caught
 by the following lines.  
 I think anonymous functions means javascript 1.5.  */
core.f=function () {
    var x;
    x=1==3;
    try {} catch(e) {}
    x=[1];
    x=true;
    var x=/d/;
}
/* we should have reasonable syntax, so it's safe to proceed. */

if(core.olderror) window.onerror=core.olderror; 
compatible=true;

if(!document.getElementById) compatible=false;

if(!"".match) compatible=false;
if(compatible==false&&debugging) alert('Not Compatible Super Early');

core.global=this;

function debug() { 
    if(!debugging) return;
    var str='',i;
    if(arguments.length>0) str+=arguments[0];
    if(arguments.length>1) str+=': '+arguments[1];
    for(i=2;i<arguments.length;i++) str+=', '+arguments[i];
    alert(str) 
    return arguments
}

if(!this.XMLHttpRequest) {
    core.XMLHttpRequest=function() {
        try {
            var obj=new ActiveXObject("MSXML2.XMLHTTP.3.0");
            return obj; 
        } catch(e) {}
        return false;
    }
}
else {
    core.XMLHttpRequest=function() {
        return new XMLHttpRequest();
    }
}
try {
    if(!core.XMLHttpRequest()) compatible=false;
} catch(e) { }    
    
if(compatible==false&&debugging) alert('Requests fail');

core.unFrame=function () {
    if(window!==parent) parent.location.href=window.location.href;
}

/* name, value, expires, path, domain, secure */
core.setCookie=function() {
    if(arguments.length>2) {
        var exp=arguments[2];
        if(exp.toGMTString) exp=exp.toGMTString(); 
    }
    var curCookie = arguments[0] + "=" + escape(arguments[1]) +
            ((arguments.length>2&&arguments[2]) ? "; expires=" + exp : "") +
            ((arguments.length>3&&arguments[3]) ? "; path=" + arguments[3] : "; path=/") +
            ((arguments.length>4&&arguments[4]) ? "; domain=" + arguments[4] : "") +
            ((arguments.length>5&&arguments[5]) ? "; secure" : "");
    document.cookie = curCookie;
}

core.delCookie=function(name) {
    core.setCookie(name,'','Thu, 31-Dec-1998 00:00:00 GMT');
}

core.getCookie=function(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

core.popup=function(mylink,name,dparam) {
    var param=false;
    if (!window.open) return false;
    var href;
    if (typeof(mylink) == 'string') href=mylink;
    else href=mylink.href;
    for(var i in dparam) {
        if(param==false) param="";
        else param+=",";
        param+=i+"="+dparam[i];
    }
    win=window.open(href, name, param);
    if(win.focus) win.focus();
    return win
}

core.getNamedControls=function(form,name) {
    var r=new Array();
    if(typeof(form)=='string') form=document.getElementById(form);
    try {
        /* MS.  Also gets ID=name */
        var cs=form.elements(name);
    }
    catch(e) {
        /* W3C. Gets name from every form */
        var cs=document.getElementsByName(name);
    }
    if(!cs) return null;
    if(cs.form) { /* MS and non-array */
        if(cs.name==name&&cs.form==form) r.push(cs); 
    }
    else {
        for(var i in cs) {
            var c=cs[i];
            if(c.name==name&&c.form==form) r.push(c);
        }
    }
    return r;
}

core.contains=function(outer,inner) {
    if(!outer||!inner) return(false);
    if(outer.compareDocumentPosition) {
        return !!(outer.compareDocumentPosition(inner) & 16)
    }
    while(1) { 
        inner=inner.parentNode;
        if(!inner) return(false);
        if(outer===inner) return(true);
    }
}

core.args=function(args) {
    var i
    a=Array() 
    for(i=0;i<args.length;i++) a.push(args[i])    
    return a
}

/* get a closure, without extraneous scope data */
function getClosure() {
    var i;
    var args=Array()
    var f=arguments[0]
    for(i=1;i<arguments.length;i++) args.push(arguments[i])
    delete i
    return function() {
        if(arguments.length==0) return f.apply(window,args)

        var i
        var newargs=Array()
        for(i=0;i<arguments.length;i++) newargs.push(arguments[i])    
        return f.apply(window,args.concat(newargs))    
    }
}

function evalFunc(code) {
    eval(code);
}

function DOMElementData() {
    this.mycounter=0
    this.index=new Array()
    this.mapping=new Object()
    this.sweepindex=0
}

DOMElementData.prototype.delindex=function(i) {
    var top=this.index.pop()
    if(i<this.index.length) this.index[i]=top
}

DOMElementData.prototype.check=function(index) {
    var obj=this.index[index]
    var id=obj.id
    var e=document.getElementById(id)
    var d=new Date()
    if(!e&&d.getTime()>obj.t+5) {
        this.delindex(index)
        delete this.mapping[id]
        return 1 
    }
    return 0 /* ok */ 
}

DOMElementData.prototype.get=function(id) {
    var obj=this.mapping[id] 
    if(obj) return(obj)
    alert(id+' not found')
}

DOMElementData.prototype.clean=function() {
    while(this.index.length>0) {
        if(this.sweepindex==0) this.sweepindex=this.index.length
        this.sweepindex-=1
        if(this.check(this.sweepindex)==0) break 
    }
}

function DOMElementAssocObj(id) {
    var d = new Date()
    this.id = id 
    this.t = floor(d.getTime())
}

DOMElementData.prototype.add=function(id) {
    var obj2=false;
    this.clean();
    var obj=this.mapping[id];
    if(obj) return obj
    obj=new DOMElementAssocObj(id);
    this.mapping[id]=obj;
    this.index.push(obj);
    return obj;
}

coreDOMElementData=new DOMElementData();

core.getDOMObj=function(id) {
    return coreDOMElementData.get(id);
}
core.addDOMObj=function(id) {
    return coreDOMElementData.add(id);
}

function EventHandler() {
}

EventHandler.prototype.addEvent=function(e, eventType, f) {
    if(e.addEventListener) {
        e.addEventListener(eventType, f , false);
    }
    else {
        /*debug('attach event',e,eventType)*/
        e.attachEvent('on'+eventType, f);
        /*e['on'+eventType]=f*/
    }
}

eventHandler=new EventHandler();

function Event2(ev) {
    if(!ev) ev=window.event
    this.ev = ev;
    this.returnValue=true
    eventHandler.ev2 = this;
    if(ev.target) this.target = ev.target;
    else this.target = ev.srcElement;
    
    if(!this.target) return
    if (this.target.nodeType == 3) // Safari bug
		this.target = this.target.parentNode;
    if(ev.type=='keypress') {
        var c;
        this.ch='';
        if(ev.ctrlKey) return;
        if(ev.metaKey) return;
        if(typeof ev.charCode=='number') c=ev.charCode;
        else if(ev.keyCode) c=ev.keyCode;
        else return;  // allow non-printable chars
        if(c<32||c>60000) return; 
        this.ch=String.fromCharCode(c);
    }
}

Event2.prototype.preventDefault=function() {
    var ev=this.ev
    if(ev.preventDefault) ev.preventDefault()
    else ev.returnValue=false
    this.returnValue=false
}

Event2.prototype.stopPropagation=function() {
    var ev=this.ev
    if(ev.stopPropagation) ev.stopPropagation()
    else ev.cancelBubble=true
}

core.urlAdds=function(href,val) {
    if(href.indexOf('?')==-1) href+='?'+val;
    else href+='&'+val;
    return href;
}

core.calcPath=function(abs,rel) {
    var abs,rel,dir,diri
    abs=abs.split('/')
    rel=rel.split('/')
    abs.pop()
    for(diri in rel) {
        dir=rel[diri]
        if(dir=='.');
        else if(dir=='..') abs.pop()
        else abs.push(dir)
    }
    return abs.join('/')
}



if(document.cookie&&document.cookie.indexOf&&document.cookie.indexOf(';')!=-1); 
else if(typeof document.cookie!='undefined') {
    core.setCookie('x','chkcookie');
    ck=core.getCookie('x');
    if(ck!='chkcookie') compatible=false;
    else core.delCookie('x');
}

Date.prototype.toJSON = function () {
    function f(n) {
        return n < 10 ? '0' + n : n;
    }
    return this.getUTCFullYear()   + '-' +
         f(this.getUTCMonth() + 1) + '-' +
         f(this.getUTCDate())      + 'T' +
         f(this.getUTCHours())     + ':' +
         f(this.getUTCMinutes())   + ':' +
         f(this.getUTCSeconds())   + 'Z';
};


core.json_encode= function(value, whitelist) {
    var m = {    // table of character substitutions
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"' : '\\"',
        '\\': '\\\\'
    };
    var a, i, k, l, v; 
    switch (typeof value) {
    case 'string':
            return /["\\\x00-\x1f]/.test(value) ?
                    '"' + value.replace(/[\x00-\x1f\\"]/g, function (a) {
                        var c = m[a];
                        if (c) {
                            return c;
                        }
                        c = a.charCodeAt();
                        return '\\u00' + Math.floor(c / 16).toString(16) +
                                                   (c % 16).toString(16);
                    }) + '"' :
                    '"' + value + '"';
    case 'number':
        return isFinite(value) ? String(value) : 'null';
    case 'boolean':
        return String(value);
    case 'null':
        return 'null';
    case 'object':
        if (!value) return 'null';
        if (typeof value.toJSON === 'function') 
            return core.json_encode(value.toJSON());
        a = [];
        if (value.constructor === Array) {
            l = value.length;
            for (i = 0; i < l; i += 1) 
                a.push(core.json_encode(value[i], whitelist) || 'null');
            return '[' + a.join(',') + ']';
        }
        for (k in value) {
            if (typeof k === 'string') {
                v = core.json_encode(value[k], whitelist);
                if (v) a.push(core.json_encode(k) + ':' + v); 
            }
        }
        return '{' + a.join(',') + '}';
    }
}

