if(!document.getElementById && document.all)
	document.getElementById = function(id) { return document.all[id]; }

function sniff() {
	try {
		var result = 
			 "userAgent[" + navigator.userAgent + "] |" +
			 "appName[" + navigator.appName + "] |" +
			 "appVersion[" + navigator.appVersion + "] |" +
			 "appMinorVersion[" + navigator.appMinorVersion + "] |" +
			 "cookieEnabled[" + navigator.cookieEnabled + "] |" +
			 "platform[" + navigator.platform + "] |" +
			 "systemLanguage[" + navigator.systemLanguage + "] |" +
			 "browserLanguage[" + navigator.browserLanguage + "] |" +	
			 "userLanguage[" + navigator.userLanguage + "]";
	} catch(e) {}

	var xml = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><cjb></cjb>";
	var xsl = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><x:stylesheet version=\"1.0\" xmlns:x=\"http://www.w3.org/1999/XSL/Transform\" xmlns:m=\"urn:schemas-microsoft-com:xslt\"><x:template match=\"/\"><x:value-of select=\"system-property('m:version')\" /></x:template></x:stylesheet>";
	
	var x = null;
		
	try{ 
		x = new ActiveXObject("Microsoft.XMLDOM");  
		x.async = false;
		if (x.loadXML(xml)) result += " |msxml[OK]";
	} catch(e) {result += " |msxml[" + e.description + "]";} 

	try{ 
		x = new ActiveXObject("Msxml2.DOMDocument"); 
		x.async = false;
		if (x.loadXML(xml)) result += " |msxml2[OK]";
	} catch(e) {result += " |msxml2[" + e.description + "]";}
	 
	try{ 
		x = new ActiveXObject("Msxml2.DOMDocument.2.6"); 
		x.async = false;
		if (x.loadXML(xml)) result += " |msxml2v26[OK]";
	} catch(e) {result += " |msxml2v26[" + e.description + "]";} 

	try{ 
		x = new ActiveXObject("Msxml2.DOMDocument.3.0"); 
		x.async = false;
		if (x.loadXML(xml)) result += " |msxml2v30[OK]";
	} catch(e) {result += " |msxml2v30[" + e.description + "]";}

	try{ 
		x = new ActiveXObject("Msxml2.DOMDocument.4.0"); 
		x.async = false;
		if (x.loadXML(xml)) result += " |msxml2v40[OK]";
	} catch(e) {result += " |msxml2v40[" + e.description + "]";}

	try{
		var s = new ActiveXObject("Microsoft.XMLDOM"); 
		s.async = false;
		if (s.loadXML(xsl)){
			try{
				var op = x.transformNode(s);
				if (op.indexOf("stylesheet") == -1) {
					result += " |replace[V" + op.substr(op.lastIndexOf(">")+1) + "]";
				} else
					if (sniffer.msxml2.checked) result += " |Side-By-Side";
			} catch(e) {
				if (sniffer.msxml2.checked) result += " |Side-By-Side";
			}
		}
	} catch(e) {}
	
	result = result.replace(/\|/g, "\n");
	return result;
}

function ccLoaderCallback(id) {
	try {
		var err; // for debugging purposes
		err = 1; eval("var doc = xmldoc" + id);
		err = 2; eval("var obj = ccLoader" + id);
		if (obj.engine == "MSXML3") {
			err = 3; var state = doc.readyState;
			if (state == 4) {
				err = 4; var pe = doc.parseError;
				if (pe.errorCode == 0)	{
					err = 5; obj.ready = true;
					if (obj.callback) obj.callback(obj);
				} else {
					err = 6; throw(pe);
				}
			}
		} else if (obj.engine == "Safari") {
			if (doc.readyState == 4) {
				obj.ready = true;
				if (obj.callback) obj.callback(obj);
			}
		} else if (obj.engine == "Gecko") {
			if (/^XML Parsing Error/.test(doc.documentElement.firstChild.nodeValue)) {
				err = 7; 
				pe = new Object(); 
				pe.message = doc.documentElement.firstChild.nodeValue;
				throw(pe);
			}
			err = 8; obj.ready = true;
			if (obj.callback) obj.callback(obj);
		} else handleError("ccLoaderCallback unsupported browser: " + this.engine, 0);
	} catch(e) {
		handleError("ccLoaderCallback(" + id + ") at point " + err, e);
	}
}

