// (c) 2006-2007 Gladkoborodov Igor


function getId(obj) {
	if (!obj.getAttribute('id')) obj.setAttribute('id', 'rand' + Math.random(10000));
	return obj.getAttribute('id');
}

function setOpacity(obj, opacity) {
	obj.style.opacity = opacity;
	obj.style.MozOpacity = opacity;
	obj.style.filter = 'alpha(opacity='+(opacity*100)+')';
}

function preload(src) {
	var tmpImage = new Image();
	tmpImage.src = src;
}

// http://ejohn.org/projects/flexible-javascript-events/
function addEvent(obj, type, fn) {
	if (obj) {
		if (obj.attachEvent) {
			obj['e'+type+fn] = fn;
			obj[type+fn] = function(){obj['e'+type+fn](window.event);}
			obj.attachEvent('on'+type, obj[type+fn]);
		}
		else obj.addEventListener(type, fn, false);
	}
}

// http://ejohn.org/projects/flexible-javascript-events/
function removeEvent(obj, type, fn) {
	if (obj.detachEvent) {
		obj.detachEvent('on'+type, obj[type+fn]);
		obj[type+fn] = null;
	}
	else obj.removeEventListener(type, fn, false);
}

// http://www.quirksmode.org/js/events_properties.html
function getTarget(e, nodeName) {
	if (e.target)           target = e.target;
	else if (e.srcElement)  target = e.srcElement;
	if (target.nodeType == 3) target = targ.parentNode;
	if (nodeName) {
		while (target && target.nodeName.toLowerCase() != nodeName.toLowerCase())
			target = target.parentNode;
	}
	return target;
}

// http://www.artlebedev.ru/tools/technogrette/js/arrow-navigation/
function getKeyCode(e) {
	return (e.keyCode ? e.keyCode : e.which ? e.which : null);
}


// stops event progagation, cancels bubble, returns false. The event is completely handled.
function stopEvent(e) {
	stopBubbling(e);
	(e.preventDefault) ? e.preventDefault() : (e.returnValue = false);
}

function stopBubbling(e) {
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}


function random(num) {
	return (Math.floor(Math.random()*10000 % num));
}

function max(a,b) {
	return a > b ? a : b;
}

function min(a,b) {
	return a > b ? b : a;
}

scalableLayout = {
	'milestones' : [],

	'start' : function(){
		addEvent(window, 'resize', function(){scalableLayout.resize();})
		this.body = document.getElementsByTagName('body')[0];
		this.resize();
	},
	'addMilestone' : function(width, klass) {
		this.milestones[width] = klass;
	},
	'resize' : function() {
		var windowWidth = getWindowWidth();
		for (i in this.milestones) {
			if (windowWidth <= i) {
				addClass(this.body, this.milestones[i]);
			}
			else
				removeClass(this.body, this.milestones[i]);
		}
	}
}

// http://www.quirksmode.org/viewport/compatibility.html
function getWindowDimensions() {
	var x, y;
	if (self.innerHeight) {
		x = self.innerWidth;
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight) {
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}
	else if (document.body) {
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	return {'width' : x, 'height' : y};
}

function getWindowHeight() {
	return getWindowDimensions().height;
}

function getWindowWidth() {
	return getWindowDimensions().width;
}


function addClass(obj, sClassName) {
	if (obj.className) {
		var aClass = obj.className.split(' ');
		for (var i in aClass) {
			if (sClassName == aClass[i]) sClassName = '';
		}
		if (sClassName) aClass.push(sClassName);
		obj.className = aClass.join(' ');
	}
	else {
		obj.className = sClassName;
	}
}

function removeClass(obj, sClassName) {
	if (obj.className) {
		var aClass = obj.className.split(' ');
		for (var i in aClass) {
			if (sClassName == aClass[i]) {
				aClass.splice(i,1);
				break;
			}
		}
		obj.className = aClass.join(' ');
	}
}


function getElementsByClass(obj, className) {
	var result = [];
	var search = obj.getElementsByTagName('*');
	for (var i=0; i < search.length; i++) {
		if (isClass(search[i], className)) {
			result.push(search[i]);
		}
	}
	return (result.length > 0) ? result : false;
}

function isClass(obj, sClassName) {
	if (obj.className) {
		var aClasses = obj.className.split(' ');
		for (var i=0; i<aClasses.length; i++) {
			if (aClasses[i] == sClassName) {
				return true;
			}
		}
	}
	return false;
}


geometry = function(object) {
	return {
		'width' : function() {
			return object.offsetWidth;
		},
		'height' : function() {
			return object.offsetHeight;
		},
		'top' : function() {
			var obj = object;
			var top = obj.offsetTop;
			while (obj = obj.offsetParent) top += obj.offsetTop;
			return top;
		},
		'left' : function() {
			var obj = object;
			var left = obj.offsetLeft;
			while (obj = obj.offsetParent) left += obj.offsetLeft;
			return left;
		},
		'bottom' : function() {
			return this.top() + this.height()
		},
		'right' : function() {
			return this.left() + this.width()
		}
	}
};

initGeometry = function(object) {
	for (i in geometry(object)) object[i] = geometry(object)[i];
	return object;
};


function getScrollTop() {
	if (typeof(window.pageYOffset) == 'number')
		return window.pageYOffset;
	else if (document.body && document.body.scrollTop)
		return document.body.scrollTop;
	else if (document.documentElement && document.documentElement.scrollTop)
		return document.documentElement.scrollTop;
}


function getScrollLeft() {
	if (typeof(window.pageYOffset) == 'number')
		return window.pageXOffset;
	else if (document.body && document.body.scrollLeft)
		return document.body.scrollLeft;
	else if (document.documentElement && document.documentElement.scrollLeft)
		return document.documentElement.scrollLeft;
}

