//MultiUploader JavaScript Document © author:tf2199@yahoo.com.cn build:2009.3 lastUpdate:2010.01
var $jy = jQuery

function loadProgressID(){
	$('postframe').src='http://www.chnimg.com/cm.xp.mup.html?action=progressid&chl='+xpow.point.Path.getPre()+'.'+xpow.point.Path.getApp()
}
function setProgressID(id){
	$('PID').value = id
}
function getProgressID(){
	return $('PID').value
}
function doParseUpJSON(t,jn,ejn){
	if(t==2 ){
		//waring : this.upparams.__succ_befor = function(){ ....; return false/true}
		var param = xpow.emObj.Parmas.MultiUploader.upparams,re=''
		if(xpow.point.Lang.isString(param['__succ_befor'])){
			parseError(ejn)
			return tcon = eval(param.__succ_befor.Replace('param',JSON2Str(jn)))
		}else if (xpow.point.Lang.isFunction(param['__succ_befor'])){
			parseError(ejn)
			return tcon = param['__succ_befor'](jn)
		}
	}
	
	xpow.emObj.Parmas.MultiUploader.doParseUpJSON(t,jn,ejn)
}

function parseError(ejn){
	if(ejn){
		var tTree = new Array(),err=''
		for(var i=0; i<ejn.length; i++){
			tTree.push(ejn[i])
		}
		
		for (i=tTree.length; i>=0; i--){
			if(tTree[i]){
				for(var x in tTree[i]){
					err += tTree[i][x]+'\n'
				}
			}
		}
		if (err)alert(err)
	}
}

function setSwfParam(options){
	var settings = {
		flash_url : "http://www.chnimg.com/js/libextend/swfupload/swfupload.swf",
		upload_url: 'http://www.chnimg.com/system/upload/revupload.asp?action=upload&pid='+getProgressID()+'&codepage=65001',
		post_params: {
			'SESSIONID' : '125262525256251','_channel':xpow.point.Path.getPre(),'_allext' :'rar,zip,pdf,ppt,jpg,doc,ai,cdr,eps,xls','limit':-1,'_maxsize' : -1,'_filepath' :'http://www.chnimg.com/upload/files/'+xpow.getDater.Get('toFile')+'/',
			'_filename' :'','_isResize' :1,'_re_mode' :0,'_re_size' :'100,100','_re_maxw' :100,'_re_maxh' :100,'_re_focus' :'topic','__mode' : 'multi','__from' : 'swf','__succ' : 'setImgInfo({$param})'
		},
		//,'__succ_befor' : function(a){doParaseImgList(a); return false}
		file_size_limit : "2000 MB",
		file_types : "*.rar;*.zip;*.pdf;*.ppt;*.jpg;*.doc;*.ai;*.cdr;*.eps;*.xls",//*.*
		file_types_description : "文件",//All Files
		file_post_name : 'Filedata', 
		file_upload_limit : 5,
		file_queue_limit : 0,
		custom_settings : {
			progressTarget : "fsUploadProgress",
			cancelButtonId : "btnCancel"
		},
		debug: false,
		
		// Button settings
		button_image_url: "http://www.chnimg.com/js/libextend/swfupload/TestImageNoText_65x29.png",
		button_width: "65",
		button_height: "29",
		button_placeholder_id: "spanButtonPlaceHolder",
		button_text: '<span class="theFont">上传</span>',
		button_text_style: ".theFont { font-size: 16px; }",
		button_text_left_padding: 12,
		button_text_top_padding: 3,
		
		// The event handler functions are defined in handlers.js
		file_queued_handler : fileQueued,
		file_queue_error_handler : fileQueueError,
		file_dialog_complete_handler : fileDialogComplete,
		upload_start_handler : uploadStart,
		upload_progress_handler : uploadProgress,
		upload_error_handler : uploadError,
		upload_success_handler : uploadSuccess,
		upload_complete_handler : uploadComplete,
		queue_complete_handler : queueComplete // Queue plugin event
	};
	
	var tparam={}
	tparam.file_types = ';*.'+options.post_params['_allext'].split(',').join(';*.')
	tparam.file_upload_limit = options.post_params['limit']
	tparam.file_size_limit = (options.post_params['_maxsize']*options.post_params['limit']).toString()+' K'
	$jy.extend(settings, options);
	$jy.extend(settings, tparam);
	swfu = new SWFUpload(settings);
}

function setBtnupload(o,e){
	var upFile = $('upFile'), $j=jQuery;
	var ef = xpow.point.getoffset(o,true)
	var pf = $j('.multiuploader')
	var vf = $j('.multitips')
	var voff=vf[0].offsetHeight==0?50:vf[0].offsetHeight
	if(pf.parent().parent().attr('id')=='multiuploader_box'){
		upFile.style.width='20px'
		upFile.style.left=(e.clientX-12+document.documentElement.scrollLeft)+ 'px';
		upFile.style.top=(e.clientY-15+document.documentElement.scrollTop)+ 'px';
	}else{
		upFile.style.left=(ef.left-pf.offset().left+15)+ 'px';
		upFile.style.top=(ef.top-pf.offset().top+voff-15)+ 'px';
	}
}

function _setTagFile(){
	var pf = jQuery('.multiuploader')
	if(!$('tagfile'))return
	if(pf.parent().parent().attr('id')=='multiuploader_box'){
		$('tagfile').style.right=0
	}else{
		$('tagfile').style.right=(xpow.browser.isIE?0:0)+'px'
	}
	jQuery('.MultiFile').mouseover(function(){
		jQuery(this).css({'position':'absolute','right':'0px'})
	})
}

