/** 
 * @class stimpack의 super class 입니다.
 */
var stp =
	/**
	 * @lends stp
	 */
	{
	/** 
	 * stimpack의 버젼정보를 제공합니다.
	 * @description : "버전_날짜" 로 구성되어있습니다 (ex : x.x_xxxxxx)
	 * @method */
	version:"1.2_100315",
	/** 
	 * stimpack의 베이스 라이브러리 정보를 제공합니다.
	 * @description : 현재는 prototype만 제공합니다.
	 * @method */
	lib:"prototype.js",
	/** 
	 * stimpack의 제작팀을 제공합니다.
	 * @method */
	author:"Reflexion Web Team"
};

Object.extend(Event, {
	wheel:function (event){
		var delta = 0;
		if (!event) event = window.event;
		if (event.wheelDelta) {
			delta = event.wheelDelta/120; 
			if (window.opera) delta = -delta;
		} else if (event.detail) { delta = -event.detail/3;     }
		return Math.round(delta); //Safari Round
	}
});/**
 * string의 앞뒤의 공백을 제거합니다.
 * @name stp.trim
 * @static
 * @function
 * @param {String/require} str : 앞뒤공백을 지울 String object
 * @return String
 */
function stpReturnTrim(s){
	return s.replace(/(^\s*)|(\s*$)/g, "");
};stp.trim=stpReturnTrim;

/**
 * string의 모든 공백을 제거합니다.
 * @name stp.delBlank
 * @static
 * @function
 * @param {String/require} str : 모든 공백을 지울 String Object
 * @return String
 */
function stpDelBlank(s){
	return s.replace(/\s+/g,"");
};stp.delBlank=stpDelBlank;

/**
 * string의 모든 특수문자를 삭제합니다.
 * @name stp.delSpec
 * @static
 * @function
 * @param {String/require} str : 특수문자를 삭제할 String Object
 * @return String
 */
function stpDelSpec(s){
	return s.replace(/[^ㄱ-ㅎ가-힣\s\w]+/g,"");
};stp.delSpec=stpDelSpec;

/**
 * 글자를 byte수로 리턴합니다.
 * @name stp.byte
 * @static
 * @function
 * @param {String/require} str : byte수를 받을 String Object
 * @return Number
 */
function stpReturnByte(s){
	var c=0; //바이트수를 저장할 변수
	for(i=0;i<s.length;i++){
		c+=(s.charCodeAt(i)>127)?2:1;
	};
	return c;
};stp.byte=stpReturnByte;

/**
 * 돈을 표현하는 형식으로 리턴 (3단위마다 ,를 리턴)
 * @name stp.money
 * @static
 * @function
 * @param {Number/require} number : 돈형식으로 바꿀 Number Object
 * @return String
 */
function stpReturnMoney(n){
	var n = stp.$N(n)+"";
	while ((/(-?[0-9]+)([0-9]{3})/).test(n)) {
		n=n.replace((/(-?[0-9]+)([0-9]{3})/), "$1,$2");
	};return n;
};stp.money=stpReturnMoney;/**
 * 쿠키가 있고 없고를 체크하여 토글형식으로 제어합니다.
 * @name stp.toggleCookie
 * @function
 * @param {String/require} name :  존재유무를 체크할 쿠키의 이름
 * @param {Hash/require} hash : 쿠키의 존재유무에 따라서 실행되는 key값을 가진 hash.
 * @return interaction (상호작용)
 */
function stpToggleCookie(name,hash){
	if(stp.getCookie(name)){$H(hash).get("on").call(null,gcv)}else{$H(hash).get("off").call(null,gcv)};
};stp.toggleCookie=stpToggleCookie;

/**
 * 엘리먼트가 보이고 안보이고에 따라서 토글형식으로 제어합니다.
 * @name stp.toggle
 * @function
 * @param {String/require} oId :  display을 체크할 엘리먼트의 아이디
 * @param {Hash/require} hash : display을 체크에 따라서 실행되는 key값을 가진 hash.
 * @return interaction (상호작용)
 */
function stpToggleDisplay(oId,hash){
	if(stp.$V(oId)){$H(hash).get("on").call(null,$(oId))}else{$H(hash).get("off").call(null,$(oId))};
};stp.toggle=stpToggleDisplay;

/**
 * 이미지 엘리먼트들의 On,Off 토글을 제어합니다.
 * @name stp.toggleSrc
 * @function
 * @param {String/require} cName : 이미지 클래스 네임
 * @param {Number/option} num : 이미지 On으로 전환할 인덱스
 * @return interaction (상호작용)
 */
function stpToggleSrcOnOff(cName,num){
	var cn = (!cName.startsWith("."))?"."+cn:cn;
	$$(cName).each(function(img,i){
		img.src=(img.src).replace("On.gif",".gif");
		if(i==num){ img.src=(img.src).replace(".gif","On.gif"); };
	});
};stp.toggleSrc=stpToggleSrcOnOff;

/**
 * 글자수를 해당하는 부분에 맞게 잘라서 리턴해주는 함수 입니다.
 * @description 꼭 선언되는 엘리먼트 안에는 string만 존재해야 합니다.
 * @name stp.cutWidthClass
 * @function
 * @param {Hash/option} hash
 * <table border="0" cellpadding="0" cellspacing="0" width="100%">
 * <tr><th>hash key</th><th>hash value type</th><th>description</th></tr>
 * <tr><td>className</td><td>String</td><td>글자을 잘라낼 문자열을 가진 엘리먼트의 class 명</td></tr>
 * <tr><td>tail</td><td>String</td><td>글자을 잘라낸후의 꼬리글</td></tr>
 * </table>
 * @return interaction (상호작용)
 * @example
 * &lt;a href="#" class="cutWidth 200"&gt;200px만큼만 표시되고 잘리게 됩니다.&lt;/a&gt;
 * &lt;script&gt;stp.stp.cutWidthClass({"className":"cutWidth"});&lt;/script&gt;
 * 
 */
function stpWidthCutClassName(hash){
	//함수 기본 설정
	var H = $H(hash);
	var cn = (H.get("className"))?H.get("className"):".cutWidth";
		cn = (!cn.startsWith("."))?"."+cn:cn;
	var tail = (H.get("tail"))?H.get("tail"):"...";
	
	
	//cutting 진행
	$$(cn).each(function(item,i){
		(function(){
			var str = (item.innerHTML).stripTags().replace(/[&amp;]{5}/gi,"&");
			var wid = (item.className.match(/[0-9]+$/))?Number(item.className.match(/[0-9]+$/)):(item.offsetWidth-20);
			var bold = (item.getStyle("font-weight")==700)?"bold":"normal";
			var cutTxt = stp.cutWidth(str,wid,tail,"font-size:"+item.getStyle("font-size")+";font-weight:"+bold);
			item.title = str;
			item.innerHTML = cutTxt;
		})();
	});
};stp.cutWidthClass=stpWidthCutClassName;

/**
 * 셀렉트 엘리먼트에서 도메인을 넣어주는 함수
 * @name stp.selectDomain
 * @function
 * @param {String/require} selectId : 도메인 리스트를 가진 셀렉트 엘리먼트의 아이디
 * @param {String/require} inputId : 도메인이 작성 또는 입력될 인풋 엘리먼트의 아이디
 * @param {Boolean/option} modify : 도메인이 인풋엘리먼트에 삽입되는 경우 인풋에 있는 도메인을 수정할수 있는가에 대해 정의합니다.
 * @return interaction (상호작용)
 */
function stpSelectDomainUI(selectId,inputId,bn){
	var bn = (!bn)?false:true;
	$(selectId).observe("change",function(){
		if($(selectId).selectedIndex==0){
			$(inputId).value = "";
			$(inputId).enable();
			$(inputId).setStyle({"background":"#fff"});
		}else{
			$(inputId).value = $(selectId).options[$(selectId).selectedIndex].value;
			if(!bn){$(inputId).disable();};
			$(inputId).setStyle({"background":"#f5f5f5"});
		};
	});
};stp.selectDomain=stpSelectDomainUI;

/**
 * textArea의 값을 바이트로 전달하고 글자수에 닿으면 막는다.
 * @name stp.textareaByte
 * @function
 * @param {String/require} textareaId : 입력을 받을 text Element Id
 * @param {Number/require} byteNum : 제한할 byte값
 * @param {String/require} returnId : 현재 작성되고 있는 byte의 값
 * @return interaction (상호작용)
 */
function stpReturnByteUI(textareaId,byteNum,returnId){
	$(textareaId).observe("keyup",function(){
		var rb = stp.byte(this.value);
		if(byteNum<rb){
			alert("최대 "+byteNum+"byte를 넘기실수 없습니다.");
			while(stp.byte(this.value)>stp.$N(byteNum)){
				this.value = this.value.substr(0,$(textareaId).value.length-1);
			}
			rb = stp.byte(this.value);
		};
		$(returnId).innerHTML = rb;
	});
};stp.textareaByte=stpReturnByteUI;

/**
 * 지정된 엘리먼트나 스트링을 ctrl+C 로 클립보드 저장하는 함수
 * @name stp.ctrlC
 * @function
 * @param {String/require} str : 클립보드에 저장할 스트링
 * @return clipboardData(클립보드)
 */
