// ==UserScript==
// @name        Make Compatible with GreaseMonkey
// @description for Opera
// @namespace   http://lowreal.net/
// @include     http://*
// @exclude     http://del.icio.us/post*
// ==/UserScript==
// GM Template (by cho45):



Array.prototype.forEach = function (func, self) {
	for (var i = 0, len = this.length; i < len; i++) {
		func.apply(self || this, [this[i]]);
	}
}

function GM_xmlhttpRequest(options) {
	var req = new opera.XMLHttpRequest();
	try {
		req.onreadystatechange = function () {
			if (req.readyState == 4) {
				if (req.status == 200) {
					if (options.onload) options.onload(req);
				}
			}
		}
		req.open(options.method || "GET", options.url, true);
		if (options.headers) {
			for (key in options.headers) {
				req.setRequestHeader(key, options.headers[key]);
			}
		}
		req.send(null);
	} catch (e) {
		if (options.onerror) options.onerror(req, e);
	}
}

/* template functions  */
function $N (name, attr, childs) {
	var ret = document.createElement(name);
	for (k in attr) {
		if (!attr.hasOwnProperty(k)) continue;
		v = attr[k];
		if (k == "class") {
			ret.className = v;
		} else {
			ret.setAttribute(k, v);
		}
	}
	switch (typeof childs) {
		case "string": {
			ret.appendChild(document.createTextNode(childs));
			break;
		}
		case "object": {
			for (var i = 0, len = childs.length; i < len; i++) {
				var child = childs[i];
				if (typeof child == "string") {
					ret.appendChild(document.createTextNode(child));
				} else {
					ret.appendChild(child);
				}
			}
			break;
		}
	}
	return ret;
}

function $X (exp, context) {
	if (!context) context = document;
	var resolver = function (prefix) {
		var o = document.createNSResolver(context)(prefix);
		return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
	}
	var exp = document.createExpression(exp, resolver);

	var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
	switch (result.resultType) {
		case XPathResult.STRING_TYPE : return result.stringValue;
		case XPathResult.NUMBER_TYPE : return result.numberValue;
		case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
		case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
			result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
			var ret = [];
			for (var i = 0, len = result.snapshotLength; i < len ; i++) {
				ret.push(result.snapshotItem(i));
			}
			return ret;
		}
	}
	return null;
}

