﻿BlogCnFloatables = { //可随滚动条移动
	items: new Array(),
	add: function (){		
		for (var i=0; i<arguments.length; i++){
			if (typeof(arguments[i]) == "string" )
				this.items.push($(arguments[i]))
			else
				this.items.push(arguments[i])
			this.items[this.items.length-1].x = this.items[this.items.length-1].y = 0
			this.items[this.items.length-1].style.position = "absolute" 
		}
	},
	move: function(){
		for (var i=0; i<this.items.length; i++){
			var percent;		
			var diffY = document.body.scrollTop;
			if(diffY != this.items[i].y)  {
				percent = .5 * (diffY - this.items[i].y);      
				percent =(percent > 0)?Math.ceil(percent):Math.floor(percent);  
				this.items[i].style.top = (parseInt(this.items[i].style.top || this.items[i].offsetTop)+percent)+"px";
				this.items[i].y += percent;
			}

			var diffX = document.body.scrollLeft; 
			if(diffX != this.items[i].x) {
				percent = .5 * (diffX - this.items[i].x);
				percent =(percent > 0) ?Math.ceil(percent):Math.floor(percent); 
				this.items[i].style.left = (parseInt(this.items[i].style.left || this.items[i].offsetLeft)+percent)+"px";
				this.items[i].x +=  percent;
			}
		}//for
	},
	start: function(){
		setInterval(this.move.bind(this), 100)
		//setTimeout(this.move.bind(this), 1000)
	}
}//BlogCnFloatables

BlogCnOverTurnables = { //可翻转的，建议只用图片，flash在ff中显示不正常。
	items: new Array(),
	add: function (element) {
		var e = element
		e.style.overflow = "hidden"   //设CSS样式超出部分隐藏
		e.style.position = "relative" //设CSS样式超出部分隐藏
		var options = {
		  speed: 50, //unit: ms
		  delay: 5, //unit:s
		  step: 10,
		  direction: 1 //1 向上， 2向左，(后面TODO:)其他 
		}.extend(arguments[1] || {})
		if (options.direction == 1) { //up
			var size = parseInt(e.style.height)
			var styleP = "top"
			var styleP2 = "left"
		} else if (options.direction == 2) {
			var size = parseInt(e.style.width)
			var styleP = "left"
			var styleP2 = "top"
		}//if	
		var childs = e.childNodes
		for (var i=0; i< childs.length; i++) {
			childs[i].style.position = "absolute"
			childs[i].style[styleP] = (i*size)+"px"
			childs[i].style[styleP2] = "0px"
		}//for
		this.items.push(e)
		var i = this.items.length-1
		this.items[i].options = options
		setTimeout("BlogCnOverTurnables.move("+i+")", options.delay*1000)		
	}//add
	,
	move: function (index) {
		var e = this.items[index]
		var step = this.items[index].options.step
		var speed = this.items[index].options.speed
		var delay = this.items[index].options.delay
		var size = (this.items[index].options.direction == 1) ? parseInt(e.style.height) : parseInt(e.style.width) //TODO: 根据不同的direction参数取不同的值
		var childs = e.childNodes
		var len = childs.length
		var strDirection = (this.items[index].options.direction == 1) ? "top" : "left" //TODO: 根据不同的direction参数取不同的值
		this.isEnd = function (childs, size, step, count, strDirection) {
			for (var i=0; i<count; i++) {
				if (parseInt(childs[i].style[strDirection])<=-size+step) return true
			}//for
		}//isEnd
		this.getPosition = function (currentPosition, count, size) {
			var p = currentPosition
			for (var i=0; i<count; i++) {
				if (p<i*size) {
					if ((i-1)<0) return (count-1)*size+"px"
					return ((i-1)*size)+"px"
				}
			}//for
		}//getPosistion
		if (this.isEnd(childs, size, step, len, strDirection)) { //如果到顶点	
			for (var i=0; i<len; i++) {
				childs[i].style[strDirection] = this.getPosition(parseInt(childs[i].style[strDirection]), len, size)
			}
			setTimeout("BlogCnOverTurnables.move("+index+")", delay*1000)
		} else { //没到顶点	
			for (var i=0; i<len; i++) {
				childs[i].style[strDirection] = (parseInt(childs[i].style[strDirection]) - step) + "px"
			}
			setTimeout("BlogCnOverTurnables.move("+index+")", speed)
		}
	}//move	
} //BlogCnOverTurnables

