
function floatBox(){
	this.init.apply(this, arguments);
}

floatBox.prototype = {
	init: function(boxId, closeId, slideSpace, expireTime){
		this.interval = null;
		this.boxId = boxId;
		this.boxNode = this.getNodeById(boxId);

		this.closeId = closeId;
		this.closeNode = this.getNodeById(closeId);
		
		this.expireTime = expireTime;
		if(!this.expireTime) this.expireTime = 0;

		if(this.boxNode){
			if(isNaN(slideSpace)) this.slideSpace = this.boxNode.offsetHeight / 10;
			else this.slideSpace = slideSpace / 10;
			if(this.getCookie() == this.boxId) return;
		}
		else return;
		
		this.boxSetTop = false;
		this.boxTop = parseInt(this.getCssStyle(this.boxNode, "top"));
		if(isNaN(this.boxTop)) this.boxTop = document.documentElement.clientHeight;
		else this.boxSetTop = true;
		this.boxHeight = parseInt(this.boxNode.offsetHeight);

		this.boxSetLeft = false;
		this.boxLeft = parseInt(this.getCssStyle(this.boxNode, "left"));
		if(isNaN(this.boxLeft)) this.boxLeft = document.documentElement.clientHeight;
		else this.boxSetLeft = true;
		this.boxWidth = parseInt(this.boxNode.offsetWidth);

		this.boxOpacity = parseFloat(this.getCssStyle(this.boxNode, "opacity"));
		if(isNaN(this.boxOpacity)) this.boxOpacity = 10;

		var obj = this;
		if(this.closeNode){
			this.closeNode.onmouseover = function(){
				obj.closeNode.className = obj.closeId + "_over";
				return false;
			};
			this.closeNode.onmouseout = function(){
				obj.closeNode.className = obj.closeId + "_out";
				return false;
			};
			this.closeNode.onclick = function(){
				clearTimeout(obj.interval);
				obj.floatIn(obj.boxOpacity, -1);
				obj.setCookie();
				return false;
			};
		}

		this.floatIn(0, 1);
	},

	floatIn: function(percent, flag){
		if(((percent <= this.boxOpacity) && (flag > 0)) || ((percent >= 0) && (flag < 0))){
			this.boxNode.style.filter = "Alpha(opacity=" + percent * 10 + ")";
			this.boxNode.style.opacity = percent / 10;
			this.boxNode.style.top = (this.getTop(0) - this.slideSpace * (percent - 10)) + "px";
			this.boxNode.style.left = this.getLeft() - this.boxNode.offsetWidth + "px";
			
			percent += flag;
			this.interval = setTimeout(this.floatIn.bind(this, percent, flag), 50);
		}
		else {
			clearTimeout(this.interval);
			if(flag > 0){
				this.topSpace = this.boxNode.offsetTop;
				this.interval = setInterval(this.checkWindow.bind(this), 1);
			}
			else {
				this.boxNode.style.display = "none";
			}
		}
	},
	
	checkNavigator: function(){
		if(navigator.userAgent.indexOf("Safari") != -1) return 1;
		else return 0;
	},

	checkWindow: function(){
		this.topSpace += Math.ceil(this.getTop() / 10);
		if((this.boxNode.offsetTop > (this.topSpace - 1)) && (this.boxNode.offsetTop < (this.topSpace + 1))) this.topSpace = this.getTop(0);
		this.boxNode.style.top = this.topSpace + "px";

		this.boxNode.style.left = this.getLeft() - this.boxNode.offsetWidth + "px";
	},

	getCookie: function(){
		if(document.cookie.length > 0){
			var cookie_end;
			var cookie_start = document.cookie.indexOf(this.obj_id + "=");
			if(cookie_start != -1){
				cookie_start = cookie_start + this.obj_id.length + 1;
				cookie_end = document.cookie.indexOf(";", cookie_start);
				if(cookie_end == -1) cookie_end = document.cookie.length;
				return unescape(document.cookie.substring(cookie_start, cookie_end));
			}
		}
		return "";
	},

	setCookie: function(method){
		var date = new Date();
		var cookie_value = this.boxId;

		if(isNaN(this.expireTime) || method == "del") date.setTime(date.getTime() - 10000);
		else date.setTime(date.getTime() + this.expireTime * 1000 * 60);
		document.cookie = this.boxId + "=" + escape(cookie_value) + "; expires=" + date.toGMTString();
	},

	getTop: function(styleTop){
		var objTop = 0;
		var winTop = 0;
		if(styleTop == undefined) objTop = this.boxNode.style.top.replace("px", "");
		if(this.boxSetTop) this.boxTop = parseInt(document.documentElement.clientHeight);

		//document.getElementById("a").innerHTML += !this.boxSetTop + "<br>";

		switch(this.checkNavigator()){
			case 1: winTop = parseInt(window.pageYOffset); break;
			default: winTop = parseInt(document.documentElement.scrollTop); break;
		}

		return winTop - objTop - this.boxHeight + this.boxTop - 5;
	},

	getLeft: function(styleLeft){
		var bodyWidth = document.body.offsetWidth;
		var bodyLeft = (document.documentElement.clientWidth - bodyWidth) / 2;

		/*
		if(style_left == undefined) theleft = this.boxNode.style.left.replace("px", "");
		if(!this.set_left) this.boxLeft = parseInt(document.documentElement.clientWidth);
		*/
		return bodyWidth + bodyLeft;
	},

	getCssStyle: function(obj, type){
		var value = null;
		//for(var x in obj.currentStyle) document.getElementById("debug").innerHTML += x + " : " + obj.currentStyle[x] + "<br>";

		if(obj.currentStyle){
			if(type == "opacity") value = parseInt(obj.currentStyle['filter'].replace(/[^\d]/gi, "")) / 10;
			else value = obj.currentStyle[type];
		}
		else if(window.getComputedStyle){
			type = type.toLowerCase();
			value = parseFloat(document.defaultView.getComputedStyle(obj, null)[type]) * 10;
		}
		return value;
	},

	getNodeById: function(idname){
		var tags;
		var bodyhtml = document.body.innerHTML;
		var reg = new RegExp("<(\\w*)([^>]*) id=([\'\"]?)" + idname + "\\3(>| [^>]+>)", "i");
		bodyhtml.replace(reg, function(){ tags = arguments[1]; });

		var getags = document.getElementsByTagName(tags);
		for(i = 0; i < getags.length; i++){
			if(getags[i].id == idname) return getags[i];
		}
		return null;
	}
};

new floatBox("gotop", "top_close", "30", "1");

