var getBrowser = function() {
	var userAgent = navigator.userAgent.toLowerCase();
	if (/webkit/.test( userAgent )) {
		return "safari";
	}
	if (/opera/.test( userAgent )) {
		return "opera";
	}
	if (/msie/.test( userAgent ) && !/opera/.test( userAgent )) {
		return "msie";
	}
	if (/mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )) {
		return "mozilla";
	}
};

var getBrowserVersion = function() {
	var userAgent = navigator.userAgent.toLowerCase();
	return (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1];
};

var hasClass = function(element, className) {
	var array = (element.className || element).toString().split(/\s+/);
	
	var j=-1;
	for (var i=0;i<array.length;i++) {
		if (array[i] === className) {
			j=i;
		}
	}
	return (j > -1);
}

var removeClass = function(element, className) {
	var arr = (element.className || element).toString().split(/\s+/);
	
	var newArr = new Array();
	var j = 0;
	for (var i=0;i<arr.length;i++) {
		if (arr[i] != className) {
			newArr[j] = arr[i];
			j++;
		}
	}
	element.className = newArr.join(" ");
}

var addClass = function(element, className) {
	if (!hasClass(element,className)) {
		element.className += (element.className ? " " : "") + className;
	}
}

var searchChilds = function(element, childClassName, level, maxLevel) {
	maxLevel = maxLevel || 0;
	level = level || 0;
	
	var childs = new Array();
	for(var i=0;i<element.childNodes.length;i++) {
		if (hasClass(element.childNodes[i],childClassName)) {
			childs.push(element.childNodes[i]);
		}
		if (element.childNodes[i].childNodes.length > 0 && (maxLevel == 0 || level < maxLevel)) {
			childs = childs.concat(searchChilds(element.childNodes[i],childClassName,level+1,maxLevel));
		}
	}
	return childs;
}

var searchChildsByTagName = function(element, childTagName, level, maxLevel) {
	maxLevel = maxLevel || 0;
	level = level || 0;
	
	var childs = new Array();
	for(var i=0;i<element.childNodes.length;i++) {
		if (element.childNodes[i].tagName == childTagName) {
			childs.push(element.childNodes[i]);
		}
		if (element.childNodes[i].childNodes.length > 0 && (maxLevel == 0 || level < maxLevel)) {
			childs = childs.concat(searchChildsByTagName(element.childNodes[i],childTagName,level+1,maxLevel));
		}
	}
	return childs;
}

