function image_transform(_rootId){
	var elms=Dom.$id(_rootId).getElementsByTagName('ul');
	var timer=null, curI=0, transformElmToHide=null, transformElmToShow=null;
	var isChanging=false;
	var elmToShow=elms[0];
	var htmls=[];
	if(Base.isIE() && (window.createPopup)){
		elmToShow.style.filter="revealTrans(duration=2,transition=18)";
	}
	for(var i=0; i<elms.length; i++){
		if(i!=0){
			kStyle.setAtt(elms[i], 'display', 'none');
		}
		htmls[i]=elms[i].innerHTML;
	}
	elmToShow.innerHTML=htmls[0];
	function chgTo(_ti){
		timeStart=new Date();
		if(Base.isIE() && (window.createPopup)){
			curI=_ti;
			elmToShow.filters[0].Transition=Math.floor(Math.random()*23);
			elmToShow.filters[0].apply();
			elmToShow.innerHTML=htmls[_ti];
			elmToShow.filters[0].play();
		}else{
			if(curI==_ti){
				return;
			}
			var ci=curI;
			curI=_ti;
			var temp1=parseFloat(kStyle.getAtt(elmToShow, 'opacity'));
			animateOpac(timer, elmToShow, temp1, 0, Math.round(500*temp1),
								function(){
									elmToShow.innerHTML=htmls[_ti];
									var temp1=parseFloat(kStyle.getAtt(elmToShow, 'opacity'));
									animateOpac(timer, elmToShow, temp1, 1, Math.round(300*(1-temp1)));
								});
		}
	}
	/*S func animateOpac*/
	function animateOpac(timer, _elm, v1, v2, duration, whenDone){
		clearInterval(timer);
		timer=null;
		var scrollStart=false;
		var startTime=null;
		timer=setInterval(animate, 1000/kAnimator.FPS);
		function animate(){
			if(scrollStart){
				var now=new Date();
				var percent=parseFloat((now-startTime)/duration);
				var sl=v1+(v2-v1)*percent;
				if(percent<0.99999){
					try{
						kStyle.setAtt(_elm, 'opacity', sl);
					}catch(er){}
				}else{
					clearInterval(timer);
					timer=null;
					kStyle.setAtt(_elm, 'opacity', v2);
					scrollStart=false;
					if(whenDone && (typeof whenDone=='function')){
						whenDone();
					}
				}
			}else{
				scrollStart=true;
				startTime=new Date();
			}
		}
		/*E func scroll*/
	}
	
	var timeStart=new Date();
	setInterval(function(){
						if(((new Date()).getTime()-timeStart.getTime())>6000){
							var ti=curI+1;
							if(ti==elms.length){
								ti=0;
							}
							chgTo(ti);
						}
					   }, 1000/(kAnimator.FPS||30));
	/*E func animateOpac*/
}

var Base={
	setCookie:function(sName, sValue){
		var date=new Date();
		date.setTime(date.getTime()+31536000000);
		document.cookie = sName + "=" + escape(sValue) + "; expires=" + date.toGMTString();
	},
    delCookie:function(sName){
        if(Base.getCookie(name)){
            document.cookie=sName+"="+((domain)?"; domain="+dm:"")+"; expires=Thu, 01-Jan-70 00:00:01 GMT";
        }
    },
	getCookie:function(sName){
		var aCookie = document.cookie.split("; ");
		for (var i=0; i < aCookie.length; i++)
		{
			var aCrumb = aCookie[i].split("=");
			if (sName == aCrumb[0]) 
				return unescape(aCrumb[1]);
		}
		return "";
	},
    trimL:function(txt){
		return txt.replace(/^\s*/,"");
	},
    trimR:function(txt){
		return txt.replace(/\s*$/,"");
	},
    trim:function(txt){
		return this.trimL(this.trimR(txt));
	},
	/*check explorer type
	*/
	isIE6:function(){
		return navigator.userAgent.indexOf('MSIE')>0&&navigator.userAgent.indexOf('6')>0;
	},
	isIE:function(){
		return navigator.userAgent.indexOf('MSIE')>0;
	},
	isOpera:function(){
		return navigator.userAgent.indexOf('Opera')>-1;
	},
	isMoz:function(){
		return navigator.userAgent.indexOf('Mozilla/5.')>-1;
	}
};

