var util = {};

/*---------------
	Array
---------------*/
util.copyArray = function(arr){
	var a = [];
	for(var i=0; i < arr.length; i++) a[i] = arr[i];
	return a;
};

/*---------------------
	Browser SPECIFIC
---------------------*/
// browser check
util.isOpera = function(){
	return navigator.userAgent.indexOf("Opera") != -1;
};
util.isIE = function(){
	return navigator.userAgent.indexOf("MSIE") != -1;
};
util.isIE6 = function(){
	return navigator.appVersion.match(/MSIE 6/i);
};
util.isIE7 = function(){
	return navigator.userAgent.match(/MSIE 7/i);
};
util.isMoz = function(){
	return navigator.userAgent.match(/gecko/i);
};
// find elements
util.element = function(layer){
	return typeof(layer) == "string" ? document.getElementById(layer) : layer;
};
util.getElementsByClassName = function(layer, classes, strTagName, match, conversely){
	layer = this.element(layer)
	var result = [];
	if(layer){
		if(strTagName == null) strTagName = "*";
		var arrElements = (strTagName == "*" && layer.all)? layer.all : layer.getElementsByTagName(strTagName);
		var elmnt;
		for(var i=0; i < arrElements.length; i++){
			elmnt = arrElements[i];
			// no classes
			if(classes == null){
				// element have no classes
				if(!elmnt.className.length){
					// straight logic
					if(!conversely) result.push(elmnt);
				} else if(conversely){ // opposite logic
					result.push(elmnt);
				}
			} else if((elmnt.className && elmnt.className.length) || conversely){
				var elmntClasses = elmnt.className.split(" ");
				if(typeof(classes) == "string"){
					if(classes == "*"){
						if(elmnt.className.length){
							if(!conversely) result.push(elmnt);
						} else if(conversely){
							result.push(elmnt);
						}
					} else {
						if(match){
							var matched = 0;
							var tmpClasses = classes.split(" ");
							for(var cls in elmntClasses){
								if(util.in_array(tmpClasses, elmntClasses[cls])){
									matched++;
								}
							}
							if(matched == tmpClasses.length){
								if(!conversely) result.push(elmnt);
							} else if(conversely){
								result.push(elmnt);
							}
						} else if(elmnt.className == classes){
							if(!conversely) result.push(elmnt);
						} else if(conversely){
							result.push(elmnt);
						}
					}
				} else if(typeof(classes) == "object" && classes.length){
					var doAdd = false;
					for(var j=0; j < classes.length; j++){
						if(!util.in_array(result, elmnt)){
							if(match){	
								var matched = 0;
								var tmpClasses = classes[j].split(" ");
								for(var cls in elmntClasses){
									if(util.in_array(tmpClasses, elmntClasses[cls])){
										matched++;
									}
								}
								if(matched == tmpClasses.length){
									if(!conversely){
										doAdd = true;
									} else {
										doAdd = false;
										break;
									}
								} else if(conversely){
									doAdd = true;
									//break;
								}
							} else if(classes[j] == elmnt.className){
								if(!conversely){
									doAdd = true;
								} else {
									doAdd = false;
									break;
								}
							} else if(conversely){
								doAdd = true;
								//break;
							}
						}
					}
					if(doAdd) result.push(elmnt);
				}
			}
		}
	}
	return result;
};
// element position
util.getElementX = function(obj){
	var pos = 0;
	if(obj.offsetParent){
		while(obj.offsetParent){
			pos += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} else if(obj.x){
		pos = obj.x;
	}
	return pos;
};
util.getElementY = function(obj){
	var pos = 0;
	if(obj.offsetParent){
		while(obj.offsetParent){
			pos += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else if(obj.y){
		 pos = obj.y;
	}
	return pos;
};
util.getElementWidth = function(obj){
	return this.element(obj).offsetWidth;
};
util.getElementHeight = function(obj){
	return this.element(obj).offsetHeight;
};
// page offset
util.getPageXScroll = function(){
	return (window.pageXOffset ? window.pageXOffset : (document.documentElement && document.documentElement.scrollLeft != null) ? document.documentElement.scrollLeft : document.body.scrollLeft)||0;
};
util.getPageYScroll = function(){
	return (window.pageYOffset ? window.pageYOffset : (document.documentElement && document.documentElement.scrollTop != null) ? document.documentElement.scrollTop : document.body.scrollTop)||0;
};
// inner dimentions
util.getInnerWidth = function(){
	return (window.innerWidth ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth != null) ? document.documentElement.clientWidth||document.body.clientWidth : document.body.clientWidth)||0;
};
util.getInnerHeight = function(){
	return (window.innerHeight ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight != null) ? document.documentElement.clientHeight||document.body.clientHeight : document.body.clientHeight)||0;
};

/*---------------
	Number
---------------*/
util.getNumberBtw = function(num, min, max){
	return Math.min(Math.max(num, min), max);
};
util.getNumberFromString = function(val){
	var firstDot = true;
	var val = String(val);
	var c;
	var str="";
	var len = val.length;
	for(var i=0; i<len; i++){
		c = val.slice(i,i+1)
		if(isNaN(c)){
			if(c == "." && firstDot){
				firstDot = false;
				str+=c;
			}
		} else {
			str+=c;
		}
	}
	if(!str.length || str == ".") str = 0;
	return isNaN(str) ? 0 : Number(str);
};

/*---------------
	Stnrig
---------------*/
util.zeroPad = function(str,num){
	var result = String(str);
	var len = result.length;
	for(var i=0; i < num-len; i++) result = '0'+result;
	return result;
};

/*---------------
	Cookies
---------------*/
util.getCookie = function(name){
	var start = document.cookie.indexOf(name+"=");
	var len = start+name.length+1;
	if(!start && name != document.cookie.substring(0, name.length)) return null;
	if(start == -1) return null;
	var end = document.cookie.indexOf(';', len);
	if(end == -1) end = document.cookie.length;
	return unescape(document.cookie.substring(len, end));
};
util.setCookie = function(name, value, expires, path, domain, secure){
	var today = new Date();
	today.setTime(today.getTime());
	expires = (expires||356)*1000*60*60*24;
	var expires_date = new Date(today.getTime()+expires);
	document.cookie = name+'='+escape(value)+(expires ? ';expires='+expires_date.toGMTString() : '')+(path ? ';path=' + path : '')+(domain ? ';domain=' + domain : '')+(secure ? ';secure' : '');
};
util.deleteCookie = function(name, path, domain){
	if(getCookie(name)) document.cookie = name+'='+(path ? ';path=' + path : '')+(domain ? ';domain=' + domain : '')+';expires=Thu, 01-Jan-1970 00:00:01 GMT';
};

/*---------------
	Style
---------------*/
// changings
util.setStyles = function(id, styles){
	var obj = this.element(id);
	if(obj){
		for(var i=0; i < styles.length; i++){
			obj.style[styles[i][0]] = styles[i][1];
		}
	}
};
util.setStyle = function(id, style, value){
	var obj = this.element(id);
	if(obj && obj.style) obj.style[style] = value;
};
util.getStyle = function(id, style){
	var obj = this.element(id).style;
	var styles = style.split(".");
	var s;
	while(styles.length){
		s = styles.shift();
		if(obj[s] != null){
			obj = obj[s];
		}
	}
	return obj;// && obj.style ? obj.style[style] : null;
};

/*---------------
	Others
---------------*/
// remove a flickering
util.fixBgImageCache = function(){
	try {
	  document.execCommand("BackgroundImageCache", false, true);
	} catch(err) {}
};