function stpCopyText(str){
	if(stp.browser()[0]=="ie"){
		window.clipboardData.setData("Text", str);
		alert ("텍스트가 복사되었습니다.\n붙여넣기(Ctrl + V) 하시면 됩니다.");
	}else{
		alert("현재 브라우저에서는 클립보드에\n복사하기 기능을 지원하지 않습니다.\n\n직접 Ctrl + C 버튼으로 복사해서\n붙여넣기 (Ctrl + V) 해 주세요.");
	};
};stp.ctrlC=stpCopyText;

/**
 * 즐겨찾기 등록을 합니다.
 * @name stp.bookMark
 * @function
 * @param {String/require} url : 즐겨찾기가 될 URL
 * @param {String/require} str : 즐겨찾기 이름
 * @return favorite(즐겨찾기)
 */
function stpAddBookMark(url,str){
	if(stp.browser()[0]=="ie"){
		window.external.AddFavorite(url, str);
	}else{
		alert("현재 브라우저에서는 즐겨찾기 기능을 지원하지 않습니다.");
	}
};stp.bookMark=stpAddBookMark;

/**
 * HTML문서내 <a>엘리먼트에 블러(blur)을 적용합니다.
 * @name stp.autoBlur
 * @function
 * @return interaction (상호작용)
 */
function stpSetAutoBlur() {
	Event.observe(window, 'load', function() {
		$$("a").each(function(item){
			item.onfocusin = function(){
				this.blur();
			};
		});
	});
};stp.autoBlur=stpSetAutoBlur;

/**
 * 팝업이나 새창의 사이즈을 자신에게 맞도록 고정합니다.
 * @name stp.resizeWindow
 * @function
 * @param {String/require} argWid : 팝업의 가로사이즈 , 지정하지 않을경우 auto로 진행
 * @param {String/require} argHei : 팝업의 세로사이즈 , 지정하지 않을경우 auto로 진행
 * @return interaction (상호작용)
 */
function stpAutoResizeWindow(argWid,argHei) {
	var wid = (argWid)?stp.$N(argWid):0;
	var hei = (argHei)?stp.$N(argHei):0;
	$(document.body).select("*").each(function(elem){
		if(!argWid){ wid=(elem.style.width!="") ? (elem.getWidth()>wid) ? elem.getWidth() : wid : wid; };
		if(!argHei){ hei=(elem.style.height!="") ? (elem.getHeight()>hei) ? elem.getHeight() : hei : hei; };
	});
	
	var winR=setInterval(function(){
		var stpWid = stp.viewPort()[0];
		var stpHei = stp.viewPort()[1];
		if(stp.browser()[0]=="sf"){
			stpWid = stp.viewPort()[0]-17;
			stpHei = stp.viewPort()[1];
		};
		var Dw = wid-stpWid;
		var Dh = hei-stpHei;
		window.resizeBy(Dw, Dh);
		if(Dw==0 && Dh==0){
			clearInterval(winR);
			if(stp.browser()[0]=="sf"){
				window.resizeBy(-17,0);
			};
		};
	},1);
};stp.resizeWindow=stpAutoResizeWindow;

/**
 * 자동으로 아이프레임 영역을 맞춥니다.
 * @name stp.resizeIframe
 * @function
 * @param {String/option} iframeId : 본 페이지의 높이값을 적용할 부모창 아이프레임 아이디 (없을 경우 부모창의 맨처음 아이프레임으로 적용) 
 * @param {Number/option} addHeight : 높이에 추가할 높이값 (기본 30px)
 * @return interaction (상호작용)
 */
function autoIframeResize(iframeId,addHeight){
	var add = (addHeight)?stp.$N(addHeight):30;
	var hei = $(document.body).getHeight()+add;
	var target = (iframeId)?$(parent.document.body).down("#"+iframeId):$(parent.document.body).down("iframe");
	target.setStyle({"height":hei});
};stp.resizeIframe=autoIframeResize;




/**
 * "true" 또는 "false"라고 쓰여 있을경우 실제 Boolean값으로 리턴합니다.
 * @name stp.$B
 * @function
 * @param {String/require} str : 입력받을 스트링 오브젝트
 * @return Boolean
 */
function stpBoolean(s){
	if(s=="false" || s==null || s==false){return false;};
	if(s=="true" || s==true){return true;};
	alert(s);
	return s;
};stp.$B=stpBoolean;

/**
 * 엘리먼트가 보이고 있으면 true 안보이면 false을 리턴합니다.
 * @name stp.$V
 * @function
 * @param {String/require} str : display을 확인할 아이디
 * @return Boolean
 */
function stpDisplayBoolean(oId){
	return ($(oId).style.display=="none")?false:true;
};stp.$V=stpDisplayBoolean;


/**
 * 엘리먼트을 만들고 그에 따른 아이디을 지정합니다.
 * @name stp.$E
 * @function
 * @param {String/require} name : 엘리먼트 객체의 Tag name
 * @param {String/option} id : 엘리먼트의 아이디
 * @return Element
 */
function stpMakeElement(name,id){
	var t = document.createElement(name);
	t.id = (id)?id:"";
	return $(t);
};stp.$E=stpMakeElement;

/**
 * 문자열내에 있는 모든 숫자을 리턴합니다.
 * @name stp.$N
 * @function
 * @param {String/require} str : 숫자을 추출할 문자열
 * @return Number
 */
function stpReturnNumber(s){
	return (s!="")?Number(s.match(/[0-9]+/g).join("")):"";
};stp.$N=stpReturnNumber;

/**
 * 넘어온 배열에서 지정된 개수만큼 "겹치지않는" 불규칙배열을 리턴합니다.
 * @name stp.suffle
 * @function
 * @param {Array/require} array : 불규칙배열로 만들 배열
 * @param {Number/option} length : 리턴될 배열의 갯수
 * @return Array
 */
function stpSuffle(arr,length){
	this.su=function(){return Math.random()*2-1;};
	var arr=arr.sort(this.su);
	arr=(length)?arr.slice(0,length):arr;
	return arr;
};stp.suffle=stpSuffle;

/**
 * 지정된 숫자 이하 에서 지정된 개수만큼 "겹치지않는" 불규칙배열을 리턴합니다.
 * @name stp.suffleNumber
 * @function
 * @param {Number/require} min : 최소값
 * @param {Number/require} max : 최대값
 * @param {Number/option} length : 리턴될 배열의 갯수
 * @return Array
 */
function stpSuffleNumber(min,max,length){
	return stpSuffle($A($R(min,max)),length);
};stp.suffleNumber=stpSuffleNumber;

/**
 * 넘어온 배열에서 지정된 개수만큼 "겹칠수도있는" 불규칙배열을 리턴합니다.
 * @name stp.random
 * @function
 * @param {Array/require} array : 불규칙배열로 만들 배열
 * @param {Number/option} length : 리턴될 배열의 갯수
 * @return Array
 */
function stpRandom(array,length){
	var tArr=$A();
	stpRandomNumber(0,$A(array).length,length).each(function(i){
		tArr.push(array[i]);
	});
	tArr=(length)?tArr.slice(0,length):tArr;
	return tArr;
};stp.random=stpRandom;

/**
 * 지정된 숫자 이하 에서 지정된 개수만큼 "겹칠수도있는" 불규칙배열을 리턴합니다.
 * @name stp.randomNumber
 * @function
 * @param {Number/require} min : 최소값
 * @param {Number/require} max : 최대값
 * @param {Number/option} length : 리턴될 배열의 갯수
 * @return Array
 */
function stpRandomNumber(min,max,length){
	var tArr = $A();
	$A($R(min,max)).each(function(){
		tArr.push(Math.floor(Math.random()*max)+min);
	});
	tArr=(length)?tArr.slice(0,length):tArr;
	return tArr;
};stp.randomNumber=stpRandomNumber;

/**
 * 쿠키를 설정합니다.
 * @name stp.setCookie
 * @function
 * @param {String/require} name : cookie의 이름을 설정합니다.
 * @param {String/require} value : cookie의 값을 설정합니다.
 * @param {Number/option} cMin : cookie의 유효시간을 분단위로 설정합니다. (0일 경우에는 브라우져 창이 닫히면 쿠키도 소멸)
 * @param {Boolean/option} escapeUse : 입력되는 cookie의 값을 escape할것인지을 지정합니다.
 * @return Cookie
 */
function stpSetCookie(name,value,cMin,escapeUse){
	var value = (!escapeUse) ? value : escape(value); //이스케이프 기능사용여부
	var cMin = (!cMin) ? 0 : cMin; //쿠키유효기간 설정
	var expTime = "";
	if(cMin!=0){
		var sDate = new Date(); //오늘의 날짜 저장;
		sDate.setMinutes(sDate.getMinutes()+cMin); //원하는 날짜 만큼 지정 (분을 기준으로 함)
		expTime = sDate.toGMTString(); //expires형식으로 전환
	};
	document.cookie = name+"="+value+";expires="+expTime+"path='/'";
};stp.setCookie=stpSetCookie;

/**
 * 쿠키에 설정된 값을 가져옵니다.
 * @name stp.getCookie
 * @function
 * @param {String/require} name : 값을 가져올 cookie의 이름을 지정합니다.
 * @return String
 */