/*
dom
*/
var Dom={
/*
node
*/
//$ -> getBy
    $id:function(nodeId){
    	if(typeof nodeId=='string'){
    		return document.getElementById(nodeId);
    	}else if(typeof nodeId=='object'){
    		return nodeId;
    	}else{
			return false;
		}
    },
	$idInNode:function(nodeId, pNode){// have not finish
		if(!pNode){
			return Dom.$id(nodeId);
		}else{
			return false;
		}
    },
    $tagInNode:function(tagName, pNode){
		if(!pNode){
			pNode=document;
		}
		reNodes=pNode.getElementsByTagName(tagName);
		if(reNodes&&reNodes.length){
			return reNodes;
		}else{
			return false;
		}
    },
//reXxxx -> use to return value
    $tagInNodeChild:function(tagName, pNode){
		if(!pNode){
			pNode=document;
		}
		var nodes=pNode.childNodes;
		if(!(nodes&&nodes.length)){return false;}
		var reNodes=[];
		for(var i=0; i<nodes.length; i++){
			var node=nodes[i];
			if(node.nodeName.toLowerCase()==tagName){
				reNodes[reNodes.length]=node;
			}
		}
		if(reNodes.length){
			return reNodes;
		}else{
			return false;
		}
    },
    $withClassInNodeChild:function(className, pNode){
		if(!pNode){
			pNode=document;
		}
		var nodes=pNode.childNodes;
		if(!(nodes&&nodes.length)){return false;}
		var reNodes=[];
		for(var i=0; i<nodes.length; i++){
			var node=nodes[i];
			if(node.className.toLowerCase()==className){
				reNodes[reNodes.length]=node;
			}
		}
		if(reNodes.length){
			return reNodes;
		}else{
			return false;
		}
    },
    /*$hasClassInNodeChild:function(className, pNode){},*/
    $tagWithClassInNode:function(tagName, className, pNode){
		var nodes=Dom.$tagInNode(tagName, pNode);
		var reNodes=[];
		for(var i=0; i<nodes.length; i++){
			var node=nodes[i];
			if(Dom.isClass(className, node)){
				reNodes[reNodes.length]=node;
			}
		}
		return reNodes;
	},
    $tagHasClassInNode:function(tagName, className, pNode){
		var nodes=Dom.$tagInNode(tagName, pNode);
		if(!nodes){return false;}
		var reNodes=[];
		for(var i=0; i<nodes.length; i++){
			var node=nodes[i];
			if(Dom.hasClass(className, node)){
				reNodes[reNodes.length]=node;
			}
		}
		if(reNodes.length){
			return reNodes;
		}else{
			return false;
		}
	},
    $tagHasClassInNodeChild:function(tagName, className, pNode){
		var nodes=Dom.$tagInNodeChild(tagName, pNode);
		if(!nodes){return false;}
		var reNodes=[];
		for(var i=0; i<nodes.length; i++){
			var node=nodes[i];
			if(Dom.hasClass(className, node)){
				reNodes[reNodes.length]=node;
			}
		}
		if(reNodes.length){
			return reNodes;
		}else{
			return false;
		}
	},
/*
class
*/
	isClass:function(className, node){
		if((!node)||(!className)){return null;}
		var reFlag=false;
		if(node.className==className){
			reFlag=true;
		}

		return reFlag;
	},
	hasClass:function(className, node){
		if((!node)||(!className)){return null;}
		if(node.className.indexOf(className)!=-1){// need to update
			return true;
		}
		return false;
	},
	addClass:function(className, node){
		if(Dom.hasClass(className, node)){return false;}
		var newClassName=node.className?node.className+' '+className:className;
		node.className=newClassName;
		return true;
	},
	removeClass:function(className, node){
		if(!(Dom.hasClass(className, node))){return true;}
		var nodeClassName=node.className;
		if(nodeClassName==className){
			nodeClassName="";
		}else{
			nodeClassName=Base.trim(nodeClassName.replace(className, ""));
		}
		node.className=nodeClassName;
	},
	replaceClass:function(className, newClassName, node){
		if(!(Dom.hasClass(className, node))){return false;}
		node.className=Base.trim(node.className.replace(className, NewClassName));
	},
	setClass:function(className, node){
		node.className=className;
	},
	clearClass:function(node){
		node.className="";
	}
};

var module=function(moduleId){
	this.elmId=moduleId;
	return this;
};
module.prototype.initTabs=function(opt){
		this.tabsId=this.elmId+'_tabs';
		this.contentIdPreText=this.elmId+'_content_';
		new Module.Tabs(this.tabsId, this.contentIdPreText);//默认是点击
		if(opt){
			//if(opt.){}
		}
	};