BlogCnSwapables = { //可交替，只能用图片，Flash设置zIndex没有用
	items: new Array(),
	add: function (element) {
		var e = element
		e.style.position = "relative" //设CSS样式超出部分隐藏
		var options = {
		  delay: 10 //unit:s
		}.extend(arguments[1] || {})
		var childs = e.childNodes
		for (var i=0; i< childs.length; i++) {
			childs[i].style.position = "absolute"
			childs[i].style.top = childs[i].style.left = "0px"
			childs[i].style["zIndex"] = childs.length-i
		}//for
		this.items.push(e)
		var i = this.items.length-1
		this.items[i].options = options
		setTimeout("BlogCnSwapables.swap("+i+")", options.delay*1000)		
	}//add
	,
	swap: function (index) {
		var e = this.items[index]
		var options = this.items[index].options
		var childs = e.childNodes
		var count = childs.length

		this.getMaxMinIndex = function (childs) {
			var max = min = childs[0]
			for (var i=1; i<childs.length; i++) {
				if (childs[i].style.zIndex > max.style.zIndex) max = childs[i]
				if (childs[i].style.zIndex < min.style.zIndex) min = childs[i]
			}//for
			return [max,min]
		} // getMaxMinIndex

		var arrMaxMinIndex = this.getMaxMinIndex(childs)
		arrMaxMinIndex[0].style.zIndex = parseInt(arrMaxMinIndex[1].style.zIndex) - 1  //最大的换成最小的。

		for (var i=0; i<count; i++) {
			childs[i].style.zIndex = parseInt(childs[i].style.zIndex) + 1
		}//for
		setTimeout("BlogCnSwapables.swap("+index+")", options.delay*1000)	
	}//swap	
}//BlogCnSwapables

BlogCnFadables = {//可以一定的方式消失
	items: new Array(),
	addHideAfter: function (element, second) {//在一定的时间后消失
		this.items.push(element)
		var i = this.items.length - 1
		setTimeout("BlogCnFadables.hide("+i+")", second*1000)
	}//addFadeAfter
	,
	hide: function (index) { //直接隐藏
		var element = $(this.items[index])
		if (element.style.display != "none") element.style.display = "none"
	}//hide
}//BlogCnFadables

BlogCnTools = {
	createElement: function (elementAttrObj) { //创建元素
		var o = elementAttrObj
		var e = document.createElement(o.tag)
		for (var p in o){
			if (p == "tag" || p == "style") continue
			e[p] = o[p]
		}//for	
		if (o.style) { //如果需要设置style
			for (var p in o.style){
				e.style[p] = o.style[p]
			}//for
		}//if
		return e
	}//createElement
	,
	insertElement: function (element) { //插入对象	
		if (!document.body) this.log("no document.body")
		var bo = document.body.firstChild;
		document.body.insertBefore(element, bo);	
	}//insertElement
	,
	getUniqueId: function() {
		var d = new Date()
		return ""+d.getYear()+d.getMonth()+d.getDate()+d.getTime()
	}//getUniqueID
	,
	log: function (v) {
		//alert(v)
	}//log
}//BlogCnTools