function stpGetCookie(name){
	var cookie = document.cookie;
	sIndex = cookie.indexOf(name+"=");
	start = sIndex+name.length+1; //시작점 찾기
	end = cookie.indexOf(";",start); //마지막 점 찾기
	if(end=="-1"){end = cookie.length;}; //만약 마지막 값이라서 end의 indexOf값이 -1이라면 마지막값(length로 지정)
	cookieValue = unescape(cookie.substring(start,end)); //시작점 과 마지막점 으로 값을 가져옴
	return cookieValue;
};stp.getCookie=stpGetCookie;
/**
 * 쿠키를 삭제합니다.
 * @name stp.delCookie
 * @function
 * @param {String} name : 지울 쿠키의 이름을 지정합니다.
 * @return cookie
 */
function stpRemoveCookie(name){
	stpSetCookie(name,"",-876000); //1년전으로 쿠키를 설정한다. (쿠키의 유효기간이 끝나면서 없어짐);
};stp.delCookie=stpRemoveCookie;

/**
 * 이벤트가 발생한 지점의 화면 X,Y 좌표을 배열형식으로 리턴합니다 [X,Y,element]
 * @name stp.getXY
 * @function
 * @return Array
 */
function stpGetEventXY(){
	return [Event.pointerX(event),Event.pointerY(event),$(Event.element(window.event))];
};stp.getXY=stpGetEventXY;


/**
 * 사용자의 브라우져 환경을 리턴합니다.
 * @name stp.browser
 * @function
 * @return Array
 */
function userBrowser(){
	var p = Prototype.Browser;
	var bArr = new Array();
	if(p.IE){
		bArr[0]="ie";
		bArr[1]=(navigator.appVersion).replace(/\s/g,"").match(/MSIE[0-9.]+/)[0].match(/[0-9.]+/)[0];
	}else if(p.Opera){
		bArr[0]="op";
		bArr[1]=(navigator.userAgent).replace(/\s/g,"").match(/Version\/[0-9.]+/)[0].match(/[0-9.]+/)[0];
	}else if(p.WebKit){
		if((navigator.appVersion).indexOf("Chrome")!="-1"){
			bArr[0]="cr";
			bArr[1]=(navigator.appVersion).replace(/\s/g,"").match(/Chrome\/[0-9.]+/)[0].match(/[0-9.]+/)[0];
		}else{
			bArr[0]="sf";
			bArr[1]=(navigator.appVersion).replace(/\s/g,"").match(/Version\/[0-9.]+/)[0].match(/[0-9.]+/)[0];
		};
	}else if(p.Gecko){
		bArr[0]="ff";
		bArr[1]=(navigator.userAgent).replace(/\s/g,"").match(/Firefox\/[0-9.]+/)[0].match(/[0-9.]+/)[0];
	}else if(p.MobileSafari){
		bArr[0]="msf";
		bArr[1]=(navigator.appVersion).replace(/\s/g,"").match(/Version\/[0-9.]+/)[0].match(/[0-9.]+/)[0];
	};
	return bArr;
};stp.browser=userBrowser;

/**
 * 사용자창의 가로,세로,스크롤높이 값을 리턴합니다.
 * @name stp.viewPort
 * @function
 * @return Array
 */
function stpViewPort(){
	return [document.viewport.getDimensions().width,document.viewport.getDimensions().height,document.viewport.getScrollOffsets().top];
};stp.viewPort=stpViewPort;

/**
 * js파일의 query에서 key에 맞는 값을 가져 옵니다.
 * @name stp.queryVars
 * @function
 * @param {String/require} key : query에서 가져올 key값
 * @return String
 */
function stpQueryLoad(key){
	var s = $$('script[src]').find(function(n){return (n.src.indexOf(key)!=-1)});
	return s.src.split(key+"=")[1].split('&')[0];
};stp.queryVars=stpQueryLoad;

/**
 * url에있는 query에서 key에 맞는 값을 가져옵니다.
 * @name stp.urlVars
 * @function
 * @param {String/require} key : query에서 가져올 key값
 * @return String
 */
function stpLocationLoad(key){
	return location.href.split(key+"=")[1].split('&')[0];
};stp.urlVars=stpLocationLoad;

/**
 * IE6에서 PNG의 투명화을 지원하는 함수
 * @name stp.png24
 * @function
 * @param {Element/require} obj : img element로 png경로을 가진 투명화가 될 엘리먼트  
 * @return Element
 */
function stpSetPng24(obj){
	if(stp.browser()[1].startsWith("6")){
		obj.width=obj.height=1;
		$(obj).removeClassName("png24");
	    obj.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+ obj.src +"',sizingMethod='image');"
	};
};stp.png24 = stpSetPng24;


/**
 * 글자수를 해당하는 부분에 맞게 잘라서 리턴해주는 함수 입니다.
 * @description 꼭 선언되는 엘리먼트 안에는 string만 존재해야 합니다.
 * @name stp.cutWidth
 * @function
 * @return String
 */
function stpWidthCutWord(str,wid,tail,style){
	return (function(){
		var tElem = stp.$E("span");tElem.innerHTML = str;document.body.appendChild(tElem);
		tElem.style.cssText = "position:absolute;top:-100px;white-space:nowrap;visibility:hidden;"+style;
		
		var tTail = (tElem.offsetWidth>wid)?tail:"";
		var tTailElem = stp.$E("span");tTailElem.innerHTML = tail;document.body.appendChild(tTailElem);
		tTailElem.style.cssText = "position:absolute;top:-100px;white-space:nowrap;visibility:hidden;"+style;
		tElem.innerHTML = (tElem.innerHTML).replace(/(&nbsp;)/gi,"");
		
		while(tElem.offsetWidth>(wid-tTailElem.offsetWidth)){
			tElem.innerHTML = (tElem.innerHTML).substr(0,tElem.innerHTML.length-1);
		};
		var finalText = tElem.innerHTML+tTail;
		document.body.removeChild(tElem);
		document.body.removeChild(tTailElem);
		return finalText;
	})();
};stp.cutWidth=stpWidthCutWord;

/**
 * 열려있는 브라우저 창을 찾습니다.
 * @name stp.findWindow
 * @function
 * @param {String/require} name : 찾을 창의 이름
 * @return Window
 */
function stpFindWindow(name){
	var s = window.open('',name);
	if(s.document.body.childNodes.length==0){
		s.close();
		return null;
	};
	return s;
};stp.findWindow=stpFindWindow;


























/**
 * 플래쉬오브젝트를 script로 rewrite시키는 함수입니다.
 * @name stp.setFlash
 * @function
 * @description : 이올라스 패치 이전의 브라우져에서 오브젝트의 외곽라인이 나오는 현상을 방지하기 위해 만들어진 함수입니다.
 * @param {String} src : 플래쉬의 경로를 작성합니다. 입니다.
 * @param {Hash} hash : 플래쉬 표현에 따른 옵션을 hash형식으로 지정합니다.
 * <table border="1" cellpadding="3" cellspacing="0" width="100%" class="desc">
		<thead>
			<tr>
				<th>키(key)</th>
				<th>필수</th>
				<th>값(value)</th>
				<th>기본값</th>
				<th>설명</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>url</td>
				<td class="center">필수</td>
				<td class="center">string</td>
				<td class="center">null</td>
				<td>플래쉬 경로</td>
			</tr>
			<tr>
				<td>width</td>
				<td class="center">미필수</td>
				<td class="center">Number<br />(단 string형식으로 뒤에 "px" 붙여야함)</td>
				<td class="center">"100%"</td>
				<td>플래쉬의 가로사이즈</td>
			</tr>
			<tr>
				<td>height</td>
				<td class="center">미필수</td>
				<td class="center">Number<br />(단 string형식으로 뒤에 "px" 붙여야함)</td>
				<td class="center">"100%"</td>
				<td>플래쉬의 세로사이즈</td>
			</tr>
			<tr>
				<td>id</td>
				<td class="center">미필수</td>
				<td class="center">string</td>
				<td class="center">플래쉬의 파일명으로 적용</td>
				<td>플래쉬가 선언되는 object 엘리먼트의 아이디</td>
			</tr>
			<tr>
				<td>wmode</td>
				<td class="center">미필수</td>
				<td class="center">string</td>
				<td class="center">"window"</td>
				<td>
					<dl class="dlReview">
						<dt>"window"</dt>
						<dd>브라우져 기본 wmode , HTML위에 flash가 위치하게 됨 , flash위에 HTML 레이어가 올라갈수 없음.</dd>
						<dt>"opaque"</dt>
						<dd>높은 퍼포먼스를 요구하며 가장 부드러운 애니메이션을 보임</dd>
						<dd>Movie 아래의 모든 것을 가리게 된다. 위에 레이어를 올릴 수 있다.</dd>
						<dd>FireFox 한글 입력에 문제가 있고 키보드 입력에 문제 발생 가능성이 있다</dd>
						<dt>"transparent"</dt>
						<dd>Flash를 투명하게 하여 Flash 아래의 html 요소가 화면상에 나오게 할때 사용한다.</dd>
						<dd>애니메이션 속도가 저하 될수 있음.</dd>
						<dd>Movie를 투명하게 하여 뒤의 html 부분을 보여준다. </dd>
						<dt>"direct"</dt>
						<dd>FlashPlayer10부터 적용되며 알려진 문제는 없음.</dd>
						<dd>Browser FlashPlayer DC와 Stand Alone FlashPlayer DC의 차이가 없게 Stand Alone의 Performance를 그대로 Browser에서 확인</dd>
						<dt>"gpu"</dt>
						<dd> Hardware가속 지원.</dd>
						<dd>Graphic Card GPU를 활용 하드웨어 가속, 아직 기능이 미비하며 지원 Graphic Card에서만 Performance 향상</dd>
					</dl>
				</td>
			</tr>
			<tr>
				<td>asa</td>
				<td class="center">미필수</td>
				<td class="center">boolean</td>
				<td class="center">"true"</td>
				<td>플래쉬의 allowScriptAccess(스크립트 사용 가능여부)를 설정합니다.</td>
			</tr>
			<tr>
				<td>fv</td>
				<td class="center">미필수</td>
				<td class="center">string</td>
				<td class="center">null</td>
				<td>플래쉬 안에 flashVars를 설정합니다.</td>
			</tr>
		</tbody>
	</table>
 * @return object Element
 * @author <a href="mailto:dstyle@reflexion.co.kr">Dstyle</a>
 */
