﻿Type.registerNamespace("Explorica")

Explorica.makeRequest = function(url, verb, body, callback, context) {
	var req = new Sys.Net.WebRequest();
	req.set_url(url);
	req.set_httpVerb(verb);
	if (body !== null && body !== "") req.set_body(body);
	if (context != null) req.set_userContext(context);
	req.add_completed(callback);
	req.invoke();
	return req;
}

Explorica._getPostVars = function(args) {
	var html = "";
	if (args != null) {
		for (var a in args) {
			if (html != "") html += "&";
			html += a + "=" + escape(args[a]);
		}
	}
	return html;
}

Explorica.makeWebRequest = function(url, args, callback, context, decode) {
	var req = new Sys.Net.WebRequest(), cx = { "callback": callback, "context": context, "decode": decode };
	req.set_url(url);
	req.set_httpVerb("POST");
	req.set_body(Explorica._getPostVars(args));
	req.set_userContext(cx);
	req.add_completed(Explorica._finishRequest);
	req.invoke();
	return req;
}

Explorica.makeSyncWebRequest = function(url, args, decode) {
	var req = new XMLHttpRequest(), data;
	req.open("post", url, false);
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	req.send(Explorica._getPostVars(args));
	if (req.status == 200) data = (decode && req.responseText != "") ? Sys.Serialization.JavaScriptSerializer.deserialize(req.responseText) : req.responseText;
	else data = { "_error": req.status, "_data": ((decode && req.responseText != "") ? Sys.Serialization.JavaScriptSerializer.deserialize(req.responseText) : req.responseText) };
	return data;
}

Explorica._finishRequest = function(executor, args) {
	var req = executor.get_webRequest(), cx = req.get_userContext(), data;
	if (executor.get_responseAvailable()) {
		if (executor.get_statusCode() == 200) {
			data = (cx.decode) ? executor.get_object() : executor.get_responseData();
		} else {
			data = { "_error": executor.get_statusCode(), "_data": ((cx.decode) ? executor.get_object() : executor.get_responseData()) };
		}

		if (cx.callback) {
			cx.callback(data, cx.context);
		}
	}
}

Explorica.getParentNode = function(element, tagName) {
	var regex = new RegExp("^" + tagName + "$", "i");
	while (element != null && element.parentNode != null) {
		if (regex.test(element.parentNode.tagName)) return element.parentNode;
		element = element.parentNode;
	}
	return null;
}

Explorica.getChildNodes = function(element, tagName) {
	var regex = new RegExp("^" + tagName + "$", "i"), ar = [];
	if (element != null && typeof (element.childNodes) != "undefined") {
		for (var i = 0; i < element.childNodes.length; i++) {
			if (element.childNodes[i].nodeType != 3 && regex.test(element.childNodes[i].tagName)) {
				ar.push(element.childNodes[i]);
			}
		}
	}
	return ar;
}

Explorica.getEvent = function(event) { return (event) ? event : window.event; }

Explorica.getEventTarget = function(event) {
	var t = null;
	if (event == null) event = window.event;
	if (event.target) t = event.target;
	else if (event.srcElement) t = event.srcElement;
	if (t != null && t.nodeType == 3) t = t.parentNode; // a safari bug
	return t;
}

Explorica.isTag = function(el, tag) { return (el != null) ? new RegExp(tag, "i").test(el.tagName) : false; }
Explorica.isSelfOrChildOf = function(el, parent) {
	if (el && parent) {
		var tmp = el;
		while (tmp != null) {
			if (tmp == parent) return true;
			tmp = tmp.parentNode;
		}
	}
	return false;
}

Explorica._filterCoor = function(w, d, b) { var r = w ? w : 0; if (d && (!r || (r > d))) r = d; return b && (!r || (r > b)) ? b : r; }
Explorica._gsTop = function() { return Explorica._filterCoor(window.pageYOffset ? window.pageYOffset : 0, document.documentElement ? document.documentElement.scrollTop : 0, document.body ? document.body.scrollTop : 0 ); }
Explorica._gsLeft = function() { return Explorica._filterCoor(window.pageXOffset ? window.pageXOffset : 0, document.documentElement ? document.documentElement.scrollLeft : 0, document.body ? document.body.scrollLeft : 0 ); }
Explorica.getMousePosition = function(event) { return new Sys.UI.Point(event.clientX + Explorica._gsLeft(), event.clientY + Explorica._gsTop()); }

if (typeof (Sys) !== "undefined") Sys.Application.notifyScriptLoaded();