function logError(e) {
    if (window.firebug) {
        for (var i in e) {
            alert(i);
        }
        window.firebug.d.console.log(e);
    }
}

function logMessage(m) {
    if (window.firebug) {
        window.firebug.d.console.log(m);
    }
}

function handleErr(msg, url, l) {
    if (window.firebug) {
        window.firebug.d.console.log(url + ":" + l + " - " + msg);
    }
    return false;
}

onerror = handleErr;

function xaopInsertSpinner(content) {
    xaopFirefoxSafeInnerHTMLReplace(content, "<table style='width: 100%; height: 100%; '><tr><td><img src='/streamtails/f/spinner.gif'></img></td></tr></table>");
}

function xaopInsertUnavailable(content) {
    xaopFirefoxSafeInnerHTMLReplace(content, "<div style='margin: 5px 2px 2px 2px; padding: 0px 4px 3px 4px; background: white; color: red; left: 0px; right: 0px; text-align: center; font-style: italic;'>server unavailable</div>");
}

function xaopInstallEventListener(el, ev, f) {
	if (el.addEventListener) {
		el.addEventListener(ev, f, false);
	} else if (el.attachEvent) {
		el.attachEvent("on" + ev, f);
	}
}

function xaopReviewngParseURL(url) {
    var md = url.match(/^(?:([^:/?#]+):)?(?:\/\/([^/?#:]*)(?::(\d+))?)?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/);
    if (md) {
     return {
            protocol: md[1] ? md[1].toLowerCase() : null,
            host: md[2] ? md[2].toLowerCase() : null,
            port: md[3],
         path: md[4],
         query: md[5],
         fragment: md[6]
     };
    } else {
         alert("error parsing url");
         return null;
    }
}

function xaopGetElementsByTagAndClassName(el, tag, cl) {
    var elements = el.getElementsByTagName(tag);
    var result = [];
    var matcher = new RegExp("\\b" + cl + "\\b");
    for (var i = 0; i < elements.length; i++) {
	    var element = elements[i];
	    if (element.className && matcher.test(element.className)) {
	        result.push(element);
	    }
    }
    return result;
}

function xaopFindChild(el, tag, cl) {
    var elements = el.getElementsByTagName(tag);
    var matcher = new RegExp("\\b" + cl + "\\b");
    for (var i = 0; i < elements.length; i++) {
	    var element = elements[i];
	    if (element.className && matcher.test(element.className)) {
	        return element;
	    }
    }
}

function xaopFindChildren(el, tag, cl) {
    var res = [];
    var elements = el.getElementsByTagName(tag);
    var matcher = new RegExp("\\b" + cl + "\\b");
    for (var i = 0; i < elements.length; i++) {
	    var element = elements[i];
	    if (element.className && matcher.test(element.className)) {
	        res.push(element);
	    }
    }
    return res;
}

function xaopXmlHttpRequest() {
    try {
	    return new XMLHttpRequest();
    } catch (e) {
	    try {
	        return new ActiveXObject("Msxml2.XMLHTTP");
	    } catch (e) {
	        try {
		        return new ActiveXObject("Microsoft.XMLHTTP");
	        } catch (e) {
		        alert("Your browser does not support AJAX; you cannot use Reviewng");
		        return null;
	        }
	    }
    }
}

function xaopDoAjaxRequest(method, url, data, f) {
    var xmlHttp = xaopXmlHttpRequest();
    if (xmlHttp) {
	    xmlHttp.onreadystatechange = function () {
	        if (xmlHttp.readyState == 4) {
		        var status;
		        try {
		            status = xmlHttp.status || 0;
		        } catch (e) {
		            status = 0;
		        }
		        if (status != 0) {
		            var response = xmlHttp.responseText;
		            var notQuery = false;
		            if (status == 200 || status == 404) {
		                try {
    		                response = xaopDecodeQuery(response);
    		                if (window.xaopReceivedUser) {
    		                    xaopReceivedUser(parseInt(response["user"]));
		                    }
                            delete response["user"];
    		            } catch (e) {
    		                alert(e);
    		                notQuery = true;
    		            }
		            }
		            if (status == 200) {
		                if (notQuery) {
		                    f(3, { error: "invalid response from server; try again later" });
		                } else {
				            f(1, response);
			            }
		            } else if (status == 404) {
		                if (notQuery) {
		                    f(2, { error: response });
		                } else if (response.error) {
				            f(2, { error: response.error });
				        } else if (response.fatal) {
				            f(4, { error: response.fatal });
				        } else if (response.auth) {
				            f(5, { error: response.auth });
				        } else {
				            f(3, { error: "invalid response from server; try again later" });
				        }
			        } else if (status >= 400 && status < 500) {
					    f(2, { error: response });
		            } else if (status == 503) {
		                f(3, { error: "server unavailable; try again later" });
		            } else {
				        f(3, { error: response + "; try again later" });
		            }
		        } else {
		            f(3, { error: "server unavailable; try again later" });
		        }
	        }
	    }
	    xmlHttp.open(method, url, true);
	    xmlHttp.send(data);
    } else {
	    f(4, "Ajax unavailable");
    }
}

function xaopFirefoxSafeInnerHTMLReplace(el, html) {
    if (el.firstChild) {
	    for (var i = 0; i < el.childNodes.length; i++) {
	        el.childNodes[i].style.display = "none";
	    }
	    var div = document.createElement("div");
	    div.innerHTML = html;
	    var new_count = div.childNodes.length;
	    for (var i = 0; i < new_count; i++) {
	        var newEl = div.childNodes[0];
	        div.removeChild(newEl); // Probably redundant
	        el.insertBefore(newEl, el.childNodes[i]);
	    }
	    while (el.childNodes[new_count]) {
	        el.removeChild(el.childNodes[new_count]);
	    }
    } else {
	    el.innerHTML = html;
    }
}

function xaopDecodeQuery(query) {
    var parts = query.split("&");
    var result = {};
    for (var i = 0; i < parts.length; i++) {
	    var part = parts[i].split("=", 2);
	    if (part[0].length != 0) {
	        result[part[0]] = unescape(part[1]);
	    }
    }
    return result;
}

function xaopSetCookie(name, value) {
    document.cookie = name + "=" + value + ";path=/;expires=" + new Date(new Date().getTime() + 30 /*days*/ * 24 /*hours*/ * 60 /*minutes*/ * 60 /*seconds*/ * 1000 /*milliseconds*/).toGMTString();
}

function xaopGetCookie(name) {
    var data = document.cookie.match(new RegExp("\\b" + name + "\\s*=\\s*([^;,]+)"));
    if (data) {
        return data[1];
    } else {
        return null;
    }
}