function stpSetFlash(src,hash){
	//초기값 설정
	var hash = $H(hash);
	var src = src;
	
	//옵션들 셋팅
	var oId = (hash.get("id"))?hash.get("id"):src.match(/[^/]+$/)[0].replace("/","").replace(/\.swf(\?)?.*/g,"");
	var oWid = (hash.get("width"))?hash.get("width"):"100%";
	var oHei = (hash.get("height"))?hash.get("height"):"100%";
	var oWm = (hash.get("wmode"))?hash.get("wmode"):"window";
	var oAs = (hash.get("asa"))?hash.get("asa"):"always";
	var oFv = (hash.get("fv"))?hash.get("fv"):"";
	var oCase = (hash.get("case"))?hash.get("case"):null;
	
	//뿌려질 구문 만들기
	var oTxt= "<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' type='application/x-shockwave-flash' "+
				"codeBase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0' width='"+oWid+"' height='"+oHei+"' id='"+oId+"'>"+
				"<param name='movie' value='"+src+"'>"+
				"<param name='quality' value='high'>"+
				"<param name='wmode' value='"+oWm+"'>"+
				"<param name='flashVars' value='"+oFv+"'>"+
				"<param name='allowScriptAccess' value='"+oAs+"'>"+
				"<embed src='"+src+"' type='application/x-shockwave-flash' width='"+oWid+"' height='"+oHei+"' id='"+oId+"' pluginspage='http://www.macromedia.com/go/getflashplayer' quality='high'"+
				"flashVars='"+oFv+"' allowScriptAccess='"+oAs+"' wmode='"+oWm+"' />"+
				"</object>";
	if(oCase){$(oCase).innerHTML=oTxt;}else{document.write(oTxt);}
	
	
	
	//뿌려진후 부터 발생하는 메소드들
	var oLoad = (hash.get("load"))?hash.get("load"):null;
	var oWheelLock = stp.$B((hash.get("wheelLock"))?hash.get("wheelLock"):false);
	var sObj = ($(oId).down("embed")) ? $(oId).down("embed") : $(oId);
	//플래쉬가 로드되면 실행
	if(oLoad){
		setTimeout(function(){oLoad.call(null,sObj)});
	};
	
	if(oWheelLock){
		Event.observe(document.body,"mousewheel",function(event){
			if(Event.element(event) == sObj){
				if (event.stopPropagation) { event.stopPropagation() };
			    if (event.preventDefault) { event.preventDefault() };
				event.cancelBubble = true;
			    event.cancel = true;
			    event.returnValue = false;
			}else{
				return false;
			};
		});
	};
};stp.setFlash=stpSetFlash;/**
 * 한글인지 확인합니다.
 * @name stp.isKor
 * @function
 * @param {String/require} str : 한글인지 확인할 String Object
 * @param {Boolean/option} blank : 공백허용
 * @return Boolean
 */
function stpIsKor(str,b){
	var s = (!stp.$B(b)) ? "" : "\\s";
	return eval("(/^[가-힣"+s+"]+$/).test(str)");
};stp.isKor=stpIsKor;

/**
 * 숫자인지 확인합니다.
 * @name stp.isNum
 * @function
 * @param {String/require} str : 숫자인지 확인할 String Object
 * @param {Boolean/option} blank : 공백허용
 * @return Boolean
 */
function stpIsNum(str,b){
	var s = (!stp.$B(b)) ? "" : "\\s";
	return eval("(/^[0-9"+s+"]+$/).test(str)");
};stp.isNum=stpIsNum;

/**
 * 영어인지 확인합니다.
 * @name stp.isEng
 * @function
 * @param {String/require} str : 영어인지 확인할 String Object
 * @param {Boolean/option} blank : 공백허용
 * @return Boolean
 * @author <a href="mailto:dstyle@reflexion.co.kr">Dstyle</a>
 */
function stpIsEng(str,b){
	var s = (!stp.$B(b)) ? "" : "\\s";
	return eval("(/^[a-zA-Z"+s+"]+$/).test(str)");
};stp.isEng=stpIsEng;

/**
 * 숫자와영어만 허용합니다.
 * @name stp.isEngNum
 * @function
 * @param {String/require} str : 숫자와 영어인지 확인할 String Object
 * @param {Boolean/option} blank : 공백허용
 * @return Boolean
 */
function stpIsEngNum(str,b){
	var s = (!stp.$B(b)) ? "" : "\\s";
	return eval("(/^[\-\_0-9a-zA-Z"+s+"]+$/).test(str)");
};stp.isEngNum=stp.isNumEng=stpIsEngNum;

/**
 * 지정된 글자수 범위를 확인합니다.
 * @name stp.isLength
 * @function
 * @param {String/require} str : 글자범위를 확인할 String Object
 * @param {Number/require} min : 최소값을 지정합니다.
 * @param {Number/option} max : 최대값을 지정합니다.
 * @return Boolean
 */
function stpIsLength(str,min,max){
	if(min<=str.length){
		var max = (max)?max:str.length;
		return (str.length<=max);
	};return false;
};stp.isLength=stpIsLength;

/**
 * 한글이름형식을 확인합니다.
 * @name stp.isName
 * @function
 * @param {String/require} str : 이름 String Object
 * @return Boolean
 */
function stpIsName(str){
	return (/^[가-힣]{2,}$/).test(str);
};stp.isName=stpIsName;

/**
 * 전화번호형식을 체크합니다.
 * @name stp.isPhone
 * @function
 * @param {Number/require} num0 : 전화번호의 국번 Number Object
 * @param {Number/require} num1 : 전화번호의 중간번호 Number Object
 * @param {Number/require} num2 : 전화번호의 끝번호 Number Object
 * @return Boolean
 * @author <a href="mailto:dstyle@reflexion.co.kr">Dstyle</a>
 */
function stpIsPhone(num0,num1,num2){
	var chk0 = (/^0[2-6]{1}[1-5]?$/).test(num0); if(num0=="0707" || num0=="0708"){chk0=true};
	var chk1 = (/^[0-9]{3,4}$/).test(num1);
	var chk2 = (/^[0-9]{4}$/).test(num2);
	if(chk0 && chk1 && chk2){ return true; };
	return false;
};stp.isPhone=stpIsPhone;

/**
 * 핸드폰번호형식을 체크합니다.
 * @name stp.isMobile
 * @function
 * @param {Number/require} num0 : 핸드폰번호의 앞자리 Number Object
 * @param {Number/require} num1 : 핸드폰번호의 중간번호 Number Object
 * @param {Number/require} num2 : 핸드폰번호의 끝번호 Number Object
 * @return Boolean
 * @author <a href="mailto:dstyle@reflexion.co.kr">Dstyle</a>
 */
function stpIsMobile(num0,num1,num2){
	var chk0 = (/^01[01256789]{1}$/).test(num0);
	var chk1 = (/^[0-9]{3,4}$/).test(num1);
	var chk2 = (/^[0-9]{4}$/).test(num2);
	if(chk0 && chk1 && chk2){ return true; };
	return false;
};stp.isMobile=stpIsMobile;

/**
 * 이메일주소형식을 체크합니다.
 * @name stp.isEmail
 * @function
 * @description : 이메일형식은 MSDN의 이메일형식을 기반으로 합니다.
 * @param {String/require} str0 : 이메일의 ID
 * @param {String/require} str1 : 이메일의 도메인
 * @return Boolean
 */
function stpIsEmail(str0,str1){
	var txt = str0+""+str1;
	var chk0 = (/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$/).test(str0);
	var chk1 = (/^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/).test(str1);
	if(chk0 && chk1 && txt.length<61){ return true; };
	return false;
};stp.isEmail=stpIsEmail;

/**
 * 체크박스 체크여부를 확인하고 value값을 리턴합니다.
 * @name stp.isCheck
 * @function
 * @description : 체크된 값이 있는 경우 checkbox의 value값을 기준으로 가져옵니다.
 * @description : 물론 만일 checkbox에 value값이 없는 경우에는 true로 리턴됩니다.
 * @param {String/require} str : 확인할 체크박스의 ID
 * @return Boolean or String
 */
function stpIsCheckBox(str){
	if(str && $(str).checked){
		return ($F(str)=="on") ? true : $F(str);
	};return false;
};stp.isCheck=stpIsCheckBox;

/**
 * 라디오버튼의 체크여부를 확인하고 선택된 라디오버튼의 value값을 리턴합니다.
 * @name stp.isRadio
 * @function
 * @description : 라디오버튼들 중 체크된것이 없는 경우엔 false를 리턴하며
 * @description : 라디오버튼들 중 체크되어있다면 체크되어있는 라디오버튼의 value값을 리턴합니다.
 * @param {String/require} name : 확인할 라디오버튼의 name값
 * @return String or false
 */