_BlogCnAd = {
	id:"",
	show: function (id) {
		this.id = id;
		document.write('<script src="http://gg.blogcn.com/cgi-bin/class/AD.DataProvider/ADData.aspx?act=Get&id='+id+'" charset="gb2312"><'+'/script>');
	}
	,

	_show: function (arrAd) {
		if (this[arrAd[0].showType+"Ad"]) 
			this[arrAd[0].showType+"Ad"](arrAd)
		else
			document.write("数据出错")
	}
	,
	getAdObj: function (arrAd, count) { //获得广告对象，count为0，返回全部。1 返回一个。 n 返回n个，如果n大于实际数量则返回全部
		var arrAdObj = arrAd.slice(1)
		this.sort = function (arr) { //按order排序
			var p = "order"
			for (var i=1; i<arr.length; i++) {
				for (var j=0; j<i; j++) {
					arr[i][p] = arr[i][p] || 0 //假如没有设置order，则order为 0
					arr[j][p] = arr[j][p] || 0
					if (arr[i][p]>arr[j][p]) {
						var tmp = arr[j]
						arr[j] = arr[i]
						arr[i] = tmp
					}
				}//for j				
			}//for i
			return arr
		}//sort

		this.getRandom = function () {
			var probSum = 0
			for (var i=0; i<arrAdObj.length; i++){
				probSum += (arrAdObj[i].prob || 0)
			}//for	
			if (0 == probSum) { //TODO:这里随机添加了一个，如果需要一次取多个的时候会有重复的可能
					var len = arrAdObj.length
					var intR = Math.floor(Math.random()*len)
					var o = arrAdObj[intR]
					while (o.selected){
						window.status = parseInt(window.status)+1
						intR = Math.floor(Math.random()*len)
						o = arrAdObj[intR]
					}				
					o.selected = true
					this.arrRe.push(o)				
					return
			}//if
			var r = Math.ceil(Math.random()*probSum)
			probSum = 0
			for (var i=0; i<arrAdObj.length; i++){
				probSum += (arrAdObj[i].prob || 0)
				if (probSum >= r) {
					this.arrRe.push(arrAdObj[i])
					arrAdObj[i].prob = 0 //已经添加的下次不再添加
					return
				}
			}//for
		}//getRandom
		if ( (0==count) || (count >= arrAdObj.length) )
			if (1==count) return [arrAdObj[0]] //返回一个
			else return this.sort(arrAdObj) //全部返回		

		this.arrRe = new Array()
		for (var i=0; i<count; i++) {
			this.getRandom()
		}//for
		
		if (1 == count) return [this.arrRe[0]] //只返回一个
		return this.sort(this.arrRe)
	}//getAdObj
	,
	
	floatAd: function (arrAd) { //页面浮动图层广告
		//如果是对联广告，根据分辨率情况是否需要显示。
		if (arrAd[0].availWidth && (arrAd[0].availWidth > screen.availWidth-1) ) return; //对联广告的有效宽度大于实际有效宽度就不输出
		var oStyle = new Object() //针对FloatAd需要的style对象
		oStyle.position = "absolute"
		oStyle.zIndex = 99
		if (arrAd[0].height) oStyle.height = arrAd[0].height
		if (arrAd[0].width) oStyle.width = arrAd[0].width
		if (arrAd[0].top) oStyle.top = arrAd[0].top
		if (arrAd[0].left) oStyle.left = arrAd[0].left
		//判断是否居中
		if (oStyle.left && (oStyle.left.toLowerCase() == "center")) oStyle.left = (screen.availWidth-oStyle.width)/2		
		if (arrAd[0].bottom) oStyle.bottom = arrAd[0].bottom
		if (arrAd[0].right) oStyle.right = arrAd[0].right
		var innerHtml = this.getCode( this.getAdObj(arrAd, 1)[0] ) 
		//if (arrAd[0].closable) //需要关闭 
		if (1) //需要关闭 
			innerHtml += this.getCloseButton()
		var o = {
			tag: "DIV",
			style: oStyle,
			innerHTML: innerHtml
		}
		var e = BlogCnTools.createElement(o)
		BlogCnTools.insertElement(e)
		if (arrAd[0].movable) { //需要移动
			BlogCnFloatables.add(e)
			BlogCnFloatables.start()
		}//if
		if (arrAd[0].fadable) { //需要隐藏
			var time = arrAd[0].time || 5
			BlogCnFadables.addHideAfter(e, time)
		}//if
	}//floatAd
	,
	fixedAd: function (arrAd) { //固定位置的浮动图层广告
		var strStyle = 'position: absolute'
		if (arrAd[0].height) strStyle += ';height: ' + arrAd[0].height
		if (arrAd[0].width) strStyle += ';width: ' + arrAd[0].width
		if (arrAd[0].top) strStyle += ';top: ' + arrAd[0].top
		if (arrAd[0].left) strStyle += ';left: ' + arrAd[0].left
		if (arrAd[0].bottom) strStyle += ';bottom: ' + arrAd[0].bottom
		if (arrAd[0].right) strStyle += ';right: ' + arrAd[0].right
		var innerHtml = this.getCode( this.getAdObj(arrAd, 1)[0] ) 
		if (arrAd[0].closable) //需要关闭 
		//if (1) //需要关闭 
			innerHtml += this.getCloseButton()
		var strRe = '<div style="position: absolute;z-index:99">'
					+'<div style="'+strStyle+'">'+innerHtml+'</div>'
					+'</div>'
		document.write(strRe)
	}//fixedAd
	,
	popwinAd: function (arrAd) { //弹出窗口广告
		if (arrAd[0].popType&1){
			var s =  'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbar=yes,resizable=no,copyhistory=yes'
			if (arrAd[0].height) s += ',height='+arrAd[0].height
			if (arrAd[0].width) s += ',width='+arrAd[0].width
			if (arrAd[0].top) s += ',top='+arrAd[0].top + ',screenY='+arrAd[0].top
			if (arrAd[0].left) s += ',left='+arrAd[0].left + ',screenX='+arrAd[0].left
			var adObj = this.getAdObj(arrAd, 1)[0]
			var strFun = "new function () {_PopAdWin = open('"+adObj.url+"', '','"+s+"'); _PopAdWin.adid = "+ adObj.adId +";  _PopAdWin.pid = '"+ this.id +"'; }" 
			this.addShowCount(adObj.adId, this.id)
			window.__PopWinFunction = function () {eval(strFun)}
		}//if
		if (arrAd[0].popType&4) { //关闭时弹出
			if (window.attachEvent) window.attachEvent("onunload",__PopWinFunction) //ie
			if (window.addEventListener) window.addEventListener("unload",__PopWinFunction,false) //mozilla
		} else { //直接弹出
			eval(strFun)
			if (arrAd[0].popType&2) //后台弹出(背投)
				window.focus()
		}//if
	}//popwinAd
	,
	overturnAd: function (arrAd) { //翻转广告
		var cols = arrAd[0].cols || 1 //每行个数
		var rows = arrAd[0].rows || 0  //行数，0为任意
		var direction = arrAd[0].direction || 1 //1为up		
		var arrAdObj = this.getAdObj(arrAd, cols*rows)
		var strRe = ""		
		for (var i=0; i<arrAdObj.length; ) { 
			if (direction == 1) {
				strRe += '<div>'
				for (var j=0; j<cols; j++) {
					if (i>=arrAdObj.length) break
					strRe += '<span>'+this.getCode(arrAdObj[i])+'</span>'
					i++ //这里增加
				}//for
				strRe += '</div>'
			}//if
		}//for
		var options = ""
		if (arrAd[0].delay) options += ",delay:" + arrAd[0].delay
		if (arrAd[0].speed) options += ",speed:" + arrAd[0].speed
		if (arrAd[0].step) options += ",step:" + arrAd[0].step
		if (arrAd[0].direction) options += ",direction:" + arrAd[0].direction
		options = "{"+options.substr(1)+"}"
		var strId = "ad"+BlogCnTools.getUniqueId()
		strRe = '<div id="'+strId+'" style="overflow: hidden; width:'+arrAd[0].width+'; height:'+arrAd[0].height+';">' + strRe + '</div>'
		document.write(strRe)
		//alert(strRe)
		var strFunc = "BlogCnOverTurnables.add"
		if (arrAd[0].swapable) strFunc = "BlogCnSwapables.add"
		setTimeout(strFunc+"(document.getElementById(\""+strId+"\"),"+options+")",200)
	}//overturnAd
	,
	marqueeAd: function (arrAd) { //跑马灯广告
		var cols = arrAd[0].cols || 1 //每行个数
		var rows = arrAd[0].rows || 0  //行数，0为任意
		var direction = arrAd[0].direction || 'left' //方向	
		var speed = 2 //速度
		var arrAdObj = this.getAdObj(arrAd, cols*rows)
		var strRe = ""		
		for (var i=0; i<arrAdObj.length; ) { 
			//strRe += '<div>'
			for (var j=0; j<cols; j++) {
				if (i>=arrAdObj.length) break
				strRe += '<span>'+this.getCode(arrAdObj[i])+'&nbsp;&nbsp;</span>'
				i++ //这里增加
			}//for
			//strRe += '</div>'
		}//for
		strRe = '<marquee direction='+direction+' scrollamount='+speed+' onmouseover=this.stop() onmouseout=this.start() style="width:'+arrAd[0].width+'; height:'+arrAd[0].height+';">' + strRe + '</marquee>'
		document.write(strRe)
	}//marqueeAd
	,
	normalAd: function (arrAd) { //直接显示在页面调用广告的位置
		var cols = arrAd[0].cols || 1 //每行个数
		var rows = arrAd[0].rows || 1  //行数	
		var arrAdObj = this.getAdObj(arrAd, cols*rows)
		var strRe = ""		
		for (var i=0; i<arrAdObj.length; ) {
			strRe += '<div class="css'+this.id+'Div"><nobr>'
			for (var j=0; j<cols; j++) {
				if (i>=arrAdObj.length) break
				strRe += '<span class="css'+this.id+'Span">'+this.getCode(arrAdObj[i])+'</span>' //TODO:这里的class怎么设置
				i++ //这里增加
			}//for
			strRe += '</nobr></div>'
		}//for
		var id = BlogCnTools.getUniqueId()
		strRe = '<div id='+id+' style="width:'+arrAd[0].width+'; height:'+arrAd[0].height+';">' + strRe + '</div>'
		if (arrAd[0].fadable) { //需要隐藏
			strRe = '<div style="text-align: center">'+strRe+'</div>'
			var time = arrAd[0].time || 5
			BlogCnFadables.addHideAfter(id, time)
		}//if
		//prompt("",strRe)
		document.write(strRe)
	}//normalAd
	,
	getCode: function (objAd) {
		this.addShowCount(objAd.adId, this.id)
		var codeType = objAd.url.replace(/.+\.(.+)$/gi,"$1").toLowerCase()
		if (this["get"+codeType]){
			objAd.url = "http://images.blogcn.com/AD" + objAd.url;
			return this["get"+codeType](objAd)
		}//if
		return this.gettext(objAd) //返回文字广告
	}//getCode
	,
	getgif: function (objAd) {
		var w = objAd.width?' width="'+objAd.width+'"':""
		var h = objAd.height?' height="'+objAd.height+'"':""
		return '<a class="css'+this.id+'" href="'+objAd.gourl+'" onclick="_BlogCnAd.addClickCount('+objAd.adId+',\''+this.id+'\')" target="_blank">'
				+'<img'+w+h+' src="'+objAd.url+'" border="0"/>'
				+'</a>'	
	}//getgif
	,
	getjpg: function (objAd) {return this.getgif(objAd)},
	getpng: function (objAd) {return this.getgif(objAd)},
	getjpeg: function (objAd) {return this.getgif(objAd)},
	getswf: function (objAd) {
		return ( '<span class="css'+this.id+'"><button onclick="window.open(\''+objAd.gourl+'\');_BlogCnAd.addClickCount('+objAd.adId+',\''+this.id+'\')"'
		+'style="width:'+objAd.width+'px;height:'+objAd.height+'px;background:transparent;border:0;padding:0;margin: 0px;">'
		+'<object id="swf'+this.id+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'
		+'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"'
		+' width="'+objAd.width+'" height="'+objAd.height+'">'
		+'<param name="movie" value="'+objAd.url+'">'
		+'<param name="quality" value="high">'
		+'<param name="wmode" value="transparent">'
		+'<embed id="swf'+this.id+'" wmode="transparent" src="'+objAd.url+'" quality="high"'
		+'pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"'
		+' width="'+objAd.width+'" height="'+objAd.height+'"></embed></object>'
		+'</button></span>'
		+'<SCRIPT FOR="swf'+this.id+'" EVENT="FSCommand(command,args)" LANGUAGE="JavaScript">_BlogCnAd.addClickCount('+objAd.adId+',\''+this.id+'\')<'+'/script></span>'
		)
	}//getswf
	,
	gettext: function (objAd) {
		if (objAd.type == 1)
		return '<a style="line-height: '+objAd.height+'px;" class="css'+this.id+'" href="'+objAd.gourl+'" onclick="_BlogCnAd.addClickCount('+objAd.adId+',\''+this.id+'\')" target="_blank">'
				+objAd.url
				+'</a>'	
		return '<div onclick="_BlogCnAd.addClickCount('+objAd.adId+',\''+this.id+'\')">'+objAd.url+'</div>'	
	}//gettext
	,
	getCloseButton: function () {
		return '<span title="关闭" onclick="this.parentNode.style.display=\'none\'" '
						+'style="z-index: 99;position: absolute;right: 0px;top: 0px;cursor: hand;cursor: pointer">'
						+'<img src="http://gg.blogcn.com/cgi-bin/img/close.gif" border="0"/></span>'
	}//getCloseButton
	,
	addShowCount: function (adId, pid) {
		var param = "adid="+adId+"&pid="+pid
		//alert(param)
		//TODO:增加广告显示次数
		//new Ajax.Request('http://www.blogcn.com', {method:"get", parameters:"a=b&c=0",onComplete:completeFunc});
		//completeFunc
		//BlogCnTools.log("第"+adId+"号广告显示增加一次")
	}//addShowCount
	,

	addClickCount: function (adId, pid) {
		var param = "adid="+adId+"&pid="+pid			
		new Ajax.Request('http://www.blogcn.com/advertisementwebcount/webcount.asp', {method:"get", parameters: param});
	}//addClickCount
}//_BlogCnAd