var Module={};
Module.Tabs=function(nodeId, contentIdPreText){
	if((!nodeId)||(!(Dom.$id(nodeId)))){return null;}
	var selfObj=this;
	this.elmId=nodeId;
	this.contentIdPreText=contentIdPreText;
	this.eTabBox=Dom.$id(nodeId);
	this.eTabs=this.eTabBox.getElementsByTagName('li');//eTab -> li tag
	this.tabNum=this.eTabs.length;
	this.curTabIndex=0;
	this.targetTabIndex=0;
	this.content=[];
	var i,j,k;

	this.changeContent=function(curIndex, targetIndex){
		this.content[curIndex].style['display']='none';
		this.content[targetIndex].style['display']='';
	};

	this.chgTab=function(){
try{
		if(this.curTabIndex==this.targetTabIndex){return;}
		Dom.removeClass('cur', this.eTabs[this.curTabIndex]);
		Dom.addClass('cur', this.eTabs[this.targetTabIndex]);
		var temC=this.curTabIndex;
		var temT=this.targetTabIndex;
		this.curTabIndex=this.targetTabIndex;
		this.changeContent(temC, temT);
}catch(e){}
	};
	this.init=function(){
		for(i=0; i<this.eTabs.length; i++){
			var ttTab=this.eTabs[i];
			if(Dom.hasClass("cur", ttTab)){
				this.curTabIndex=this.targetTabIndex=i;
			}
			this.content[i]=Dom.$id(this.contentIdPreText+(i+1));
			var ttLink=ttTab.getElementsByTagName('a')[0];
			ttLink.setAttribute('i',i);
			ttLink.onclick=function(ev){
				this.blur();
				selfObj.targetTabIndex=this.getAttribute('i');
				selfObj.chgTab();
				return false;
			};
		}
	};
	this.init();
	return selfObj;
};

var kStyle={
	fixPngBg: function(element){
		if(typeof element=='string'){element=Dom.$id(element);}
		if((!(element.currentStyle))||((navigator.appName.toLowerCase().indexOf('internet explorer'))==-1)){return;}
		var xSrc=element.currentStyle.backgroundImage;
		element.style.background="none";
		element.style.filter ="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod='scale', src='"+xSrc.substring(5, xSrc.length-2)+"')";
	},
	fixPngImg: function(element){
		if(typeof element=='string'){element=Dom.$id(element);}
		if((!(element.currentStyle))||((navigator.appName.toLowerCase().indexOf('internet explorer'))==-1)){return;}
		var xSrc=element.src;
		element.src=blankImgSrc;
		element.style.filter ="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod='scale', src='"+xSrc+"')";
	},
	getRealStyle: function(element){
		var reStyle;
		if (element.currentStyle){
			reStyle = element.currentStyle;
		}else if (window.getComputedStyle){
			reStyle = window.getComputedStyle(element, null);
		}else{
			reStyle = null;
		}
		return reStyle;
	},
	setAtt: (function(){
				if (Base.isIE()) {
					return (function(el, property, val) {
						switch (property) {
							case 'opacity':
								if (typeof el.style.filter == 'string' ) {
									el.style.filter = 'alpha(opacity=' + val * 100 + ')';
									if (!el.currentStyle || !el.currentStyle.hasLayout) {
										el.style.zoom = 1;
									}
								}
								break;
							default:
								el.style[property] = val;
						}
					});
				} else {
					return (function(el, property, val) {
						el.style[property] = val;
					});
				}
			})(),
	getAtt: (function(){
		var patterns = {
			HYPHEN: /(-[a-z])/i
		};
		var toCamel = function(property) {
			if ( !patterns.HYPHEN.test(property) ) {
				return property; // no hyphens
			}
			
			if (propertyCache[property]) { // already converted
				return propertyCache[property];
			}
			
			while( patterns.HYPHEN.exec(property) ) {
				property = property.replace(RegExp.$1,
						RegExp.$1.substr(1).toUpperCase());
			}
			
			propertyCache[property] = property;
			return property;
		};

		if (document.defaultView && document.defaultView.getComputedStyle) {
        	return (function(el, property) {
				var value = null;
				
				var computed = document.defaultView.getComputedStyle(el, '');
				if (computed) { // test computed before touching for safari
					value = computed[toCamel(property)];
				}
				
				return el.style[property] || value;
        	});
		} else if (document.documentElement.currentStyle && Base.isIE()) {// IE method
			return (function(el, property) {
				switch( toCamel(property) ) {
					case 'opacity' :// IE opacity uses filter
						var val = 100;
						try { // will error if no DXImageTransform
							val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
						} catch(e) {
							try { // make sure its in the document
								val = el.filters('alpha').opacity;
							} catch(e) {}
						}
						return val / 100;
						break;
					default:
						// test currentStyle before touching
						var value = el.currentStyle ? el.currentStyle[property] : null;
					return ( el.style[property] || value );
				}
        	});
		} else { // default to inline only
			return (function(el, property) {return el.style[property];});
		}
	})()
	
};


var kAnimator={
	create:function(){
		
	},
	getPV:function(v1, v2, percent, Method){//取进度值
		var reV=(v2-v1)*Math.sin(Math.PI*percent/2)+v1;
		return reV;
	},
	FPS:30
};