function stpIsRadio(name){
	var argItem = $A(document.getElementsByName(name)).find(function(s){ return s.checked; });
	return (!argItem) ? false : argItem.value;
};stp.isRadio=stpIsRadio;

/**
 * 카드번호형식을 체크합니다.
 * @name stp.isCard
 * @function
 * @param {Number/require} cn0 : 카드번호의 첫번째자리
 * @param {Number/require} cn1 : 카드번호의 두번째자리
 * @param {Number/require} cn2 : 카드번호의 세번째자리
 * @param {Number/require} cn3 : 카드번호의 네번째자리
 * @return Boolean
 */
function stpIsCard(){
	var arg = $A(arguments);
	return (arg.length==4) ? arg.all(function(s){return (/^[0-9]{4}$/).test(s)}) : false;
};stp.isCard=stpIsCard;

/**
 * 아이디형식을 지정하고 체크합니다.
 * @name stp.isId
 * @function
 * @param {String/require} str : 아이디
 * @param {Number/option} min : 아이디 글자수의 최소값 : 기본 1글자
 * @param {Number/option} max : 아이디 글자수의 최대값 : 기본 100글자
 * @param {Boolean/option} eng : 아이디가 영문으로 시작하는가에 대한 boolean : 기본 false
 * @return Boolean
 */
function stpIsId(str,min,max,eng){
	var min = (!min)?1:min;
	var max = (!max)?100:max;
	var reg = (stp.$B(eng)) ? "[a-zA-Z]{1}[0-9a-zA-Z_-]{"+(min-1)+","+(max-1)+"}" : "[0-9a-zA-Z_-]{"+min+","+max+"}";
	return eval("(/^"+reg+"$/).test(str)");
};stp.isId=stpIsId;

/**
 * 비밀번호를 체크합니다.
 * @name stp.isPw
 * @function
 * @param {String/require} str : 비밀번호 String Object
 * @param {Number/option} min : 비밀번호 글자수의 최소값 : 기본 1 글자
 * @param {Number/option} max : 비밀번호 글자수의 최대값 : 기본 100글자
 * @param {Boolean/option} wordType : 비밀번호의 전제조건을 설정합니다. (true: 영문,숫자,특수문자"-","_" 만 사용가능 , false: 모든문자허용(기본값))
 * @return Boolean
 */
function stpIsPw(str,min,max,wordType){
	return (stp.$B(wordType))?stpIsId(str,min,max):stpIsLength(str,min,max);
};stp.isPw=stp.isPassword=stpIsPw;

/**
 * 주민등록번호를 체크합니다.
 * @name stp.isJumin
 * @function
 * @description : XXXXXX-XXXXXXX(6-7) 
 * @param {Number/require} num0 : 주민등록번호의 앞 6자리
 * @param {Number/require} num1 : 주민등록번호의 뒤 7자리
 * @return Boolean
 */
function stpIsJumin(num0,num1){
	if((/^[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}$/).test(num0) && (/^[1234]{1}[0-9]{6}$/).test(num1)){
		var juArr = (num0+""+num1).toArray();
		var jNum = 0;
		var jS = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
		var juLast = juArr.pop();
		juArr.each(function(item,i){
			jNum += item * jS[i];//주민등록번호 체크구문
		});
		//주민등록번호 맨 마지막과 주민등록번호 번호알고리즘 비교
		return (juLast==((11-(jNum%11))%10));
	};return false;
};stp.isJumin=stpIsJumin;

/**
 * 외국인등록번호를 체크합니다.
 * @description : XXXXXX-XXXXXXX(6-7)
 * @name stp.isForeign
 * @function
 * @param {Number/require} num0 : 외국인등록번호의 앞 6자리
 * @param {Number/require} num1 : 외국인등록번호의 뒤 7자리
 * @return Boolean
 */
function stpIsForeign(num0,num1){
	if((/^[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}$/).test(num0) && (/^[5678]{1}[0-9]{1}[02468]{1}[0-9]{2}[6789]{1}[0-9]{1}$/).test(num1)){
		var foArr =(num0+""+num1).toArray();
		var fNum = 0;
		var jS = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
		var foLast=foArr.pop();
		foArr.each(function(item,i){
			fNum += item * jS[i];
		});
		return (foLast==((11-(fNum%11))%10));
	};return false;
};stp.isForeign=stpIsForeign;

/**
 * 사업자번호를 체크합니다.
 * @description : XXX-XX-XXXXX(3-2-5)
 * @name stp.isCompany
 * @function
 * @param {Number/require} comp0 : 사업자번호의 앞 3자리
 * @param {Number/require} comp1 : 사업자번호의 중간 2자리
 * @param {Number/require} comp2 : 사업자번호의 뒷 5자리
 * @return Boolean
 */
function stpIsCompany(comp0,comp1,comp2){
	if((/^[0-9]{3}$/).test(comp0) && (/^[0-9]{2}$/).test(comp1) && (/^[0-9]{5}$/).test(comp2)){
		var compNum = (comp0+""+comp1+""+comp2).toArray(); //일괄로 저장시키고 배열화
		var vaildNum = new Array(1,3,7,1,3,7,1,3,5); //사업자 번호용 키 배열
		var tempNum = 0; //모두 키와 사업자번호가 조합되어서 저장되는 변수
		var lastNum = compNum.last(); //마지막값 (체크번호)
		compNum.pop(); //마지막 번호는 빼버린다.
		compNum.each(function(item,i){
			tempNum += item*vaildNum[i]; //각번호 * 키 값 을 다 더한다.
		});
		var plusNum = parseInt((compNum.last() * 5)/10); //플러스값인 9번째수 *5 나누기 10
		return (lastNum==(10-((tempNum+plusNum)%10)))// 각번호*키값 된것에 플러스 값을 더하고, 더한값을 10으로 나누고 나머지를 10에서 뺀다. => 그게 마지막 값이 되어야 한다.
	};return false;
};stp.isCompany=stpIsCompany;

/**
 * 법인번호를 체크합니다.
 * @description : XXXXXX-XXXXXXX(6-7)
 * @name stp.isCorp
 * @function
 * @param {Number/require} num0 : 법인번호의 앞 6자리
 * @param {Number/require} num1 : 법인번호의 앞 7자리
 * @return Boolean
 */
function stpIsCorp(num0,num1){
	if((/^[0-9]{6}$/).test(num0) && (/^[0-9]{7}$/).test(num1)){
		var corpArr = (num0+""+num1).toArray();
		var cNum = 0;
		var cS = new Array(1,2,1,2,1,2,1,2,1,2,1,2);
		var lNum = corpArr.pop();
		corpArr.each(function(item,i){
			cNum += item * cS[i];
		});
		return (lNum==(10-(cNum%10)));
	};return false;
};stp.isCorp=stpIsCorp;
















