/**
 * Static banner
 *
 * @
 * @changelog
 *  2006. 11. 16 release
 */

if (typeof U2 == 'undefined')
{
	U2 = {};
	U2.VERSION = '0.7.2';
	U2.$=function(){var ret=[];for(var i=0;i<arguments.length;i++){if(typeof arguments[i]=='string')ret.push(document.getElementById(arguments[i]));else ret.push(arguments[i])};return ret[1]?ret:ret[0]};U2.$C=function(tag){return document.createElement(tag)};U2.$A=function(collection){var ret=[];for(var i=0;i<arguments.length;i++)ret.push(arguments[i]);return ret};U2.Func={bind:function(func,obj){var a=U2.Array.toArray(arguments);a.shift();a.shift();return function(){func.apply(obj,a)}},bindForEvent:function(func,obj){return function(e){return func.call(obj,e||window.event)}}};U2.Array={has:function(arr,needle){for(var i=0;i<arr.length;i++){if(arr[i]==needle)return true};return false},indexOf:function(arr,needle){if(arr.indexOf){return arr.indexOf(needle)}else{for(var i=0;i<arr.length;i++)if(arr[i]==needle)return i}},each:function(arr,iter){for(var i=0;i<arr.length;i++){arr[i]=iter(arr[i],i)};return arr},filter:function(arr,iter){var ret=[];for(var i=0;i<arr.length;i++){if(iter(arr[i],i))ret.push(arr[i])};return ret},toArray:function(collection){var arr=[];for(var i=0;i<collection.length;i++){arr.push(collection[i])};return arr}};U2.Class=function(){var obj=function(){if(this.__const)this.__const.apply(this,arguments)};obj.prototype.free=function(){if(this.__destruct)this.__destuct()};if(arguments[0])U2.Class.extend(obj.prototype,arguments[0]);return obj};U2.Class.extend=function(superCls){var obj=superCls;for(var i=0;i<arguments.length;i++){if(arguments[i]){for(var x in arguments[i])obj[x]=arguments[i][x]}};return obj};U2.Event={register:function(oEl,sEvent,pFunc){oEl=U2.$(oEl);if(oEl.addEventListener){oEl.addEventListener(sEvent,pFunc,false)}else if(oEl.attachEvent){oEl.attachEvent('on'+sEvent,pFunc)}},unregister:function(oEl,sEvent,pFunc){oEl=U2.$(oEl);if(oEl.removeEventListener){oEl.removeEventListener(sEvent,pFunc)}else if(oEl.detachEvent){oEl.detachEvent('on'+sEvent,pFunc)}},stop:function(e){if(e.stopPropagation&&e.preventDefault){e.stopPropagation();e.preventDefault()}else{e.returnValue=false;e.cancelBubble=true}}};
}
if (typeof U2.Effect == 'undefined')
{
	U2.Effect = new Object;
}

