// (c) 2006 Gladkoborodov Igor


// Element.prototype fix for Safari
//if (!Element) var Element = document.createElement("element").constructor;

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


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

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


function addSuffixToFile(str, suffix) {
	if (fileNameHasSuffix(str, suffix)) return str;
	else return str.substr(0, str.lastIndexOf('.')) + suffix + str.substr(str.lastIndexOf('.'));
}

function fileNameHasSuffix(str, suffix) {
	return (str.substring(str.lastIndexOf('-'), str.lastIndexOf('.')) == suffix);
}

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


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


// http://ejohn.org/projects/flexible-javascript-events/
function addEvent(obj, type, fn) {
	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);
}


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



// 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 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;
}

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(' ');
	}
}


// http://www.quirksmode.org/js/events_properties.html
function getMousePosition(e) {
	result = {'x' : 0, 'y' : 0}

	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		result.x = e.pageX;
		result.y = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		result.x = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		result.y = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	return result;
}

// http://www.quirksmode.org/js/events_properties.html
function getTarget(e) {
	if (e.target)           return e.target;
	else if (e.srcElement)  return e.srcElement;
	if (targ.nodeType == 3) return targ.parentNode; // defeat Safari bug
}


// http://www.quirksmode.org/js/findpos.html
function posX(obj) {
	var posX = 0;
	if (obj.offsetParent) {
		posX = obj.offsetLeft;
		while (obj = obj.offsetParent) {
			posX += obj.offsetLeft;
		}
	}
	return posX;
}


// http://www.quirksmode.org/js/findpos.html
function posY(obj) {
	var posY = 0;
	if (obj.offsetParent) {
		posY = obj.offsetTop;
		while (obj = obj.offsetParent) {
			posY += obj.offsetTop;
		}
	}
	return posY;
}


function dimX(obj) {
	return obj.offsetWidth;
}

function dimY(obj) {
	return obj.offsetHeight;
}

function coordsTop(obj) {
	return posY(obj);
}

function coordsBottom(obj) {
	return posY(obj)+dimY(obj);
}

function coordsLeft(obj) {
	return posX(obj);
}

function coordsRight(obj) {
	return posX(obj)+dimX(obj);
}



function closeUp(num, closeTo) {
	if (num%closeTo) return (Math.floor(num/closeTo)+1)*closeTo;
	else return num;
}

function closeDown(num, closeTo) {
	if (num%closeTo) return Math.floor(num/closeTo)*closeTo;
	else return num;
}

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