var makeDatePicker = new Array();
function datePickerSkinUp(oid,skin,arg){
	if($(oid+"stpDatePickerSpan")){
		$(oid+"stpDatePickerSpan").parentNode.removeChild($(oid+"stpDatePickerSpan"));
	};
	var arg = (arg) ? $H(arg) : $H();
	var span = document.createElement("span"); //스판 엘리먼트 생성
	span.id=oid+"stpDatePickerSpan"; //아이디 설정
	$(span).setStyle({"position":"relative","border":"0","font-size":"1px","line-height":"1px"}); //스타일 설정
	
	var skinLayout = "<div id='"+oid+"DatePickerCase' class='"+skin+"DatePicker'>";
	skinLayout += "<div id='"+oid+"DatePickerHeader' class='"+skin+"DatePickerHeader'>";
		skinLayout += "<div id='"+oid+"DatePickerPrevYear' class='"+skin+"DatePickerPrevYear'><a href='#'><span>이전년</span></a></div>";
		skinLayout += "<div id='"+oid+"DatePickerPrevMonth' class='"+skin+"DatePickerPrevMonth'><a href='#'><span>이전달</span></a></div>";
		skinLayout += "<div id='"+oid+"DatePickerDateDiv' class='"+skin+"DatePickerDateDiv'><strong id='"+oid+"DatePickerDate'></strong></div>";
		skinLayout += "<div id='"+oid+"DatePickerNextMonth' class='"+skin+"DatePickerNextMonth'><a href='#'><span>다음달</span></a></div>";
		skinLayout += "<div id='"+oid+"DatePickerNextYear' class='"+skin+"DatePickerNextYear'><a href='#'><span>다음년</span></a></div>";
	skinLayout += "</div>";
	skinLayout += "<div id='"+oid+"DatePickerCalendar' class='"+skin+"DatePickerCalendar'>";
		skinLayout += "<div id='"+oid+"DatePicker' class='"+skin+"DatePickerCalendarSub'></div>";
	skinLayout += "</div></div>";
	
	$(span).innerHTML = skinLayout;
	$(oid).parentNode.insertBefore(span,$(oid)); //리턴받는 input의 앞에 적용시킨다.
	$(oid+"DatePickerCase").setStyle({
		"position":"absolute",
		"top":"0",
		"left":"0"
	});
	arg.update({
		"case":oid+"DatePickerCase",
		"calendar":oid+"DatePicker",
		"dateShow":oid+"DatePickerDate",
		"prevYear":oid+"DatePickerPrevYear",
		"prevMonth":oid+"DatePickerPrevMonth",
		"nextYear":oid+"DatePickerNextYear",
		"nextMonth":oid+"DatePickerNextMonth"
	});
	new stp.datePicker(oid,arg);
};
/**
 * @class 일자를 입력하는 인풋 엘리먼트에 클릭이 가능한 달력을 삽입합니다.
 * @param {String} objId : datePicker가 뿌려질 엘리먼트 아이디
 * @param {String} skin : 스킨을 사용하는 경우에 스킨명 (현재 blue만 지원)
 * @param {Hash} argHash : datePicker의 옵션을 지정합니다.
 * <table border="1" cellpadding="3" cellspacing="0" width="100%" class="desc">
			<thead>
				<tr>
					<th>키(key)</th>
					<th>필수도</th>
					<th>값형식<br />(typeof)</th>
					<th>기본값</th>
					<th>설명</th>
				</tr>
			</thead>
			<tbody>
			<tr>
				<td>lang</td>
				<td>미필수</td>
				<td>"kor"<br />"eng"<br />"engMin"</td>
				<td>"kor"</td>
				<td>datePicker의 달력에서 나오는 th부분을 지정합니다.
					<ul>
						<li>"kor" : 한글(월,화,수...)</li>
						<li>"eng" : 영문("Mon","Tue","Wed")</li>
						<li>"engMin" : 영문("Mo","Tu","We")</li>
					</ul>
				</td>
			</tr>
			<tr>
				<td>type</td>
				<td>미필수</td>
				<td>String</td>
				<td>"yyyy-mm-dd"</td>
				<td>
					datePicker에서 나오는 값의 리턴형식을 지정합니다.<br />
					"yyyy:mm:dd"로 선언하는 경우 리턴값은 "<strong id="reDateStr0">2009:11:16</strong>"로 리턴됩니다.<br />
					"yy.mm.dd"로 선언하는 경우 리턴값은 "<strong id="reDateStr1">09.11.16</strong>"로 리턴됩니다.
				</td>
			</tr>
			<tr>
				<td>case</td>
				<td>필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>datePicker의 전체 영역을 담당하는 div 엘리먼트를 설정합니다.</td>
			</tr>
			<tr>
				<td>calendar</td>
				<td>필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>달력이 표시되는 div엘리먼트를 설정합니다. innerHTML를 기반으로 table엘리먼트가 삽입됩니다.</td>
			</tr>
			<tr>
				<td>dateShow</td>
				<td>미필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>날짜가 나올 엘리먼트를 지정합니다.(yyyy.mm)형식 반환</td>
			</tr>
			<tr>
				<td>prevYear</td>
				<td>미필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>클릭시 이전년도로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>nextYear</td>
				<td>미필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>클릭시 다음년도로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>prevMonth</td>
				<td>미필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>클릭시 이전월로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>nextMonth</td>
				<td>미필수</td>
				<td>id(String)</td>
				<td>null</td>
				<td>클릭시 다음월로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>table</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"datePickerTable"</td>
				<td>달력이 표시되는 &lt;table&gt; 에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>sun</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"sun"</td>
				<td>달력 중 일요일에 해당하는 &lt;th&gt; , &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>sat</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"sat"</td>
				<td>달력 중 토요일에 해당하는 &lt;th&gt; , &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>day</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"day"</td>
				<td>달력 중 요일명에 해당하는 &lt;th&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>date</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"date"</td>
				<td>달력 중 날짜에 해당하는 &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>last</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"last"</td>
				<td>달력 중 마지막 주에 해당하는 &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>blank</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"blank"</td>
				<td>달력 중 비어있는 부분에 해당하는 &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			</tbody>
		</table>
 * @return interaction (상호작용)
 * @example
 * new stp.datePicker("inputId",{
 * 	"lang":"eng",
 * 	"type":"yy.mm.dd",
 * 	"case":"pickerCase"
 * }); //스킨을 사용하지 않는 경우.
 * 
 * new stp.datePicker("inputId","gray",{
 * 	"lang":"eng",
 * 	"type":"yy.mm.dd"
 * }); //스킨을 사용합니다.
 */
stp.datePicker = Class.create(
	/**
	 * @lends stp.datePicker
	 */	
	{
	initialize:function(objId,argHash){
		if(typeof argHash=="string"){
			return datePickerSkinUp(objId,argHash,$A(arguments)[2]);
		}
		var arg = (argHash) ? $H(argHash) : $H();
		this.caseId = arg.get("case");
		this.tableId = arg.get("calendar");
		this.caseDiv = $(arg.get("case"));
		
		//월수 만들기
		var nowDate = new Date(); //오늘날짜 구하기
		var nowYear = nowDate.getFullYear(); //오늘 년도 (윤년 체크에 사용)
		var nowMonth = nowDate.getMonth(); //오늘 월(시작점 띄울때 사용)
		
		var calDate = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		if(nowYear%4==0){// 년도가 4로 나누어지면 윤년
			calDate[1] = 29;
			if(nowYear%100==0){// 단 년도가 100으로 나누어 지면 평년
				calDate[1] = 28;
				if(nowYear%400==0){// 단 년도가 400으로 나누어 지면 윤년
					calDate[1] = 29;
				};
			};
		};
		
		//달력에 적용될 th부분 글자
		var lang = new Array("일","월","화","수","목","금","토"); //한글로 설정("lang":"kor")
		if(arg.get("lang")=="eng"){ lang = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; };//영어로 설정("lang":"eng")
		if(arg.get("lang")=="engMin"){ lang = ["Su","Mo","Tu","We","Th","Fr","Sa"]; };//영어(축약)로 설정("lang":"engMin")
		
		//달력일자로 표시될 모양 컨트롤
		//리턴될때의 문자구분
		var tempType0 = "-";
		var tempType1 = "-";
		var tempType2 = "yyyy";
		var dateType = arg.get("type");
		if(dateType){
			var yChk = dateType.toArray().findAll(function(item){if(item=="y"){return item;};});
			if(yChk.length==2){tempType2="yy"};
			tempType0 = dateType.substring(dateType.indexOf(tempType2)+yChk.length,dateType.indexOf("mm"));
			tempType1 = dateType.substring(dateType.indexOf("mm")+2,dateType.indexOf("dd"));
		};
		arg.update({
			"deli0":tempType0,
			"deli1":tempType1,
			"year":(tempType2=="yyyy") ? 4 : 2
		});
		
		this.objId = objId;
		this.arg = arg;
		this.monthDate = calDate;
		this.lang = lang;
		this.month = nowMonth;
		this.obj = $(this.arg.get("calendar"));
		
		//달력 만들기
		this.create(); 
		
		//이벤트 추가
		if(this.arg.get("prevYear")){
			$(this.arg.get("prevYear")).observe("click",function(){
				this.prevYear();
			}.bind(this));
		};
		if(this.arg.get("prevMonth")){
			$(this.arg.get("prevMonth")).observe("click",function(){
				this.prevMonth();
			}.bind(this));
		};
		if(this.arg.get("nextMonth")){
			$(this.arg.get("nextMonth")).observe("click",function(){
				this.nextMonth();
			}.bind(this));
		};
		if(this.arg.get("nextYear")){
			$(this.arg.get("nextYear")).observe("click",function(){
				this.nextYear();
			}.bind(this));
		};
	},
	create:function(){
		this.createTable(); //달력 HTML을 작성하는 함수
		this.addClass(); //달력 HTML에 CSS class를 삽입하는 함수
		this.addClick(); //달력 HTML에 a엘리먼트에 이벤트를 삽입하는 함수
		if(this.arg.get("dateShow")){
			this.dateShow(this.arg.get("dateShow")); //달력의 일자를 표시하는 함수
		}
	},
	createTable:function(){
		var showDate = new Date(); //현재.
			showDate.setMonth(this.month);
			this.showDate = showDate;
		var firstDate = new Date(); //첫째날
			firstDate.setMonth(this.month,1);
		var firstDay = firstDate.getDay();
		
		//table에 날짜 넣기
		var yStr = showDate.getFullYear()+""; //년 구하기
			yStr = (this.arg.get("year")==4) ? yStr : yStr.substring(2,4);
		var mStr = showDate.getMonth()+1;
			mStr = (mStr<10) ? "0"+mStr : mStr;//월 구하기
		var dStr; //일 구하기
		var mDay = this.monthDate[showDate.getMonth()] // 월의 날짜 계산
		var dateTable = "<table width='100%' border='0' cellpadding='0' cellspacing='0' id='"+this.objId+"Table'><thead><tr>";
		this.lang.each(function(item){ dateTable += "<th>"+item+"</th>" }); //달력에 적용되는 글자적용.
		dateTable += "</tr></thead><tbody>";
		if(firstDay!=0){
			dateTable+="<tr>";
			$R(1,firstDay).each(function(){
				dateTable += "<td>&nbsp;</td>";
			});
		}
		$R(1,mDay).each(function(item,i){
			dStr = (item<10) ? "0"+item : ""+item;
			if(i!=0 && (i+firstDay)%7==0){ //본래날짜 + 처음날짜 적용 /7일 해서 토요일로 구분한다.
				dateTable += "</tr><tr>";
			};
			dateTable += "<td><a href='#' title="+yStr+(this.arg.get("deli0"))+mStr+(this.arg.get("deli1"))+dStr+">"+item+"</a></td>";
			
			if(mDay==item && (firstDay+item)%7!=0){ //마지막 셀부터 토요일까지 td를 적용하는 부분
				var lNum = 7-((firstDay+item)%7);
				$R(1,lNum).each(function(ktem){
					dateTable += "<td>&nbsp;</td>";
				});
			};
		}.bind(this));
		dateTable+="</tr></tbody></table>";
		$(this.arg.get("calendar")).innerHTML = dateTable;
	},
	/**
	 * argHash로 class명이 지정되는 경우에 사용되는 메소드 입니다.
	 * @static
	 * @method
	 */
	addClass:function(){
		this.table = this.obj.down("table");
		var tbe = (!this.arg.get("table")) ? "datePickerTable" : this.arg.get("table");
		var sun = (!this.arg.get("sun")) ? "sun" : this.arg.get("sun");
		var sat = (!this.arg.get("sat")) ? "sat" : this.arg.get("sat");
		var th = (!this.arg.get("day")) ? "day" : this.arg.get("day");
		var td = (!this.arg.get("date")) ? "date" : this.arg.get("date");
		var end = (!this.arg.get("last")) ? "last" : this.arg.get("last");
		var blank = (!this.arg.get("blank")) ? "blank" : this.arg.get("blank");
		
		//table 클래스
		this.table.addClassName(tbe);
		
		//th 클래스
		this.table.select("th").each(function(item,i){
			if(i%7==0){ //일요일
				item.addClassName(sun);
			}else if(i%7==6){ //토요일
				item.addClassName(sat);
			}
			item.addClassName(th); //그외 평일
		});
		
		//td클래스
		this.table.select("td").each(function(item,i){
			if(i%7==0){ //일요일
				item.addClassName(sun);
			}else if(i%7==6){ //토요일
				item.addClassName(sat);
			};//평일
			item.addClassName(td);
		});
		
		//td 마지막 부분 클래스
		this.table.select("tr").last().select("td").each(function(item){
			item.addClassName(end);
		});
		
		//빈 td부분 클래스 넣기
		this.table.select("td").each(function(item){
			if(item.innerHTML=="&nbsp;"){
				item.addClassName(blank);
			};
		});
		
		//현재일표시 (또는 클릭일 표시)
		var nowDate = new Date();
		if(this.showDate.getMonth()==nowDate.getMonth() && this.showDate.getFullYear()==nowDate.getFullYear()){
			this.table.select("a")[(nowDate.getDate()-1)].addClassName("now");
		};
	},
	addClick:function(){
		this.table.select("a").each(function(item){
			item.onclick = function(){return false;};
			$(item).observe("click",function(){
				$(this.objId).value = item.getAttribute("title");
				this.caseDiv.hide();
			}.bind(this));
		}.bind(this));
	},
	/**
	 * argHash중 prevMonth가 설정되는 경우 자동적으로 지정되는 메소드 입니다.
	 * @static
	 * @method
	 */
	prevMonth:function(){
		this.month = this.month-1;
		this.create();
	},
	/**
	 * argHash중 nextMonth가 설정되는 경우 자동적으로 지정되는 메소드 입니다.
	 * @static
	 * @method
	 */
	nextMonth:function(){
		this.month = this.month+1;
		this.create();
	},
	/**
	 * argHash중 prevYear가 설정되는 경우 자동적으로 지정되는 메소드 입니다.
	 * @static
	 * @method
	 */
	prevYear:function(){
		this.month = this.month-12;
		this.create();
	},
	/**
	 * argHash중 nextYear가 설정되는 경우 자동적으로 지정되는 메소드 입니다.
	 * @static
	 * @method
	 */
	nextYear:function(){
		this.month = this.month+12;
		this.create();
	},
	/**
	 * argHash중 dateShow가 설정되는 경우 자동적으로 지정되는 메소드 입니다.
	 * @static
	 * @method
	 */
	dateShow:function(){
		$(this.arg.get("dateShow")).innerHTML = (this.showDate.getFullYear()+"")+"."+(this.showDate.getMonth()+1);
	},	
	onOpen:function(){
		
	},
	onClose:function(){
		
	}
});

