function DOM(d) {
	if (!d.getSelection) {
		if (d.selection) {
			d.getSelection = function() {
				var r = this.selection.createRange();
				var nr = this.body.createTextRange();
				var oo = new Object();
				var rtext = r.text;

				nr.moveToElementText(r.parentElement());
				var nrtext = nr.text;
				var trim = (nrtext.length - rtext.length)+1;
				nr.moveEnd('character', -trim);

				var opos = 0;
				var tr = r.getBoundingClientRect();
				for (;;) {
					var tn = nr.getBoundingClientRect();

					if (nr.text == rtext
					&& tn.top == tr.top
					&& tn.bottom == tr.bottom
					&& tn.left == tr.left
					&& tn.right == tr.right) {
						break;
					}

					if (nr.text.length != rtext.length) {
						// should not happen
						break;
					}
						
					nr.moveStart('character', 1);
					nr.moveEnd('character', 1);
					opos++;
				}

				var off = opos;
				var n = r.parentElement();
				while (off > 0 || n.nodeType != 3) {
					if (n.nodeType == 3) {
						if (n.data.length > off) {
							/* found it! */
							break;
						}
						off -= n.data.length;
						n = n.nextSibling;
					} else if (n.childNodes.length > 0) {
						n = n.firstChild;
					} else if (n.nextSibling) {
						n = n.nextSibling;
					} else {
						while (n.parentNode && !n.nextSibling) {
							n = n.parentNode;
						}
						if (!n.nextSibling) {
							break;
						}
						n = n.nextSibling;
					}
				}

				oo.anchorNode = n;
				oo.anchorOffset = off;

				oo._stringvalue = rtext;

				oo.commonAncestorContainer = r.parentElement();
				oo.collapsed = (rtext.length > 0 ? false : true);

				oo.focusNode = oo.anchorNode;
				oo.focusOffset = oo.anchorOffset;

				oo.endContainer = r.commonAncestorContainer;
				oo.endOffset = opos + rtext.length;

				oo.startContainer = r.commonAncestorContainer;
				oo.startOffset = opos;

				oo.toString = function() { return this._stringvalue; };

				return oo;
			};
		} else if (d.window.getSelection) {
			d.getSelection = function() {
				return this.window.getSelection();
			};
		}
	}

	if (!d.getComputedStyle) {
		if (d.defaultView && d.defaultView.getComputedStyle) {
			d.getComputedStyle = function(e,f) {
				return d.defaultView.getComputedStyle(e,f);
			};
		} else if (d.window && d.window.getComputedStyle) {
			d.getComputedStyle = function(e,f) {
				return d.window.getComputedStyle(e,f);
			};
		} else if (d.body && d.body.runtimeStyle) {
			d.getComputedStyle = function(e, f) {
				return e.runtimeStyle;
			};
		}
	}
	if (!d.__operahack) {
		if (window.opera && document.getElementById) {
			var dx = d.createElement('DIV');
			dx.id = 'OpErABlUrHaCk';
			if (dx.style) {
				dx.style.position = 'absolute';
				dx.style.display = 'none';
			}
			dx.innerHTML = '<input tabindex="-1" type="text" />';
			d.body.insertBefore(dx, d.body.firstChild);
	
			d.__operahack = function() {
				if (dx.style) {
					dx.style.left = dx.style.left - 1;
					dx.style.left = dx.style.left + 1;
					dx.style.pixelLeft = dx.style.pixelLeft - 1;
					dx.style.pixelLeft = dx.style.pixelLeft + 1;
				}
				dx.firstChild.focus();
			};
		} else {
			d.__operahack = function() {};
		}


	}

	if (!d.getElementById) {
		if (d.all) {
			d.getElementById = function(ss) {
				var a = d.all[ss];
				if (a && a.id && a.id == ss) return a;
				if (a.length) {
					var i;
					for (i = 0; i < a.length; i++) {
						var j = a[i];
						if (j && j.id && j.id == ss)
							return j;
					}
				}
				return undefined;
			};
		} else {
			d.getElementById = function(i) {
				return undefined;
			};
		}
	}

	if (!d.getElementsByClass) {
		if (d.documentElement && d.documentElement.nextSibling) {
			d.getElementsByClass = function(needle) {
				function _GetElementsByClass(outArray, seed, needle)
				{
					while (seed) {
						if (seed.nodeType == Node.ELEMENT_NODE) {
							if (seed.hasAttribute("class")) {
								var c = " " + seed.className + " ";
								if (c.indexOf(" " + needle + " ") != -1)
									outArray.push(seed);
							}
							_GetElementsByClass(outArray, seed.firstChild, needle)
						}
						seed = seed.nextSibling;
					}
				}

				var outArray = new Array();
				_GetElementsByClass(outArray, d.documentElement, needle);
				return outArray;
			};

		} else if (d.createTreeWalker) {
			d.getElementsByClass = function(needle) {
				var acceptNode = function(node) {
					if (node.hasAttribute("class")) {
						var c = " " + node.className + " ";
						if (c.indexOf(" " + needle + " ") != -1)
							return NodeFilter.FILTER_ACCEPT;
					}
					return NodeFilter.FILTER_SKIP;
				};

				var treeWalker = d.createTreeWalker(d.documentElement,
						NodeFilter.SHOW_ELEMENT,
						acceptNode,
						true);
				var outArray = new Array();
				if (treeWalker) {
					var node = treeWalker.nextNode();
					while (node) {
						outArray.push(node);
						node = treeWalker.nextNode();
					}
				}
				return outArray;
			};
		} else {
			d.getElementsByClass = function(needle) {
				var my_array = d.getElementsByTagName("*");
				var retvalue = new Array();
				var i, j;
				for (i = 0, j = 0; i < my_array.length; i++) {
					var c = " " + my_array[i].className + " ";
					if (c.indexOf(" " + needle + " ") != -1)
						retvalue[j++] = my_array[i];
				}
				return retvalue;
			};
		}
	}
}
function XHTTP() {
	var xmlhttp=false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
   xmlhttp = false;
  }
 }
@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}