function ccLoaderProcessor() {
	try {
		var err = 1; // for debugging purposes
		var processor = "ccLoaderProcessor" + this.ccid;
		if (this.engine == "MSXML3") {
			var doesntExist;
			err = 2; eval("doesntExist = (typeof " + processor + " == 'undefined')");
			if (doesntExist) {
				err = 3; var xslt = new ActiveXObject("Msxml2.XSLTemplate");
				err = 4; eval("xslt.stylesheet = xmldoc" + this.ccid);
				err = 5; eval(processor + " = xslt.createProcessor()");
			}
			return processor;
		} else if (this.engine == "Gecko") {
			err = 6; 
			eval("if (typeof " + processor + " == 'undefined') {" + processor + " = new XSLTProcessor(); " + 
				processor + ".importStylesheet(xmldoc" + this.ccid + ");}");
			return processor;
		} else handleError("ccLoaderProcessor unsupported browser: " + this.engine, 0);
	} catch(e) {
		handleError("ccLoaderProcessor at point " + err, e);
	}
}

function ccLoaderTransform(xml, xsl) {
	try {
		var err = 1; // for debugging purposes
		var doc = "xmldoc" + xml.ccid;
		//var stylesheet = "xmldoc" + xsl.ccid;
		var mine = "xmldoc" + this.ccid;
		err = 2; var processor = xsl.processor();
		if (this.engine == "MSXML3") {
			err = 3; eval(processor + ".input = " + doc);
			err = 4; eval(processor + ".transform()");
			var s;
			err = 5; eval("s = " + processor + ".output");
			if (s == "" || s == null) throw "ccLoaderTransform[IE]: s is empty";
			err = 6; eval("var temp = " + mine);
			err = 7; temp.loadXML(s);
			if (temp.xml == "" || temp.xml == null)	{ 
				err = 8; eval("htmldoc" + this.ccid + " = s"); 
			}
		} else if (this.engine == "Gecko") {
			err = 9; eval(mine + " = " + processor + ".transformToDocument(" + doc + ")");
		} else handleError("ccLoaderTransform unsupported browser: " + this.engine, 0);
	} catch(e) {
		handleError("ccLoaderTransform at point " + err, e);
	}
}

function ccLoaderSetParameter(name, val) {
	try {
		var err = 1; // for debugging purposes
		var processor = this.processor();
		if (this.engine == "MSXML3") {
			err = 2; eval(processor + ".addParameter('" + name + "', '" + val + "')");
		} else if (this.engine == "Gecko") {
			err = 3; eval(processor + ".setParameter('', '" + name + "', '" + val + "')");
		} else handleError("ccLoaderSetParameter unsupported browser: " + this.engine, 0);
	} catch(e) {
		handleError("ccLoaderSetParameter('" + name + "','" + val + "') at point " + err, e);
	}
}

function ccLoaderSerialize() {
	try {
		var err = 1; // for debugging purposes
		var doc = "xmldoc" + this.ccid;
		if (this.engine == "MSXML3") {
			err = 2; eval ("var s = " + doc + ".xml");
			if (s == "" || s == null) {
				try {
					eval("s = htmldoc" + this.ccid);
					return s;
				} catch (e) {
					return "";
				}
			}
			else return s;
		} else if (this.engine == "Safari") {
			err = 3; eval ("var s = " + doc + ".responseText");
			return s;
		} else if (this.engine == "Gecko") {
			var d;
			err = 4; eval ("d = " + doc);
			err = 5; var ser = new XMLSerializer();
			err = 6; return ser.serializeToString(d.documentElement);
		} else {
			handleError("ccLoaderSerialize unsupported browser: " + this.engine, 0);
		}
	} catch(e) {
		handleError("ccLoaderSerialize at point " + err, e);
	}
}

function handleError(err, description) {
	if (window.console) {
		if (err) window.console.log(err);
		if (description) window.console.log(description);
	}
}