var makeDateLinker = new Array();
function dateLinkerSkinUp(oid,skin,arg){
	var skinLayout = "<div id='"+oid+"DateLinkerCase' class='"+skin+"DateLinker'>";
	skinLayout += "<div id='"+oid+"DateLinkerPrevYear' class='"+skin+"DateLinkerPrevYear'><a href='#'><span>이전년</span></a></div>";
	skinLayout += "<div id='"+oid+"DateLinkerPrevMonth' class='"+skin+"DateLinkerPrevMonth'><a href='#'><span>이전달</span></a></div>";
	skinLayout += "<div id='"+oid+"DateLinkerDateDiv' class='"+skin+"DateLinkerDateDiv'><strong id='"+oid+"DateLinkerDate'></strong></div>";
	skinLayout += "<div id='"+oid+"DateLinkerNextMonth' class='"+skin+"DateLinkerNextMonth'><a href='#'><span>다음달</span></a></div>";
	skinLayout += "<div id='"+oid+"DateLinkerNextYear' class='"+skin+"DateLinkerNextYear'><a href='#'><span>다음년</span></a></div>";
	skinLayout += "<div id='"+oid+"DateLinkerCalendar' class='"+skin+"DateLinkerCalendar'>";
		skinLayout += "<div id='"+oid+"DateLinker' class='"+skin+"DateLinkerCalendarSub'></div>";
	skinLayout += "</div></div>";
	$(oid).innerHTML = skinLayout;
	
	var hash = $H(arg);
	var func = hash.unset("addClick");
	hash.update({
		"prevYear":oid+"DateLinkerPrevYear",
		"prevMonth":oid+"DateLinkerPrevMonth",
		"nextYear":oid+"DateLinkerNextYear",
		"nextMonth":oid+"DateLinkerNextMonth",
		"dateShow":oid+"DateLinkerDate"
	})
	makeDateLinker[oid] = new stp.dateLinker(oid+"DateLinker",hash);
	makeDateLinker[oid].addEvent("click",func);
	return makeDateLinker[oid];
}
/**
 * @class 달력을 클릭하면 링크가 가능하도록 하는 UI컴포넌트 입니다.
 * @param {String} objId : dateLinker가 뿌려질 엘리먼트 아이디
 * @param {String} skin : 스킨을 사용하는 경우에 스킨명 (현재 blue만 지원)
 * @param {Hash} argHash : dateLinker의 옵션을 지정합니다.
 * <table border="1" cellpadding="3" cellspacing="0" width="100%" class="desc">
		<thead>
			<tr>
				<th>키(key)</th>
				<th>필수도</th>
				<th>값형식<br />(typeof)</th>
				<th>기본값</th>
				<th>설명</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>lang</td>
				<td>미필수</td>
				<td>"kor"<br />"eng"<br />"engMin"</td>
				<td>"kor"</td>
				<td>dateLinker의 달력에서 나오는 th부분을 지정합니다.
					<ul>
						<li>"kor" : 한글(월,화,수...)</li>
						<li>"eng" : 영문("Mon","Tue","Wed")</li>
						<li>"engMin" : 영문("Mo","Tu","We")</li>
					</ul>
				</td>
			</tr>
			<tr>
				<td>addClick</td>
				<td>미필수</td>
				<td>function(item,date){}</td>
				<td>null</td>
				<td>
					dateLinker에 달력의 클릭이벤트를 지정합니다.
					<ul>
						<li>item : a엘리먼트를 반환합니다.</li>
						<li>date : 선택된 날짜를 반환합니다.(yyyymmdd형식)</li>
					</ul>
				</td>
			</tr>
			<tr>
				<td>dateShow</td>
				<td>미필수</td>
				<td>id{String}</td>
				<td>null</td>
				<td>날짜가 나올 엘리먼트를 지정합니다.(yyy.mm)형식 반환</td>
			</tr>
			<tr>
				<td>prevYear</td>
				<td>미필수</td>
				<td>id{String}</td>
				<td>null</td>
				<td>클릭시 이전년도로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>nextYear</td>
				<td>미필수</td>
				<td>id{String}</td>
				<td>null</td>
				<td>클릭시 다음년도로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>prevMonth</td>
				<td>미필수</td>
				<td>id{String}</td>
				<td>null</td>
				<td>클릭시 이전월로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>nextMonth</td>
				<td>미필수</td>
				<td>id{String}</td>
				<td>null</td>
				<td>클릭시 다음월로 달력을 전환할 엘리먼트를 지정합니다.</td>
			</tr>
			<tr>
				<td>table</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"dateLinkerTable"</td>
				<td>달력이 표시되는 &lt;table&gt; 에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>sun</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"sun"</td>
				<td>달력 중 일요일에 해당하는 &lt;th&gt; , &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>sat</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"sat"</td>
				<td>달력 중 토요일에 해당하는 &lt;th&gt; , &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>day</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"day"</td>
				<td>달력 중 요일명에 해당하는 &lt;th&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>date</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"date"</td>
				<td>달력 중 날짜에 해당하는 &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>last</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"last"</td>
				<td>달력 중 마지막 주에 해당하는 &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			<tr>
				<td>blank</td>
				<td>미필수</td>
				<td>class{String}</td>
				<td>"blank"</td>
				<td>달력 중 비어있는 부분에 해당하는 &lt;td&gt;에 class 어트리뷰트를 설정합니다.</td>
			</tr>
			
		</tbody>
	</table>
 * @example
 * //퍼블리셔가 사용하는경우(스킨미사용)
 * var testDateLinker = new stp.dateLinker("testId",{argHash});
 * 
 * //개발자가 사용하는경우(스킨사용)
 * var testDateLinker = new stp.dateLinker("testId","testSkin",{argHash});
 * 
 * 
 */