U2.Effect.Static = U2.Class({
	__const : function(id) {/////////////////////////////////////////////////////////////////////////
		this.obj = U2.$(id);
		this.options = U2.Class.extend({
			enable   : true,
			slowDown : false,
			topTrack : false,
			division : 50,
			limitArea : null
		}, arguments[1] || {});

		//alert('id = ' + id);	//
		
		var offset = this.getPos(this.obj)[0];	// quickmenu의 top위치만 얻어오는 듯(페이지 로딩시 처음 quickmenu의 top위치) 
		
		//alert('offset = ' + offset);	//

		if (this.obj.style.position == '') {	// quickmenu의 position style값이 '' 이면
			//alert("quickmenu의 position style이 없는 경우");		//
			this.obj.style.position = 'absolute';
			if (offset != this.getPos(this.obj)[0]) {
				alert("offset이 getPos(this.obj)[0]와 같지 않은 경우");		//
				this.obj.style.position = 'relative';
			}
		}

		if (this.obj.style.position == 'absolute') {
			this.obj.style.top = this.obj.offsetTop+'px';	// quickmenu의 top 위치 설정
		} else {	// quickmenu의 position style값이 relative 이면
			if (offset == this.getPos(this.obj)[0]) this.obj.style.top = '0px';	// quickmenu의 현재 top위치가 처음 페이지 로딩 시의 top위치와 같다면, quickmenu의 top 위치를 0으로 설정
			else this.obj.style.top = (this.getPos(this.obj)[0] - offset) + 'px';	// this.getPos(this.obj)[0] - offset == quickmenu가 이동한 만큼의 위치
			
			//alert('this.obj.style.top = ' + this.obj.style.top);
		}

		this._scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);	// 전체 페이지가 스크롤 된 높이(처음 페이지 로딩시 스크롤 되어 있는 높이)
		this._startTop  = parseInt(this.obj.style.top);	// quickmenu의 top위치(처음 페이지 로딩 시)
		this._startPosY = this.getPos(this.obj)[0];		// quickmenu의 최상위 부모로 부터 이동된 top위치
		
		//alert("this._startTop = " + this._startTop);
		//alert($(localnavi).offsetTop + $(localnavi).offsetHeight);
		this._localnaviTop = $(localnavi).offsetTop + $(localnavi).offsetHeight;

		// event binding
		this.onscroll = U2.Func.bindForEvent(this.onScroll, this);
		U2.Event.register(window, 'scroll',this.onscroll);
	},////////////////////////////////////////////////////////////////////////////////
	onScroll : function(e) {//////////////////////////////////////////////////////////////////////////////
		if (!this.options.enable) return;

		var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 280;	// 스크롤 된 이후의 전체 페이지가 스크롤된 높이
		//alert(scrollTop);
		if( scrollTop < 0 ) {
			scrollTop = 0;
		}
		var diff = scrollTop - this._scrollTop;	// 전체페이지가 스크롤 된 높이 - 처음 페이지 로딩 시 스크롤 되어 있는 높이
		var diffChange = false;
		
		this._targetTop = this._startTop + diff;	//처음 페이지 로딩 시의 quickmenu top위치 + 전체 페이지가 스크롤 된 높이
		//alert("scrollTop = " + scrollTop);
//		alert("this._targetTop = " + this._targetTop);
		
		//alert("scrollTop = " + scrollTop + "this._targetTop = " + this._targetTop);

		if (this.options.limitArea) {
			var objY = this.getPos(this.obj)[0];	// 현재 quickmenu의 부모로부터 이동된 높이 
			var area = U2.$(this.options.limitArea);
			var posY = this.getPos(area)[0];	// limitArea로 지정된 object의 부모로부터의 현재 높이 값을 가져온다.

			// quickmenu의 최상위 부모로 부터 이동된 top위치 + quickmenu 자체의 div 높이 값 + (전체페이지가 스크롤 된 높이 - 처음 페이지 로딩 시 스크롤 되어 있는 높이) > limitArea로 지정된 object의 부모로부터의 현재 높이 값 + limitArea로 지정된 object 자체의 높이 
			if (this._startPosY + this.obj.offsetHeight + diff > posY + area.offsetHeight) {
				diff = posY + area.offsetHeight - this._startPosY - this.obj.offsetHeight;
				this._targetTop = this._startTop + diff;	// quickmenu의 top위치를 처음 페이지 로딩 시 quickmenu의 top위치 + 새롭게 세팅된 diff값으로 변경
				diffChange = true;	// 변화가 있었다 라고 표시 해줌
			}
		}

		if (this.options.topTrack && !diffChange && scrollTop > this._startPosY) {	/////// 테스트를 수행해 보자
			this._targetTop -= this._startPosY;
		}

		if (this._timer) {
			clearTimeout(this._timer);
			this._timer = null;
		}

		this._timer = setTimeout(U2.Func.bind(this.animate, this), 1);
	},///////////////////////////////////////////////////////////////////////////////////////////////////////
	animate : function() {//////////////////////////////////////////////////////////////////////////////////
		var currTop = parseInt(this.obj.style.top);	// quickmenu의 현재 top위치 => quickmenu에서 style로 지정된 top의 값 => 0인듯(처음에는)
		var unit = (this._targetTop-currTop)<0?-1:1;
		//alert("this._targetTop = " + this._targetTop + "unit = " + unit + "currTop = " + currTop);//
		var step = Math.ceil(this._targetTop - this._startTop / 100);
		//alert("step = " + step);
	

		if (this.options.slowDown) {
			step = parseInt((this._targetTop - currTop) / this.options.division);
			if (step == 0) step = unit;
		}
		if ((step > 0 && currTop + step > this._targetTop) || (step < 0 && currTop + step < this._targetTop)) {
			step = this._targetTop - currTop;
		}
		if (this._targetTop != currTop) {	// quickmenu가 스크롤의 변화가 있었으면
			//alert("33333");
			//step = step - 10;
			this.obj.style.top = (currTop+step)+'px';	// 실질적으로 이동되는 곳
			setTimeout(U2.Func.bind(this.animate, this), 10);
		}
	},//////////////////////////////////////////////////////////////////////////////////////////////////////
	getPos : function(obj) {///////////////////////////////////////////////////////////////////////////////////////
		var top=0, left=0;
		while(obj.offsetParent) {
			top += obj.offsetTop;	// smenu를 기준으로 한 quickmenu의 top위치 
			//top = top / 2;
			left += obj.offsetLeft;
			obj = obj.offsetParent;
			
			//alert("in while");	//
		}
		
		//alert('top111 = ' + top);	//
		//alert('left111 = ' + left);	//
		return [top, left];
	},////////////////////////////////////////////////////////////////////////////////////////////////////
	setEnable : function(enable) {
		this.options.enable = enable;
	}
});