xpow.Use('script').loadExtend('xpow.plugs.flashdetect')
xpow.point.MultiUploader = function(){}
Object.extend(xpow.point.MultiUploader.prototype,{
	$j:jQuery,ojsn:{sn:0},vparam:{sn:0,isre:false,marginal:10,curr:0,upparams:{},limit:0},url:'../{$$$}.xpm?to=10&PID={$pid}',furl:'http://www.chnimg.com/framebar',error:'',
	objGet : '',objName:'',exportObj :'',charset : false,form:'',
	doUploadInit : function(param){
		var self = this
		if (!xpow.point.Script.Module.swfupload && this.isSwfMajor())return xpow.point.Script.jLoad('swfupload',function(){self.doUploadInit(param)})
		this.parseParam(param)
		var re='可上传文件类型： ', tary = this.upparams['_allext'].split(','),op = this
		this.upparams['_channel']=xpow.point.Path.getPre()
		for(var i in this.upparams){if($(i))$(i).value=this.upparams[i]}
		if(tary.length>1){
			for(var i=0; i<tary.length; i++){ re +='<img src="http://www.chnimg.com/images/common/linkicons/'+tary[i]+'.png" /> '}
		}else{
			re +='<span class="chn">不限</span>'
		}

		$('limit_').innerHTML = (this.upparams['limit']<1)?'不限':this.upparams['limit']
		$('maxsize_').innerHTML = (this.upparams['_maxsize']<1)?'不限大小':this.upparams['_maxsize']+' K'
		$('allext_').innerHTML = re
		
		if (this.upparams['limit']<2){
			$('_t_tips').className= 'disnone'
		}
		if (this.upparams['_maxsize']<1){
			$('_maxsize_').className = 'disnone'
		}
		if (tary.length<=1){
			$('allext_').className = 'disnone'
		}
		
		if (tary.length<=1&&this.upparams['_maxsize']==-1&&this.upparams['limit']<2){
			$('_t_tips').parentNode.className = 'disnone'
		}
		
		if (!this.isSwfMajor()){
			$(this.upparams['_form']).target = 'postframe'
			$(this.upparams['_form']).encoding = 'multipart/form-data'
			$(this.upparams['_form']).onsubmit = function(){return op.doCheckFile()}
		}

		this.vparam.selected = 0
		this.objGet = xpow.emObj.Parmas.MultiUploader?xpow.emObj.Parmas.MultiUploader:this
		this.exportObj = xpow.emObj.Parmas.edtDlg?xpow.emObj.Parmas.edtDlg:eval(this.exportObj)
		this.uploadmode = this.upparams['__mode']?this.upparams['__mode']:'editor'
		if (this.upparams['__mode']=='single'){
			this.vparam.filemode = 'single'
			this.vparam.filecss = 'single grid'
			this.vparam.dis = 'disnone'
			this.vparam.vcss = 'multiuploaders'
			//if (!this.isSwfMajor())$('tagfile').onchange = function(){$('filepath').value=this.value}
			this.setMode()
			this.loadProgressID()
		}else{
			this.vparam.filemode = 'editor'
			this.vparam.filecss = 'multi'
			this.vparam.vcss = ''
			this.vparam.dis = ''
			this.setMode()
			this.extendMultiFile()
		}
	},
	setMode : function(){
		this.$j('#upre-log').addClass(this.vparam.dis )
		this.$j('#vlist').addClass(this.vparam.dis )
		this.$j('#tagfile').addClass(this.vparam.filecss )
		this.$j('.multiuploader').addClass(this.vparam.vcss )
	},
	isSwfMajor : function(){
		if (FlashDetect.major>9 && !xpow.browser.isMaxthon)return true
		return false
	},
	parseParam : function(param){
		if (!param)return
		this.upparams = param.post_params ||{}
		this.extendParams = param ||{}
		var _re_mode=param.post_params['_re_mode']
		var tmpLiary = ('_filename,_isResize,_re_mode,_re_size,_re_maxw,_re_maxh,_re_focus,_form').split(',')
		var tmpViary = ('null,1,1,100,100,100,topic,__postform').split(',')
		for(var i=0; i<tmpLiary.length; i++){
			this.upparams[tmpLiary[i]]=(!xpow.point.Lang.isUndefined(param.post_params[tmpLiary[i]]))?param.post_params[tmpLiary[i]]:((tmpViary[i]=='null')?'':tmpViary[i])
		}
	},
	setParam : function(data){
		setProgressID(data.id)
		if (this.isSwfMajor())setSwfParam(this.extendParams)
	},
	extendMultiFile : function(){
		if (this.isSwfMajor())return this.loadProgressID()
		var self = this
		this.$j(function(){
			jQuery('#tagfile').MultiFile({
				onFileRemove: function(element, value, master_element){
					if($('btn-browser'))$('btn-browser').value = '继续浏览'
				},
				afterFileAppend: function(element, value, master_element){
					if($('btn-browser'))$('btn-browser').value = '继续浏览'
				},
				accept:self.upparams['_allext'].toReSymbol(',','|'), max:self.upparams['limit'], list: '#upre-log' ,
				STRING: {
					remove:'<img align="absmiddle" title="删除当前选择的文件" alt="删除" src="http://www.chnimg.com/images/status/delete_sa.gif" />',
					selected:'$file',
					denied:'不支持上传 $ext 格式文件！',
					duplicate:'该文件已存在！' ,
					limit:'已超出最大上传数量！'
				}
			});
			self.objGet.loadProgressID()
		}); 
	},
	loadProgressID : function(){
		var self = this
		this.$j.getJSON('http://www.chnimg.com/cm.xp.swfup.html?action=progressid&chl='+xpow.point.Path.getPre()+'.'+xpow.point.Path.getApp()+'&jsoncallback=?',function(data){self.setParam(data)})
	},
	setProgressID : function(id){
		$('PID').value = id
	},
	getProgressID : function(){
		return $('PID').value
	},
	doParseUpJSON : function(t,jn,ejn){
		if(t==1){
			jn = jn?jn:''
			return this.$j.getJSON('http://www.chnimg.com/system/upload/?action=getitemfile&pid='+this.getProgressID()+'&obj='+jn+'&jsoncallback=?',function(data){
				doParseUpJSON(2,data.imglist,data.error)
			})
		}
		if(t==2){
			if(ejn){
				var tTree = new Array(),err=''
				for(var i=0; i<ejn.length; i++){
					tTree.push(ejn[i])
				}
				
				for (i=tTree.length; i>=0; i--){
					if(tTree[i]){
						for(var x in tTree[i]){
							err += tTree[i][x]+'\n'
						}
					}
				}
				if (err){ alert(xpow.decodeURI(err))}
			}
			
			var tcon = true
			if (tcon && jn){
				var tTree = new Array(),tsn=1,tcur=0
				for(var i=0; i<jn.length; i++){
					tTree.push(jn[i])
				}
				
				if (this.vparam.filemode=='single'){
					this.vparam.sn = 1; this.vparam.limit = 1
					this.jsn = tTree[0]
					this.getContent()
				}else{
					/*for (i=tTree.length; i>=0; i--){
						if(tTree[i]){this.doParseImglist(tTree[i])}
					}*/
					for (i=0; i<tTree.length; i++){
						if(tTree[i]){this.doParseImglist(tTree[i])}
					}
				}
			}
		}
		if (this.vparam.filemode=='single'){}else{this.resetDataMethod()}
		this.clearTagFile()
		this.$j('#statusre').addClass('disnone')
		this.$j('#upre').removeClass('disnone')
	
	},
	resetDataMethod : function(){
		this.init()
		this.resetSn()
		if (this.vparam.limit>4){
			this.goCarouselLiteEnd()
			this.$j('.handleOPs').removeClass('disnone')
		}
		
	},
	goCarouselLiteEnd : function(){
		if (this.vparam.sn>4){
			this.ojsn.goto(this.vparam.limit-4)
		}
	},
	doParseImglist : function(jn){
		this.jsn = jn
		if(this.$j('ul.imglist'+this.vparam.sn).size()<1){this.vparam.sn+=1}
		if (jn.action=='upload'){
			if (jn.filemode==1){/*class="link-'+jn._vFileExt'"*/
				this.$j('<li for='+jn.smallimg+'>'
				+'<div class="sn">'+(this.vparam.sn+1)+'</div><div><div style="float:left;"><a href="'+jn.domain+jn.bigimg+'"  title="点击下载 '+jn.sourcename+' ['+jn._vFileSize+' '+jn.sizeapp+']" for="{filemode:1,sourcename:\''+jn.sourcename+'\',size:\''+jn._vFileSize+'\',sizeapp:\''+jn.sizeapp+'\',domain:\''+jn.domain+'\',ext:\''+jn._vFileExt+'\'}" target="_blank"><img align="center" src="'+jn.domain+'/images/common/linkicons/'+jn._vFileExt+'-big.png"></a><div class="topic">'+jn.sourcename+'['+jn._vFileSize+' '+jn.sizeapp+']</div></div>'
				+'<div style="float:right" class="_optimgs disnone"><img for='+jn.imgpath+' alt="删除此文件" src="http://www.chnimg.com/images/status/delete_sa.gif" align="right" /></div>'
				+'<div class="clear"></div></div></li>'/*<div class="topic">'+jn.sourcename+'</div>*/
				).appendTo(this.$j('ul.imglist'+this.vparam.sn)[0])
			}else{
				this.$j('<li for='+jn.smallimg+'>'
				+'<div class="sn">'+(this.vparam.sn+1)+'</div><div><div style="float:left"><a title="'+jn.sourcename+'" href="'+jn.domain+jn.bigimg+'" for="{filemode:0,sourcename:\''+jn.sourcename+'\',width:\''+jn.v_reimg_w+'\',height:\''+jn.v_reimg_h+'\'}" target="_blank"><img src="'+jn.domain+jn.smallimg+'?'+ new Date().getTime()+'"></a></div>'
				+'<div style="float:right" class="_optimgs disnone"><img for='+jn.imgpath+' alt="删除此图片" src="http://www.chnimg.com/images/status/delete_sa.gif" align="right" /></div>'
				+'<div class="clear"></div></div></li>'/*<div class="topic">'+jn.sourcename+'</div>*/
				).appendTo(this.$j('ul.imglist'+this.vparam.sn)[0])
			}
			this.vparam.html = this.$j('ul.imglist'+this.vparam.sn).html(); this.vparam.sn += 1; this.vparam.limit += 1;this.$j('.vlist').empty()
			this.$j('.vlist').html('<ul class="imglist'+this.vparam.sn+'">'+this.vparam.html+'</ul>'
				+' <div class="handleOPs disnone"><div class="prv"><img height="13" align="absmiddle" src="http://www.chnimg.com/images/status/left.png" /></div>'
				+' <div class="_sn disnone">1</div><div class="nxt" ><img align="absmiddle" src="http://www.chnimg.com/images/status/right.png" /></div>'
				+' <div class="space"></div></div>'
			)
		}
	},
	init : function(){
		var op = this
		var tcss = '._optimgs'
		if (this.upparams['_form']!='' ){/*=='__postform'*/
			this.$j('ul.imglist'+this.vparam.sn+' li').each(function(i){
				this.onmouseover = function(){
					var obj = this.getElementsByTagName('div')[0]
					obj.className='handles'
					obj.style.width=(this.offsetWidth-6)+'px'
					obj.style.height=(this.offsetHeight-5)+'px'
				}
				this.onmouseout = function(){
					var obj = op.$j('.optimgs',this).addClass('disnone')
					//obj.className=' disnone'
				}
			})
			
			this.$j('ul.imglist'+this.vparam.sn+' li').each(function(i){
				this.onmouseover = function(){
					op.$j('._optimgs',this).removeClass('disnone')
					op.$j(this).addClass('liboder')
				}
				
				this.onmouseout = function(){
					op.$j('._optimgs',this).addClass('disnone')
					op.$j(this).removeClass('liboder')
				}
			})
		}
		
		this.$j('ul.imglist'+this.vparam.sn+' li '+tcss+' img').each(function(i){
			op.$j(this).click( function(){
				if(confirm('确实要删除这个文件吗？')){
					op.doDeleteImg(this.getAttribute('for'),0)
					op.vparam.limit -= 1
					if(op.$j(this).parent().parent().tagName=='LI'){
						op.$j(this).parent().parent().remove(); 
					}else{
						op.$j(this).parent().parent().parent().remove();
					}
					op.resetjCarouselLite()
				}
			})
		})
		
		this.$j(function(){op.$j('.vlist').jCarouselLite({ btnNext: '.nxt', btnPrev: '.prv', boxSn: '._sn',speed: 600,start:0})})
	},
	resetSn : function(){
		var self = this
		this.$j('ul.imglist'+this.vparam.sn+' li').each(function(i){
			self.objGet.$j('.sn',this).html(i*1+1)
		})
		if (!this.exportObj)return
		if (this.vparam.limit>=1){
			this.exportObj.setBtns({id:xpow.emObj.Parmas.edtDlg.id,button:[{description:'确 定',action:function(){xpow.emObj.Parmas.MultiUploader.getContent()}},{description:'取 消',action:function(){xpow.emObj.Parmas.MultiUploader.Clear()}}]})
		}else{
			this.exportObj.setBtns({empty:1})
		}
	},
	resetjCarouselLite : function(){
		var tmpCls = this.vparam.limit<5?'disnone':''
		this.vparam.html = this.$j('ul.imglist'+this.vparam.sn).html();
		this.$j('.vlist').empty()
		this.$j('.vlist').html('<ul class="imglist'+this.vparam.sn+'">'+this.vparam.html+'</ul>'
			+' <div class="handleOPs '+tmpCls+'"><div class="prv"><img height="13" align="absmiddle" src="http://www.chnimg.com/images/status/left.png" /></div>'
			+' <div class="_sn">1</div><div class="nxt"><img align="absmiddle" src="http://www.chnimg.com/images/status/right.png" /></div>'
			+' <div class="space"></div></div>'
		)
		this.init()
		this.resetSn()
	},
	clearTagFile : function(){
		var self = this
		this.$j('#upre-log a').each(
			function(){self.objGet.$j(this).click()}
		)
		if(this.error==''){return}
		if(this.$j.blockUI){
			this.$j.blockUI({
				message: this.error.replace(/\n/gi,'<br/>'),
				css:{ 
					padding:'10px', size:'12.0pt', 'text-align':'left','line-height':'18px','min-width':'200px',
					backgroundColor:'#f1f1f1', color:'#666',top: '10px', left: '10px', right: '',/*opacity:'.5',*/
					'-webkit-border-radius': '10px','-moz-border-radius': '10px',cursor:''
				},
				overlayCSS :{
					backgroundColor:'#000', opacity:'0.5'
				}/*,timeout: 2000 */
			});
			this.$j('.blockUI').attr('title','点击屏幕继续...').click(this.$j.unblockUI); 
		} else{
			alert(this.error);
		}
		this.error = ''
	},
	doCheckFile : function(){
		var isnull = true,fileAry = $j('#upre input[type=file]'),tmpTotal=0
		fileAry.each(function(){ if (this.value!=''){isnull=false;return false} })
		
		tmpTotal = fileAry.size()
		
		this.vparam.selected = tmpTotal

		if (isnull){alert('请至少上传一个文件！'); setTimeout(function(){ $j.fn.MultiFile.reEnableEmpty() },1000);;return false}
		if (this.upparams['limit']==-1){
			
		}else{
			//if ((this.vparam.limit+tmpTotal-1)>this.upparams['limit']){alert('最多允许一次上传'+this.upparams['limit']+'张，当前已上传'+this.vparam.limit+'张！');return false}
		}
		this.$j('#statusre').removeClass('disnone')
		this.$j('#upre').addClass('disnone')
		return this.getProgress()
	},
	getProgress : function(){
		this.tFrame = $('statusfrm');
		this.tFrame.src=this.url.replace('../{$$$}',this.furl).Replace('pid',this.getProgressID());
		this.charset = (!this.charset)? document.charset:this.charset
		if(xpow.browser.isIE)document.charset='gb2312'
		var c=(document.charset=='gb2312')?936:65001
		$(this.upparams['_form']).action='http://www.chnimg.com/cm.xp.mup.html?action=upload&pid='+getProgressID()+'&codepage='+c
		return true
	},
	doDeleteImg : function(delpath,isre){$('postframe').src='http://www.chnimg.com/cm.xp.mup.html?action=delimg&delpath='+delpath+'&rePort='+isre},
	setButton : function(){},
	getMultiHtml : function(){
		var tc = xpow.Use('content'),re = xpow.browser.typeName!='IE6'?'IE7':xpow.browser.typeName,toff=xpow.browser.isIE?0:150
		tc.append('<div class="',re,'"><div class="multiuploader">')
		tc.append('<div class="multibox"><div class="grid2"><div class="left"><div class="multitips">')
		tc.append('<div class="lable"><span id="_t_tips">每次可批量上传 <span id="limit_" class="chn"></span>&nbsp;个文件，</span><span id="_maxsize_">单文件不大于：<span id="maxsize_" class="chn"></span></span></div>')
		tc.append('<div id="allext_" class="lable"></div></div>')
		tc.append('<div id="statusre" class="disnone"><iframe id="statusfrm" name="statusfrm" scrolling="no" frameborder="0"></iframe></div>')
		tc.append('<div id="upre">')
		if (this.upparams){
			if 	(this.upparams['_form']=='__postform')tc.append('<form method="post" id="__postform" enctype="multipart/form-data" target="postframe">')
		}else{
			tc.append('<form method="post" id="__postform" enctype="multipart/form-data" target="postframe">')
		}
		tc.append('<input type="hidden" id="_filename" name="_filename" value="" />')
		tc.append('<input type="hidden" id="__mode" name="__mode" value="" />')
		tc.append('<input type="hidden" id="__succ" name="__succ" value="" />')
		tc.append('<input type="hidden" id="_form" name="_form" value="" />')
		tc.append('<input type="hidden" id="_re_mode_set" name="_re_mode_set" value="" />')
		tc.append('<input type="hidden" id="_objname" name="_objname" value="" />')
		tc.append('<input type="hidden" id="_allext" name="_allext" value="" />')
		tc.append('<input type="hidden" id="_velemt" name="_velemt" value="" />')
		tc.append('<input type="hidden" id="PID" name="PID" value="018E94ED018E94EE" />')
		tc.append('<input type="hidden" id="_maxsize" name="_maxsize" value="500" />')
		tc.append('<input type="hidden" id="_filepath" name="_filepath" value=""/>')
		tc.append('<input type="hidden" id="_channel" name="_channel" value="',xpow.point.Path.getPre(),'" />')
		tc.append('<input type="hidden" id="_channel_app" name="_channel_app" value="',xpow.point.Path.getApp(),'" />')
		tc.append('<input type="hidden" id="_isResize" name="_isResize" value="2" />')
		tc.append('<input type="hidden" id="_re_mode" name="_re_mode" value="1" />')
		tc.append('<input type="hidden" id="_re_size" name="_re_size" value="" />')
		tc.append('<input type="hidden" id="_re_maxw" name="_re_maxw" value="150" />')
		tc.append('<input type="hidden" id="_re_maxh" name="_re_maxh" value="190" />')
		tc.append('<input type="hidden" id="_re_focus" name="_re_focus" value="topic" />')
		//tc.append('<div id="upFile" style="position:absolute;left:0;top:0; border:1px solid;z-index:100000;width:65px;height:25px;overflow:hidden;filter:alpha(opacity=0);-moz-opacity: 0;opacity:0;">')//
		tc.append('<input type="file" id="tagfile" class="MultiFile" name="tagfile"/>')
		tc.append('<input type="text" id="filepath" class="disnone" readonly="readonly" /> ')
		tc.append('<input type="button" value="浏 览" onmousemove="setBtnupload(this, event);" class="disnone btn-up" id="btn-browser" /> ')
		tc.append('<input type="submit" class="grid" value="上 传" id="btn-upload" />')
		tc.append('<div class="clear"></div>')
		tc.append('<div id="tips" class="waring">你的FLASH插件版本过低，<a target="_blank" href="http://www.adobe.com/cn/products/flashplayer/" class="linkwaring">点击到 Adobe 升级</a>，体验批量高速上传新功能！</div>')
		tc.append('<div id="upre-log"></div>')
		if (this.upparams){
			if 	(this.upparams['_form']=='__postform')tc.append('</form>')
		}else{
			tc.append('</form>')
		}
		tc.append('<iframe id="postframe" name="postframe" height="200" width="500" style="display:none"></iframe>')
		tc.append('</div>')
		tc.append('<div class="vlist"><ul class="imglist0"></ul></div></div><div class="clear"></div>')
		tc.append('</div></div><div class="clear"></div></div></div><div class="_ssn"></div><div id="_ssns"></div>')
		return tc.toString()
	},
	getSwfHtml : function(){
		var tc = xpow.Use('content'),re = xpow.browser.typeName!='IE6'?'IE7':xpow.browser.typeName,toff=xpow.browser.isIE?0:150
		tc.append('<div class="',re,'"><div class="multiuploader">')
		tc.append('<div class="multibox"><div class="grid2"><div class="left"><div class="multitips">')
		tc.append('<div class="lable"><span id="_t_tips">每次可批量上传 <span id="limit_" class="chn"></span>&nbsp;个文件，</span><span id="_maxsize_">单文件不大于：<span id="maxsize_" class="chn"></span></span></div>')
		tc.append('<div id="allext_" class="lable"></div></div>')
		tc.append('<div id="statusre" class="disnone"><iframe id="statusfrm" name="statusfrm" scrolling="no" frameborder="0"></iframe></div>')
		tc.append('<div id="upre">')
		if (this.upparams){
			if 	(this.upparams['_form']=='__postform')tc.append('<form method="post" id="__postform" enctype="multipart/form-data" target="postframe">')
		}else{
			tc.append('<form method="post" id="__postform" enctype="multipart/form-data" target="postframe">')
		}
		tc.append('<div id="getswfbox">')
		tc.append('<div class="fieldset flash" id="fsUploadProgress"></div>')
		tc.append('<div style="padding-left:5px">')
		tc.append('<div id="divStatus" class="gary">0 Files Uploaded</div>')
		tc.append('<span class="objuploadswf"><span id="spanButtonPlaceHolder">上传组件加载中...</span></span>')
		tc.append('<input id="btnCancel" type="button" value="Cancel All Uploads" onclick="swfu.cancelQueue();" disabled="disabled" style="margin-left: 2px; font-size: 8pt; height: 29px;" />')
		tc.append('</div>')
		tc.append('<div style="padding:5px 5px" class="gary">* 可以同时选择多个文件。</div>')
		tc.append('</div><input type="hidden"  id="PID" />')
		if (this.upparams){
			if 	(this.upparams['_form']=='__postform')tc.append('</form>')
		}else{
			tc.append('</form>')
		}
		tc.append('<iframe id="postframe" name="postframe" height="200" width="500" style="display:none"></iframe>')
		tc.append('</div>')
		tc.append('<div class="vlist"><ul class="imglist0"></ul></div></div><div class="clear"></div>')
		tc.append('</div></div><div class="clear"></div></div></div><div class="_ssn"></div><div id="_ssns"></div>')
		return tc.toString()
		
	},
	getBody : function(){
		if (this.isSwfMajor())return this.getSwfHtml()
		return this.getMultiHtml()
	},
	Export : function(param){
		this.parseParam(param)
		var re = this.getBody()
		return re
	},
	Clear : function(){
		var self = this
		if (this.vparam.limit>0 && !this.vparam.isre){
			if(!confirm('确定要取消上传文件吗？')){return 'unclose'}
		}
		var re='',op=this, tc = xpow.Use('content')
		this.$j('li',this.$j('.vlist')).each(function(){
			re+=$g(this,'for').replace(self.upparams['_filepath'],'{$path}')+'$$$\n'
		})
		
		if (!re){return this.release()}
		this.tFrame = $('statusfrm');
		this.tFrame.src='http://www.chnimg.com/cm.xp.mup.html?action=cancelupfile&path='+encodeURI(self.upparams['_filepath'])+'&dps='+re
		this.$j('.vlist').html('<li class="gary">正在删除上传文件，请稍候...</li>')
		setTimeout('xpow.emObj.Parmas.MultiUploader.release()',1500)
		return 'unclose'
	},
	getFile : function(){
		var re='',op=this, tc = xpow.Use('content'),jn,sn=0,tsyble = xpow.Use('letter').get(30)
		if (this.jsn.succ){
			eval(this.jsn.succ.Replace('param',JSON2Str(this.jsn)))
		}
		this.$j('a',this.$j('.vlist')[0]).each(function(i){
			eval('jn='+$g(this,'for'))
			tc.append('file'+i+'='+op.$j(this).attr('href').replace(op.jsn.domain,'')+tsyble)
			sn+=1
		})
		tc.append('filecount='+sn+tsyble)
		return tc.toString()
	},
	getContent : function(){
		if (this.vparam.limit<1){return alert('请先上传你的文件！')}
		var re='',op=this, tc = xpow.Use('content'),jn
		if (!this.jsn)return this.release()
		if (this.jsn.succ){
			eval(this.jsn.succ.Replace('param',JSON2Str(this.jsn)))
		}
		
		if (this.uploadmode=='editor'){
			this.$j('a',this.$j('.vlist')[0]).each(function(){
				eval('jn='+$g(this,'for'))
				if (jn.filemode==0){
					tc.append('&nbsp;<br>&nbsp;<img src=',op.$j(this).attr('href'),' height="'+jn.height+'" width="'+jn.width+'" />&nbsp;<br>&nbsp;')
				}else{
					tc.append('<a href="'+op.$j(this).attr('href')+'" title="'+op.$j(this).attr('title')+'" style="PADDING-LEFT: 20px; BACKGROUND: url('+jn.domain+'/images/common/linkicons/'+jn.ext+'.gif) no-repeat" target="_blank">'+jn.sourcename+'</a>')
				}
			});
			KE.util.insertHtml('_editor_concc', tc.toString())
		}else{
			jn=op.jsn
			var tmpObjArray=new Array()
			tmpObjArray['url'] = jn.domain+jn.bigimg
			tmpObjArray['imgv'] = $(jn.velemt)
			tmpObjArray['img'] = $('img_'+jn.velemt)
			tmpObjArray['imgs'] = $('img_'+jn.velemt+'s')
			tmpObjArray['imglink'] = $('link_'+jn.velemt)
			if (jn.filemode==0){
				if (tmpObjArray['img']){
					if (tmpObjArray['img'].tagName.toLowerCase()=='img' ){
						tmpObjArray['img'].style.display='block';
						tmpObjArray['img'].src = tmpObjArray['url']+'?'+ new Date().getTime()
					}else{
						tmpObjArray['img'].background=tmpObjArray['url']+'?'+ new Date().getTime()
						if(tmpObjArray['imgs'])tmpObjArray['imgs'].style.background='url('+tmpObjArray['url']+'?'+ new Date().getTime()+') left repeat-y'
					}
				}
			}
			
			if(tmpObjArray['imglink']) tmpObjArray['imglink'].href = tmpObjArray['url']
			if(tmpObjArray['imgv']) tmpObjArray['imgv'].value = tmpObjArray['url']
			
		}
		this.release()
	},
	fixSWFUpload : function(){
		var KE=KE
		if (KE){
			KE.fixSWFUpload()
		}else{
			$j(document.body).append('<div class="disnone">'+$j('.objuploadswf').html()+'</div>')
		};
	},
	release : function(){this.fixSWFUpload();  this.vparam.limit = 0; this.vparam.sn=0; if(this.charset) document.charset=this.charset;this.charset=false; if(xpow.emObj.Parmas.edtDlg)xpow.emObj.Parmas.edtDlg.Clear()}
});