stp.dateLinker = Class.create(
	/**
	 * @lends stp.dateLinker
	 */
	{
	initialize:function(objId,argHash){
		if(typeof argHash=="string"){
			return dateLinkerSkinUp(objId,argHash,$A(arguments)[2]);
		}
		var arg = (argHash) ? $H(argHash) : $H();
		//월수 만들기
		var nowDate = this.reUrlDate(); //오늘날짜 구하기
		var nowYear = nowDate.getFullYear(); //오늘 년도 (윤년 체크에 사용)
		var nowMonth = nowDate.getMonth(); //오늘 월(시작점 띄울때 사용)
		this.dateY = nowYear;
		this.dateM = nowMonth;
		this.dateD = nowDate.getDate();
		
		var calDate = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		if(nowYear%4==0){// 년도가 4로 나누어지면 윤년
			calDate[1] = 29;
			if(nowYear%100==0){// 단 년도가 100으로 나누어 지면 평년
				calDate[1] = 28;
				if(nowYear%400==0){// 단 년도가 400으로 나누어 지면 윤년
					calDate[1] = 29;
				};
			};
		};
		//달력에 적용될 th부분 글자
		var lang = new Array("일","월","화","수","목","금","토"); //한글로 설정("lang":"kor")
		if(arg.get("lang")=="eng"){ lang = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; };//영어로 설정("lang":"eng")
		if(arg.get("lang")=="engMin"){ lang = ["Su","Mo","Tu","We","Th","Fr","Sa"]; };//영어(축약)로 설정("lang":"engMin")
		
		this.objId = objId;
		this.obj = $(objId);
		this.arg = arg;
		this.monthDate = calDate;
		this.lang = lang;
		this.month = nowMonth;
		this.chkDateShow = true;
		
		this.createTable();
		this.addClass();
		
		//이벤트 추가
		if(this.arg.get("addClick")){
			this.addEvent("click",this.arg.get("addClick"));
		};
		if(this.arg.get("onChange")){
			this.onChange(this.arg.get("onChange"));
		};
		if(this.arg.get("prevYear")){
			$(this.arg.get("prevYear")).onclick=function(){return false;}
			$(this.arg.get("prevYear")).observe("click",function(){
				this.prevYear();
			}.bind(this));
		};
		if(this.arg.get("prevMonth")){
			$(this.arg.get("prevMonth")).onclick=function(){return false;}
			$(this.arg.get("prevMonth")).observe("click",function(){
				this.prevMonth();
			}.bind(this));
		};
		if(this.arg.get("nextMonth")){
			$(this.arg.get("nextMonth")).onclick=function(){return false;}
			$(this.arg.get("nextMonth")).observe("click",function(){
				this.nextMonth();
			}.bind(this));
		};
		if(this.arg.get("nextYear")){
			$(this.arg.get("nextYear")).onclick=function(){return false;}
			$(this.arg.get("nextYear")).observe("click",function(){
				this.nextYear();
			}.bind(this));
		};
		//엘리먼트 보이기 추가
		if(this.arg.get("dateShow")){
			this.dateShow(this.arg.get("dateShow"));
		};
	},
	/**
	 * Table을 작성하는 함수입니다.
	 * @static
	 * @method
	 * 
	 */
	createTable:function(){
		var showDate = this.reUrlDate(); //현재.
			showDate.setMonth(this.month,1);
			this.showDate = showDate;
		var firstDate = this.reUrlDate(); //첫째날
			firstDate.setMonth(this.month,1);
		var firstDay = firstDate.getDay();
		
		
		//table에 날짜 넣기
		var yStr = showDate.getFullYear()+""; //년 구하기
		var mStr = showDate.getMonth()+1;
			mStr = (mStr<10) ? "0"+mStr : mStr;//월 구하기
		var dStr; //일 구하기
		var mDay = this.monthDate[showDate.getMonth()] // 월의 날짜 계산
		var dateTable = "<table width='100%' border='0' cellpadding='0' cellspacing='0' id='"+this.objId+"Table'>";
		//this.lang.each(function(item){ dateTable += "<th>"+item+"</th>" }); //달력에 적용되는 글자적용.
		dateTable += "<tbody>";
		if(firstDay!=0){
			dateTable+="<tr>";
			$R(1,firstDay).each(function(){
				dateTable += "<td>&nbsp;</td>";
			});
		}
		$R(1,mDay).each(function(item,i){
			dStr = (item<10) ? "0"+item : ""+item;
			if(i!=0 && (i+firstDay)%7==0){ //본래날짜 + 처음날짜 적용 /7일 해서 토요일로 구분한다.
				dateTable += "</tr><tr>";
			};
			dateTable += "<td><a href='#' title="+yStr+mStr+dStr+">"+item+"</a></td>";
			
			if(mDay==item && (firstDay+item)%7!=0){ //마지막 셀부터 토요일까지 td를 적용하는 부분
				var lNum = 7-((firstDay+item)%7);
				$R(1,lNum).each(function(ktem){
					dateTable += "<td>&nbsp;</td>";
				});
			};
		});
		dateTable+="</tr></tbody></table>";
		this.obj.innerHTML = dateTable;
	},
	addClass:function(){
		this.table = this.obj.down("table");
		var tbe = (!this.arg.get("table")) ? "dateLinkerTable" : this.arg.get("table");
		var sun = (!this.arg.get("sun")) ? "sun" : this.arg.get("sun");
		var sat = (!this.arg.get("sat")) ? "sat" : this.arg.get("sat");
		var th = (!this.arg.get("day")) ? "day" : this.arg.get("day");
		var td = (!this.arg.get("date")) ? "date" : this.arg.get("date");
		var end = (!this.arg.get("last")) ? "last" : this.arg.get("last");
		var blank = (!this.arg.get("blank")) ? "blank" : this.arg.get("blank");
		
		//table 클래스
		this.table.addClassName(tbe);
		
		//th 클래스
		this.table.select("th").each(function(item,i){
			if(i%7==0){ //일요일
				item.addClassName(sun);
			}else if(i%7==6){ //토요일
				item.addClassName(sat);
			}
			item.addClassName(th); //그외 평일
		});
		
		//td클래스
		this.table.select("td").each(function(item,i){
			if(i%7==0){ //일요일
				item.addClassName(sun);
			}else if(i%7==6){ //토요일
				item.addClassName(sat);
			};//평일
			item.addClassName(td);
		});
		
		//td 마지막 부분 클래스
		this.table.select("tr").last().select("td").each(function(item){
			item.addClassName(end);
		});
		
		//빈 td부분 클래스 넣기
		this.table.select("td").each(function(item){
			if(item.innerHTML=="&nbsp;"){
				item.addClassName(blank);
			};
		});
		
		//현재일표시 (또는 클릭일 표시)
		if(this.showDate.getMonth()==this.dateM && this.showDate.getFullYear()==this.dateY){
			this.table.select("a")[(this.dateD-1)].addClassName("now");
			this.table.select("a")[(this.dateD-1)].parentNode.addClassName("now");
		};
	},
	addEvent:function(e,func){
		this.eventFunc = func;
		this.table.select("a").each(function(item){
			item.onclick = function(){return false;};
			item.observe(e,function(){
				func.call(null,item,item.getAttribute("title"));
			});
		});
	},
	create:function(){
		this.createTable();
		this.addClass();
		this.addEvent("click",this.eventFunc);
		if(this.chkDateShow){
			this.dateShow(this.dateShowId);
		}
		if(this.cahngeFunc){
			this.cahngeFunc.call(null);
		}
	},
	prevMonth:function(){
		this.month = this.month-1;
		this.create();
	},
	nextMonth:function(){
		this.month = this.month+1;
		this.create();
	},
	prevYear:function(){
		this.month = this.month-12;
		this.create();
	},
	nextYear:function(){
		this.month = this.month+12;
		this.create();
	},
	dateShow:function(id){
		this.dateShowId = id;
		this.chkDateShow = true;
		$(this.dateShowId).innerHTML = (this.showDate.getFullYear()+"")+"."+(this.showDate.getMonth()+1);
		$(this.dateShowId).title = (this.showDate.getFullYear()+"")+"."+(this.showDate.getMonth()+1);
	},
	reUrlDate:function(){
		var date = new Date();
		var tDay = document.location+"";
		tDay = tDay.replace(/[\.]/g,"");
		tDay = tDay.match(/[012]{1}[0-9]{3}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}/g);
		if(tDay){
			tDay = (tDay.length==2)?tDay[1]:tDay[0];
			var y = tDay.substring(0,4);
			var m = (tDay.substring(4,6))-1;
			var d = tDay.substring(6,8);
			date.setYear(y);
			date.setMonth(m,d);
			this.dateY = date.getFullYear();
			this.dateM = date.getMonth();
			this.dateD = date.getDate();
		};
		return date;
	},
	onChange:function(func){
		this.cahngeFunc = func;
	}
});