function ccLoader(xml, callback) {
	try {
		var err = 1; // for debugging purposes
		this.ready = false;
		this.callback = callback? callback : refreshDisplay;
		if (isNaN(this.cccount)) {
			err = 2; 
			ccLoader.prototype.cccount = 0;
			ccLoader.prototype.transform = ccLoaderTransform;
			ccLoader.prototype.serialize = ccLoaderSerialize;
			ccLoader.prototype.processor = ccLoaderProcessor;
			ccLoader.prototype.setParameter = ccLoaderSetParameter;
		}
		err = 3; this.ccid = this.cccount + 1;
		ccLoader.prototype.cccount = this.ccid;
		this.engine = "unknown";
		err = 4; eval("ccLoader" + this.ccid + " = this");
		var cb = "(function(){ccLoaderCallback(" + this.ccid + ");})";
		err = 5; 
		try {	// is it Microsoft IE?
			var doc = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
			this.engine = "MSXML3";
		} catch(e) {
			try { // is it Apple Safari?
				var doc3 = new XMLHttpRequest();
				this.engine = "Safari";
			} catch(e) {
				try { // is it Gecko?
					var doc2 = document.implementation.createDocument("", "xml" + this.ccid, null);
					this.engine = "Gecko";
				} catch(e) { // unsupported browser
					handleError("ccLoader('" + xml + "') unsupported browser", e);
				}
			}
		}
		
		if (this.engine == "MSXML3") {
			err = 6; eval("xmldoc" + this.ccid + " = doc");
			if (xml == null || xml == "") {
				err = 7; doc.async = false;
				this.ready = true;
			} else {
				err = 8; eval("doc.onreadystatechange = " + cb);
				err = 9; doc.load(xml);
			}
		} else if (this.engine == "Safari") {
			err = 10; eval("xmldoc" + this.ccid + " = doc3");
			if (xml == null || xml == "") {
				this.ready = true;
			} else {
				err = 11; eval("doc3.onreadystatechange = " + cb);
				err = 12; doc3.open("GET", xml, true); doc3.send(null);
			}
		} else {
			err = 13; eval("xmldoc" + this.ccid + " = doc2");
			if (xml == null || xml == "") {
				this.ready = true;
			} else {
				err = 14; eval("doc2.addEventListener('load', " + cb + ", false)");
				err = 15; doc2.load(xml);
			}
		}
	} catch(e) {
		handleError("ccLoader('" + xml + "') at point " + err, e);
	}
}

function setCookiei(sName, sValue) {
    try {
        document.cookie = sName + "=" + escape(sValue) + "; path=/; expires=Thu, 31 Dec 2099 23:59:59 GMT;";
    } catch(e) {}
}

function getCookiei(sName) {
    try {
        var sCookie = document.cookie;
        var aCookie = sCookie.split("; ");
        for (var i=0; i != aCookie.length; ++i) {
            var aCrumb = aCookie[i].split("=");
            if (aCrumb[0] == sName) return ((aCrumb.length == 1)? "" : unescape(aCrumb[1]));
        }
    } catch(e) {}
}

function setCookie(sName, sValue) {
    try {
        var sCake = getCookiei("cccake");
        var aCake = ((sCake == null)? new Array() : sCake.split("; "));
        for (i=0; i!=aCake.length; ++i)
            if (aCake[i].split("=")[0] == sName) break;
        aCake[i] = sName + "=" + escape(sValue);
        setCookiei("cccake", aCake.join("; "));
    } catch(e) {}
}

function getCookie(sName) {
    migrateCookies();
    try {
        var sCake = getCookiei("cccake");
        var aCake = ((sCake == null)? new Array() : sCake.split("; "));
        for (i=0; i!=aCake.length; ++i) {
            var aCrumb = aCake[i].split("=");
            if (aCrumb[0] == sName) return ((aCrumb.length == 1)? "" : unescape(aCrumb[1]));
        }
    } catch(e) {}
}

function deleteCookie(sName) {
    try {
        document.cookie = sName + "=x; path=/; expires=Fri, 31 Dec 1999 23:59:59 GMT;";
    } catch(e) {}
}

function migrateCookies() {
    if (getCookiei("cccake") != null) return;
    try {
        var todo = new Array("searchProfiling", "search_tip_ids", "search_tab", "searchSettings",
                             "search_details", "search_amount", "search_info", "search_tips",
                             "searchSimpleHelp", "searchAdvancedHelp", "order", "collate",
                             "newOnly", "hideImages", "filter",
                             "filterStr", "expandSettings", "expandLegend", "expandHelp",
                             "typeIDs", "typeStates", "looping");
        for (var i = 0; i != todo.length; ++i) {
            var sCrumb = getCookiei(todo[i]);
            if (sCrumb != null) {
                deleteCookie(todo[i]);
                setCookie(todo[i], sCrumb);
            }
        }
    } catch(e) {}
}