xpow.point.Vote = function(){}
Object.extend(xpow.point.Vote.prototype,{
	param :{},$j:jQuery?jQuery:{},oJSN : '',oDLG:'',
	options:{
		'btnaddopts':'btnaddopts',
		'btnsubmit':'btnsubmit',
		'btnsetopts':'btnsetopts',
		'v_topic':'v_topic',
		'o_topic':'o_topic'
	},
	init : function(o){
		if (o)this.param.obj = o
		this.oDLG = xpow.Use('dlg')
		this.param.poststatu = this.param.poststatu ?this.param.poststatu :'\\\\{$xm}{$chn}/'
		this.Step(1)
		var tary = this.$j('.vtabs .vtab')
		var self = this
		tary.each(function(){
			self.$j(this).click(function(){
				if (self.param.mode!=self.getMode(this)){
					if (!confirm('切换形式将丢失之前所作的设置！\n\n确定要继续吗？')){return}
				}
				tary.each(function(){
					self.$j(this).removeClass('current')
				})
				self.$j(this).addClass('current')
				self.setMode()
			})
		})
		
	},
	Export : function(html,toffset,loffset,btn){
		var self = this
		this.oDLG.doInit(this.param.obj+'_oDLG');
		this.oDLG.id = this.param.obj+'_oDLG'
		//this.oDLG.isMask = ismask;
		this.oDLG.topOffset = toffset;
		this.oDLG.leftOffset = loffset;
		//this.oDLG.mHeight = h;
		//this.oDLG.button = btn
		this.oDLG.mWidth = 552;
		this.oDLG.der = '';
		this.oDLG.onComplete=function(){
			self.setMode();
			self.oDLG.setBtns({id:self.param.obj+'_oDLG',button:[{description:'下一步',action:function(){self.setOpts()}},{description:'取 消',action:function(){self.Cancel()}}]})
		}
		this.oDLG.Export(html);
	},
	Step: function(sn){
		var self = this
		switch(sn){
		case 1:
			this.Export(this.getHtml(),0,0,{id:this.param.obj+'_oDLG',button:[{description:'下一步',action:function(){self.setOpts()}},{description:'取 消',action:function(){self.Cancel()}}]});break
		case 2:
			this.oJSN = xpow.JSN//
			this.oJSN.Init(this.param.poststatu,'','','vsi',0)
			this.oDLG.setBtns({id:self.param.obj+'_oDLG',button:[{description:'确 定',action:function(){self.Submit()}},{description:'取 消',action:function(){self.Cancel()}}]});break
		}
	},
	getHtml : function(){
		var cc = xpow.point.Content
		cc.append('<div class="votebox">')
		cc.append('<div class="vtabs disnone">')
		cc.append('<div class="vtab current" param="{mode:\'f\'}">文字形式</div>')
		cc.append('<div class="vtab disnone" param="{mode:\'g\'}">图片形式</div>')
		cc.append('<div class="clear"></div>')
		cc.append('</div>')
		cc.append('<div class="vtabc"><p></p>')
		cc.append('<div>调查主题：<br><input type="text" name="v_topic" id="v_topic" maxlength="150" /></div><p></p>')
		cc.append('<div class="tabmode" id="tab.f">')
		cc.append('<div id="votbot">请输入调查选项数量：<br> <input type="text" size="3" id="v-opts" maxlength="3" /></p></div>')
		cc.append('<div id="vtabd" class="disnone">')
		cc.append('<div id="setopts">')
		cc.append('<label title="投票时只能对一个选项进行投票"><input type="radio" checked name="ismulti" value="0" />单选</label>&nbsp;&nbsp;')
		cc.append('<label title="投票时可以对多个选项进行投票"><input type="radio" name="ismulti" value="1"  />多选</label>&nbsp;&nbsp;')
		cc.append('<label><input type="radio" name="needlogin" checked value="0" />游客可以投票</label>&nbsp;&nbsp;')
		cc.append('<label><input type="radio" name="needlogin" value="1" />仅会员可以投票</label>')
		cc.append('</div><p></p>')
		cc.append('<div>请输入每个选项的标题：</div>')
		cc.append('<div id="votcont"></div>')
		cc.append('<div><p><input id="btnaddopts" type="button" value="增加选项" onclick="vote.addOpts()" class="disnone"></p></div>')
		cc.append('</div></div>')
		cc.append('</div></div>')
		return cc.toString()
	},
	setMode : function(){
		this.param.mode = this.getMode()
		var self = this
		self.$j('.tabmode').each(function(){
			self.$j(this).addClass('disnone')
		})
		self.$j($('tab.'+this.param.mode)).removeClass('disnone')
		this.parseChannel()
	},
	parseChannel : function(){
		this.param.set=false
		switch(xpow.point.Path.getPre()){
		case 'bbs': this.param.channel='forum'; break
		case 'admin':
		case 'co':
		case 'me': this.param.set=true; break
		default : this.param.channel=xpow.point.Path.getPre() ;break
		}
		if (this.param.set){
			if (this.param.channel){
				if (this.param.channel.indexOf('.admin')>0){
					this.param.channel = this.param.channel.replace('.admin','')
				}
			}else{
				if (xpow.point.Path.getPre()=='co'){
					this.param.post = 'channelCorps'
				}else{
					this.param.post = 'channel'+xpow.point.Path.getPre()+'s'
				}
			}
			
		}else{
			this.param.post = 'channel'+this.param.channel+'s'
		}
	},
	getMode : function(obj){
		var o = obj?obj:this.$j('.vtabs .current')[0]
		return $g(o,'param').evalJSON().mode
	},
	addOpts : function(){
		this.param.opts+=1
		var self = this
		if (!this.param.v_o_topic)this.param.v_o_topic=''
		$('votcont').childNodes[0].innerHTML +='<li><input name="'+this.options['o_topic']+'" maxlength="150" class="votetit" type="text" for="'+this.param.eid+'" id="opt-'+this.param.opts+'" value="'+this.param.v_o_topic+'"/> <a href="javascript:;" id="h.del.'+this.param.opts+'" title="删除" class="link01 del">&nbsp;</a></li>'
		setTimeout(function(){$('opt-'+self.param.opts).focus();self.regHandle()},50)
	},
	setOpts : function(){
		var re = '',vopts= $('v-opts').value
		if (isInt(vopts) || vopts==''){return alert('请输入正整数！')}
		for (var i=0; i<$('v-opts').value; i++){
			re += '<li><input name="'+this.options['o_topic']+'" type="text" class="votetit" maxlength="150" id="opt-'+i+'"/> <a href="javascript:;" id="h.del.'+i+'" title="删除" class="del">&nbsp;</a></li>'
		}
		$('votbot').className='disnone'
		$('vtabd').className=''
		$('btnaddopts').className=''
		this.param.opts = i-1
		this.param.setMode = true
		$('votcont').innerHTML = '<ul>'+re+'</ul>'
		this.regHandle()
		this.Step(2)
	},
	Edit : function(id,t,json){
		if(!t){
			this.param.editid=id
			this.oJSN = xpow.JSN
			this.oJSN.Init(this.param.poststatu,this.param.post,'','vsi',0)
			return this.oJSN.Send('loadvoteopts&obj='+this.param.obj+'&dataid='+id);
		}
		switch(t){
		case 1:
			this.init()
			$('v-opts').value = 0
			$('v_topic').value = json.votes.topic
			for(var i in json.votes){
				this.$j('#setopts input').each(function(){
					if(this.name==i){if (this.value==json.votes[i]){this.checked=true}}
				})
			}
			this.setOpts()
			this.param.isedit=true
			for (var i in json){
				if (json[i].o_topic){
					this.param.eid = json[i].o_id
					this.param.v_o_topic = json[i].o_topic
					this.addOpts()
					this.param.v_o_topic = ''
					this.param.eid = ''
				}
			}
			
		}
	},
	Delete : function(id){
		if (!confirm('确定要删除这个调查吗？')){return }
		xpow.JSN.Init(this.param.poststatu,this.param.post,'','votelist',0)
		xpow.JSN.SendX('deletevote&dataid='+id,'opt=user');
	},
	regHandle : function(t){
		var tary = this.$j('#votcont a')
		var self = this
		tary.each(function(){
			this.onclick=function(){
				if(confirm('确定要删除此选项吗？'))self.$j(this).parent().remove()
				self.param.opts -=1
			}
		})
	},
	regHandleItem : function(){
		var self = this
		this.$j('#_votelist li a').each(function(){
			if(this.className.indexOf('edits')>0){
				self.$j(this).click(function(){
					self.Edit($g(this.parentNode,'param').evalJSON().id)
				})
			}
			if(this.className.indexOf('dels')>0){
				self.$j(this).click(function(){
					self.Delete($g(this.parentNode,'param').evalJSON().id)
				})
			}
		})
		
	},
	Cancel : function(){
		if (!confirm('确实要取消当前的设置吗？')){
			return	
		}
		this.oDLG.Clear()
	},
	addSucc : function(vid,tid){
		this.param.objvid = tid?tid:'voteid'
		this.param.ovid = $(this.param.objvid)
		this.param.ovlist = $('votelist')
		var re=''
		xpow.JSN.Init(this.param.poststatu,this.param.post,'','votelist',0)
		if (this.param.ovid){
			re = this.param.ovid.value;if (re){re +='|'+vid}else{re = vid};this.param.ovid.value = re
			re = re.toString().replace(/\|/ig,'-')
			xpow.JSN.SendX('loadvote&parentid='+this.param.parentid+'&dataid='+re+'&obj='+this.param.obj);
		}else{
			xpow.JSN.SendX('loadvote&parentid='+this.param.parentid+'&obj='+this.param.obj);
		}
		if(this.oDLG.Clear)this.oDLG.Clear()
	},
	Submit : function(){
		var self = this,ts = xpow.Use('letter').get(30),vtt,vot='',vts=xpow.Use('letter').get(32)
		var tary = self.$j('#votcont input[type=text][name='+this.options['o_topic']+'] ')
		this.param.foundErr = false
		vts = vts+vts+vts
		vtt = trim($(this.options['v_topic']).value)
		if (vtt==''){self.param.foundErr=true; $(this.options['v_topic']).focus(); alert('请输入调查主题！'); return false}
		
		tary.each(function(){
			this.value = trim(this.value).replace(/\$/ig,'').toReSymbol(ts,'')
			if (this.value==''){self.param.foundErr=true }
		})
		
		if (this.param.foundErr){return alert('请为每个选项输入标题！')}
		if (this.param.isedit){
			tary.each(function(i){
				vot += ($g(this,'for')?$g(this,'for'):'non'+i)+vts+trim(this.value).replace(/\$/ig,'').toReSymbol(ts,'')+'$$$'
			})
		}else{
			tary.each(function(i){
				vot += trim(this.value).replace(/\$/ig,'').toReSymbol(ts,'')+'$$$'
			})
		}
		var oopts = ''
		this.$j('#setopts input').each(function(){
			if(this.checked)oopts+=this.name+'='+this.value+ts
		})
		var ac = this.param.isedit?'editvote&dataid='+this.param.editid:'addvote'
		this.param.vtt = vtt
		this.param.msg = 'topic='+vtt+ts+'o_topic='+vot+ts+'iid='+vote.param.parentid+ts+'channel='+this.param.channel+ts+oopts
		this.oJSN.Init(this.param.poststatu,this.param.post,'','vsi',0)
		this.oJSN.SendX(ac+'&parentid='+vote.param.parentid,this.param.msg);
	},
	doSurvey : function(jsn){
		xpow.osEvent.catchSrc()
		var obj = xpow.osEvent.cSrcElmt,re='',did=$g(obj,'for'),csn=0
		var olist = this.$j('#voteitem_'+did+' input')
		if (jsn.needlogin==1&&!Parmas.ISLOGIN){
			return alert('请登陆后再进行投票！')	
		}
		olist.each(function(){
			if (this.checked){
				re += this.value + ','
				csn +=1
			}
		})
		if (csn==0){return alert('请至少选择一项！')}
		if (re)re = re.toLeft(1)+'&tim='+xpow.getDater.Get('toTimer',1)+'&dataid='+did
		this.parseChannel()
		xpow.JSN.Init('',this.param.post,'','vsi',0)
		xpow.JSN.Send('survey&checkid='+re+'&m='+re.MD5());
	},
	doView : function(){
		this.oDLG = xpow.Use('dlg')
		xpow.osEvent.catchSrc()
		var obj = xpow.osEvent.cSrcElmt,re='<div id="_voteview"></div>',did=$g(obj,'for'),csn=0
		xpow.point.setPop({topOffset:-100,mWidth:560})
		xpow.point.doPop(re,5.2)
		this.parseChannel()
		xpow.JSN.Init('\\\\/cm.ch/',this.param.post,'','_voteview',0)
		xpow.JSN.Send('loadvoterank&dataid='+did);
	}
});