function getStyleValue(elem, prop) {
	var ret, style = elem.style;
	
	if (prop == "opacity" && getBrowser() == "msie") {
		return style.filter && style.filter.indexOf("opacity=") >= 0 ?
			(parseFloat( style.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
			"";
	} else {
		return parseInt(style[prop],10) || 0;
	}
}

function setStyleValue(elem, prop, value) {	
	if (prop == "opacity" && getBrowser() == "msie") {
		elem.style.zoom=1;
		elem.style.filter = (elem.style.filter || "").replace( /alpha\([^)]*\)/, "" ) +
			(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
		
	} else {
		elem.style[prop]=value;
	}
}

function getWidth(elem, p, b, m) {
	w = elem.offsetWidth;
	
	p = p || true;
	b = b || true;
	m = m || false;
	
	padding = 0;
	border = 0;
	margin = 0;
	
	if (p)
		padding = getStyleValue(elem, "paddingLeft") + getStyleValue(elem, "paddingRight");
		
	if (b)
		border = getStyleValue(elem, "borderLeftWidth") + getStyleValue(elem, "borderRightWidth");
		
	if (m) 
		margin = getStyleValue(elem, "marginLeft") + getStyleValue(elem, "marginRight");
		
	return w + padding + border + margin;
}

function noww() {
	return +new Date;
}

var Animation = function(duration,step,complete,cancel) {
	var startTime = noww();
	var dur = duration;
	var self=this;
	
	var timerId = window.setInterval(function() {
		var n  = noww() - startTime;
		var state = n / dur;
		if (state > 1) {
			state = 1;
		}
		if (step != undefined && typeof(step) == "function") {
			
			var r = step.call(self,state,n,dur) || true;
			if (!r || state >= 1) {
				window.clearInterval(timerId);
				if (!r && cancel != undefined && typeof(cancel) == "function") {
					cancel.call(state);
				}
				if (r && complete != undefined && typeof(complete) == "function") {
					complete.call(state);
				}
			}
		}
	},13);
	
}

function initHotTopics(element) {	
	return new HotTopics(element);
}

var HotTopics = function(element) {
	var self = this;
	var element = element;
	var bAnim = false;
	
	var aPrev = (searchChilds(element, "prev"))[0];
	var aNext = (searchChilds(element, "next"))[0];
	
	var topics_list = (searchChilds(element, "topics_list"))[0];
	var topics_list_width = getWidth(topics_list,false,false,true);
	
	var gr_l = (searchChilds(topics_list, "gr_l"))[0];
	var gr_r = (searchChilds(topics_list, "gr_r"))[0];
	
	var ul = (searchChildsByTagName(topics_list, "UL"))[0];
	var li = searchChildsByTagName(ul, "LI");
	
	var items = new Array();
	var steps = new Array();
	var cur_step = complete_step = 0;
	var w = 0;
	
	steps[0]=0;
	for (var i=0,j=1,x=0,n=li.length ; i < n ; i++) {
		items[i] = {};
		items[i].w = getWidth(li[i],true,true,true);
		items[i].x = w;
		w += items[i].w;
		
		if (x + items[i].w > topics_list_width) {
			steps[j] = items[i].x;
			x=0;
			j++;
		} else {
			x += items[i].w;
		}
	}
	ul.style.width = w+"px";
	
	//last step
	j=steps.length-1;
	steps[j] = w - topics_list_width;
	
	var initGrState = function() {
		//var l = getStyleValue(ul, "left");
		if (cur_step > 0) {
			gr_l.style.display = "block";
			removeClass(aPrev,"nav_disable");
		} else {
			gr_l.style.display = "none";
			addClass(aPrev,"nav_disable");
		}
		if (cur_step < steps.length-1) {
			gr_r.style.display = "block";
			removeClass(aNext,"nav_disable");
		} else {
			gr_r.style.display = "none";
			addClass(aNext,"nav_disable");
		}
	};
	
	var from_left, to_left;
	var ease = "swing";
	var anim_step = function(state,n,d) {
		var diff = to_left - from_left;
		var x = to_left;
		
		if (state >= 1) {
			x = from_left + diff;
		} else {
			if (ease == "swing") {
				x = ((-Math.cos(state*Math.PI)/2) + 0.5) * diff + from_left;
			} else if (ease == "easeOutExpo") {
				if (n==d) {
					x = 1;
				} else {
					x = 1 * (-Math.pow(2, -10 * n/d) + 1);
					x = from_left + diff * x;
				}
			} else {
				x = from_left + diff * state;
			}
		}
		ul.style.left = x + "px";
	};
	
	var anim_complete = function(state) {
		cur_step = complete_step;
		bAnim = false;
		initGrState();
	};
	
	var aPrev_click = function() {
		if (cur_step > 0 && !bAnim) {
			bAnim = true;
			complete_step = cur_step-1;
			from_left = steps[cur_step] * -1;
			to_left = steps[complete_step] * -1;
			
			new Animation(600,anim_step,anim_complete);
		}
		return false;
	};
	
	var aNext_click = function() {
		if (cur_step < steps.length-1 && !bAnim) {
			bAnim = true;
			complete_step = cur_step+1;
			from_left = steps[cur_step] * -1;
			to_left = steps[complete_step] * -1;
			
			new Animation(600,anim_step,anim_complete);
		}
		return false;
	};
	
	
	aPrev.onclick = aPrev_click;
	aNext.onclick = aNext_click;
	
	initGrState();
};

var initArticleMenu = function(element) {
	if (element == undefined) return false;
	
	var m = new function() {
		var self = this;
		var bOver = false;
		var aTrigger = undefined;
		var subMenu = undefined;
		var ele = element;
		var hideTimeout = 0;
		
		var onMouseOver = function() {
			bOver = true;
			cancelHide();
			doShow();
		};
		
		var onMouseOut = function() {
			bOver = false;
			initHide();
		};
		
		var onSubMenuMouseOver = function() {
			bOver = true;
			cancelHide();
			doShow();
		};
		
		var onSubMenuMouseOut = function() {
			bOver = false;
			initHide();
		};
		
		var doShow = function() {
			ele.style.backgroundPosition = "0 0";
			if (subMenu) subMenu.style.display = "block";
		};
		
		var doHide = function() {
			cancelHide();
			if (!bOver) {
				ele.style.backgroundPosition = "0 -1000px";
				if (subMenu) subMenu.style.display = "none";
			}
		};
		var initHide = function() {
			cancelHide();
			hideTimeout = window.setTimeout(doHide,300);
		};
		var cancelHide = function() {
			if (hideTimeout > 0) window.clearTimeout(hideTimeout);
			hideTimeout = 0;
		};
		
		aTrigger = searchChildsByTagName(ele, "A", 0, 1);
		if (aTrigger.length > 0) {
			aTrigger = aTrigger[0];
			
			aTrigger.onmouseover = onMouseOver;
			aTrigger.onmouseout = onMouseOut;
		}
		
		subMenu = searchChilds(ele,"shareSubMenu");
		if (subMenu.length > 0) {
			subMenu = subMenu[0];
			subMenu.onmouseover = onSubMenuMouseOver;
			subMenu.onmouseout = onSubMenuMouseOut;
		} else {
			subMenu = undefined;
		}
	}
	
	return m;
}