/**
 *	디지틀 조선일보 위젯 프레임 - 유틸리티
 *
 *	브라우저마다 서로 다른 구현통합제공등.
 */
 
/**
 *	예외정의
 */
var	UnsupportedBrowerException = "지원되지 않는 브라우저입니다.";


/**
 *	브라우저를 검사한다.
 */
var Browser = new Object();
var ua = navigator.userAgent.toLowerCase(); 

Browser.isGecko = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
Browser.isMozilla = (Browser.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
Browser.isIE = window.ActiveXObject ? true : false;
Browser.isMozilla = Browser.isFirefox = (ua.indexOf("firefox")!=-1);
Browser.isSafari = (ua.indexOf("safari")!=-1);
Browser.isOpera = (ua.indexOf("opera")!=-1);

/**
 *	마우스 버튼정의
 */
var	__BUTTON = new Object();
__BUTTON.left = (Browser.isIE) ? 1 : 0;
__BUTTON.right = (Browser.isIE) ? 2 : 1;

/**
 *	이벤트처리를 막기 위해서 사용되는 함수
 */
function __returnFalse() { return false; }

/**
 *	해당값이 정의된 값인지 확인한다.
 *	undefined 혹은 빈문자열이면 false를 반환한다.
 */
function __isDefined(obj)
{
	return (obj == undefined ) ? false : /\S+/.test(obj);
}

/**
 *	DOM 구성요소의 넓이를 픽셀단위 정수값으로 환산해서 반환한다.
 *	만약 100% 같이 되었다면 상위노드를 검사 및 환산후 반환한다.
 *	@param elmt:넓이를 구하고자 하는 DOM구성요소
 *	@param ratio:구해진 값에 곱해지는 값, 상위노드의 width가 퍼센트값임 (optional)
 */
function __calcWidth(elmt, ratio)
{
	if ( elmt == null ) return 0;

	if ( !__isDefined(elmt.style.width) && !__isDefined(elmt.width) ) 
	{
		if ( ratio != undefined )
		{
			return (elmt.tagName.toLowerCase() == "body") ? document.viewport.getWidth() * ratio : __calcWidth(elmt.parentNode, ratio)
		}
		else
			return 0;
	}
	
	var	_ratio = (ratio == undefined) ? 1 : ratio;	
	var	_width = (__isDefined(elmt.style.width)) ? elmt.style.width : elmt.width;
	
	var temp = 0;
	if ( (temp = _width.indexOf("%")) != -1 )
	{
		var	subRatio = parseInt(_width);
		subRatio = (subRatio > 0) ? subRatio / 100 : 0;
		return (elmt.parentNode == null) ? 0 : Math.floor(__calcWidth(elmt.parentNode, subRatio) * _ratio);
	}
	else
	{
		return Math.floor(parseInt(_width) * _ratio);
	}
}

/**
 *	DOM 구성요소의 높이를 픽셀단위 정수값으로 환산해서 반환한다.
 *	만약 100% 같이 되었다면 상위노드를 검사 및 환산후 반환한다.
 *	@param elmt:높이를 구하고자 하는 DOM구성요소
 *	@param ratio:구해진 값에 곱해지는 값, 상위노드의 height가 퍼센트값임 (optional)
 */
function __calcHeight(elmt, ratio)
{
	if ( elmt == null ) return 0;

	if ( !__isDefined(elmt.style.height) && !__isDefined(elmt.height) ) 
	{
		if ( ratio != undefined )
		{
			return (elmt.tagName.toLowerCase() == "body") ? document.viewport.getHeight() * ratio : __calcHeight(elmt.parentNode, ratio)
		}
		else
			return 0;
	}
	
	var	_ratio = (ratio == undefined) ? 1 : ratio;	
	var	_height = (__isDefined(elmt.style.height)) ? elmt.style.height : elmt.height;
	
	var temp = 0;
	if ( (temp = _height.indexOf("%")) != -1 )
	{
		var	subRatio = parseInt(_height);
		subRatio = (subRatio > 0) ? subRatio / 100 : 0;
		return (elmt.parentNode == null) ? 0 : Math.floor(__calcHeight(elmt.parentNode, subRatio) * _ratio);
	}
	else
	{
		return Math.floor(parseInt(_height) * _ratio);
	}
}

/**
 *	Event에서 웹페이지내 좌표를 구해낸다.
 */
function __getEventPoint(evt)
{
	if ( Browser.isIE )
	{
		return new DWFPoint(evt.clientX + document.body.scrollLeft, evt.clientY + document.body.scrollTop);
	}
	else if ( Browser.isMozilla )
	{
		return new DWFPoint(evt.pageX, evt.pageY);
	}
	else
		throw UnsupportedBrowerException;
}

/**
 *	Event에서 상대 좌표를 구해낸다.
 */
function __getEventLayerPoint(evt)
{
	if ( Browser.isIE )
	{
		return new DWFPoint(evt.x, evt.y);
	}
	else if ( Browser.isMozilla || Browser.isSafari )
	{
		return new DWFPoint(evt.layerX - 1, evt.layerY - 1);
	}
	else
		throw UnsupportedBrowerException;
}

/**
 *	텍스트 선택기능을 비활성화 한다.
 *	@param target:대상 (DOM)
 *	@param op:true 활성화, false이면 비활성화
 */
function __enableTextSelection(target, op)
{
	if ( Browser.isIE || Browser.isSafari )
	{
        target.onselectstart = (op) ? null : __returnFalse;
	}
	else if ( Browser.isMozilla )
	{
		target.style.MozUserSelect = (op) ? "normal" : "none";
	}
	else
		throw UnsupportedBrowerException;
}

/**
 *	텍스트 선택기능을 비활성화 한다.
 *	@param target:대상 (DOM)
 *	@param op:true 활성화, false이면 비활성화
 */
function __enableDragging(target, op)
{
	if ( Browser.isIE || Browser.isSafari )
	{
        target.ondragstart = (op) ? null : __returnFalse;
	}
	else if ( Browser.isMozilla )
	{
	}
	else
		throw UnsupportedBrowerException;
}

/**
 *	DOM객체의 투명도를 조정한다.
 *	@param target:대상
 *	@param value: 0 ~ 1까지의 실수값
 */
function __changeOpacity(target, value)
{
	if ( Browser.isIE )
	{
		target.style.filter = "alpha(opacity=" + value * 100 + ")";
	}
	else if ( Browser.isMozilla || Browser.isSafari )
	{
		target.style.opacity = value;
	}
}

/**
 *	문자열을 특정크기로 잘라낸다.
 *	@param ratio: 한글의 크기비율 (2이면 한글을 2자로 계산, 3이면 3자로 계산)
 */
function __cutText(text, num, suffix, ratio)
{
	if ( suffix == undefined ) suffix = "..."; 

	if ( text == undefined ) return suffix;
	if ( num == undefined || num <= 0 ) return suffix;
	if ( ratio == undefined || ratio < 1 ) ratio = 2;
	
	var	arrchs = text.toArray();
	var	count = 0;
	var	truncateLength = 0;

	for( var i = 0; i < arrchs.length && count <= num; i++ )
	{
		count += (arrchs[i].charCodeAt(0) > 128) ? ratio : 1;
		truncateLength++;
	}
	
	return text.truncate(truncateLength, suffix);
	//return (Browser.isMozilla) ? text.unescapeHTML().truncate(truncateLength, suffix).escapeHTML() : text.truncate(truncateLength, suffix);
}

/**
 *	XML문서에서 element의 텍스트데이타를 안전하게 읽는다.
 */
function __safeElementData(elmt)
{
	return (elmt == undefined || elmt[0] == undefined || elmt[0].firstChild == undefined) ? "" : elmt[0].firstChild.data;
}


/**
 *	XML문서에서 element의 텍스트데이타를 모두 읽는다.
 */
function __safeElementText(elmt)
{
	if ( elmt == undefined || elmt.childNodes == undefined ) return "";
	
	var	retstr = "";
	for ( var i = 0; i < elmt.childNodes.length; i++ )
	{
		if ( elmt.childNodes[i].nodeValue == null && elmt.childNodes[i].childNodes != undefined )
			retstr += __safeElementText(elmt.childNodes[i]);
		else
			retstr += elmt.childNodes[i].nodeValue;
	}
		
	return retstr;
}


/** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *	스크립트를 읽어온다.
 */
var __ScriptLoader = Class.create();

__ScriptLoader.prototype =
{
	/** 적재대기중인 스크립트 URL배열중 현재 적재할 스크립트 인덱스 */
	loadingIndex : 0
	/** 스크립트 URL에 공통적으로 들어가게 될 앞의 문자열 */
	, urlPrefix : ""
	/** 적재대기중인 스크립트 URL배열 */
	, scripts : null
	
	/**
	 *	초기화
	 *	@param urlPrefix: 
	 *	@param scripts: 적재할 스크립트 URL배열
	 */
	, initialize : function(urlPrefix, scripts)
	{
		this.urlPrefix = urlPrefix;
		this.scripts = scripts;
	}
	
	, load : function()
	{
		if ( this.scripts == null || this.scripts.length <= this.loadingIndex )
		{
			this.sucess();
			return;
		}
		
		// 스크립트를 정의한다.
		var	sc = document.createElement("script");
		var	scSrc = this.urlPrefix + this.scripts[this.loadingIndex++];
		
		sc.setAttribute("src", scSrc);
		sc.setAttribute("type", "text/javascript");
		sc.setAttribute("charset", "utf-8");
		
		// callback함수를 정의한다.
		if ( Browser.isIE )
		{
			sc.onreadystatechange = function()
			{
				var	scElmt = arguments[0];
				if ( scElmt.readyState == "loaded" || scElmt.readyState == "complete" )
					this.load();
			}
			// 바인드후 재정의
			sc.onreadystatechange = sc.onreadystatechange.bind(this, sc);
		}
		else if ( Browser.isMozilla || Browser.isSafari )
		{
			sc.onerror = function() { this.fail(); }
			sc.onload = function() { this.load(); }

			// 바인드후 재정의
			sc.onerror = sc.onerror.bind(this);
			sc.onload = sc.onload.bind(this);
		}
		else
			throw UnsupportedBrowerException;
		
		// 스크립트 적재 시작
		if ( Browser.isIE )
		{	// IE일 경우에는 Head에 넣어질수 있도록 한다. 그렇지 않으면 body가 적재되지 않은 상태에서는
			// 오류가 발생한다.
			var head = document.getElementsByTagName('head').item(0);
			head.insertBefore(sc, head.firstChild);
		}
		else
			document.documentElement.appendChild(sc);
	}
	
	, sucess : function()
	{
		alert("스크립트를 읽어왔습니다.");
		// 필요한 작업을 재정의해서 구현한다.
		// IE일 경우에는 실재로 성공한 것인지를 보장하지는 못한다.
	}
	
	, fail : function()
	{
		alert("스크립트를 읽어오는 도중 오류가 발생하였습니다.");
		// 필요한 작업을 재정의해서 구현한다.
	}
};

function __str2Xml (str, contentType)
{
      if (typeof ActiveXObject != "undefined") {
         var d = new ActiveXObject("MSXML.DomDocument");
         d.loadXML(str);
         return d;
      } 
      else if (typeof XMLHttpRequest != "undefined")
		return (new DOMParser()).parseFromString(str, "text/xml"); 		      
}


/** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *	슬라이딩 효과를 낸다.
 */
var __Slider = Class.create();
__Slider.NORTH = 1;
__Slider.EAST  = 2;
__Slider.SOUTH = 3;
__Slider.WEST  = 4;
__Slider.WIDTH  = 5;	//position:relative
__Slider.HEIGHT = 6;	//position:relative

__Slider.prototype =
{
	target: null
	, startPos: null
	, dir: __Slider.NORTH
	, timerId: null
	, endOffset: 0
	
	, runOffset: 0
	, scrollAmount: 0
	, scrollDelay: 0
	
	/**
	 *	@param target:스라이딩할 대상
	 *	@param startPos:슬라이딩 시작위치 [Num,Num]
	 *	@param dir:방향 (1:북쪽, 2:동쪽, 3:남쪽, 4:서쪽)
	 *	@param endOffset: 슬라이딩이 끝나게 되는 조건
	 */
	, initialize: function(target, startPos, dir, endOffset)
	{
		this.target = target;
		this.startPos = startPos;
		this.dir = dir;
		this.endOffset = endOffset;
	}
	
	/**
	 *	슬라이딩 시작
	 */
	, slide: function()
	{
		this.runOffset = 0;
		this.scrollAmount = 50;
		this.scrollDelay = 10;
		
		this.target.style.left = this.startPos[0] + "px";
		this.target.style.top = this.startPos[1] + "px";
		
		switch(this.dir)
		{
			case __Slider.NORTH:
			case __Slider.SOUTH:
				this.target.style.overflowY = "hidden";
				this.target.style.height = "0px";
				break;
				
			case __Slider.WEST:
			case __Slider.EAST:
				this.target.style.overflowX = "hidden";
				this.target.style.width = "0px";
				break;
				
			case __Slider.HEIGHT:
		}

		this.target.style.display = "block";
		this.target.style.visibility = "visible";

		this.timerId = window.setInterval(this.slideImpl.bind(this), this.scrollDelay);
	}
	
	/**
	 *	슬라이드 구현
	 */
	, slideImpl: function()
	{
		if ( this.runOffset >= this.endOffset )
		{
			window.clearInterval(this.timerId);
			return;
		}
		
		this.scrollAmount = Math.floor((this.endOffset - this.runOffset) / 10) + 4;
		
		this.runOffset += this.scrollAmount;
		if ( this.runOffset >= this.endOffset ) this.runOffset = this.endOffset;
		
		switch(this.dir)
		{
			case __Slider.NORTH:
				this.target.style.top = (this.startPos[1] - this.runOffset) + "px";
			case __Slider.SOUTH:
				this.target.style.height = this.runOffset + "px";
				break;
				
			case __Slider.WEST:
				this.target.style.left = (this.startPos[0] - this.runOffset) + "px";
			case __Slider.EAST:
				this.target.style.width = this.runOffset + "px";
				break;
		}
	}
}

/**
 *	OS와 브라우저에 상관없이 범용적인 클립보드 복사 기능을 제공한다.
 *	단 _clipboard.swf파일이 있어야 한다.
 *	참조사이트: http://webchicanery.com/2006/11/14/clipboard-copy-javascript/
 */
function __clip(text2copy)
{
	var flashcopier = $("flashcopier");

	if ( flashcopier == undefined )
	{
		var flashcopier = document.createElement('div');
		flashcopier.id = "flashcopier";
		document.body.appendChild(flashcopier);
	}
	
	flashcopier.innerHTML = '<embed src="/images/_clipboard.swf" FlashVars="clipboard='
						  + text2copy.replace(/\"/, "&quot")
						  //+ escape(text2copy)
						  + '" width="0" height="0" type="application/x-shockwave-flash"></embed>';
}