(function($$){
$$.fn.jCarouselLite=function(o){
o=$$.extend({
	btnPrev:null,btnNext:null,btnGo:null,boxSn:null,mouseWheel:false,auto:0,speed:800,easing:null,
	vertical:false,circular:false,visible:4,start:0,scroll:1,beforeStart:null,afterEnd:null},o||{});
	
	return this.each(function(){
	var b=false,animCss=o.vertical?'top':'left',sizeCss=o.vertical?'height':'width';
	var c=$$(this),ul=$$('ul',c),tLi=$$('li',ul),tl=tLi.size(),v=o.visible,running=false;
	if (tLi.size()<=0 ){return}
	
	if(o.circular){ul.prepend(tLi.slice(tl-v-1+1).clone()).append(tLi.slice(0,v).clone());o.start+=v}
	var f=$$('li',ul),itemLength=f.size(),curr=o.start;c.css('visibility','visible');

	f.css({overflow:'hidden',float:o.vertical?'none':'left'});
	ul.css({margin:'0',padding:'0',position:'relative','list-style-type':'none','z-index':'1'});
	c.css({overflow:"hidden",position:'relative','z-index':'2',left:'0px'});

	var g=o.vertical?height(f):width(f),h=g*itemLength;var j=g*v, last=0
	
	f.css({width:f.width(),height:f.height()});ul.css(sizeCss,h+'px').css(animCss,-(curr*g));c.css(sizeCss,j+'px');
	xpow.emObj.Parmas.MultiUploader.ojsn={
		goPrv : function(){
			go(curr-o.scroll)
		},
		goNext :function() {
			go(curr+o.scroll)
		},
		goto :function(i) {
			go(i)
		}
	}
	
	if(o.btnPrev)$$(o.btnPrev).click(xpow.emObj.Parmas.MultiUploader.ojsn.goPrv);
	if(o.btnNext)$$(o.btnNext).click(xpow.emObj.Parmas.MultiUploader.ojsn.goNext);
	
	
	if(o.btnGo)$$.each(o.btnGo,function(i,a){$$(a).click(function(){return go(o.circular?o.visible+i:i)})});
	if(o.mouseWheel&&c.mousewheel)c.mousewheel(function(e,d){return d>0?go(curr-o.scroll):go(curr+o.scroll)});
	if(o.auto)setInterval(function(){go(curr+o.scroll)},o.auto+o.speed);
	xpow.emObj.Parmas.MultiUploader.vparam.curr = tl

	function fade(){
		//$$(f[curr]).fadeOut(o.speed);
		$$(f[curr]).fadeIn(o.speed, function() {removeFilter($$(this)[0])});
	};
	function removeFilter(element) {
		if(element.style.removeAttribute){
			element.style.removeAttribute('filter');
		}
	}
	function vis(){return f.slice(curr).slice(0,v)};
			
	function go(a){
		if(!b){
			if(o.beforeStart){o.beforeStart.call(this,vis())}
			if(o.circular){
				if(a<=o.start-v-1){
					ul.css(animCss,-((itemLength-(v*2))*g)+'px');
					curr=a==o.start-v-1?itemLength-(v*2)-1:itemLength-(v*2)-o.scroll
				}else if(a>=itemLength-v+1){
					ul.css(animCss,-((v)*g)+'px');
					curr=a==itemLength-v+1?v+1:v+o.scroll
				}else curr=a
			}else{
				if(a<0||a>itemLength-v)return;else curr=a}b=true;
				ul.animate(animCss=='left'?{left:-(curr*g)}:{top:-(curr*g)},o.speed,o.easing,function(){if(o.afterEnd)o.afterEnd.call(this,vis());b=false});
				if(!o.circular){
					$$(o.btnPrev+','+o.btnNext).removeClass('disabled')
					$$((curr-o.scroll<0&&o.btnPrev)||(curr+o.scroll>itemLength-v&&o.btnNext)||[]).addClass('disabled')
				}
			}
			//fade()
			if(o.boxSn)$$(o.boxSn)[0].innerHTML=curr+1;
			//$('_ssns').innerHTML = 'prv: '+curr+' # '+o.scroll
			return false
		};
	})
	
};
function css(a,b){ if (a[0]) return parseInt($$.css(a[0],b))||0};
function width(a){ if (a[0]) return a[0].offsetWidth+css(a,'marginLeft')+css(a,'marginRight')};
function height(a){ if (a[0]) return a[0].offsetHeight+css(a,'marginTop')+css(a,'marginBottom')}
})(jQuery);


