function trace(/*...*/)/* void */ {
	if (!arguments[0]) return;
	
	var f = "console.log(";
	var i = 0;
	while (arguments[i]) {
		if (i > 0) f += ", ";
		f += "arguments[" + String(i) + "]";
		i++;
	}
	f += ");";

	eval(f);
}

function getXMLHttpRequest()/* XMLHttpRequest */ {
	var xmlHttp;
	try {
		xmlHttp = new XMLHttpRequest();
	} catch (e) {
		try {
			xmlHttp = new ActiveXObject("Microsoft.XMLHttp");
		} catch (e) {
			
		}
	}
	if (!xmlHttp) {
		alert("XMLHttp error 487");
	} else {
		return xmlHttp;
	}
}

function numbersDifference(/* Number */ num0, /* Number */ num1)/* Number */ {
	var a = num0;
	var b = num1;
	
	if (a == b) return 0;
	else if (a > b) return a - b;
	else return b - a;
}

function clearDiv(/* Node */ div, /* Array */ except)/* void */ {
	var nodes = div.childNodes;
	var leng = nodes.length;
	var n = 0;
	if (!leng) return;
	for (var i=0; i<leng; i++) {
		if (except && except.length > 0) {
			for (var k=0; k<except.length; k++) {
				if (nodes[n] == except[k]) n++;
			}
		}
		if (nodes[n]) div.removeChild(nodes[n]);
	}
}

function getJSON(/* String */ path, /* String */ objName, /* Function */ func)/* void */ {
	var req = getXMLHttpRequest();
	req.open("GET", path, true);
	req.send(null);
	req.onreadystatechange = function () {
		if (req.readyState == 4) {
			if (req.status == 200) {
				eval("var abc = " + String(req.responseText) + ";");
				window[objName] = abc;
				func(abc);
			} else {
				alert("problems...");
			}
			req = null;
		}
	};
}

function getBodyScrollTop()/* Number */ {
	return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}

function getOffset(/* Node */ elem)/* Object */ {
	var getOffsetSum = function(elem) {
		var top=0, left=0;
		
		while(elem) {
			top = top + parseInt(elem.offsetTop);
			left = left + parseInt(elem.offsetLeft);
			elem = elem.offsetParent;
		}

		return {top: top, left: left};
	};
	var getOffsetRect = function(elem) {
		var box = elem.getBoundingClientRect();

		var body = document.body;
		var docElem = document.documentElement;

		var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
		var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;

		var clientTop = docElem.clientTop || body.clientTop || 0;
		var clientLeft = docElem.clientLeft || body.clientLeft || 0;

		var top  = box.top +  scrollTop - clientTop;
		var left = box.left + scrollLeft - clientLeft;

		return { top: Math.round(top), left: Math.round(left) };
	}; 
	if (elem.getBoundingClientRect) {
        return getOffsetRect(elem);
    } else {
        return getOffsetSum(elem);
    }
}

function scrollToY(/* Number */ newY, /* Number */ time, /* Number */ rate, /* Function */ func)/* void */ {
	if (getBodyScrollTop() == newY) {
		if (func) func();
		return;
	}
	var idKeeper;
	var step = Math.round(numbersDifference(getBodyScrollTop(), newY) / (time / rate));
	var dir = getBodyScrollTop() > newY ? "up" : "down";
	var lastY = getBodyScrollTop();
	var ready = function() {
		var ready = dir == "up" ? getBodyScrollTop() + step < newY : getBodyScrollTop() + step > newY;
		return ready;
	};
	var mover = function() {
		if ((!ready() && lastY != getBodyScrollTop() + step) || resizer) {
			lastY = getBodyScrollTop() + step;
			parent.scroll(1, getBodyScrollTop() + step);
		} else {
			clearInterval(idKeeper);
			parent.scroll(1, newY);
			if (func) func();
		}
	};
	if (dir == "up") step = -step;
	idKeeper = setInterval(mover, rate);
}

function blockEvent(/* MouseEvent */ e)/* void */ {
    if (!e) {
        e = window.e;
    }
    if(e.stopPropagation) e.stopPropagation();
    else e.cancelBubble = true;
    if(e.preventDefault) e.preventDefault();
    else e.returnValue = false;
}

function radToDeg(/* Number */ rad)/* Number */ {
	return rad * 180 / Math.PI; 
}

function degToRad(/* Number */ deg)/* Number */ {
	return deg * Math.PI / 180;
}

function getClientWidth()/* Number */ {
    return document.documentElement.clientWidth == 0 ? document.body.clientWidth : document.documentElement.clientWidth;
}
 
function getClientHeight()/* Number */ {
    return document.documentElement.clientHeight == 0 ? document.body.clientHeight : document.documentElement.clientHeight;
}