(function(){
	var $a=[];
	var $b=[];
	var $c=[];
	var $d=false;
	var $e=null;
	var $f=true;
	var $bk='';
	var $g=function(){
		$b.push($e);
		$a=$c.concat($a);
		$c.length=0;
		if(!$a.length){$d=false;return false;};
		$e=$a.shift();
		$d=true;
		if($h.call($b,$e)+1){arguments.callee();}else{$i();}
	};
	var $i=function(){
		$d=true;
		var t=typeof $e;
		if(t=='function'){$e();$g();};
		if(t=='string'){
			d=$e.split(' ');
			$jj(d[0],$g,d[1])
		}
	};
	var $k=function(T,cbk){$c.push(T); $bk=cbk; $l();};
	var $m=function(){$a=$c.concat($a);$c.length=0;};
	var $l=function(){
		if($d){return;};
		$c.reverse();
		$a=$c.concat($a);
		$c.length=0;
		$e=$a.shift();
		$i();
	};
	var $h=function(d){for(var b=0;b<this.length;b++){if(this[b]===d){return b;}};return -1;};
	var $jj=function($n,$o,$p){
		$p=$p||'utf-8';
		var t
		switch(xpow.point.Path.getApp($n).toLowerCase()){
		case 'css':
			t=document.createElement('link');
			t.type='text/css';
			t.charset=$p;
			t.href=$n;
			t.rel='stylesheet' 
			break
		case 'js':
			t=document.createElement('script');
			t.type='text/javascript';
			t.charset=$p;
			t.src=$n;
			break
		}
		
		document.getElementsByTagName('HEAD').item(0).appendChild(t);
		var $q=$o||function(){};
		var $r=function(){
			//if ($bk) { $bk() }
			if(t.onreadystatechange){t.onreadystatechange=null;}else{t.onload=null;};
			$r=null;
			$bk=null;
			$q()
			//document.getElementsByTagName('head')[0].removeChild(t);
		};

		var done=false
		if ( !done && (!t.readyState || t.readyState == 'loaded' || t.readyState == 'complete') ) {
			done = true;$r();
		}else{
			t.onload = t.onreadystatechange = function(){
				if ( !done && (!this.readyState || this.readyState == 'loaded' || t.readyState == 'complete') ) {
					done = true;$r();
				}
			}
		}
	};
	window.Import=$k;
	window.ImportEnd=$m;}
)();

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  tagifyText: function(element) {
    if(typeof Builder == 'undefined')
      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
      
    var tagifyStyle = 'position:relative';
    if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';
    
    element = $(element);
    $A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || {});
    Effect[element.visible() ? 
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

var Effect2 = Effect; // deprecated

if (typeof Class=='undefined'){
	var Class = {  create: function() {
		return function() {
		  this.initialize.apply(this, arguments);
		}
	  }
	}
};

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
  initialize: function() {
    this.effects  = [];
    this.interval = null;    
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();
    
    var position = (typeof effect.options.queue == 'string') ? 
      effect.options.queue : effect.options.queue.position;
    
    switch(position) {
      case 'front':
        // move unstarted effects after this effect  
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }
    
    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);
    
    if(!this.interval)
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if(this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    for(var i=0, len=this.effects.length;i<len;i++) 
      this.effects[i] && this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

/* ------------- transitions ------------- */
Effect.Transitions = {
  linear: Prototype.K,
  sinoidal: function(pos) {
    return (-Math.cos(pos*Math.PI)/2) + 0.5;
  },
  reverse: function(pos) {
    return 1-pos;
  },
  flicker: function(pos) {
    var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
    return (pos > 1 ? 1 : pos);
  },
  wobble: function(pos) {
    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
  },
  pulse: function(pos, pulses) { 
    pulses = pulses || 5; 
    return (
      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
      );
  },
  none: function(pos) {
    return 0;
  },
  full: function(pos) {
    return 1;
  }
};

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   0.3,   // seconds
  fps:        100,   // 100= assume 66fps max.
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.2,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    function codeForEvent(options,eventName){
      return (
        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
      );
    }
    if(options.transition === false) options.transition = Effect.Transitions.linear;
    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn+(this.options.duration*1000);
    this.fromToDelta  = this.options.to-this.options.from;
    this.totalTime    = this.finishOn-this.startOn;
    this.totalFrames  = this.options.fps*this.options.duration;
    
    eval('this.render = function(pos){ '+
      'if(this.state=="idle"){this.state="running";'+
      codeForEvent(options,'beforeSetup')+
      (this.setup ? 'this.setup();':'')+ 
      codeForEvent(options,'afterSetup')+
      '};if(this.state=="running"){'+
      'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
      'this.position=pos;'+
      codeForEvent(options,'beforeUpdate')+
      (this.update ? 'this.update(pos);':'')+
      codeForEvent(options,'afterUpdate')+
      '}}');
    
    this.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if(timePos >= this.startOn) {
      if(timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if(this.finish) this.finish(); 
        this.event('afterFinish');
        return;  
      }
      var pos   = (timePos - this.startOn) / this.totalTime,
          frame = Math.round(pos * this.totalFrames);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if(this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    var data = $H();
    for(property in this)
      if(typeof this[property] != 'function') data[property] = this[property];
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if(effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
  initialize: function() {
    var options = Object.extend({
      duration: 0
    }, arguments[0] || {});
    this.start(options);
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});


Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
	  obj:    {},
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
	if (!this.element.makePositioned){
		  this.element.makePositioned=function(element) {
			element = $(element);
			var pos = Element.getStyle(element, 'position');
			if (pos == 'static' || !pos) {
			  element._madePositioned = true;
			  element.style.position = 'relative';
			  if (window.opera) {
				element.style.top = 0;
				element.style.left = 0;
			  }
			}
			return element;
		}
	}
	this.element.makePositioned(this.element);
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
    });
	if(this.options.obj)this.options.obj.onmove=false
  }
});

Effect.MoveBy = function(element, toTop, toLeft, pos, pobj) {
  return new Effect.Move(element, 
    Object.extend({ x: toLeft, y: toTop, mode:(pos)?pos:'relative',obj:pobj }, arguments[3] || {}));
};

