
if (typeof rain == 'undefined')
	var rain = Class.create();

/**
 * rain.extend 
 * Class È®Àå
 */
if (rain.extend == null) {
	rain.extend = function(destination, source) {
		return Object.extend(Object.extend({}, destination), source);
	}
}

/**
 * ÆË¾÷ °ü¸®±â
 * @package com.rain
 * @version 1.0
 * @author http://cafen.net (outmind@cafen.net)
 */
var rainPopup = {
/**
 * µð¹ö±ë Å¬·¡½º
 */
	debug_class: null,
/**
 * Popup Class & Popup Style Class
 */
	check : function() {
		if (this.popup_class == null) {
			this.style_class = new rain.Popup.style({url_image:_editor_url +'images/'});
			this.popup_class = new rain.Popup(this.style_class);
		}
	},
/**
 * Debug Dialog
 */
	showDebug : function(event) {
		if (typeof event == 'undefined') event = window.event;
		if (event.keyCode == 27) {
			this.check();
			this.debug_class = new rain.Popup.debug('µð¹ö±ë ½ÃÀÛ',this.style_class);
			this.add(this.debug_class);
		}else 
			return ; 
	},

/**
 * show Debug Dialog Mag
 * @param  msg  Ç¥½ÃÇÒ ¸Þ¼¼Áö
 */
	addDebug : function(msg) {
		if (this.debug_class != null) 
			this.debug_class.addMsg(msg);
	},

/**
 * È¸¿ø Á¤º¸ Ç¥½Ã±â
 * @param  user_id  È¸¿ø ¾ÆÀÌµð
 * @param  obj  ±âÁ¸ Object
 * @param  user_nm  È¸¿ø¸í
 */
	showUser : function(user_id, obj, user_nm) {
		this.check();
		if (this.last_userid == user_id) {
			this.popup_class.closeChild();
			this.last_userid = '';
		} else {		
			this.last_userid = user_id;
			var blogUser = new rain.blogUser(user_id, user_nm, this.style_class);
			this.add(blogUser, {is_scrollable:false, toolbar:false, sticker:{obj:obj,pos:'TR'}});
		}
	},

/**
 * ¸Þ½ÃÁö º¸ÀÌ±â
 * @param  msg  ¸Þ¼¼Áö
 */
	alert : function(msg) {
		this.add(new rain.Popup.alert(msg,this.style_class), {is_scrollable:true});
	},

/**
 * È®ÀÎ Ã¢ º¸ÀÌ±â
 * @param  msg  ¸Þ¼¼Áö
 * @param  call_back  CallBack ÇÔ¼ö
 */
	confirm : function(msg, call_back) {
		this.add(new rain.Popup.confirm(msg, call_back, this.style_class), {is_scrollable:true});
	},

/**
 * ÀÔ·ÂÃ¢ Ã¢ º¸ÀÌ±â
 * @param  msg  ¸Þ¼¼Áö
 * @param  options  ÀÔ·ÂÃ¢¿É¼Ç
 * @param  call_back  CallBack ÇÔ¼ö
 */
	prompt : function(msg, call_back, options) {
		this.add(new rain.Popup.prompt(msg, call_back,options, this.style_class), {is_scrollable:true});
	},

/**
 * ¸ðµç Ã¢ ´Ý±â
 */
	close : function() {
		if (this.popup_class != null)
			this.popup_class.closeChild();
	},

/**
 * ÇöÀç Ã¢¿¡ »õ·Î¿î Ã¢À» º¸ÀÌ±â
 * @param  obj  º¸ÀÏ Object obj.obj ¿¡ ½ÇÁ¦Ã¢¿¡ º¸ÀÏ ³»¿ëÀ» ´ã°í ÀÖ¾î¾ßÇÔ
 * @param  options  Ã¢ ¿É¼Ç
 * @return  popup_class
 */
	add : function(obj, options) {
		this.check();
		return this.popup_class.add(obj, options);
	},

/**
 * »ý»óÇ¥ º¸ÀÌ±â
 * @param  init_color  ÃÊ±â »ö»ó°ª
 * @param  call_back  »ý»ó °ªÀ» Àü´ÞÇÒ ÇÔ¼ö
 */
	getColor : function (init_color, call_back, canbe_transparent) {
		this.check();
		var popup_class = this.popup_class;
		function getColor(color) {
			popup_class.closeChild();
			call_back(color);
		}
		this.add(new rain.Popup.ColorPicker(getColor, this.style_class, init_color, canbe_transparent), {is_scrollable:true});
	}
}

/**
 * µð¹ö±ë ½ÃÀÛ(ESC Å°¸¦ ´­·¶À» ¶§ È°¼ºÈ­µÊ
 */
// window.document.onkeypress = rainPopup.showDebug.bind(rainPopup);


/**
 * rain.Popup
 * ·¹ÀÎ ÆË¾÷ ÅëÁ¦±â
 */
rain.Popup = Class.create();
rain.Popup.prototype = {
/**
 * ¿©¹é Á¤º¸
 */
	popupMagin : {top:6, right:20, bottom:5, left:20},
/**
 * Å©±â Á¶Á¤ °¡´É¿©ºÎ
 */
	isResizeable : false,
/**
 * »ý¼ºÀÚ
 * @param  obj_class  ´ë»ó Class (obj_class.obj ¿¡ º» ³»¿ëÀ» Æ÷ÇÔÇÏ°í ÀÖ¾î¾ßÇÔ)
 * @param  options  ÆË¾÷Ã¢ ¿É¼Ç
 * @param  parentNode  ÇØ´ç ÆË¾÷Ã¢ÀÇ parentNode
 */
	initialize : function(obj_class, options, parentNode) {
		this.parentNode = parentNode;
		this.childNodes = [];
		if (this.parentNode == null) {
			var doc_area = document.getElementsByTagName("body")[0];
			this.style_class = (obj_class != null)?obj_class:new rain.Popup.style();
			try {
				this.obj_area = doc_area.insertBefore(rain.nodeUtil.getDiv({},{left:'0px',top:'0px',position:'absolute'}), doc_area.lastChild);
			} catch(ex) {
				this.obj_area = doc_area.appendChild(rain.nodeUtil.getDiv({},{left:'0px',top:'0px',position:'absolute'}));
			}
		} else {
			if (typeof obj_class.popupMagin != 'undefined')
				this.popupMagin = rain.extend(this.popupMagin, obj_class.popupMagin);

			this.obj = $(obj_class.obj);
			this.style_class = this.parentNode.style_class;
			obj_class.popup_class = this;
			this.is_closed = false;
			this.options = Object.extend({
				is_scrollable : false,
				is_transparent : false,
				toolbar : true,
				shadow : false,
				ismoveable : true,
				sticker : {obj : null, pos : 'TL', margin : [0,0]}
			}, options);	
			var doc_area = this.parentNode.obj_area;
			var tmp_obj = rain.nodeUtil.getDiv({},{zIndex : 1, position : 'relative'});
			this.frame_obj = doc_area.insertBefore(tmp_obj, doc_area.firstChild);
			if (this.options.shadow) {
				this.shadow_obj = this.frame_obj.appendChild(rain.nodeUtil.getDiv({},this.style_class.getStyle('shadow')));
				Position.absolutize(this.shadow_obj);
			} else 
				this.shadow_obj = null;
				
			if (!this.options.is_transparent)
				this.outbox_obj = this.frame_obj.appendChild(rain.nodeUtil.getDiv({},this.style_class.getStyle('outbox')));
			else 
				this.outbox_obj = this.frame_obj.appendChild(rain.nodeUtil.getDiv({},{}));
			this.drawFrame();
			this.reSize();
		}
	},
/**
 * ¿Ü°û ÇÁ·¹ÀÓ ±×¸®±â
 */
	drawFrame : function() {
		if (this.options.toolbar ) {
			this.top_area = this.outbox_obj.appendChild(rain.nodeUtil.getDiv({},{width:'auto', height:'16px',margin:'0 0 0 0px',backgroundImage:'url('+this.style_class.imgURL()+'pop_handlerbg.gif)',padding:'1 0 0 0px'}));
			this.handler = this.top_area.appendChild(rain.nodeUtil.getDiv({},this.style_class.getStyle('handler')));
			if (this.isResizeable)
				this.btn_toggle = this.top_area.appendChild(rain.nodeUtil.getButton({title:'ÃÖ¼ÒÈ­',onclick:this.toggle.bind(this)},this.style_class.getStyle('smallopenbtn')));
			else
				this.btn_toggle = this.top_area.appendChild(rain.nodeUtil.getDiv({},{height : '10px',width : '10px',fontSize : '3px',margin : '2px 1px 0px 2px',padding:'0px', cssFloat:'left',styleFloat:'left'}));
				
			this.btn_close = this.top_area.appendChild(rain.nodeUtil.getButton({title:'Ã¢´Ý±â',onclick:this.close.bind(this)},this.style_class.getStyle('smallclosebtn')));
			this.obj_area = this.outbox_obj.appendChild(rain.nodeUtil.getDiv({},Object.extend(this.style_class.getStyle('obj_area'), {padding : this.popupMagin.top+' '+this.popupMagin.right+' '+this.popupMagin.bottom+' '+this.popupMagin.left+'px'})));
			this.frame_margin = {w:(this.popupMagin.right + this.popupMagin.left + 2),h:(this.popupMagin.top + this.popupMagin.bottom + 16 + 1),l:0,t:0};
		} else if (this.options.is_transparent) {
			this.obj_area = this.outbox_obj.appendChild(rain.nodeUtil.getDiv({},{width:'auto', height:'auto',margin:'0px'}));
			this.frame_margin = {w:5,h:0,l:0,t:0};
		} else {
			this.obj_area = this.outbox_obj.appendChild(rain.nodeUtil.getDiv({},{width:'auto', height:'auto',margin:'0px',padding:'2px'}));
			this.frame_margin = {w:4,h:4,l:0,t:0};
		}
		this.obj_area.appendChild(this.obj);
		Position.absolutize(this.frame_obj);
		if (this.options.toolbar && this.options.ismoveable)
			new rain.Popup.Drag(this.frame_obj, {handler : [this.handler]});
	},
/**
 * ÇöÀçÀÇ Ã¢¿¡ »õ·Î¿î Child Ã¢À» ¸¸µé±â
 * @param  obj_class  ´ë»ó Class (obj_class.obj ¿¡ º» ³»¿ëÀ» Æ÷ÇÔÇÏ°í ÀÖ¾î¾ßÇÔ)
 * @param  options  ÆË¾÷Ã¢ ¿É¼Ç
 */
	add : function(obj_class,options) {
		if (this.childNodes.length > 0) 
			this.childNodes[0].close();
		var obj = new rain.Popup(obj_class,options,this);
		if (typeof obj_class.onPopup == 'function')
			obj_class.onPopup();
		this.appendChild(obj);
		return obj;
	},

/**
 * ÇöÀçÀÇ Ã¢¿¡ Child Object »ý¼ºÇÏ±â
 * @param  obj  ´ë»ó Class (obj_class.obj ¿¡ º» ³»¿ëÀ» Æ÷ÇÔÇÏ°í ÀÖ¾î¾ßÇÔ)
 */
	appendChild : function(obj) {
		this.childNodes.push(obj);
	},

/**
 * ÇöÀçÀÇ Ã¢¿¡ Child Object Æ¯Á¤ Object Á¦°ÅÇÏ±â
 * @param  obj  ´ë»ó Class
 */
	removeChild : function(obj) {
		this.childNodes = this.childNodes.findAll(function(value) {return (value != obj);});
		if (obj.frame_obj.parentNode != null) obj.frame_obj.parentNode.removeChild(obj.frame_obj);
	},

/**
 * Ã¢ Å©±â º¯°æ
 * @param  frm_height  ´ë»ó Ã¢ÀÇ ³ôÀÌ
 * @param  frm_width  ´ë»ó Ã¢ÀÇ °¡·Î
 */
	changeSize : function(frm_height, frm_width) {
		var style_info;
		if (frm_width != null) {
			style_info = {height:frm_height  + 'px',width : frm_width+ 'px'};
		} else {
			style_info = {height:frm_height + 'px'};
		}
		Element.setStyle(this.frame_obj,style_info);
		Element.setStyle(this.outbox_obj,style_info);
		if (this.shadow_obj != null)
			Position.clone(this.outbox_obj,this.shadow_obj);
		
	},

/**
 * Ã¢ Min & Maxmize (Toggle)
 */
	toggle : function() {
		this.is_closed = !this.is_closed;
		if (this.is_closed) {
			Element.hide(this.obj_area);
			Element.setStyle(this.btn_toggle, this.style_class.getStyle('smallminbtn'));
			this.changeSize(20);
		} else {
			Element.show(this.obj_area);
			Element.setStyle(this.btn_toggle, this.style_class.getStyle('smallopenbtn'));
			this.changeSize(this.obj_size.h+ this.popupMagin.top + this.popupMagin.bottom + 16 + 1);
		}
	},

/**
 * Ã¢ Å©±â º¯°æ
 */
	reSize : function() {
		this.obj_size  = {w:this.obj.offsetWidth, h:this.obj.offsetHeight};
		Element.setStyle(this.obj_area, {width:(this.obj_size.w)+'px',height:(this.obj_size.h)+'px'});
		this.changeSize(this.obj_size.h+this.frame_margin.h,this.obj_size.w+this.frame_margin.w);
		if (!this.is_resized) {
			if (this.handler != null) {
				var base_width = this.obj_size.w + this.popupMagin.left + this.popupMagin.right + 2;
				Element.setStyle(this.handler, {width:(base_width - 38)+'px'});
				Element.setStyle(this.top_area, {width:(base_width)+'px'});
			}
			if (this.options.sticker.obj != null) {
				var pos = Position.positionedOffset(this.options.sticker.obj);
				var wh = {w:this.options.sticker.obj.offsetWidth, h:this.options.sticker.obj.offsetHeight};
				switch(this.options.sticker.pos) {
					case 'TR' :
						pos[0] += wh.w; break;
					case 'BL' :
						pos[1] += wh.h; break;
					case 'BR' :
						pos[0] += wh.w; pos[1] += wh.h; break;
				}
				if (this.options.sticker.margin != null) {
					pos[0] +=  this.options.sticker.margin[0];
					pos[1] +=  this.options.sticker.margin[1];
				}
				Element.setStyle(this.frame_obj, {left:(pos[0] + this.frame_margin.l)+'px',top:(pos[1] + this.frame_margin.t)+'px'});
				
			} else if (this.parentNode == null || this.parentNode.parentNode == null)
				rain.nodeUtil.move2Center(this.frame_obj);
			else 
				rain.nodeUtil.move2Center(this.frame_obj, this.parentNode.obj_area);
			this.is_resized = true;
			if (this.options.is_scrollable) {
				this._scrolleffect = new rain.Effect.AutoScroll(this.frame_obj, {
					topTrack : false,
					slowDown : true,
					division : 10
				});
			}
		}
	},

/**
 * Ã¢ ´Ý±â
 */
	close : function() {
		if (this.parentNode != null) 
			this.parentNode.removeChild(this);
	},

/**
 * ÀÚ½ÄÃ¢ ´Ý±â
 */
	closeChild : function() {
		for(var i =0; i < this.childNodes.length; i++) 
			this.childNodes[i].close();
	},

/**
 * ÀÚµ¿ ½ºÅ©·Ñ ±â´É È°¼ºÈ­/ºñÈ°¼ºÈ­
 * @param  bl  È°¼ºÈ­ ¿©ºÎ
 */
	setautoScroll : function(bl) {
		if (this._scrolleffect)
			this._scrolleffect.setEnable(bl);
	},

/**
 * ÇöÀçÀÇ Ã¢ Åõ¸íÈ­ ¿©ºÎ
 * @param  bl  Åõ¸íÈ­ ¿©ºÎ
 */
	setTransparent : function(bl) {
		rain.nodeUtil.changeOpacity(this.frame_obj, bl);
	}
}


/**
 * rain.Popup.style
 * ·¹ÀÎ ÆË¾÷ ½ºÅ¸ÀÏ ÅëÁ¦±â
 */
rain.Popup.style = Class.create();
rain.Popup.style.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  options  ½ºÅ¸ÀÏ ¿É¼Ç
 */
	initialize : function(options) {
		this.options = Object.extend({
			line : '#9e9e9e',
			bg : '#FFFFFF',
			font : '#000000',
			handler : '#464646',
			btn : '#FFFFFF',
			tabon : '#363636',
			taboff : '#363636',
			box_bg : '#FFFFFF',
			box_font : '#000000',
			shadow : '#d0d0d0',
			innerLine : '#d4d4d4',
			shadow_margin : '3 0 0 3px',
			tabfont : '#ff7c1c',
			tabgab : '#6c6c6c',
			titlelineB : '#797979',
			titlelineG : '#d7d7d7',
			btnbg : 'pop_btnbg.gif',
			url_image : '/editor/images/',
			url_uploads : base_upload_url
		}, options);
	},
/**
 * ÀÌ¹ÌÁö °æ·Î °¡Á®¿À±â
 */
	imgURL : function() {
		return this.options.url_image;
	},
/**
 * ¾÷·Îµå °æ·Î °¡Á®¿À±â
 */
	uploadURL : function() {
		return this.options.url_uploads;
	},
/**
 * ½ºÅ¸ÀÏ °¡Á®¿À±â
 */
	getStyle : function(area_name, extra_options) {
		switch(area_name) {
			case 'toptaboff' :
				return {
					color : this.options.box_font,
					fontWeight:'',
					padding : '2px',
					fontSize : '11px',
					textAlign : 'center',
					cursor:rain.nodeUtil.getCursor()
				}
				break;
			case 'toptabon' :
				return {
					color : this.options.tabfont,
					fontWeight:'bolder',
					padding : '2px',
					fontSize : '11px',
					textAlign : 'center',
					cursor:rain.nodeUtil.getCursor()
				}
				break;
			case 'toptitle' :
				return {
					borderBottom : '2px solid ' + this.options.titlelineB,
					color : this.options.box_font,
					padding : '3 3 3 5px',
					fontSize : '12px',
					fontWeight:'bolder',
					textAlign : 'left',
					cursor:rain.nodeUtil.getCursor()
				}
				break;
			case 'toptitleLine' :
				return {
					borderTop : '0px',
					borderLeft : '0px',
					borderRight : '0px',
					borderBottom : '2px solid ' + this.options.titlelineG,
					padding : '1px',
					width : 'auto',
					fontSize : '3px'
				}
				break;
			case 'toptabgab' :
				return {
					color : this.options.tabgab,
					padding : '1px',
					width : '3px',
					fontSize : '10px'
				}
				break;
			case 'toptabline' :
				return {
					height : '1px',
					fontSize : '1px'
				}
				break;
			case 'smallbox' :
				return {
					border : '1px solid ' +this.options.line,
					backgroundColor : this.options.box_bg,
					color : this.options.box_font,
					fontSize : '12px',
					cursor:rain.nodeUtil.getCursor()
				}
				break;
			case 'outbox' :
				return {
					backgroundColor : this.options.bg,
					border : '1px solid '+this.options.line,
					width : 'auto',height : 'auto',
					margin :'0px',
					padding :'0px',
					textAlign : 'center'
				}
				break;
			case 'shadow' :
				return {
					backgroundColor : this.options.shadow,
					width : 'auto',height : 'auto',
					fontSize : '0px',
					padding : '0px',
					margin : this.options.shadow_margin,
					opacity : 0.7,
					filter : "alpha(opacity = 70)",
					textAlign : 'center',
					zIndex : -1
				}
				break;
			case 'handler' :
				return {
					backgroundColor : 'transparent',
					height : '10px',
					width : 'auto',
					fontSize : '1px',
					margin : '1px 1px 1px 2px',
					cssFloat : 'left', styleFloat : 'left',
					cursor : 'move'
				}
				break;
			case 'obj_area' :
				return {
					width:'auto', 
					height:'auto',
					margin:'-1 0 0 0px',
					padding : '6 20 5 20px',
					borderTop:'0px',
					borderRight:'1px solid '+this.options.innerLine,
					borderBottom:'1px solid '+this.options.innerLine,
					borderLeft:'1px solid '+this.options.innerLine
				}
				break;
			case 'smallbtn' :
				return {
					backgroundColor :  this.options.btn,
					height : '10px',
					width : '10px',
					fontSize : '1px',
					margin : '1px 1px 1px 2px',
					border : '1px solid '+ this.options.line
				}
				break;
			case 'smallclosebtn' :
				return {
					backgroundColor :  'transparent',
					backgroundImage :  'url('+this.imgURL() + 'pop_btn_close.gif)',
					height : '10px',
					width : '10px',
					fontSize : '1px',
					margin : '2px 1px 0px 2px',
					cursor : rain.nodeUtil.getCursor(),
					border : '0px solid '+ this.options.line
				}
				break;
			case 'smallopenbtn' :
				return {
					backgroundColor : 'transparent',
					backgroundImage :  'url('+this.imgURL() + 'pop_btn_min.gif)',
					height : '10px',
					width : '10px',
					fontSize : '3px',
					margin : '2px 1px 0px 2px',
					cursor : rain.nodeUtil.getCursor(),
					border : '0px solid ' + this.options.line
				}
				break;
			case 'smallminbtn' :
				return {
					backgroundColor :  'transparent',
					backgroundImage :  'url('+this.imgURL() + 'pop_btn_max.gif)',
					height : '10px',
					width : '10px',
					fontSize : '3px',
					margin : '2px 1px 0px 2px',
					cursor : rain.nodeUtil.getCursor(),
					border : '0px solid ' + this.options.line
				}
				break;
			case 'colorpreview' :
				return {
					width:'auto',height:'auto',fontSize:'10px', 
					border : '1px solid '+this.options.line,
					backgroundColor:this.options.bg,
					cssFloat:'left',styleFloat:'left',
					margin:'0px 2px 0px 0px',
					padding : '2 2 2 2px',
					textAlign : 'center',
					cursor : rain.nodeUtil.getCursor(),
					overflow : 'hidden'
				}
				break;
			case 'colorpreviewbox' :
				return {width:'11px',height: '10px',backgroundColor:extra_options, fontSize:'8px', cursor : rain.nodeUtil.getCursor(),overflow : 'hidden',margin:'0px'}
				break;
			case 'input' :
				return {
					border : '1px solid '+this.options.line, 
					width:'55px',
					height: '16px',
					backgroundColor:this.options.bg,
					color:this.options.font,
					fontSize: '11px',
					padding : '2 2 0 2px',
					margin:'0px 3px 0px 0px'
				}
				break;
			case 'msg' :
				return {
//					border : '1px dotted '+this.options.line, 
					color:this.options.font,
					padding:'5px',
					textAlign : 'center'
				}
				break;
			case 'button' :
				return {
					height: '17px',
					fontSize:'12px',
					backgroundColor:this.options.box_bg,
					color:this.options.box_font,
					border:'1px solid '+this.options.line,
					padding:'0px 5px 0px 5px',margin:'0px',
					margin : '0px 1px 0px 1px',
					cursor : rain.nodeUtil.getCursor()
				}
				break;
			case 'designbutton' :
				if (extra_options == undefined || extra_options == null)
					extra_options = 22;
				var padding_top = Math.round((extra_options - 15)/2);
				return {
					height: extra_options + 'px',
					fontSize:'11px',
					backgroundColor:this.options.box_bg,
					backgroundPosition : 'center center',
					backgroundRepeat : 'repeat-x',
					color:this.options.box_font,
					border:'1px solid '+this.options.line,
					padding: padding_top+' 5 '+padding_top+' 5px',
					margin : '0 1 0 1px',
					backgroundImage : 'url('+this.imgURL() + this.options.btnbg+')',
					cursor : rain.nodeUtil.getCursor()
				}
				break;
			case 'scroll' :
				return {
					scrollbarFaceColor : this.options.bg,
					scrollbarHighlightColor : this.options.line,
					scrollbar3dlightColor : this.options.bg,
					scrollbarDarkshadowColor : this.options.bg,
					scrollbarArrowColor : this.options.line,
					scrollbarShadowColor :this.options.handler,
					scrollbarTrackColor: this.options.bg,
					padding : '0px',
					overflowY:'auto' ,
					overflowX:'hidden'
				}
				break;
			default : 
				return {}
				break;
		}
	}	
}
	

/**
 * rain.Popup.confirm
 * ·¹ÀÎ ÆË¾÷ È®ÀÎ Ã¢
 */
rain.Popup.confirm = Class.create();
rain.Popup.confirm.prototype = {
/**
 * ¿©¹é Á¤º¸
 */
	popupMagin : {top:5, right:5, bottom:5, left:5},
/**
 * »ý¼ºÀÚ
 * @param  msg  º¸ÀÏ ¸Þ¼¼Áö
 * @param  call_back  È®ÀÎÃ¢ ÄÝ¹é
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(msg, call_back,style_class, base_width) {
		base_width = (typeof base_width == 'undefined')?300:base_width;
				
		if (typeof call_back != 'undefined') 
			this.onchange = call_back;
		this.style_class = (style_class != null)?style_class:new rain.Popup.style();
		this.obj = rain.nodeUtil.getDiv({},{width:base_width + 'px', height:'auto', margin : '0px'});
		this.obj.appendChild(rain.nodeUtil.getDiv({innerHTML:msg},Object.extend(this.style_class.getStyle('msg'),{margin:'5px',width:(base_width - 10) + 'px', height:'auto'})));
		var button_area = this.obj.appendChild(rain.nodeUtil.getDiv({},{padding:'5px',width:(base_width - 10) + 'px', height:'35px'}));
		button_area.appendChild(rain.nodeUtil.getButton({innerHTML:'¿¹', onclick:this.sendResult.bind(this,true)},Object.extend(this.style_class.getStyle('designbutton',20),{width:'70px'})));
		button_area.appendChild(rain.nodeUtil.getButton({innerHTML:'¾Æ´Ï¿ä', onclick:this.sendResult.bind(this,false)},Object.extend(this.style_class.getStyle('designbutton',20),{width:'70px'})));
	},
/**
 * ´Ý±â½Ã È£Ãâ ÇÔ¼ö
 */
	onchange : function() {},
/**
 * °á°ú Àü¼Û
 * @param  bl  true,false
 */
	sendResult : function(bl) {
		this.popup_class.parentNode.closeChild();
		this.onchange(bl);
	}
}

/**
 * rain.Popup.alert
 * ·¹ÀÎ ÆË¾÷ ¾Ë¸²Ã¢
 */
rain.Popup.alert = Class.create();
rain.Popup.alert.prototype = {
/**
 * ¿©¹é Á¤º¸
 */
	popupMagin : {top:2, right:5, bottom:3, left:5},
/**
 * »ý¼ºÀÚ
 * @param  msg  º¸ÀÏ ¸Þ¼¼Áö
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(msg, style_class, base_width) {
		base_width = (typeof base_width == 'undefined')?300:base_width;
		this.style_class = (style_class != null)?style_class:new rain.Popup.style();
		this.obj = rain.nodeUtil.getDiv({},{width:base_width + 'px', height:'auto'});
		this.obj.appendChild(rain.nodeUtil.getDiv({innerHTML:msg},Object.extend(this.style_class.getStyle('msg'),{margin:'5px',width:(base_width - 10)+ 'px', height:'auto', lineHeight:'140%'})));
		var button_area = this.obj.appendChild(rain.nodeUtil.getDiv({},{margin:'5px',width:(base_width -10) +'px', height:'35px'}));
		button_area.appendChild(rain.nodeUtil.getButton({innerHTML:'È®ÀÎ', onclick:this.sendResult.bind(this)},this.style_class.getStyle('designbutton')));
	},
/**
 * °á°ú Àü¼Û
 */
	sendResult : function() {
		if (this.popup_class != null)
			this.popup_class.close();
	}
}

/**
 * rain.Popup.debug
 * ·¹ÀÎ ÆË¾÷ ¾Ë¸²Ã¢
 */
rain.Popup.debug = Class.create();
rain.Popup.debug.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  msg  º¸ÀÏ ¸Þ¼¼Áö
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(msg, style_class) {
		this.style_class = (style_class != null)?style_class:new rain.Popup.style();
		this.obj = rain.nodeUtil.getDiv({},{width:'300px', height:'auto'});
		this.msgobj = this.obj.appendChild(rain.nodeUtil.getDiv({},{margin:'5px',width:'290px', height:'150px',overflowY:'auto',overflowX:'hidden'}));
		var button_area = this.obj.appendChild(rain.nodeUtil.getDiv({},{margin:'5px',width:'290px', height:'30px', padding:'10 0 0 0px'}));
		button_area.appendChild(rain.nodeUtil.getButton({innerHTML:'Ã»¼Ò', onclick:this.clear.bind(this)},this.style_class.getStyle('designbutton')));
		button_area.appendChild(rain.nodeUtil.getButton({innerHTML:'´Ý±â', onclick:this.close.bind(this)},this.style_class.getStyle('designbutton')));
		this.seqn = 0;
		this.clear();
		this.addMsg(msg);
	},
/**
 * ¸Þ¼¼Áö Ãß°¡
 * @param  msg  º¸ÀÏ ¸Þ¼¼Áö
 */
	addMsg : function(msg) {
		this.seqn ++;
		var msg_obj = rain.nodeUtil.getDiv({innerHTML : this.seqn +' : '+ msg},Object.extend(this.style_class.getStyle('msg'),{margin:'2px',width:'255px', height:'auto', textAlign:'left'}));
		if (this.last_msgobj == null)
			this.last_msgobj = this.msgobj.appendChild(msg_obj);
		else 
			this.last_msgobj = this.last_msgobj.parentNode.insertBefore(msg_obj,this.last_msgobj);
	},
/**
 * Ã¢ ´Ý±â
 */
	close : function() {
		this.popup_class.close();
	},
/**
 * ¸Þ¼¼Áö ÃÊ±âÈ­
 */
	clear : function() {
		this.last_msgobj = null;
		this.msgobj.innerHTML = '';
	}
}

/**
 * rain.Popup.imgViewer
 * ·¹ÀÎ ÆË¾÷ ÀÌ¹ÌÁö º¸±â
 */
rain.Popup.imgViewer = Class.create();
rain.Popup.imgViewer.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  img  ÀÌ¹ÌÁö °æ·Î
 * @param  base_width Ã¢ °¡·ÎÅ©±â
 * @param  base_height  Ã¢ ¼¼·ÎÅ©±â
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 * @param  onScale  È®´ë Ãà¼Ò½Ã È£Ãâ ÇÔ¼ö
 * @param  use_big  Å«½ºÄÉÀÏ¹Ù »ç¿ë¿©ºÎ
 * @param  use_mag  È®´ë Ãà¼Ò¹Ù »ç¿ë¿©ºÎ
 */
	initialize : function(img, base_width, base_height, style_class, onScale, use_big, use_mag, init_percent) {
		if (use_mag == undefined)
			use_mag = true;
		if (use_big == undefined)
			use_big = false;
		
		this.style_class = (style_class != null)?style_class:new rain.Popup.style();
		this.options = {
				width : base_width,
				height : base_height,
				x : 0,
				y : 0,
				useMag : use_mag,
				useBig : use_big,
				initMag : (init_percent == undefined)?0:init_percent,
				onScale : (onScale != null)?onScale:function(){}
		}
		this.keycontrol = (rain.nodeUtil.Browser.IE || rain.nodeUtil.Browser.Gecko)?true:false;
		var base_thickness = (this.options.useBig)?13:3;
		var margin_thickness = Math.round(base_thickness+5);
		var base_width = this.base_width = this.options.width - (margin_thickness+2) - ((this.options.useMag)?(margin_thickness +2):0);
		var base_height = this.base_height = this.options.height - (margin_thickness +2);
		this.obj = rain.nodeUtil.getDiv({},{width:this.options.width + 'px', height:this.options.height + 'px', overflow:'hidden', padding:'0px',margin:Math.round(margin_thickness/2)+' 0 0 '+Math.round(margin_thickness/2)+'px'});
		var tmp_obj = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:this.options.width + 'px', height:base_height+ 'px'}));
		if (this.options.useMag) {
			var img_scale = tmp_obj.appendChild(rain.nodeUtil.getDiv({},{width: margin_thickness + 'px', height : base_height + 'px', padding:'0px',cssFloat:'left', styleFloat:'left', margin : '0 1 0 0px'}));
			this.imgscale_class = new rain.Effect.imgSlider(img_scale, {
				maxPos : base_height,
				minValue : 10,
				maxValue : 100,
				step : 5,
				defValue : 100,
				bind_id : 'scale',
				onstartRelative : false,
				vertical : true,
				onSlider : true,
				title : 'È®´ë/Ãà¼Ò',
				barThickness : base_thickness,
				backgroundColor : this.style_class.options.line,
				lineColor : this.style_class.options.font,
				imgurl : this.style_class.imgURL(),
				onChange : this.imgSlider.bind(this)
			});
		}
		this.img_area = tmp_obj.appendChild(rain.nodeUtil.getDiv({},{width:base_width + 'px', height:base_height + 'px', overflow : 'hidden',padding:'0px', margin:'1 1 1 0px',cssFloat:'left',styleFloat:'left'}));
		var img_scale = tmp_obj.appendChild(rain.nodeUtil.getDiv({},{width:margin_thickness+'px', height : base_height + 'px',cssFloat:'left', styleFloat:'left', textAlign:'right', margin : '0 0 0 1px',padding:'0px'}));
		this.imgslidery_class = new rain.Effect.imgSlider(img_scale, {
			maxPos : base_height,
			minValue : 0,
			maxValue : 100,
			step : 5,
			defValue : 0,
			bind_id : 'pointY',
			onstartRelative : false,
			vertical : true,
			onSlider : true,
			title : '¼¼·Î(»óÇÏ) ÀÌµ¿',
			barThickness : base_thickness,
			backgroundColor : this.style_class.options.line,
			lineColor : this.style_class.options.font,
			imgurl : this.style_class.imgURL(),
			onChange : this.imgSlider.bind(this)
		});

		var tmp_obj = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:this.options.width + 'px', height: (margin_thickness +3) + 'px', margin : '2 0 0 0px',padding :'1 0 2 '+((this.options.useMag)?margin_thickness:0)+'px', textAlign:'left'}));
		var img_scale = tmp_obj.appendChild(rain.nodeUtil.getDiv({},{width:(base_width) + 'px', height : (margin_thickness +3) + 'px',textAlign:'left'}));
		this.imgsliderx_class = new rain.Effect.imgSlider(img_scale, {
			maxPos : base_width,
			minValue : 0,
			maxValue : 100,
			step : 5,
			defValue : 0,
			bind_id : 'pointX',
			onstartRelative : false,
			onSlider : true,
			title : '°¡·Î(ÁÂ¿ì) ÀÌµ¿',
			barThickness : base_thickness,
			backgroundColor : this.style_class.options.line,
			lineColor : this.style_class.options.font,
			imgurl : this.style_class.imgURL(),
			onChange : this.imgSlider.bind(this)
		});
		this.onmousedown = this.onDownImg.bindAsEventListener(this);
		this.onmousemove = this.onMoveImg.bindAsEventListener(this);
		this.onmouseup   = this.onUpImg.bindAsEventListener(this);
		this.onclick     = this.onClickImg.bindAsEventListener(this);
		this.onkeydown     = this.onDownkey.bindAsEventListener(this);
		this.setImg(img);
	},

/**
 * ½½¶óÀÌµå ¿É¼Ç ¹Þ±â
 * @param  val  ¿É¼Ç°ª[0-100]
 * @param  id ±âÁØ Å°°ª(scale, pointX, pointY)
 */
	imgSlider : function(val, id) {
		if (this.tmpimg != null && this.imgobj != null && this.imgobj.width != undefined && this.imgobj.width > 0 ) {
			switch(id) {
				case 'scale' :
					if (this.imgobj.width > this.base_width ) {
						var tmp_width = Math.max(this.imgobj.width * (val/100), this.base_width);
						var tmp_height = this.imgobj.height * (tmp_width/this.imgobj.width);
						Element.setStyle(this.tmpimg, {width:tmp_width + 'px', height:tmp_height+'px'});
						this.imgSlider(this.options.y,'pointY');
						this.imgSlider(this.options.x,'pointX');
					} else if (this.imgobj.style.width == undefined || this.imgobj.style.width == ''){
						Element.setStyle(this.tmpimg, {width:this.imgobj.width + 'px', height:this.imgobj.height+'px'});
					}
					this.options.onScale(val);
					break;
				case 'pointY' :
					if (parseInt(this.tmpimg.style.height) > this.base_height ) {
						var tmp_x = (parseInt(this.tmpimg.style.height) - this.base_height)*val/100 ;
						this.tmpimg.style.marginTop = tmp_x * (-1);
					}
					this.options.y = val;
					break;
				case 'pointX' :
					if (parseInt(this.tmpimg.style.width) > this.base_width ) {
						var tmp_x = (parseInt(this.tmpimg.style.width) - this.base_width)*val/100 ;
						this.tmpimg.style.marginLeft = tmp_x * (-1);
					}
					this.options.x = val;
					break;
			}
		}
	},
/**
 * ÀÌ¹ÌÁö ¿ÜºÎ È®´ë ¼³Á¤
 * @param  rate  ¿É¼Ç°ª[0-100]
 */
	setZoom : function(rate) {
		if (this.imgscale_class != null) 
			this.imgscale_class.setValue(rate);
		else
			this.imgSlider(rate, 'scale');
	},
/**
 * Å°º¸µå ´ÜÃàÅ° ÀÔ·Â½Ã 
 * @param  e  Event
 */
	onDownkey : function(event) {
		var eventchk = rain.nodeUtil.getKeyMove(event);
		if (eventchk != null) {
			if (eventchk.x != 0 && this.imgsliderx_class != null)
				this.imgsliderx_class.setMove((eventchk.x > 0)?true:false, 10);
			if (eventchk.y != 0 && this.imgslidery_class != null)
				this.imgslidery_class.setMove((eventchk.y > 0)?true:false, 10);
			if (eventchk.z != 0)
			 	if (this.imgscale_class != null)
					this.imgscale_class.setMove((eventchk.z > 0)?true:false, 10);
		}
		return false;
	},
/**
 * ÀÌ¹ÌÁö Å¬¸¯½Ã ÀÌ¹ÌÁö ÀÌµ¿ ½ÃÀÛ
 * @param  e  Event
 */
	onDownImg : function(e) {
		if (Event.isLeftClick(e)) {
			this._moving = true;
			this._startXY  = [e.clientX, e.clientY];
			this._startPos  = [parseInt(this.tmpimg.style.marginLeft), parseInt(this.tmpimg.style.marginTop)];
			Event.observe(this.tmpimg, 'mouseup', this.onmouseup);
			Event.observe(this.tmpimg, 'mouseout', this.onmouseup);
			Event.observe(this.tmpimg, 'mousemove', this.onmousemove);
			if (this.keycontrol)
				Event.observe(document, 'keydown', this.onkeydown);
			Event.stop(e);
		}
	},
/**
 * ÀÌ¹ÌÁö Å¬¸¯ ÇØÁ¦½Ã ÀÌµ¿ ¸ØÃã
 * @param  e  Event
 */
	onUpImg : function(e) {
		this._moving = false;
		Event.stopObserving(this.tmpimg, 'mouseup', this.onmouseup);
		Event.stopObserving(this.tmpimg, 'mouseout', this.onmouseup);
		Event.stopObserving(this.tmpimg, 'mousemove', this.onmousemove);
		if (this.keycontrol)
			Event.stopObserving(document, 'keydown', this.onkeydown);
		this.onClickImg(e);
	},
/**
 * ÀÌ¹ÌÁö ÀÌµ¿½Ã
 * @param  e  Event
 */
	onMoveImg : function(e) {
		var newX, newY;
		var o = this.options;
		if (!this._moving || !Event.isLeftClick(e)) return;
		newY =  (this._startPos[1] + e.clientY - this._startXY[1]);
		newY = Math.min(Math.max(newY,this.base_height - parseInt(this.tmpimg.height)), 0);
		this.tmpimg.style.marginTop = newY + 'px';
		newX =  (this._startPos[0] + e.clientX - this._startXY[0]);
		newX = Math.min(Math.max(newX,this.base_width - parseInt(this.tmpimg.width)), 0);
		this.tmpimg.style.marginLeft = newX + 'px';
	},
/**
 * ÀÌ¹ÌÁö Å¬¸¯½Ã ÀÌµ¿ ½ÃÀÛ
 * @param  e  Event
 */
	onClickImg : function(e) {
		var _x,_y,_ratex, _ratey , _marginx, _marginy;
		_x = parseInt(this.tmpimg.style.marginLeft);
		_y = parseInt(this.tmpimg.style.marginTop);
		_marginx = (this.options.width - 25) - parseInt(this.tmpimg.width);
		_marginy = (this.options.height - 20) - parseInt(this.tmpimg.height);
		_ratex = Math.min(Math.max((_marginx != 0)?(_x / _marginx*100):0, 0),100);
		_ratey = Math.min(Math.max((_marginy != 0)?(_y / _marginy*100):0, 0),100);
		this.imgsliderx_class.setValue(Math.round(_ratex));
		this.imgslidery_class.setValue(Math.round(_ratey));
	},
/**
 * ÆË¾÷Ã¢ È°¼ºÈ­½Ã ½ºÄÉÀÏ¹Ù È°¼ºÈ­
 */
	onPopup : function() {
		if (this.imgscale_class != null)
			Element.setStyle(this.imgscale_class._unit_element,{position : 'relative'});
		if (this.imgslidery_class != null)
			Element.setStyle(this.imgslidery_class._unit_element,{position : 'relative'});
		if (this.imgsliderx_class != null)
			Element.setStyle(this.imgsliderx_class._unit_element,{position : 'relative'});
	},
/**
 * ÀÌ¹ÌÁö ¼³Á¤ÇÏ±â
 * @param  img  ÀÌ¹ÌÁö °æ·Î
 */
	setImg : function(img) {
		this.img_area.innerHTML = '';	
		this.imgobj = new Image();
		this.imgobj.src = img;
		this.tmpimg = this.img_area.appendChild(rain.nodeUtil.getImage({src:this.imgobj.src},{margin:'0px'}));
		this.tmpimg.ondragstart = this.tmpimg.ondrag = function(){ return false }
		this.tmpimg.onmousedown = this.onmousedown;
		var rate = 100;		
		if (this.options.initMag == 0) {
			if (this.imgobj.width > this.options.width - 40) 
				rate = parseInt(((this.options.width - 40)/this.imgobj.width)*100);
		} else
			rate = this.options.initMag;
		this.setZoom(rate);
		if (this.imgslidery_class != null) 
			this.imgslidery_class.setValue(0);
		if (this.imgsliderx_class != null) 
			this.imgsliderx_class.setValue(0);
	}
}

/**
 * rain.Popup.imgViewer
 * ·¹ÀÎ ÆË¾÷ ÀÌ¹ÌÁö º¸±â
 */
rain.Popup.imgViewerSimple = Class.create();
rain.Popup.imgViewerSimple.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  img  ÀÌ¹ÌÁö °æ·Î
 * @param  base_width Ã¢ °¡·ÎÅ©±â
 * @param  base_height  Ã¢ ¼¼·ÎÅ©±â
 */
	initialize : function(img, base_width, base_height,base_padding) {
		this.options = {
				width : base_width,
				height : base_height,
				padding : base_padding,
				x : 50,
				y : 50
		}
		this.base_width = this.options.width +3;
		this.base_height = this.options.height + 3;
		this.obj = rain.nodeUtil.getDiv({},{width:this.options.width + 'px', height:this.options.height + 'px', overflow:'hidden', padding:this.options.padding + 'px',margin:'0px'});
		this.img_area = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:'100%', height:'100%', overflow:'hidden', padding:'0px',margin:'0px'}));
		this.setImg(img);
	},

/**
 * ½½¶óÀÌµå ¿É¼Ç ¹Þ±â
 * @param  val  ¿É¼Ç°ª[0-100]
 * @param  id ±âÁØ Å°°ª(scale, pointX, pointY)
 */
	imgSlider : function(val, id) {
		if (this.tmpimg != null && this.imgobj != null && this.imgobj.width != undefined && this.imgobj.width > 0 ) {
			switch(id) {
				case 'scale' :
					var tmp_width = Math.round(Math.max(this.imgobj.width * (val/100), this.base_width));
					var tmp_height = Math.round(this.imgobj.height * (tmp_width/this.imgobj.width));
					Element.setStyle(this.tmpimg, {width:tmp_width + 'px', height:tmp_height+'px'});
					this.imgSlider(this.options.y,'pointY');
					this.imgSlider(this.options.x,'pointX');
					break;
				case 'pointY' :
					var tmp_x = (parseInt(this.tmpimg.style.height) - this.base_height)*val/100 ;
					this.tmpimg.style.marginTop = tmp_x * (-1);
					this.options.y = val;
					break;
				case 'pointX' :
					var tmp_x = (parseInt(this.tmpimg.style.width) - this.base_width)*val/100 ;
					this.tmpimg.style.marginLeft = tmp_x * (-1);
					this.options.x = val;
					break;
			}
		}
	},

/**
 * ÀÌ¹ÌÁö ¼³Á¤ÇÏ±â
 * @param  img  ÀÌ¹ÌÁö °æ·Î
 */
	setImg : function(img) {
		this.imgobj = new Image();
		this.imgobj.src = img;
		this.tmpimg = this.img_area.appendChild(rain.nodeUtil.getImage({src:this.imgobj.src, border:'0'},{margin:'0px',padding:'0px'}));
		var rate = 100;
		var img_width = (parseInt(this.imgobj.width) > 0)? parseInt(this.imgobj.width)  : 100;
		var img_height = (parseInt(this.imgobj.height) >0)? parseInt(this.imgobj.height)  : 100;
		
		if (img_width/img_height > this.base_width / this.base_height) {
			rate = Math.ceil(this.base_height/img_height*100);
		} else {
			rate = Math.ceil(this.base_width/img_width*100);
		}
		this.imgSlider(rate, 'scale');
	}
}


/**
 * rain.Popup.objectViewer
 * ·¹ÀÎ ÆË¾÷ Object º¸±â
 */
rain.Popup.objectViewer = Class.create();
rain.Popup.objectViewer.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  child_obj º¸ÀÏ Object
 * @param  base_width Ã¢ °¡·ÎÅ©±â
 * @param  base_height  Ã¢ ¼¼·ÎÅ©±â
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(child_obj, base_width, base_height, style_class, off_scroll ) {
		if (off_scroll == undefined) 
			off_scroll = false;
		this.style_class = (style_class == null)?new rain.Popup.style():style_class;
		this.keycontrol = (rain.nodeUtil.Browser.IE || rain.nodeUtil.Browser.Gecko)?true:false;
		this.child_obj = child_obj;
		this.options = {
			width : base_width,
			height : base_height,
			off_scroll : off_scroll
		}
		var base_width = (!off_scroll)?this.options.width - 18: this.options.width - 6;
		var base_height = (!off_scroll)?this.options.height - 18: this.options.height - 8;
		this.obj = rain.nodeUtil.getDiv({}, {width:this.options.width + 'px', height : this.options.height + 'px', margin : '0 0 0 0px', padding:'0px'});
		var main_obj = this.obj.appendChild(rain.nodeUtil.getDiv({}, {width: (this.options.width - 2)+ 'px', height : (this.options.height - 10)+'px'}));
		var top_obj = main_obj.appendChild(rain.nodeUtil.getDiv({}, {width: base_width+ 'px', height : base_height+'px',cssFloat:'left',styleFloat:'left', margin:'5 1 1 1px'}));
		var tmp_obj = top_obj.appendChild(rain.nodeUtil.getDiv({}, {width: (base_width - 9)+ 'px', height : (base_height - 6)+'px', padding:'3px', overflow:'hidden'}));
		this.prev_area = tmp_obj.appendChild(rain.nodeUtil.getDiv({className:'blogtext'}, {width: 'auto', height : 'auto', overflow:'',padding:'0px',textAlign:'left'}));
		if (!off_scroll) {
			var img_scale = main_obj.appendChild(rain.nodeUtil.getDiv({},{width:'10px', height : (this.options.height - 15) + 'px', cssFloat:'left', styleFloat:'left', textAlign:'right', margin : '1px'}));
			this.imgslidery_class = new rain.Effect.imgSlider(img_scale, {
				maxPos : (this.options.height - 15),
				minValue : 0,
				maxValue : 100,
				step : 5,
				defValue : 0,
				bind_id : 'pointY',
				onstartRelative : false,
				vertical : true,
				onSlider : true,
				title : '¼¼·Î(»óÇÏ) ÀÌµ¿',
				backgroundColor : this.style_class.options.font,
				lineColor : this.style_class.options.line,
				imgurl : this.style_class.imgURL(),
				onChange : this.objSlider.bind(this)
			});
			var tmp_obj = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:this.options.width + 'px', height:'15px', padding :'0 0 3 5px', textAlign:'left'}));
			var img_scale = tmp_obj.appendChild(rain.nodeUtil.getDiv({},{width:(this.options.width -16)+ 'px', height : '10px'}));
			this.imgsliderx_class = new rain.Effect.imgSlider(img_scale, {
				maxPos : base_width,
				minValue : 0,
				maxValue : 100,
				step : 5,
				defValue : 0,
				bind_id : 'pointX',
				onstartRelative : false,
				onSlider : true,
				title : '°¡·Î(ÁÂ¿ì) ÀÌµ¿',
				backgroundColor : this.style_class.options.font,
				lineColor : this.style_class.options.line,
				imgurl : this.style_class.imgURL(),
				onChange : this.objSlider.bind(this)
			});
		}
		this.onmousedown = this.onDownObj.bindAsEventListener(this);
		this.onmousemove = this.onMoveObj.bindAsEventListener(this);
		this.onmouseup   = this.onUpObj.bindAsEventListener(this);
		this.onclick     = this.onClickObj.bindAsEventListener(this);
		this.onkeydown     = this.onDownkey.bindAsEventListener(this);
	},
/**
 * ÆË¾÷Ã¢ È°¼ºÈ­½Ã ½ºÄÉÀÏ¹Ù È°¼ºÈ­
 */
	onPopup : function() {
		if (this.imgslidery_class != null)
			Element.setStyle(this.imgslidery_class._unit_element,{position : 'relative'});
		if (this.imgsliderx_class != null)
			Element.setStyle(this.imgsliderx_class._unit_element,{position : 'relative'});
		if (this.prev_area != null)
			Element.setStyle(this.prev_area, {width:'auto', height:'auto'});
		this.init();
	},
/**
 * Å°º¸µå ´ÜÃàÅ° ÀÔ·Â½Ã 
 * @param  e  Event
 */
	onDownkey : function(event) {
		var eventchk = rain.nodeUtil.getKeyMove(event);
		if (eventchk != null) {
			if (eventchk.x != 0 && this.imgsliderx_class != null)
				this.imgsliderx_class.setMove((eventchk.x > 0)?true:false, 10);
			if (eventchk.y != 0 && this.imgslidery_class != null)
				this.imgslidery_class.setMove((eventchk.y > 0)?true:false, 10);
		}
		return false;
	},
/**
 * Object ¸¶¿ì½º Down ½Ã
 * @param  e  Event
 */
	onDownObj : function(e) {
		if (Event.isLeftClick(e)) {
			this._moving = true;
			this._startXY  = [Event.pointerX(e), Event.pointerY(e)];
			this._startPos  = [parseInt(this.prev_area.style.marginLeft), parseInt(this.prev_area.style.marginTop)];
			Event.observe(this.prev_area, 'mouseup', this.onmouseup);
			Event.observe(this.prev_area, 'mouseout', this.onmouseup);
			Event.observe(this.prev_area, 'mousemove', this.onmousemove);
			if (this.keycontrol)
				Event.observe(document, 'keydown', this.onkeydown);
			Event.stop(e);
		}
	},
/**
 * Object ¸¶¿ì½º UP ½Ã 
 * @param  e  Event
 */
	onUpObj : function(e) {
		this._moving = false;
		Event.stopObserving(this.prev_area, 'mouseup', this.onmouseup);
		Event.stopObserving(this.prev_area, 'mouseout', this.onmouseup);
		Event.stopObserving(this.prev_area, 'mousemove', this.onmousemove);
		if (this.keycontrol)
			Event.stopObserving(document, 'keydown', this.onkeydown);
		this.onClickObj(e);
	},
/**
 * Object ÀÌµ¿½Ã
 * @param  e  Event
 */
	onMoveObj : function(e) {
		var newX, newY;
		var o = this.options;
		if (!this._moving || !Event.isLeftClick(e)) return;
		newY =  (this._startPos[1] + Event.pointerY(e) - this._startXY[1]);
		newY = Math.min(Math.max(newY,(this.options.height - 20) - parseInt(this.prev_area.offsetHeight)), 0);
		this.prev_area.style.marginTop = newY + 'px';
		newX =  (this._startPos[0] + Event.pointerX(e) - this._startXY[0]);
		newX = Math.min(Math.max(newX,(this.options.width - 25) - parseInt(this.prev_area.offsetWidth)), 0);
		this.prev_area.style.marginLeft = newX + 'px';
	},
/**
 * Object Å¬¸¯½Ã ÀÌµ¿ÀÌµ¿
 * @param  e  Event
 */
	onClickObj : function(e) {
		var _x,_y,_ratex, _ratey , _marginx, _marginy;
		_x = parseInt(this.prev_area.style.marginLeft);
		_y = parseInt(this.prev_area.style.marginTop);
		_marginx = (this.options.width - 25) - parseInt(this.prev_area.offsetWidth);
		_marginy = (this.options.height - 20) - parseInt(this.prev_area.offsetHeight);
		_ratex = Math.min(Math.max((_marginx != 0)?(_x / _marginx*100):0, 0),100);
		_ratey = Math.min(Math.max((_marginy != 0)?(_y / _marginy*100):0, 0),100);
		if (this.imgsliderx_class != null)
			this.imgsliderx_class.setValue(Math.round(_ratex));
		if (this.imgslidery_class != null)
			this.imgslidery_class.setValue(Math.round(_ratey));
	},
/**
 * Object ½½¶óÀÌµå ÀÌµ¿½Ã
 * @param  val  ±âÁØ°ª
 * @param  id  ±âÁØÅ°
 */
	objSlider : function(val, id) {
		if (this.prev_area != null && this.prev_area.offsetHeight != undefined && this.prev_area.offsetHeight > 0 ) {
			var pos = [this.prev_area.offsetWidth, this.prev_area.offsetHeight];
			switch(id) {
				case 'pointY' :
					var base_height = (this.prev_area.offsetHeight - (this.options.height-20)) * (val/100);
					this.prev_area.style.marginTop = '-' + base_height + 'px';
					rainPopup.addDebug(base_height);
					break;
				case 'pointX' :
					var base_width = (this.prev_area.offsetWidth - (this.options.width-20)) * (val/100);
					this.prev_area.style.marginLeft = '-' + base_width + 'px';
					break;
			}
		}
	},
/**
 * Object Å©±â ¼³Á¤
 */
	setSize : function() {
		if (this.prev_area != null ) {
			if (this.prev_area.offsetHeight != undefined && this.prev_area.offsetHeight > 0 && this.prev_area.offsetWidth > 0) {
				Element.setStyle(this.prev_area, {width:this.prev_area.offsetWidth + 'px', height:this.prev_area.offsetHeight + 'px'});
				this.prev_area.ondragstart = this.prev_area.ondrag = function(){ return false; }
				this.prev_area.onmousedown = this.onmousedown;
				if (this.imgsliderx_class != null)
					this.imgsliderx_class.setValue(0);
				if (this.imgslidery_class != null)
					this.imgslidery_class.setValue(0);
			}else
				window.setTimeout(this.setSize.bind(this),10);
		}
	},
/**
 * html À» Object ·Î º¸±â
 * @param  html  ´ë»ó html
 */
	setHTML : function(html) {
		this.child_obj = rain.nodeUtil.getDiv({innerHTML:html, className:'blogtext', onfocus : function(){this.blur();}}, {textAlign:'left',padding:'5px',width:'auto',height:'auto'});
		this.init();
	},
/**
 * ÃÊ±âÈ­
 */
	init : function() {
		if (this.child_obj != null) {
			if (this.last_childobj != null)
				this.last_childobj.parentNode.removeChild(this.last_childobj);
			if (this.prev_area != null)
				Element.setStyle(this.prev_area, {width:'auto', height:'auto'});
			this.last_childobj = this.prev_area.appendChild(this.child_obj);
			this.setSize();
		}
	}
}

/**
 * rain.Popup.prompt
 * ·¹ÀÎ ÆË¾÷ ÀÔ·ÂÃ¢
 */
rain.Popup.prompt = Class.create();
rain.Popup.prompt.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  msg º¸ÀÏ ¸Þ¼¼Áö
 * @param  call_back Àü´Þ ÇÔ¼ö
 * @param  options  ÀÔ·ÂÇÒ °ªÀÇ ÇüÅÂ
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(msg, call_back, options, style_class) {
		this.options = Object.extend({
			value : '',
			accept : null,
			unaccept : null,
			strtype : null,
			min : 1,
			max : 150
		},options);
		if (call_back != undefined) 
			this.onchange = call_back;
		
		this.style_class = (style_class != null)?style_class:new rain.Popup.style();

		this.obj = rain.nodeUtil.getDiv({},{width:'300px', height:'auto'});
		this.obj.appendChild(rain.nodeUtil.getDiv({innerHTML:msg},Object.extend(this.style_class.getStyle('msg'),{margin:'5px',width:'280px', height:'auto'})));
		var button_area = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:'280px', height:'35px'}));
		this.input_box = button_area.appendChild(rain.nodeUtil.getInput({
			value : this.options.value
		}, Object.extend(this.style_class.getStyle('input'),{width:'150px'})));
		Event.observe(this.input_box, 'keypress', this.enterKey.bind(this));
		button_area.appendChild(rain.nodeUtil.getButton({innerHTML:'È®ÀÎ', onclick:this.sendResult.bind(this)},this.style_class.getStyle('button')));
	},
/**
 * °á°ú°ª Àü¼Û
 */
	onchange : function() {},
/**
 * ÀÔ·Â ¹ÞÀº °ªÀÇ À¯È¿¼º ÆÇ´Ü
 * @param  s ÀÔ·Â ¹ÞÀº °ª
 * @param  spc Æ÷ÇÔÇØ¾ß ÇÏ´Â ¹®ÀÚ
 */
	checkType : function (s,spc) {
		for(var i=0; i<s.length; i++) 
			if (spc.indexOf( s.substring(i, i+1)) < 0) 
				return false;
		return true;
	},
/**
 * ÀÔ·Â ¹ÞÀº °ªÀÇ À¯È¿¼º ÆÇ´Ü
 * @param  s ÀÔ·Â ¹ÞÀº °ª
 * @param  spc Æ÷ÇÔÇØ¼­´Â ¾Ê´Â ¹®ÀÚ
 */
	checkBType : function(s,spc) {
		for(var i=0; i<s.length; i++) 
			if (spc.indexOf( s.substring(i, i+1)) > 0) 
				return false;
		return true;
	},
/**
 * Enter Å° ÀÔ·Â ½Ã 
 * @param  event Event
 */
	enterKey : function(event) {
		if (event.keyCode == 13) 
			this.sendResult();
	},
/**
 * °á°ú °ª Àü¼Û
 */
	sendResult : function() {
		var result = this.input_box.value;
		if (result.length > this.options.max) 
			this.popup_class.add(
			new rain.Popup.alert('ÃÖ´ë ' + this.options.max + 'ÀÚ¸® ÀÌ»óÀ» ³ÑÀ» ¼ö ¾ø½À´Ï´Ù.'), 
			{sticker:{
				obj:this.input_box,
				pos : 'BL'
			}}
			);	
		else if (result.length < this.options.min) 
			this.popup_class.add(
				new rain.Popup.alert('ÃÖ¼Ò ' + this.options.min + 'ÀÚ¸® ÀÌ»óÀ» ÀÔ·ÂÇÏ¿© ÁÖ½Ê½Ã¿À.', this.style_class)
			);	
		else if (this.options.strtype != null && !this.checkFormat(result)) 
			this.popup_class.add(
				new rain.Popup.alert(this.error_msg, this.style_class)
			);	
		else if (this.options.accept != null && !this.checkType(result,this.options.accept)) 
			this.popup_class.add(
				new rain.Popup.alert('À¯È¿ÇÏÁö ¾ÊÀº ¹®ÀÚ°¡ µî·ÏµÇ¾î ÀÖ½À´Ï´Ù.', this.style_class)
			);	
		else if (this.options.unaccept != null && !this.checkBType(result,this.options.unaccept)) 
			this.popup_class.add(
				new rain.Popup.alert('À¯È¿ÇÏÁö ¾ÊÀº ¹®ÀÚ°¡ µî·ÏµÇ¾î ÀÖ½À´Ï´Ù.', this.style_class)
			);	
		else 	{
			this.onchange(result);
			if (this.popup_class != null)
				this.popup_class.close();
		}
	},
/**
 * °á°ú °ªÀÇ À¯È¿¼º ÆÇ´Ü
 */
	checkFormat : function(str) {
		switch(this.options.strtype) {
			case 'url' :
				if (!str.match(/^(http:\/\/.+\..+)/i)) {
					this.error_msg = "URL ÁÖ¼Ò´Â http://domain.com/index.html<br> ÇüÅÂ·Î ÀÔ·ÂÇÏ¿© ÁÖ½Ê½Ã¿À";
					return false;
				} else
					return true;
				break;
			case 'email' :
				if (!str.match(/^(.+@.+\..+)/i)) {
					this.error_msg = "¸ÞÀÏÁÖ¼Ò´Â email@domain.com ÀÇ Çü½Ä¸¸ À¯È¿ÇÕ´Ï´Ù.";
					return false;
				} else 
					return true;
				break;
			case 'id' :
				if (!str.match(/^([0-9a-zA-Z]+)$/i)) {
					this.error_msg = "¿µ¹®ÀÚ È¤Àº ¼ýÀÚ¸¸ ÀÔ·Â °¡´ÉÇÕ´Ï´Ù.";
					return false;
				}  else 
					return true;
				break;
			case 'number' :
				if (!str.match(/^([0-9]+)$/i)) {
					this.error_msg = "¼ýÀÚ¸¸ ÀÔ·ÂÇÏ½Ç¼ö ÀÖ½À´Ï´Ù.";
					return false;
				}  else 
					return true;
				break;
			case 'korean' :
				if (!this.checkBType(str, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&*+-./=?@^_`{|}~!@#$%^&*()_+|`'\"-=:;<>?,./¡Ù¡Ø¡Ú¡Û¡Ü¡Ý¡Þ£¦¡ß")){
					this.error_msg = "ÇÑ±Û°ú °ø¹éÀ» Á¦¿ÜÇÑ ´Ù¸¥ ¹®ÀÚ°¡ ¿Ã¼ö ¾ø½À´Ï´Ù.";
					return false;
				} else 
					return true;
				break;
				
		}
	}
}


/**
 * rain.Popup.Drag 
 * ·¹ÀÎ ÆË¾÷ Ã¢ µå·¡±×
 */
rain.Popup.Drag = Class.create();
rain.Popup.Drag.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  obj µå·¡±×ÇÒ Object
 * @param  options  ÀÔ·ÂÇÒ °ªÀÇ ÇüÅÂ
 */
	initialize : function(obj, options) {
		this.obj = $(obj);
		this.options = options;
		this.onmousedown = this.onDragStart.bindAsEventListener(this);
		this.onmousemove = this.onDrag.bindAsEventListener(this);
		this.onmouseup   = this.onDragEnd.bindAsEventListener(this);
		var handler = this.options.handler;
		if (handler != undefined) {
			if (typeof handler == 'string')
				Event.observe($(handler), 'mousedown', this.onmousedown);
			else if (!handler.length) 
				Event.observe(this.obj, 'mousedown', this.onmousedown);
			else 
				for(var i=0; i < handler.length; i++) 
					Event.observe($(handler[i]), 'mousedown', this.onmousedown);
		} else 
				Event.observe(this.obj, 'mousedown', this.onmousedown);
	},
/**
 * µå·¡±× ½ÃÀÛ
 * @param  e  Event
 */
	onDragStart : function(e) {
		this.orgPosition   = this.obj.style.position;
		if (this.orgPosition != 'absolute')
			Position.absolutize(this.obj);
		Event.observe(document, 'mousemove', this.onmousemove);
		Event.observe(document, 'mouseup', this.onmouseup);
		Event.observe(document, 'keypress', this.onmouseup);
		this.startX = Event.pointerX(e);
		this.startY = Event.pointerY(e);
		this.startPos = Position.positionedOffset(this.obj);
		this.orgZ   = this.obj.style.zIndex;
		this.obj.style.zIndex = 1000;
		this.obj.style.right = this.obj.style.bottom = '';
		this.obj.style.top = this.startPos[1]+'px';
		this.obj.style.left = this.startPos[0]+'px';
		if (this.options.limitArea) {
			var limitArea = this.options.limitArea;
			var limCoords = Position.cumulativeOffset(limitArea);
			var limLeft   = limCoords[0];
			var limTop    = limCoords[1];
			var limWidth  = limitArea.scrollWidth || limitArea.offsetWidth ;
			var limHeight = limitArea.scrollHeight || limitArea.offsetHeight;

			this.limit = {
				left   : limLeft,
				right  : limLeft + limWidth,
				top    : limTop,
				bottom : limTop + limHeight
			};
		}
		Event.stop(e);
	},
/**
 * ÀÌµ¿
 * @param  e  Event
 */
	onDrag : function(e) {
		var x = Event.pointerX(e);
		var y = Event.pointerY(e);
		var new_x = this.startPos[0] - this.startX + x;
		var new_y = this.startPos[1] - this.startY + y;

		if (this.options.limitArea) {
			if (new_x < this.limit.left) new_x = this.limit.left;
			else if (new_x > this.limit.right - this.obj.offsetWidth) new_x = this.limit.right - this.obj.offsetWidth;

			if (new_y < this.limit.top) new_y = this.limit.top;
			else if (new_y > this.limit.bottom - this.obj.offsetHeight) new_y = this.limit.bottom - this.obj.offsetHeight;
		}
		this.obj.style.top = new_y+'px';
		this.obj.style.left = new_x+'px';
		Event.stop(e);
	},
/**
 * ÀÌµ¿ ¿Ï·á
 * @param  e  Event
 */
	onDragEnd : function(e) {
		Event.stopObserving(document, 'mousemove', this.onmousemove);
		Event.stopObserving(document, 'mouseup', this.onmouseup);
		Event.stopObserving(document, 'keypress', this.onmouseup);
		this.obj.style.zIndex = this.orgZ;
		if (this.orgPosition != 'absolute')
			Position.relativize(this.obj);
	}
}


/**
 * rain.Editor.Popup.ColorPicker
 * »ö»ó ¼±ÅÃ±â
 */
rain.Popup.ColorPicker = Class.create();
rain.Popup.ColorPicker.prototype = {
/**
 * ¿©¹é Á¤º¸
 */
	popupMagin : {top:6, right:10, bottom:5, left:10},
/**
 * ÃÊ±â °ª
 */
	init_color : '#464646',
/**
 * ÃÊ±â°ª ºÒ·¯ ¿À±â ¸í·É
 */
	color_cmd : 'ForeColor',
/**
 * µðÀÚÀÎ Á¤º¸
 */
	picker_option : {
		width : 170,
		height : 170,
		hue_height : 12
	},
/**
 * Åõ¸í »ö»ó Á¤º¸
 */
	transparent_color : 'transparent',
/**
 * »ý¼ºÀÚ
 * @param  onchangeFnc ¿Ï·á½Ã Àü´Þ ÇÔ¼ö
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 * @param  init_color  ÃÊ±â »ö»ó
 */
	initialize : function(onchangeFnc, style_class, init_color, canbe_transparent) {
		this.canbe_transparent =  (canbe_transparent == undefined ||canbe_transparent == null) ? false : canbe_transparent;
		this.style_class = (style_class == null)?new rain.Popup.style():style_class;
		this.obj = rain.nodeUtil.getDiv({}, {});
		Element.setStyle(this.obj, {
			width : (this.picker_option.width+5) + 'px',
			height : 'auto',
			padding : '0px',
			textAlign : 'center'
		});
		
		if (onchangeFnc != undefined) this.onchange = onchangeFnc;
		this.obj_preview = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:'100%',height:'25px', padding:'0px', textAlign:'center'}));
		this.obj_palette = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:'100%', height: '37px',textAlign:'center'}));
		this.obj_morecolor = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:(this.picker_option.width+5) + 'px', padding:'2px',textAlign:'center'}));
//		Element.hide(this.obj_morecolor);
		this.showPreviewer();
		this.drawPaletteMenu();
		this.drawMoreColor();
		this.init(init_color);
	},
/**
 * ÃÊ±âÈ­
 * @param  init_color  ÃÊ±â »ö»ó
 */
	init : function(init_color) {
		this.inputRGB('#FF0000');
		if (init_color != null && typeof init_color == 'string') 
			this.init_color = init_color;
		else if (init_color != null && typeof init_color == 'function') 
			this.init_color_func = init_color;
		if (this.init_color_func != null) 
			this.init_color = this.rgb2hexFF(this.init_color_func());
		if (this.init_color != '') {
			this.setColor(this.init_color);
			this.inputRGB(this.init_color);
		}
	},
/**
 * »ö»ó °ª Àü´Þ
 * @param  color  Àü´ÞÇÒ °ª
 */
	onchange : function (color) {
		alert(color);
	},
/**
 * RGB °ªÀ» ÀÚµ¿ ÆÇ´ÜÇÏ¿© HEX °ªÀ¸·Î º¯°æ 
 * @param  value  RGB °ª (¼ýÀÚ È¤Àº RGB ÄÚµå)
 * @return   hex  »ö»ó °ª
 */
	rgb2hexFF : function(value){
		if (value.toLowerCase() == 'transparent' || value == 0)
			return '';
		else if (typeof value == 'string' && value.indexOf('rgb')>=0) {
			var hex="",v,h,i;
			var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
			var h=regexp.exec(value);
			for(i=1;i<4;i++){
				v=parseInt(h[i]).toString(16);
				if(v.length==1) hex+="0"+v;
				else hex+=v;
			}
			return("#"+hex);
		} else if (typeof value == 'number') {
			var R = value % 256;
			var G = ((value - R) % (256*256))/ 256 ;
			var B = ((value - R - G*256) % (256*256*256))/ (256*256) ;
			return this.rgb2hex(R,G,B);
		}
	},
/**
 * ÅÂ±× Object »ý¼º
 * @param  tag  »ý¼ºÇÒ ÅÂ±×
 * @return  object  »ý¼ºµÈ object
 */
	createElement : function(tag) {
		return document.createElement(tag);
	},
/**
 * »ö»ó ObjectÀÇ À§Ä¡°ª °¡Á®¿À±â
 * @return  [x ÁÂÇ¥, y ÁÂÇ¥]
 */
	getPostion : function() {
		var pos = Position.cumulativeOffset(this.obj_colorchart);
		return {x:pos[0],y:pos[1]}
	},
/**
 * ¹Ì¸® º¸±â »ý¼º
 */
	showPreviewer : function() {
		var tmp = rain.nodeUtil.getDiv({align:'left'},{width:'auto',height:'auto', padding:'0px',textAlign:'left', margin:'0px 0px 0px 2px'});
		var tmp_obj = tmp.appendChild(rain.nodeUtil.getDiv({title:'»ç¿ëÀÚÁ¤ÀÇ»ö»ó'},this.style_class.getStyle('colorpreview')));
		this.obj_previewcolor = tmp_obj.appendChild(rain.nodeUtil.getDiv({title:''},this.style_class.getStyle('colorpreviewbox','#FF0000')));
		this.obj_previewrgb = tmp.appendChild(rain.nodeUtil.getInput({onclick:function(){this.select();},value:'#FFFFFF',maxlength:7,size:7},
			Object.extend({cssFloat:'left',styleFloat:'left'}, this.style_class.getStyle('input'))
		));
		var tmp_btn_ok = tmp.appendChild(rain.nodeUtil.getButton({innerHTML:'È®ÀÎ'},
			Object.extend({cssFloat:'left',styleFloat:'left'}, this.style_class.getStyle('designbutton', 16))
		));
		if (this.canbe_transparent) {
			tmp.appendChild(rain.nodeUtil.getCheck({title:'Åõ¸íÀ¸·Î ¼³Á¤', align:'absMiddle', onclick:this.setTransColor.bind(this)},{cssFloat:'left',styleFloat:'left'}));
			tmp.appendChild(rain.nodeUtil.getDiv({align:'left', innerHTML : 'Åõ¸í'},{height:'16px', padding:'4 0 0 0px',cssFloat:'left',styleFloat:'left', color : this.style_class.options.font, fontSize:'11px'}));
		}
		this.obj_previewcolor.onclick = this.showMoreColor.bind(this);
		this.obj_previewrgb.onchange = this.inputRGB.bind(this, this.obj_previewrgb);
		tmp_btn_ok.onclick = this.sendColor.bind(this);
		this.obj_preview.appendChild(tmp);
	},
/**
 * Åõ¸í°ª À¸·Î ¼³Á¤
 * @param  e  Event
 */
	setTransColor : function() {
		this.onchange(this.transparent_color);
	},
/**
 * ÇöÀç ¼±ÅÃµÈ »ö»ó°ª Àü¼Û
 */
	sendColor : function() {
		this.onchange(this.obj_previewrgb.value);
	},
/**
 * ÆÈ·¿Æ® ¸Þ´º ±×¸®±â
 */
	drawPaletteMenu : function() {
		this.palette_class = new rain.Popup.ColorChart(this.inputRGB.bind(this), this.style_class, 'B', true);
		this.obj_palette.appendChild(this.palette_class.obj);
	},
/**
 * »ö»ó ¼³Á¤ÇÏ±â
 * @param  color  ¼³Á¤ÇÒ °ª
 */
	setColor : function(color) {
		if (this.transparent_color != color.toLowerCase()) {
			rain.colorChart.addColor(color);
			Element.setStyle(this.obj_previewcolor, {
				backgroundImage : '',
				backgroundColor : color
			});
			this.obj_previewrgb.value = color;
		} else {
			Element.setStyle(this.obj_previewcolor, {
				backgroundImage : 'url('+this.style_class.imgURL()+'bg_transparent.gif)',
				backgroundColor : ''
			});
			this.obj_previewrgb.value = color.toLowerCase();
		}
	},
/**
 * »ö»ó Ç¥ ¸¸µé±â
 */
	drawMoreColor : function() {
		var obj = this.obj_morecolor;
		var c = obj.appendChild(this.createElement('div'));
		var h = obj.appendChild(this.createElement('div'));
		Element.setStyle(c, {
			border : '1px solid #C5CAD0',
			width : this.picker_option.width + 'px',
			height : this.picker_option.height + 'px',
			backgroundColor : 'white',
			cursor : 'crosshair',
			overflow : 'hidden'
		});
		Element.setStyle(h, {
			marginTop : '3px',
			width : this.picker_option.width + 'px',
			height : this.picker_option.hue_height+ 'px',
			border : '1px solid #C5CAD0',
			backgroundColor : 'white',
			cursor : 'crosshair',
			overflow : 'hidden'
		});
		this.drawHueBar(h);
		this.drawColorChart(c);
	},
/**
 * »ç¿ëÀÚ ÀÔ·Â RGB °ª ÀÔ·ÂÇÏ±â
 * @param  sRGB  »ö»ó°ªÀ» °¡Áø Object È¤Àº »ö»ó°ª
 */
	inputRGB : function(sRGB) {
		if (typeof sRGB == 'object')
			sRGB = sRGB.value;
		if (sRGB == '' || sRGB.toLowerCase() == 'transparent') return ;
		var tRGB = this.checkHex(sRGB);
		if (tRGB != '') {
			this.setColor(tRGB);
			var rgb = this.hex2rgb(tRGB);
			var hsv = this.rgb2hsv(rgb.r,rgb.g, rgb.b);
			this.setHSV(hsv.h,hsv.s,hsv.v);
		} else {
			alert(sRGB + '´Â ¹Ù¸¥ GRB ÄÚµå°¡ ¾Æ´Õ´Ï´Ù.');	
		}
	},
/**
 * R,G,B °ªÀ¸·Î »ö»ó ¼³Á¤ÇÏ±â
 * @param  r  red [0-255]
 * @param  g  green [0-255]
 * @param  b  blue [0-255]
 */
	setRGB : function(r,g,b) {
		var hsv = this.rgb2hsv(r,g,b);
		this.setHSV(hsv.h, 100, 100);
	},
/**
 * Hue ¼³Á¤
 * @param  e  Event
 */
	ondownHue : function(e) {
		var pos = this._getOffsetXY(e);
		var h = (pos.x/(this.picker_option.width-1))*360;
		h = Math.min(Math.max(h, 0), 360);
		this.setHSV(h, this._curHSV.s, this._curHSV.v);
	},
/**
 * Saturation & Brightness ¼³Á¤
 * @param  e  Event
 */
	ondownCol : function(e) {
		var pos = this._getOffsetXY(e);
		var s = (pos.x/(this.picker_option.width-1))*100;
		var v = (1 - pos.y/(this.picker_option.height-1))*100;
		s = Math.min(Math.max(s, 0), 100);
		v = Math.min(Math.max(v, 0), 100);
		s = s/100*this._curHSV.s;
		v = v/100*this._curHSV.v;
		var rgb = this.hsv2rgb(this._curHSV.h, s, v);
		var sRGB = this.rgb2hex(rgb.r, rgb.g, rgb.b);
		this.setColor('#' +sRGB);
	},
/**
 * h,s,v °ªÀ¸·Î »ö»ó ¼³Á¤ÇÏ±â
 * @param  h  hue [0-360]
 * @param  s  saturation [0-100]
 * @param  v  brightness [0-100]
 */
	setHSV : function(h,s,v) {
		s = 100; v = 100;
		var rgb  = this.hsv2rgb(h, s, v);
		var sRGB = this.rgb2hex(rgb.r, rgb.g, rgb.b);
		Element.setStyle(this.obj_colorchart, {
			backgroundColor : '#' + sRGB
		});
		this._curHSV = {h:h,s:s,v:v};
	},
/**
 * XY ½ÇÁ¦°ª °¡Á®¿À±â
 * @return  {x:x,y:y}
 */
	_getOffsetXY : function(e) {
		var pos = this.getPostion();
		var x = Event.pointerX(e) - pos.x;
		var y = Event.pointerY(e) - pos.y;
		x = Math.min(Math.max(x,0), this.picker_option.width -1);
		y = Math.min(Math.max(y,0), this.picker_option.height-1);
		return {x : x, y : y};
	},
/**
 * º¸´Ù ¸¹Àº »ö º¸ÀÌ±â
 */
	showMoreColor : function() {
		Element.toggle(this.obj_morecolor);
		this.popup_class.reSize();
	},
/**
 * Ä®¶ó Â÷Æ® ±×¸®±â
 * @param  obj  ´ë»ó Object
 */
	drawColorChart : function(obj) {
		this.obj_colorchart = obj.appendChild(rain.colorChart.getColorChart(this.picker_option.width, this.picker_option.height, this.style_class.imgURL()));
		this.obj_colorchart.onclick = this.ondownCol.bindAsEventListener(this);
	},
/**
 * Hue Â÷Æ® ±×¸®±â
 * @param  obj  ´ë»ó Object
 */
	drawHueBar : function(obj) {
		this.obj_huechart = obj.appendChild(rain.colorChart.getHueBar(this.picker_option.width, this.picker_option.hue_height, this.style_class.imgURL()));
		this.obj_huechart.onclick = this.ondownHue.bindAsEventListener(this);
	},
/**
 * Hex °ªÀÇ À¯È¿¼º ÆÇ´Ü
 * @param  hex  Hex ÄÚµå
 * @return  Á¶Á¤µÈ hext °ª
 */
	checkHex : function(hex) {
		return rain.colorChart.checkHex(hex);
	},
/**
 * H,S,V °ªÀ» Hex °ªÀ¸·Î º¯°æ
 */
	hsv2hex : function(h,s,v) {
		return rain.colorChart.hsv2hex(h,s,v);
	},
/**
 * R,G,B °ªÀ» Hex °ªÀ¸·Î º¯°æ
 */
	rgb2hex : function(r, g, b) {
		return rain.colorChart.rgb2hex(r, g, b);
	},
/**
 * hex °ªÀ» RGB °ªÀ¸·Î º¯°æ
 */
	hex2rgb : function(hex) {
		return rain.colorChart.hex2rgb(hex);
	},
/**
 * RGB °ªÀ» HSV °ªÀ¸·Î º¯°æ
 */
	rgb2hsv : function(r, g, b) {
		return rain.colorChart.rgb2hsv(r, g, b);
	},
/**
 * HSV °ªÀ» RGB °ªÀ¸·Î º¯°æ
 */
	hsv2rgb : function(h, s, v) {
		return rain.colorChart.hsv2rgb(h, s, v);
	},
	nullfunc : null
}

/**
 * rain.Popup.ColorChart
 * »ö»ó ¼±ÅÃ±â
 */
rain.Popup.ColorChart = Class.create();
rain.Popup.ColorChart.prototype = {
/**
 * µðÀÚÀÎ Á¤º¸
 */
	picker_option : {
		width : 170,
		height : 100
	},
/**
 * »ý¼ºÀÚ
 * @param  onchangeFnc ¿Ï·á½Ã Àü´Þ ÇÔ¼ö
 * @param  style_class  ½ºÅ¸ÀÏ Å¬·¡½º
 * @param  chart_name  ÃÊ±â »ö»ó
 */
	initialize : function(onchangeFnc, style_class, chart_no, use_table) {
		if (use_table == undefined || use_table == null)
			use_table = false;
		this.use_table = use_table;
		this.call_back = onchangeFnc;
		this.style_class = style_class;
		this.base_width = 156;
		this.base_height = 48;
		this.base_marginW = 13;
		this.base_marginH = 11;
		this.base_speed = 4;

		this.keycontrol = (rain.nodeUtil.Browser.IE || rain.nodeUtil.Browser.Gecko)?true:false;
		this.pngalphasupport = rain.nodeUtil.isPngAlphaSupport();
		
		this.obj = rain.nodeUtil.getDiv({},{width:this.picker_option.width + 'px', height:'auto', padding:'0px',margin:'0px'});
		this.drawPaletteMenu();
		if (!this.use_table)
			this.drawPalette();
		this.setChart(chart_no, false);
		this.init(0);
	},
/**
 * ÆÈ·¿Æ® ¸Þ´º ±×¸®±â
 */
	drawPaletteMenu : function() {
//		this.obj_menu = [];
//		var tab_area = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:(this.picker_option.width) + 'px',height:'15px'}));
//		var obj = Object.extend(document.createElement('table'), {unselectable:'on', width : (this.picker_option.width) + 'px', height:'15px',border : '0', cellPadding :'0', cellSpacing :'0'});
//		var tr_obj = Object.extend(obj.insertRow(-1), {height:'15px'});
/*
		var color_info = rain.colorChart.getTab(this.use_table);
		for (var i = 0 ; i < color_info.length ; i ++) {
			var title= color_info[i].title;
			var idx = color_info[i].idx;
			var menu_obj = Object.extend(tr_obj.insertCell(-1), {unselectable:'on',title:title, innerHTML : idx, onclick:this.setChart.bind(this,idx)});
			Element.setStyle(menu_obj,this.style_class.getStyle('toptaboff'));
			this.obj_menu.push({obj:menu_obj,idx:idx});
			if (i < (color_info.length -1)) {
				var gab_obj = Object.extend(tr_obj.insertCell(-1), {innerHTML : '|'});
				Element.setStyle(gab_obj,this.style_class.getStyle('toptabgab'));
			}
		}
		var gab_obj = Object.extend(tr_obj.insertCell(-1), {innerHTML : '&nbsp;'});

		if (this.use_table) 
			Element.setStyle(gab_obj,Object.extend(this.style_class.getStyle('toptabgab'),{width:'10%'}));
		else
			Element.setStyle(gab_obj,Object.extend(this.style_class.getStyle('toptabgab'),{width:'20%'}));
			
		var tr_obj = obj.insertRow(-1);
		var line_obj = Object.extend(tr_obj.insertCell(-1), {colSpan : 20});
		Element.setStyle(line_obj,this.style_class.getStyle('toptabline'));
		tab_area.appendChild(obj);
*/
		this.obj_palettecolor = this.obj.appendChild(rain.nodeUtil.getDiv({},{width:(this.picker_option.width) + 'px',padding:'0px',height:'auto'}));
	},
	drawPalette : function() {
		this.bg_obj = this.obj_palettecolor.appendChild(rain.nodeUtil.getDiv({},{backgroundImage:'url('+this.style_class.imgURL()+'color_chartB.gif)',width:'170px', height:'100px', padding:'0px', margin:'0px', border : '0px solid ' + this.style_class.options.line}));
		if (this.pngalphasupport) 
			this.mask_obj = this.bg_obj.appendChild(rain.nodeUtil.getDiv({},{backgroundImage:'url('+this.style_class.imgURL()+'color_tablebg.png)',width:'170px', height:'100px', padding:'0px', overflow:'hidden'}));
		else
			this.mask_obj = this.bg_obj.appendChild(rain.nodeUtil.getDiv({},{filter : 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+this.style_class.imgURL()+'color_tablebg.png"',width:'170px', height:'100px', padding:'0px', overflow:'hidden'}));
		this.tmpimg = this.mask_obj.appendChild(rain.nodeUtil.getImage({src:this.style_class.imgURL() + 'color_tablebox.gif', title :'1.¸¶¿ì½º·Î µå·¡±× ÇÏ¼¼¿ä\r\n2.¸¶¿ì½º Å¬¸¯»óÅÂ¿¡¼­ ¹æÇâÅ°¸¦ »ç¿ëÇÏ¼¼¿ä'},{width:'340px', height:'200px',marginTop:'-99',marginLeft:'-169'}));
		this.onmousedown = this.onDownImg.bindAsEventListener(this);
		this.onmousemove = this.onMoveImg.bindAsEventListener(this);
		this.onmouseup   = this.onUpImg.bindAsEventListener(this);
		this.onclick     = this.onClickImg.bindAsEventListener(this);
		this.onkeydown     = this.onDownkey.bindAsEventListener(this);
		this.mask_obj.ondragstart = this.mask_obj.ondrag = this.tmpimg.ondragstart = this.tmpimg.ondrag = function(){ return false; }
		this.mask_obj.onmousedown = this.onmousedown;
	},
	setChart : function(chart_no, sendColor) {
		if (sendColor == undefined || sendColor == null)
			sendColor = !(this.use_table);
		if (sendColor == undefined || sendColor == null)
			sendColor = false;
		var style_class = this.style_class;
//		this.obj_menu.each(function(obj) {
//			if (obj.idx == chart_no) 
//				Element.setStyle(obj.obj,style_class.getStyle('toptabon'));
//			else
//				Element.setStyle(obj.obj,style_class.getStyle('toptaboff'));
//		});
		this.chart_no = chart_no;
		if (this.use_table) {
			if (this.last_table != null) 
				this.last_table.parentNode.removeChild(this.last_table);
			var target_text = rain.colorChart.getColorByName(chart_no);
			var obj = Object.extend(document.createElement('table'), {align:'center',unselectable:'on',width : this.picker_option.width + 'px', border : '0', cellPadding :'1', cellSpacing :'2'});
			var seqn = 0;
			var mouseoverfunc = function() {this.style.borderStyle = 'dotted';}
			var mouseoutfunc = function() {this.style.borderStyle = 'solid';}
			var cursorpoint = rain.nodeUtil.getCursor();
			for(var y = 0 ; y < 2; y++) {
				var tr_obj = obj.insertRow(-1);
				for(var x = 0 ; x < 11; x++) {
					var text = (target_text.length > seqn )?target_text[seqn]:'';
					var td_obj = Object.extend(tr_obj.insertCell(-1), {
						unselectable:'on',
						innerHTML : '&nbsp;', 
						title : text,
						onclick : this.setColor.bind(this, seqn)
					});
					Element.setStyle(td_obj, {backgroundColor : text, cursor: cursorpoint, width: '12px',height:'13px', fontSize:'1px', border:'1px solid #dcdcdc'});
					seqn++;
				}
			}
			this.last_table = obj;
			this.obj_palettecolor.appendChild(obj);
		} else {
			Element.setStyle(this.bg_obj ,{backgroundImage:'url('+this.style_class.imgURL()+'color_chart'+this.chart_no+'.gif)'});
		}
		if (sendColor)
			this.setColor(this.skin_no);
	},
	init : function(skin_no) {
		this.skin_no = skin_no;
		if (!this.use_table) {
			var posX = this.skin_no % 11;
			var posY = Math.floor(this.skin_no/11);
			var realX = Math.round(posX/11 * this.base_width- this.base_width - this.base_marginW) ;
			var realY = Math.round(posY/2 * this.base_height- this.base_height - this.base_marginH);
			this.setPos(realX, realY);
		}
	},
/**
 * Å°º¸µå ´ÜÃàÅ° ÀÔ·Â½Ã 
 * @param  e  Event
 */
	onDownkey : function(event) {
		var eventchk = rain.nodeUtil.getKeyMove(event);
		if (eventchk != null) {
			if (eventchk.x == 0 && eventchk.y == 0)  {
				this.onUpImg(event);				
			} else {
				this.init((117+this.skin_no+eventchk.x+eventchk.y*13)%117);
			}
		}
		return false;
	},
	onDownImg : function(e) {
		if (Event.isLeftClick(e)) {
			this._moving = true;
			this._startXY  = [e.clientX, e.clientY];
			this._startPos  = [parseInt(this.tmpimg.style.marginLeft), parseInt(this.tmpimg.style.marginTop)];
			Event.observe(this.mask_obj, 'mouseup', this.onmouseup);
			if (this.pngalphasupport) 
				Event.observe(this.mask_obj, 'mouseout', this.onmouseup);
			Event.observe(this.mask_obj, 'mousemove', this.onmousemove);
			if (this.keycontrol)
				Event.observe(document, 'keydown', this.onkeydown);
			Event.stop(e);
		}
	},
/**
 * ÀÌ¹ÌÁö Å¬¸¯ ÇØÁ¦½Ã ÀÌµ¿ ¸ØÃã
 * @param  e  Event
 */
	onUpImg : function(e) {
		this._moving = false;
		Event.stopObserving(this.mask_obj, 'mouseup', this.onmouseup);
		if (this.pngalphasupport) 
			Event.stopObserving(this.mask_obj, 'mouseout', this.onmouseup);
		Event.stopObserving(this.mask_obj, 'mousemove', this.onmousemove);
		if (this.keycontrol)
			Event.stopObserving(document, 'keydown', this.onkeydown);
		this.onClickImg(e);
	},
/**
 * ÀÌ¹ÌÁö ÀÌµ¿½Ã
 * @param  e  Event
 */
	onMoveImg : function(e) {
		var newX, newY;
		if (!this._moving || !Event.isLeftClick(e)) return;
		newY =  (this._startPos[1] + e.clientY - this._startXY[1]);
		newY = Math.min(Math.max(newY,this.base_height*(-1) - this.base_marginH), this.base_marginH*(-1));
		newX =  (this._startPos[0] + e.clientX - this._startXY[0]);
		newX = Math.min(Math.max(newX,this.base_width*(-1) - this.base_marginW),  this.base_marginW *(-1));
		this.setPos(newX, newY);
	},
/**
 * ÀÌ¹ÌÁö Å¬¸¯½Ã ÀÌµ¿ ½ÃÀÛ
 * @param  e  Event
 */
	onClickImg : function(e) {
		var posX = Math.round((parseInt(this.tmpimg.style.marginLeft) + this.base_marginW + this.base_width)/this.base_width*12);
		var posY = Math.round((parseInt(this.tmpimg.style.marginTop) + this.base_marginH + this.base_height)/this.base_height*8);
		var realX = Math.round(posX/12 * this.base_width- this.base_width - this.base_marginW) ;
		var realY = Math.round(posY/8 * this.base_height- this.base_height - this.base_marginH);
		this.setPos(realX, realY);
		this.setColor((posY * 13 + posX));
	},
/**
 * ½æ³×ÀÏ ÀÌµ¿
 * @param  newX  X ÁÂÇ¥
 * @param  newY  Y ÁÂÇ¥
 */
	setPos : function(newX,newY) {
		this.tmpimg.style.marginLeft = newX + 'px';
		this.tmpimg.style.marginTop = newY + 'px';
		this.bg_obj.style.backgroundPosition = ((newX + this.base_width + this.base_marginW)*this.base_speed*(-1) + 61)+' '+((newY + this.base_height + this.base_marginH)*this.base_speed*(-1) + 30)+'px';
	},
	setColor : function(idx) {
		this.skin_no = idx;
		var colorselected = rain.colorChart.getColorPng(this.chart_no, idx);
		this.call_back(colorselected);
	}
}

/**
 * rain.colorChart
 * »ö»ó ÆÈ·¹Æ®
 */
rain.colorChart = {
/**
 * »ö»ó ÆÈ·¹Æ®
 */
	chart : [
		{
			title : 'Shades of Blue',
			idx : 'B',
			color : [
				'#FF008F','#FF0000','#FF7E00','#FFD800','#51D800','#007FD8','#00195A','#6D00E8','#000000','#434343','#A6A6A6',
				'#FFE2F2','#FFE2E2','#FFDCB5','#FFF6BC','#C6FDA1','#CFEDFF','#D6DCEA','#F2E5FF','#D3D3D3','#F1F1F1','#FFFFFF'
			]
		},
		{
			title : 'Shades of Brown & Green',
			idx : 'BG',
			color : [
				'#BC8F8F','#FFC1C1','#EEB4B4','#CD9B9B','#8B6969','#8B4513','#F4A460','#F5F5DC','#A52A2A','#FF4040',
				'#EE3B3B','#CD3333','#8B2323','#DEB887','#FFD39B','#EEC591','#CDAA7D','#8B7355','#D2691E','#FF7F24',
				'#EE7621','#CD661D','#8B4513','#CD853F','#D2B48C','#FFA54F','#EE9A49','#CD853F','#8B5A2B',
				'#006400','#BDB76B','#556B2F','#CAFF70','#BCEE68','#A2CD5A','#6E8B3D','#8FBC8F','#C1FFC1','#B4EEB4',
				'#9BCD9B','#698B69','#228B22','#ADFF2F','#7CFC00','#20B2AA','#32CD32','#3CB371','#00FA9A','#F5FFFA',
				'#6B8E23','#C0FF3E','#B3EE3A','#9ACD32','#698B22','#98FB98','#9AFF9A','#90EE90','#7CCD7C','#548B54',
				'#2E8B57','#54FF9F','#4EEE94','#43CD80','#2E8B57','#00FF7F','#00FF7F','#00EE76','#00CD66','#008B45',
				'#9ACD32','#7FFF00','#7FFF00','#76EE00','#66CD00','#458B00','#00FF00','#00FF00','#00EE00','#00CD00',
				'#008B00','#F0E68C','#FFF68F','#EEE685','#CDC673','#8B864E'
			]
		},
		{
			title : 'Shades of Orange & Red',
			idx : 'OR',
			color : [
				'#FF8C00','#FF7F00','#EE7600','#CD6600','#8B4500','#E9967A','#F08080','#FFA07A','#FFA07A','#EE9572',
				'#CD8162','#8B5742','#FFDAB9','#FFDAB9','#EECBAD','#CDAF95','#8B7765','#FFE4C4','#FFE4C4','#EED5B7',
				'#CDB79E','#8B7D6B','#FF7F50','#FF7256','#EE6A50','#CD5B45','#8B3E2F','#F0FFF0','#F0FFF0','#E0EEE0',
				'#C1CDC1','#838B83','#FFA500','#FFA500','#EE9A00','#CD8500','#8B5A00','#FA8072','#FF8C69','#EE8262',
				'#CD7054','#8B4C39','#A0522D','#FF8247','#EE7942','#CD6839','#8B4726',
				'#FF1493','#FF1493','#EE1289','#CD1076','#8B0A50','#FF69B4','#FF6EB4','#EE6AA7','#CD6090','#8B3A62',
				'#CD5C5C','#FF6A6A','#EE6363','#CD5555','#8B3A3A','#FFB6C1','#FFAEB9','#EEA2AD','#CD8C95','#8B5F65',
				'#C71585','#FFE4E1','#FFE4E1','#EED5D2','#CDB7B5','#8B7D7B','#FF4500','#FF4500','#EE4000','#CD3700',
				'#8B2500','#DB7093','#FF82AB','#EE799F','#CD6889','#8B475D','#D02090','#FF3E96','#EE3A8C','#CD3278',
				'#8B2252','#B22222','#FF3030','#EE2C2C','#CD2626','#8B1A1A','#FFC0CB','#FFB5C5','#EEA9B8','#CD919E',
				'#8B636C','#FF0000','#FF0000','#EE0000','#CD0000','#8B0000','#FF6347','#FF6347','#EE5C42','#CD4F39','#8B3626'
			]
		},
		{
			title : 'Shades of Violet & Yellow',
			idx : 'VY',
			color : [
				'#9932CC','#BF3EFF','#B23AEE','#9A32CD','#68228B','#9400D3','#FFF0F5','#FFF0F5','#EEE0E5','#CDC1C5',
				'#8B8386','#BA55D3','#E066FF','#D15FEE','#B452CD','#7A378B','#9370DB','#AB82FF','#9F79EE','#8968CD',
				'#5D478B','#E6E6FA','#FF00FF','#FF00FF','#EE00EE','#CD00CD','#8B008B','#B03060','#FF34B3','#EE30A7',
				'#CD2990','#8B1C62','#DA70D6','#FF83FA','#EE7AE9','#CD69C9','#8B4789','#DDA0DD','#FFBBFF','#EEAEEE',
				'#CD96CD','#8B668B','#A020F0','#9B30FF','#912CEE','#7D26CD','#551A8B','#D8BFD8','#FFE1FF','#EED2EE',
				'#CDB5CD','#8B7B8B','#EE82EE',
				'#FFEBCD','#B8860B','#FFB90F','#EEAD0E','#CD950C','#8B6508','#FFFACD','#FFFACD','#EEE9BF','#CDC9A5',
				'#8B8970','#EEDD82','#FFEC8B','#EEDC82','#CDBE70','#8B814C','#FAFAD2','#FFFFE0','#FFFFE0','#EEEED1',
				'#CDCDB4','#8B8B7A','#EEE8AA','#FFEFD5','#FFF8DC','#FFF8DC','#EEE8CD','#CDC8B1','#8B8878','#FFD700',
				'#FFD700','#EEC900','#CDAD00','#8B7500','#DAA520','#FFC125','#EEB422','#CD9B1D','#8B6914','#FFE4B5',
				'#FFFF00','#FFFF00','#EEEE00','#CDCD00','#8B8B00'
			]
		},
		{
			title : 'Shades of White & Gray',
			idx : 'WG',
			color : [
				'#FAEBD7','#FFEFDB','#EEDFCC','#CDC0B0','#8B8378','#FFFAF0','#F8F8FF','#FFDEAD','#FFDEAD','#EECFA1',
				'#CDB38B','#8B795E','#FDF5E6','#F5F5F5','#DCDCDC','#FFFFF0','#FFFFF0','#EEEEE0','#CDCDC1','#8B8B83',
				'#FAF0E6','#FFF5EE','#FFF5EE','#EEE5DE','#CDC5BF','#8B8682','#FFFAFA','#FFFAFA','#EEE9E9','#CDC9C9',
				'#8B8989','#F5DEB3','#FFE7BA','#EED8AE','#CDBA96','#8B7E66','#FFFFFF',
				'#2F4F4F','#97FFFF','#8DEEEE','#79CDCD','#528B8B','#2F4F4F','#696969','#696969','#D3D3D3','#D3D3D3',
				'#778899','#778899','#708090','#C6E2FF','#B9D3EE','#9FB6CD','#6C7B8B','#708090','#BEBEBE'
			]
		}
	],
/**
 * »ç¿ëÀÚ Ãß°¡ »ö»ó
 */
	added_color : {
		title : '»ç¿ëÀÚÁ¤ÀÇ',
		idx : 'U',
		color : []
	},
/**
 * ÅÇÁ¤º¸ °¡Á®¿À±â
 */
	getTab : function(add_use) {
		var color_info = [];
		this.chart.each(function(obj) {
			color_info.push({title:obj.title, idx:obj.idx})
		});
		if (add_use != undefined && add_use)
			color_info.push({title:this.added_color.title, idx:this.added_color.idx});
		return color_info;
	},
/**
 * Æ¯Á¤ ÅÇÀÇ »ö»ó °¡Á®¿À±â
 * @param  idx  ÅÇ¸í
 */
	getColor : function(idx) {
		if (idx >= this.chart.length)
			return this.added_color.color;
		else
			return this.chart[idx].color;
	},
/**
 * Æ¯Á¤ ÅÇÀÇ »ö»ó °¡Á®¿À±â
 * @param  idx  ÅÇ¸í
 */
	getColorByName : function(idx) {
		var find_color = null;
		this.chart.each(function(obj) {
				if (obj.idx == idx)
					find_color = obj.color;
		});
		if (find_color == null)
			return this.added_color.color;
		else
			return find_color;
	},
/**
 * Æ¯Á¤ ÅÇÀÇ »ö»ó °¡Á®¿À±â
 * @param  idx  ÅÇ¸í
 */
	getColorPng : function(idx, no) {
		var color_info = [];
		this.chart.each(function(obj) {
			if (obj.idx == idx)
				color_info =obj.color;
		});
		if (color_info.length > no)
			return color_info[no];
		else 
			return '';
	},

/**
 * Color Chart Object °¡Á®¿À±â
 * @param  img_width  Ãß°¡ »ö»ó
 * @param  img_height  Ãß°¡ »ö»ó
 * @param  imgurl  ÀÌ¹ÌÁö °æ·Î
 * @return   ÀÌ¹ÌÁö Object
 */
	getColorChart : function(img_width, img_height, imgurl) {
		if (rain.nodeUtil.isPngAlphaSupport()) {
			return rain.nodeUtil.getDiv({align:'center'},{
				width:img_width + 'px',
				height:img_height+'px',
				backgroundColor : '#FF0000',
				cursor:'crosshair',
				backgroundImage : 'url('+imgurl+'SatVal.png)'
			});
		} else {
			return rain.nodeUtil.getDiv({align:'center'},{
				width:img_width + 'px',
				height:img_height+'px',
				backgroundColor : '#FF0000',
				cursor:'crosshair',
				filter : "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+imgurl+"SatVal.png')"
			});
		}
	},
/**
 * Hues Chart Object °¡Á®¿À±â
 * @param  img_width  Ãß°¡ »ö»ó
 * @param  img_height  Ãß°¡ »ö»ó
 * @param  imgurl  ÀÌ¹ÌÁö °æ·Î
 * @return   ÀÌ¹ÌÁö Object
 */
	getHueBar : function(img_width, img_height, imgurl) {
		return rain.nodeUtil.getDiv({align:'center'},{
			width:img_width + 'px',
			height:img_height+'px',
			cursor:'crosshair',
			backgroundImage : 'url('+imgurl+'HueVal.png)'
		});
	},
/**
 * »ç¿ëÀÚ Á¤ÀÇ »ö»ó Ãß°¡
 * @param  color  Ãß°¡ »ö»ó
 */
	addColor : function(color) {
		color = color.toUpperCase();
		if (this.added_color.color.findAll(function(val) {
			return (color == val);
		}).length == 0) {
			this.added_color.color.push(color);
			if (this.added_color.color.length > 105) this.added_color.color.shift();
		}
	},
/**
 * HSV ¸¦ Hex ÄÚµå·Î º¯È¯
 * @param  h  hue [0-360]
 * @param  s  saturation [0-100]
 * @param  v  brightness [0-100]
 * @return  hex  RGB ÄÚµå
 */
	hsv2hex : function(h,s,v) {
		var rgb = this.hsv2rgb(h,s,v);
		return this.rgb2hex(rgb.r,rgb.g,rgb.b);
	},
/**
 * RGB ¸¦ Hex ÄÚµå·Î º¯È¯
 * @param  r  red [0-255]
 * @param  g  green [0-255]
 * @param  b  blue [0-255]
 * @return  hex  RGB ÄÚµå
 */
	rgb2hex : function(r, g, b) {
		r = r.toString(16); if (r.length==1) r = '0'+r;
		g = g.toString(16); if (g.length==1) g = '0'+g;
		b = b.toString(16); if (b.length==1) b = '0'+b;
		return r+g+b;
	},
/**
 * Hex ¸¦ RGB ÄÚµå·Î º¯È¯
 * @param  hex  hex ÄÚµå
 * @return  {r:red,g:green,b:blue}
 */
	hex2rgb : function(hex) {
		hex = this.checkHex(hex);
		if (hex != '') {
			if (m = hex.match(/#?([0-9a-f]{6})/i))
				m = m[1];
			m = m.match(/../g);
			return {
				r : Number("0x" + m[0]),
				g : Number("0x" + m[1]),
				b : Number("0x" + m[2])
			}
		} else {
			return {
				r : Number("0xff"),
				g : Number("0xff"),
				b : Number("0xff")
			}
		}
	},
/**
 * RGB ¸¦ HSV ÄÚµå·Î º¯È¯
 * @param  r  red [0-255]
 * @param  g  green [0-255]
 * @param  b  blue [0-255]
 * @return  {h:hue,s:saturation,v:brightness}
 */
	rgb2hsv : function(r, g, b) {
		var max=Math.max(r,g,b);
		var delta=max-Math.min(r,g,b), H, S, V;
		if(max!=0) { 
			S=delta/max*100;
			if(r==max) 
				H=(g-b)/delta; 
			else if(g==max) 
				H=2+(b-r)/delta; 
			else if(b==max) 
				H=4+(r-g)/delta;
			var H=Math.min(H*60,360); 
			if(H<0) H+=360;
		}
		return {h:H?H:0,s:S?S:0,v:(max/255)*100};
	},
/**
 * HSV ¸¦ RGB ÄÚµå·Î º¯È¯
 * @param  h  hue [0-360]
 * @param  s  saturation [0-100]
 * @param  v  brightness [0-100]
 * @return  {r:red,g:green,b:blue}
 */
	hsv2rgb : function(h, s, v) {
		var R,B,G,S=s/100,V=v/100,H=h/360;
		if(S>0) { 
			if(H>=1) H=0;
			H=6*H; F=H-Math.floor(H);
			A=Math.round(255*V*(1.0-S));
			B=Math.round(255*V*(1.0-(S*F)));
			C=Math.round(255*V*(1.0-(S*(1.0-F))));
			V=Math.round(255*V); 
			switch(Math.floor(H)) {
				case 0: R=V; G=C; B=A; break;
				case 1: R=B; G=V; B=A; break;
				case 2: R=A; G=V; B=C; break;
				case 3: R=A; G=B; B=V; break;
				case 4: R=C; G=A; B=V; break;
				case 5: R=V; G=A; B=B; break;
			}
			return {r:R?R:0,g:G?G:0,b:B?B:0};
    	} else {
    		V=Math.round(V*255);
    		return {r:V,g:V,b:V};
    	}
	},
/**
 * Hex ÄÚµåÀÇ À¯È¿¼º ÆÇ´Ü
 * @param  hex hexÄÚµå
 * @return  hex ÄÚµå
 */
	checkHex : function(hex) {
		var m = '';
		if (m = hex.match(/#?([0-9a-f]{6}|[0-9a-f]{3})/i)) {
			if (m[1].length == 3) {
				m = m[1].match(/./g).findAll(function(c){return c+c});
			} else {
				m = m[1].match(/../g);
			}
			return '#'+m[0]+m[1]+m[2];
		} else
			return '';
	}
}

/**
 * rain.Effect
 * È¿°ú
 */
rain.Effect = Class.create();

/**
 * rain.Effect.AutoScroll
 * ÀÚµ¿ ½ºÅ©·Ñ
 */
rain.Effect.AutoScroll = Class.create();
rain.Effect.AutoScroll.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  id ´ë»ó Object
 */
	initialize : function(id) {
		this.obj = $(id);
		this.options = Object.extend({
			enable   : true,
			slowDown : false,
			topTrack : false,
			division : 50,
			limitArea : null
		}, arguments[1] || {});
		var offset = this.getPos(this.obj)[0];

		if (this.obj.style.position == '') {
			this.obj.style.position = 'absolute';
			if (offset != this.getPos(this.obj)[0]) {
				this.obj.style.position = 'relative';
			}
		}

		if (this.obj.style.position == 'absolute') {
			this.obj.style.top = this.obj.offsetTop+'px';
		} else {
			if (offset == this.getPos(this.obj)[0]) this.obj.style.top = '0px';
			else this.obj.style.top = (this.getPos(this.obj)[0] - offset) + 'px';
		}

		this._scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
		this._startTop  = parseInt(this.obj.style.top);
		this._startPosY = this.getPos(this.obj)[0];

		if (this._scrollTop > this._startTop) this._scrollTop = 0;


		this.onscroll = this.onScroll.bindAsEventListener(this);
		Event.observe(window, 'scroll',this.onscroll);
	},
/**
 * »ý¼ºÀÚ
 * @param  e Event
 */
	onScroll : function(e) {
		if (!this.options.enable) return;

		var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
		var diff = scrollTop - this._scrollTop;
		var diffChange = false;

		this._targetTop = this._startTop + diff;

		if (this.options.limitArea) {
			var objY = this.getPos(this.obj)[0];
			var area = $(this.options.limitArea);
			var posY = this.getPos(area)[0];

			if (this._startPosY + this.obj.offsetHeight + diff > posY + area.offsetHeight) {
				diff = posY + area.offsetHeight - this._startPosY - this.obj.offsetHeight;
				this._targetTop = this._startTop + diff;
				diffChange = true;
			} else if (this._targetTop < posY) {
				this._targetTop = posY;
				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(this.animate.bind(this), 1);
	},
/**
 * ¾Ö´Ï¸ÞÀÌ¼Ç
 */
	animate : function() {
		var currTop = parseInt(this.obj.style.top);
		var unit = (this._targetTop-currTop)<0?-1:1;
		var step = Math.ceil(this._targetTop - this._startTop / 100);

		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) {
			this.obj.style.top = (currTop+step)+'px';
			setTimeout(this.animate.bind(this), 10);
		}
	},
/**
 * À§Ä¡ °ª °¡Á®¿À±â
 * @param  obj ´ë»ó Object
 * @return  [xÁÂÇ¥,yÁÂÇ¥]
 */
	getPos : function(obj) {
		return Position.cumulativeOffset(obj);
	},
/**
 * ½ºÅ©·Ñ È°¼ºÈ­/ºñÈ°¼ºÈ­
 * @param  enable È°¼ºÈ­¿©ºÎ
 */
	setEnable : function(enable) {
		this.options.enable = enable;
	}
}

/**
 * rain.Effect.Toggle
 * ÆË¾÷Ã¢ ÃÖ´ëÈ­ ÃÖ¼ÒÈ­
 */
rain.Effect.Toggle = Class.create();
rain.Effect.Toggle.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  id ´ë»ó Object
 * @param  button ¿¬°á ¹öÆ° 
 */
	initialize : function(id, button) {
		this.obj = $(id);
		$(button).onclick = this.toggle.bind(this);
	},
/**
 * ÃÖ´ëÈ­ ÃÖ¼ÒÈ­ 
 */
	toggle : function () {
		Element.toggle(this.obj);	
	}
}

/**
 * rain.Effect.Slider
 * È¿°ú- ½½¶óÀÌµå
 */
rain.Effect.Slider = Class.create();
rain.Effect.Slider.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  id ´ë»ó Object
 * @param  arguments ½½¶óÀÌµå ¿É¼Ç
 */
	initialize : function(id) {
		var e = this._element = $(id);
		this.options = Object.extend({
			minValue   : 0,
			maxValue   : 100,
			defValue   : 0,
			step       : 1,
			bind_id : null,
			maxPos     : 100,
			initPos    : {x:3, y:6},
			backgroundColor : '#000000',
			lineColor : '#464646',
			vertical   : false,
			onstartRelative : true,
			lastValue : 0,
			onChange   : function(v){}
		}, arguments[1]);
		var o = this.options;
		this.onmousedown = this.onDown.bindAsEventListener(this);
		this.onmousemove = this.onMove.bindAsEventListener(this);
		this.onmouseup   = this.onUp.bindAsEventListener(this);
		this.onclick     = this.onClick.bindAsEventListener(this);
		Element.setStyle(e, {
			width : (o.maxPos + 3) + 'px',
			height : '12px',
			fontSize : '12px',
			backgroundColor : o.backgroundColor,
			border : '1px solid ' + o.lineColor,
			padding : '1px',
			textAlign : 'left'
		});
		Event.observe(this._element, 'click', this.onclick);
		var u = this._unit_element = e.appendChild(document.createElement('span'));
		u.innerHTML = '&nbsp;';
		u.ondragstart = u.ondrag = function(){ return false }
		u.onmousedown = this.onmousedown;
		Element.setStyle(u, {
			width : '6px',
			height : '12px',
			fontSize : '10px',
			position : (o.onstartRelative)?'relative':'',
			cursor : rain.nodeUtil.getCursor(),
			backgroundColor : o.lineColor,
			border : '1px solid ' + o.lineColor,
			top  : o.initPos.y+'px',
			left : o.initPos.x+'px'
		});
		this.setValue(parseInt(o.defValue));
	},
/**
 * °ª ÁöÁ¤
 * @param  v ¿¬°á °ª
 */
	setValue : function(v) {
		var o = this.options; v = Math.min(Math.max(v,o.minValue),o.maxValue);
		var p = this._val2pos(v);
		try {
		if (this.options.vertical) 
			this._unit_element.style.top = (p - 7)+'px';
		else 
			this._unit_element.style.left = (p - 4)+'px';
		o.lastValue = v;
		this.options.onChange(v, o.bind_id);
		} catch(ex) {}
	},
/**
 * °ª ÀÌµ¿
 * @param dir [true|false]ÀÌµ¿ ¹æÇâ
 */
	setMove : function(dir) {
		var move_value = this.options.lastValue;
		if (dir) 
			move_value += this.options.step;
		else
			move_value -= this.options.step;
		this.setValue(move_value);
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º Å¬¸¯
 * @param e Event
 */
	onDown : function(e) {
		var u = this._unit_element;
		if (Event.isLeftClick(e)) {
			this._moving = true;
			this._startPos = [parseInt(u.style.left), parseInt(u.style.top)];
			this._startXY  = [Event.pointerX(e), Event.pointerY(e)];
			Event.observe(this._element, 'mouseup', this.onmouseup);
			Event.observe(this._element, 'mousemove', this.onmousemove);
			Event.observe(this._element, 'keypress', this.onmousemove);
			Event.stop(e);
		}
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º ÀÌµ¿
 * @param e Event
 */
	onMove : function(e) {
		var newX, newY;
		var o = this.options;
		var u = this._unit_element;
		if (!this._moving || !Event.isLeftClick(e)) return;
		newX = this._startPos[0] + e.clientX - this._startXY[0];
		newY = this._startPos[1] + e.clientY - this._startXY[1];

		if (o.vertical) {
			newY = Math.max(Math.min(newY,o.maxPos),o.initPos.y);
			u.style.top = newY + 'px';
			if (newY >= o.maxPos ||  newY <= o.initPos.y)
				this.onUp(e);
		} else {
			newX = Math.max(Math.min(newX,o.maxPos),o.initPos.x);
			u.style.left = newX + 'px';
			if (newX >= o.maxPos ||  newX <= o.initPos.x)
				this.onUp(e);
		}
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º Release Out
 * @param e Event
 */
	onUp   : function(e) {
		this._moving = false;
		Event.stopObserving(this._element, 'mouseup', this.onmouseup);
		Event.stopObserving(this._element, 'mousemove', this.onmousemove);
		Event.stopObserving(this._element, 'keypress', this.onmousemove);
		this.onClick(e);
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º Click
 * @param e Event
 */
	onClick : function(e) {
		var pos = Position.cumulativeOffset(this._element);
		this.setValue(this._pos2val(Event.pointerX(e)-pos[0]-parseInt(this._unit_element.style.width)/2));
	},
/**
 * ¸¶¿ì½º Æ÷ÀÎÅÍ¸¦ °ªÀ¸·Î º¯È¯
 * @param p Æ÷ÀÎÅÍ À§Ä¡°ª
 * @return v ´ë»ó °ª
 */
	_pos2val : function(p) {
		var o = this.options,s=o.step;
		var m = o.vertical?o.initPos.y:o.initPos.x;
		var v = (p-m)*(o.maxValue-o.minValue)/(o.maxPos-m);
		var q = Math.floor(v/s), r=v-q*s, v=q*s;
		return Math.round((v+o.minValue+((s/2)>r?0:s))*100)/100;
	},
/**
 * °ªÀ» ¸¶¿ì½º Æ÷ÀÎÅÍ À§Ä¡·Î º¯È¯
 * @param v ÀÔ·Â°ª
 * @return p ¸¶¿ì½º Æ÷ÀÎÅÍ °ª
 */
	_val2pos : function(v) {
		var o = this.options,s=o.step;
		var m = o.vertical?o.initPos.y:o.initPos.x;
		var p = (v-o.minValue)*(o.maxPos-m)/(o.maxValue-o.minValue);
		var q = Math.floor(p/s), r=p-q*s, p=q*s;
		var v =Math.round((p+m+((s/2)>r?0:s))*100)/100; 
		return Math.min(v,o.maxPos);
	}
}

/**
 * rain.Effect.imgSlider
 * È¿°ú- ÀÌ¹ÌÁö½½¶óÀÌµå
 */
rain.Effect.imgSlider = Class.create();
rain.Effect.imgSlider.prototype = {
/**
 * »ý¼ºÀÚ
 * @param  id ´ë»ó Object
 * @param  arguments ½½¶óÀÌµå ¿É¼Ç
 */
	initialize : function(id) {
		this.obj = $(id);
		Element.setStyle(this.obj, {cursor:rain.nodeUtil.getCursor()});		
		this.options = Object.extend({
			minValue   : 0,
			maxValue   : 100,
			defValue   : 0,
			step       : 1,
			bind_id : null,
			maxPos     : 100,
			addMax : 0,
			initPos    : {x:-5, y:-10},
			backgroundColor : '#ffd545',
			lineColor : '#949494',
			vertical   : false,
			onstartRelative : true,
			lastValue : 0,
			imgurl : 'images/',
			zero : -700,
			barThickness : 2,
			backgroundimg : null,
			imgpointer : null,
			onChange   : function(v){},
			onSlider : false,
			reverseMove : false,
			titie : null
		}, arguments[1]);
		var o = this.options;
		if (o.title != null)
			this.obj.title = o.title;
		if (o.backgroundimg == null)
			o.backgroundimg = (o.vertical)?'img_slidervbg.gif':'img_sliderbg.gif';
		if (o.imgpointer == null) {
			o.imgpointer = {img:null,size:{w:0,h:0}}
			if (o.barThickness > 7) {
				o.imgpointer.size = {w:13,h:16};
				o.maxPos -= 16;
				o.addMax = 16;
				if (o.vertical) {
					o.initPos = {x:0, y:0};
					o.imgpointer.img = 'img_sliderlv.gif';
				} else {
					o.initPos = {x:-8, y:-3};
					o.imgpointer.img = 'img_sliderl.gif';
				}
			} else {
				o.imgpointer.size = {w:7,h:5};
				o.maxPos -= 2; 
				o.addMax = 2;
				if (o.vertical) {
					o.initPos = {x:-3, y:0};
					o.imgpointer.img = 'img_sliderv.gif';
				} else {
					o.initPos = {x:-5, y:-5};
					o.imgpointer.img = 'img_slider.gif';
				}
			}
		}
		var tmpimg_html = (!this.options.vertical)?'<img width=1 height='+o.barThickness+'>':'<img height=1 width='+o.barThickness+'>';
			
		var e = this._element = this.obj.appendChild(Object.extend(document.createElement('div'),{unselectable:'on', innerHTML : tmpimg_html}));
		this.onmousedown = this.onDown.bindAsEventListener(this);
		this.onmousemove = this.onMove.bindAsEventListener(this);
		this.onmouseup   = this.onUp.bindAsEventListener(this);
		this.onclick     = this.onClick.bindAsEventListener(this);
		if (this.options.vertical) {
			Element.setStyle(e, {
				width :  o.barThickness +'px',
				height : (o.maxPos + o.addMax) + 'px',
				fontSize : o.barThickness +'px',
				border : '1px solid '+o.lineColor,
				backgroundColor :  o.backgroundColor,
				backgroundImage : 'URL('+o.imgurl+o.backgroundimg+')',
				backgroundPosition : (o.reverseMove)?o.zero+'px 0px':'0px '+o.zero+'px',
				textAlign : 'left',
				cssFloat:'left',
				styleFloat:'left'
			});
		} else {
			Element.setStyle(e, {
				width : (o.maxPos + o.addMax) + 'px',
				height : o.barThickness +'px',
				fontSize : o.barThickness +'px',
				border : '1px solid '+o.lineColor,
				backgroundColor :  o.backgroundColor,
				backgroundImage : 'URL('+o.imgurl+o.backgroundimg+')',
				backgroundPosition : (o.reverseMove)?'0px '+o.zero+'px':o.zero+'px 0px',
				textAlign : 'left'
			});
		}
		Event.observe(this.obj, 'click', this.onclick);

		var tmpobj = this.obj.appendChild(Object.extend(document.createElement('div'),{unselectable:'on'}));
		if (this.options.vertical) 
			Element.setStyle(tmpobj, {width: o.barThickness + 'px',height:o.maxPos + 'px',fontSize:'1px', textAlign:'left', margin:'0 0 0 -'+(o.barThickness+1)+'px',cssFloat:'left',styleFloat:'left',padding:'0px'});
		else
			Element.setStyle(tmpobj, {width:o.maxPos +'px',height:o.barThickness + 'px',fontSize:'1px', textAlign:'left', margin:'-'+(o.barThickness - 2)+' 0 0 0px',padding:'0px'});

		var u = this._unit_element = tmpobj.appendChild(Object.extend(document.createElement('div'),{unselectable:'on'}));
		u.ondragstart = u.ondrag = function(){ return false }
		u.onmousedown = this.onmousedown;
		if (this.options.vertical) {
			Element.setStyle(u, {
				width : o.imgpointer.size.w + 'px',
				height : o.imgpointer.size.h + 'px',
				fontSize : '1px',
				position : (o.onstartRelative)?'relative':'',
				cursor : rain.nodeUtil.getCursor(),
				backgroundImage : 'URL('+o.imgurl+o.imgpointer.img+')',
				top  : o.initPos.y+'px',
				left : o.initPos.x+'px'
			});
		} else {
			Element.setStyle(u, {
				width : o.imgpointer.size.h + 'px',
				height : o.imgpointer.size.w + 'px',
				fontSize : '1px',
				position : (o.onstartRelative)?'relative':'',
				cursor : rain.nodeUtil.getCursor(),
				backgroundImage : 'URL('+o.imgurl+o.imgpointer.img+')',
				top  : o.initPos.y+'px',
				left : o.initPos.x+'px'
			});
		}
		this.setValue(parseInt(o.defValue));
	},
/**
 * °ª ÁöÁ¤
 * @param  v ¿¬°á °ª
 */
	setValue : function(v) {
		var o = this.options; v = Math.min(Math.max(v,o.minValue),o.maxValue);
		var p = this._val2pos(v);
		try {
			this.setBarPos(p);
			o.lastValue = v;
			this.options.onChange(v, o.bind_id);
		} catch(ex) {}
	},
/**
 * °ª ÀÌµ¿
 * @param dir [true|false]ÀÌµ¿ ¹æÇâ
 */
	setMove : function(dir, step) {
		if (step == undefined) step = this.options.step;
		var move_value = this.options.lastValue;
		if (dir) 
			move_value += step;
		else
			move_value -= step;
		this.setValue(move_value);
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º Å¬¸¯
 * @param e Event
 */
	onDown : function(e) {
		var u = this._unit_element;
		if (Event.isLeftClick(e)) {
			this._moving = true;
			this._startPos = [parseInt(u.style.left), parseInt(u.style.top)];
			this._startXY  = [e.clientX, e.clientY];
			Event.observe(this.obj, 'mouseup', this.onmouseup);
//			Event.observe(this.obj, 'mouseout', this.onmouseup);
			Event.observe(this.obj, 'mousemove', this.onmousemove);
			Event.stop(e);
		}
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º ÀÌµ¿
 * @param e Event
 */
	onMove : function(e) {
		var newX, newY;
		var o = this.options;
		var u = this._unit_element;
		if (!this._moving || !Event.isLeftClick(e)) return;
		if (o.vertical) {
			newY = this._startPos[1] + e.clientY - this._startXY[1];
			newY = Math.max(Math.min(newY,o.maxPos),o.initPos.y);
			this.setBarPos(newY);
			if (newY >= o.maxPos ||  newY <= 0)
				this.onUp(e);
		} else {
			newX = this._startPos[0] + e.clientX - this._startXY[0];
			newX = Math.max(Math.min(newX,o.maxPos),o.initPos.x);
			this.setBarPos(newX);
			if (newX >= o.maxPos ||  newX <= 0)
				this.onUp(e);
		}
		if (	o.onSlider != false) 
			this.onClick(e);
	},
/**
 * ¹Ù À§Ä¡ ¼³Á¤
 * @param pos À§Ä¡°ª
 */
	setBarPos :  function(pos) {
		var u = this._unit_element;
		var ele = this._element;
		var o = this.options;
		if (this.options.vertical) {
			u.style.top = (pos -2)+ 'px';
			ele.style.backgroundPosition = (o.reverseMove)?(o.zero + pos)+'px 0px':'0px '+(o.zero + pos)+'px';
		} else {
			u.style.left = (pos -2) + 'px';
			ele.style.backgroundPosition = (!o.reverseMove)?(o.zero + pos)+'px 0px':'0px '+(o.zero + pos)+'px';
		}
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º Release Out
 * @param e Event
 */
	onUp   : function(e) {
		this._moving = false;
		Event.stopObserving(this.obj, 'mouseup', this.onmouseup);
//		Event.stopObserving(this.obj, 'mouseout', this.onmouseup);
		Event.stopObserving(this.obj, 'mousemove', this.onmousemove);
		this.onClick(e);
	},
/**
 * Æ÷ÀÎÅÍ ¸¶¿ì½º Click
 * @param e Event
 */
	onClick : function(e) {
		var pos = Position.cumulativeOffset(this._element);
		if (this.options.vertical) 
			this.setValue(this._pos2val(Event.pointerY(e)-pos[1]-parseInt(this._unit_element.style.height)/2));
		else
			this.setValue(this._pos2val(Event.pointerX(e)-pos[0]-parseInt(this._unit_element.style.width)/2));
	},
/**
 * ¸¶¿ì½º Æ÷ÀÎÅÍ¸¦ °ªÀ¸·Î º¯È¯
 * @param p Æ÷ÀÎÅÍ À§Ä¡°ª
 * @return v ´ë»ó °ª
 */
	_pos2val : function(p) {
		var o = this.options,s=o.step;
		var m = 0;
		var v = (p-m)*(o.maxValue-o.minValue)/(o.maxPos-m);
		var q = Math.floor(v/s), r=v-q*s, v=q*s;
		return Math.round(((v+o.minValue+((s/2)>r?0:s))*100)/100);
	},
/**
 * °ªÀ» ¸¶¿ì½º Æ÷ÀÎÅÍ À§Ä¡·Î º¯È¯
 * @param v ÀÔ·Â°ª
 * @return p ¸¶¿ì½º Æ÷ÀÎÅÍ °ª
 */
	_val2pos : function(v) {
		var o = this.options,s=o.step;
		var m = 0;
		var p = (v-o.minValue)*(o.maxPos-m)/(o.maxValue-o.minValue);
		var q = p/s, r=p-q*s, p=q*s;
		var v =Math.round(((p+m+((s/2)>r?0:s))*100)/100); 
		return Math.min(v,o.maxPos);
	}
}

/**
 * rain.nodeUtil
 * node ÅëÁ¦
 */
rain.nodeUtil = {
/**
 * À¥ºê¶ó¿ìÁî IE ¿©ºÎ
 */
	isIE : window.ActiveXObject ? true : false,
/**
 * À¥ºê¶ó¿ìÁî FireFox ¿©ºÎ
 */
	isFirefox : navigator.userAgent.toLowerCase().indexOf("firefox")!=-1,
/**
 * À¥ºê¶ó¿ìÁî Á¤º¸
 */
	Browser: {
		IE:     !!(window.attachEvent && !window.opera),
		Opera:  !!window.opera,
		WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
		Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
		MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
	},
/**
 * PNG Alpha Áö¿ø ¿©ºÎ
 */
 	isPngAlphaSupport : function() {
		if (navigator.userAgent.indexOf('MSIE') > 0) {
			var ie_version = parseFloat(navigator.userAgent.substring(navigator.userAgent.indexOf('MSIE') + 5, navigator.userAgent.indexOf('MSIE') + 8));
			if (ie_version < 7.0) 
				return false
			else
				return true;
		} else
			return true;
 	},
/**
 * Cursor Tyle °¡Á®¿À±â
 */
	getCursor : function() {
		return (this.isIE)?'hand':'pointer';
	},
/**
 * Æ¯Á¤ ¾ÆÀÌµð¸¦ °¡Áø Element À» Array °¡Á®¿À±â
 * @param id ID
 * @return Arrray()
 */
	getElementsById : function(id){
		var els = new Array();
		try {	
			tags = document.getElementsByTagName(document.getElementById(id).tagName);
			for(i=0;i<tags.length;i++){
				if(tags[i].id==id) els[els.length]=tags[i];
			}
		} catch(ex) {}
		return els;
	},
/**
 * Æ¯Á¤ ³ëµå¿¡¼­ Ã¹¹øÂ° Child ³ëµå °¡Á®¿À±â
 * @param root ´ë»ó ³ëµå
 * @return child Node
 */
	getFirstChildNode : function(root, node, err_node) {
		var tmp_node = rain.nodeUtil.getChildrenByTagName(root, node);
		return (tmp_node !=null && tmp_node.firstChild) ? tmp_node.firstChild.nodeValue : err_node;
	},
/**
 * Input °´Ã¼ °¡Á®¿À±â
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getInput : function(options,instyle) {
		var obj = Object.extend(document.createElement('input'), Object.extend({type:'text'},options));
		var outstyle = rain.extend({
			border : '1px dotted #454545',
			backgroundColor : '#464646',
			color : '#FFFFFF'
		}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * ÀÌ¹ÌÁö °´Ã¼
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getImage : function(options, instyle) {
		var obj = Object.extend(document.createElement('img'), Object.extend({vspace : 0,hspace:0,border:0},options));
		var outstyle = rain.extend({
			margin : '3px',
			border : '0px'
		}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * TextNode °´Ã¼(Span)
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getText : function(options, instyle) {
		var obj = Object.extend(document.createElement('span'), options);
		var outstyle = rain.extend({}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * TextArea °´Ã¼
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getTextArea : function(options, instyle) {
		var obj = Object.extend(document.createElement('textarea'), options);
		var outstyle = rain.extend({}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * checkBox °´Ã¼
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getCheck : function(options, instyle) {
		var obj = Object.extend(document.createElement('input'), Object.extend({unselectable : 'on',align:'absmiddle'}, options));
		obj.setAttribute('type', 'checkbox',0);
		var outstyle = rain.extend({}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * ÀÎÅØ½º Çü °´Ã¼
 * @param text ÀÎÅØ½º ¸í
 * @param value_obj ÀÎÅØ½º °´Ã¼
 * @param text_width ÅØ½ºÆ® Æø
 * @param style_class ½ºÅ¸ÀÏ Å¬·¡½º
 * @param textAlign ÀÎÅØ½º Á¤·Ä
 * @return Object
 */
	getIndex : function(text, value_obj, text_width, style_class, textAlign) {
		if (textAlign == undefined || textAlign == null)
			textAlign = 'left';
		var obj = Object.extend(document.createElement('table'), {width : '100%', height:'20px',border : '0', cellPadding :'2', cellSpacing :'0'});
		var tr_obj = obj.insertRow(-1);
		Element.setStyle(tr_obj, {padding:'0px',margin:'0px'});
		var td_obj = Object.extend(tr_obj.insertCell(-1), {width : text_width + 'px', align:textAlign,innerHTML : text});
		Element.setStyle(td_obj, {color :style_class.options.font, fontSize:'11px',padding:'0 0 0 5px'});
		var td_obj = Object.extend(tr_obj.insertCell(-1), {align:'left'});
		if (value_obj != null) td_obj.appendChild(value_obj);
		return obj;
	},
/**
 * Å×ÀÌºí °¡Á®¿À±â
 * @param add_cell ³ÖÀ» ¼¿
 * @param style_class ½ºÅ¸ÀÏ Å¬·¡½º
 * @param width Å×ÀÌºí Æø [¹Ì»ç¿ë]
 * @return Object
 */
	getTable : function(add_cell,style_class, width) {
		var obj = Object.extend(document.createElement('table'), {height:'20px',border : '0', cellPadding :'1', cellSpacing :'0'});
		var tr_obj = obj.insertRow(-1);
		Element.setStyle(tr_obj, {padding:'0px',margin:'0px'});
		add_cell.each(function(val) {
			var td_obj = tr_obj.insertCell(-1);
			if (typeof val == 'string') {
				td_obj.innerHTML = val;
				Element.setStyle(td_obj, {color :style_class.options.font, textAlign:'left', fontSize:'11px'});
			} else if (typeof val == 'object') {
				td_obj.appendChild(val);
			}
		});
		return obj;
	},
/**
 * ÄÚ¸àÆ® °¡Á®¿À±â
 * @param text ³ÖÀ» ¼¿
 * @param value_obj °ª Object
 * @param style_class ½ºÅ¸ÀÏ Å¬·¡½º
 * @return Object
 */
	getComment : function(text, value_obj, style_class) {
		var obj = Object.extend(document.createElement('table'), {height:'20px',border : '0', cellPadding :'0', cellSpacing :'0'});
		var tr_obj = obj.insertRow(-1);
		Element.setStyle(tr_obj, {padding:'0px',margin:'0px'});
		var td_obj = Object.extend(tr_obj.insertCell(-1), {align:'right'});
		if (value_obj != null) td_obj.appendChild(value_obj);
		var td_obj = Object.extend(tr_obj.insertCell(-1), {align:'left'});
		if (typeof text == 'object') 
			td_obj.appendChild(text);
		else
			td_obj.appendChild(document.createTextNode(text));
		
		Element.setStyle(td_obj, {color :style_class.options.font, fontSize:'11px'});
		return obj;
	},
/**
 * DIV °´Ã¼
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getDiv : function(options, instyle) {
		var obj = Object.extend(document.createElement('div'),Object.extend({unselectable : 'on'},options));
		var outstyle = rain.extend({
			border : '0px',
			padding : '0px',
			margin:'0px',
			textAlign: 'center',
			fontSize : '12px'
		}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * SPAN °´Ã¼
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getSpan : function(options, instyle) {
		var obj = Object.extend(document.createElement('button'),Object.extend({unselectable:'on'},options));
		var outstyle = rain.extend({
			border : '0px',
			padding : '0px',
			margin:'0px',
			fontSize : '12px'
		}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * BUTTON °´Ã¼
 * @param options °´Ã¼ ¿É¼Ç
 * @param instyle ½ºÅ¸ÀÏ ¿É¼Ç
 * @return Object
 */
	getButton : function(options,instyle) {
		var obj = Object.extend(document.createElement('button'), Object.extend({unselectable : 'on',onfocus:function(){this.blur();}},options));
		obj.setAttribute('type', 'button',0);
		var outstyle = rain.extend({
			backgroundColor : '#464646',
			color : '#FFFFFF',
			fontSize : '8pt',
			height : '15px',
			padding : '0px 3px 0px 3px',
			border : '1px solid #000000'
		}, instyle);
		Element.setStyle(obj, outstyle);
		return obj;
	},
/**
 * °´Ã¼¸¦ Æ¯Á¤ °´Ã¼ÀÇ Áß¾ÓÀ¸·Î ÀÌµ¿
 * @param element ÀÌµ¿ÇÒ °´Ã¼
 * @param tg_element Áß½É °´Ã¼[null Àº Window °´Ã¼·Î ÁöÁ¤]
 */
	move2Center : function(element, tg_element) {
		var pop_pos = Element.getDimensions(element);
		if (tg_element == null) {
			Position.prepare();
			var scroll_x = Position.deltaX;
			var scroll_y = Position.deltaY;
			var ch = document.body.clientHeight;
			var cw = document.body.clientWidth;
			var parent_pos = Position.cumulativeOffset(Position.offsetParent(element));
		} else {
			var scroll_x = 0,scroll_y = 0;
			var parent_pos = [0,0];
			var cw = tg_element.offsetWidth;
			var ch = tg_element.offsetHeight;
		}		
		var win_top = ((scroll_y + (ch -pop_pos.height)/2) - parent_pos[1]);
		var win_left = (scroll_x + (cw -pop_pos.width)/2 - parent_pos[0]);
		if (win_top <= 0) win_top = 0;
		if (win_left <= 0) win_left = (scroll_x + (cw -pop_pos.width) - parent_pos[0]);
		
		Element.setStyle(element, {top :  win_top+ 'px', left:  win_left + 'px'});
	},
/**
 * Åõ¸íµµ ¼³Á¤
 * @param element ´ë»ó °´Ã¼
 * @param bl_opa Åõ¸í ¼³Á¤ ¿©ºÎ
 */
	changeOpacity : function(element, bl_opa) {
		var opa;
		if (bl_opa) {
			var orginal_opa = 100;
			if (rain.nodeUtil.isIE == true) {
				var m = null;
				if (m = element.style.filter.match(/opacity = ([0-9]+)/i)) 
					orginal_opa = parseInt(m[1]);
			} else if(rain.nodeUtil.isFirefox == true && element.style.opacity !='') 
					orginal_opa = parseInt(element.style.opacity) *100;
			element.orginal_opa = orginal_opa;
			opa = 70;
		} else
			opa = parseInt(element.orginal_opa);
		if (rain.nodeUtil.isIE == true) element.style.filter = "alpha(opacity = "+opa+")";
		else if(rain.nodeUtil.isFirefox == true) element.style.opacity = (opa/100);  
		else {};
	},
/**
 * Æ¯Á¤ Object ¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Â Æû °´Ã¼ °¡Á®¿À±â
 * @param objname ´ë»ó °´Ã¼
 * @return Æû °´Ã¼
 */
	getForm : function(objname) {
		var obj = $(objname);
		var forms = document.getElementsByTagName('form');
		var result = null;
		for(var i = 0; i < forms.length; i++) {
			var form = forms[i];
			var elements = Form.getElements(form);
			for(var j = 0; j < elements.length; j++) 
				if (elements[j] == obj) {result = form;break;}
			if (result) break;
		}
		return result;
	},
/**
 * Æ¯Á¤ Node ¿¡¼­ Æ¯Á¤ ÅÂ±×¸¦ °¡Áø Child °¡Á®¿À±â
 * @param node ´ë»ó node
 * @param tagName ÅÂ±× ¸í
 * @return Array(ChildNodes)
 */
	getChildrensByTagName : function (node, tagName) {
		var ln = node.childNodes.length;
		var arr = [];	
		for (var z=0; z<ln; z++) {
			if (node.childNodes[z].nodeName==tagName) arr.push(node.childNodes[z]);
		}
		return arr;
	},
/**
 * Æ¯Á¤ Node ¿¡¼­ Æ¯Á¤ ÅÂ±×¸¦ °¡Áø Ã¹¹øÂ° Child °¡Á®¿À±â 
 * @param node ´ë»ó node
 * @param tagName ÅÂ±× ¸í
 * @return ChildNode
 */
	getChildrenByTagName : function (node, tagName) {
		var arr = rain.nodeUtil.getChildrensByTagName(node, tagName);
		return (arr.length > 0)?arr[0]:null;
	},
/**
 * Æ¯Á¤ Node ¿¡¼­ Æ¯Á¤ ID¸¦ °¡Áø Child °¡Á®¿À±â
 * @param node ´ë»ó node
 * @param idName ID ¸í
 * @return Array(ChildNodes)
 */
	getChildrensById : function (element, idName) {
		var arr = [];	
		for(var i = 0 ; i < element.childNodes.length; i++) {
			if (element.childNodes[i].id == idName) arr.push(element.childNodes[i]);
			if (element.childNodes[i].childNodes.length > 0) {
				var child_node = rain.nodeUtil.getChildrensById(element.childNodes[i],idName);
				for (var j =0; j < child_node.length; j++) arr.push(child_node[j]);
			}
		}
		return arr;
	},
/**
 * Æ¯Á¤ Node ¿¡¼­ Æ¯Á¤ ID¸¦ °¡Áø Ã¹¹øÂ° Child °¡Á®¿À±â
 * @param node ´ë»ó node
 * @param idName ID ¸í
 * @return ChildNode
 */
	getChildrenById : function (node, idName) {
		var arr = rain.nodeUtil.getChildrensById(node, idName);
		return (arr.length > 0)?arr[0]:null;
	},
/**
 * ÇØ½¬µÈ ½ºÆ®¸µÀ¸·Î º¯È¯
 * @param str ´ë»ó ¹®ÀÚ
 * @return º¯È¯µÈ ¹®ÀÚ
 */
	getHash : function(str) {
		var newstr=str.replace(/=/gi, "%3D");
		newstr=newstr.replace(/\&/gi, "%26");
		newstr=newstr.replace(/\?/gi, "%3F");
		return newstr;
	},
/**
 * Html À» text ·Î ÀÚµ¿ º¯È¯
 * @param html ´ë»ó ¹®ÀÚ
 * @return º¯È¯µÈ ¹®ÀÚ
 */
	html2Text : function(html) {
		html = html.replace(/\r|\n/gi, '');
		html = html.replace(/<br>/gi, '\r\n');
		html = html.replace(/<p>/gi, '\r\n');
		html = html.replace(/&nbsp;/gi, ' ');
		return html.stripTags();
	},
/**
 * text À» html ·Î ÀÚµ¿ º¯È¯
 * @param html ´ë»ó ¹®ÀÚ
 * @return º¯È¯µÈ ¹®ÀÚ
 */
	text2Html : function(txt) {
//		txt = txt.replace(/</gi, '&lt;');
//		txt = txt.replace(/>/gi, '&gt;');
		txt = txt.replace(/\r/g, '');
		txt = txt.replace(/\n/g, '<br>');
		return txt;
	},
/**
 * ÆÄÀÏ Å©±â¸¦ ½ÉÇÃÇüÀ¸·Î º¯È¯
 * @param in_size ÆÄÀÏ Å©±â
 * @return º¯È¯µÈ ¹®ÀÚ
 */
	getSize2Short : function(in_size) {
		in_size = parseInt(in_size);
		if (in_size > 1024*1024*1024) return parseInt(in_size/ (1024*1024*1024)) + " Gb";
		else if (in_size >= 1024*1024) return parseInt(in_size/ (1024*1024)) + " Mb";
		else if (in_size >= 1024) return parseInt(in_size/ 1024) + " Kb";
		else return in_size + " b";
	},
/**
 * ÇÑ±Û ÀÚ¸£±â
 * @param txt ´ë»ó ¹®ÀÚ
 * @param len ÀÚ¸¦ ¹®ÀÚ¼ö
 * @return º¯È¯µÈ ¹®ÀÚ
 */
	getHanCut : function (txt, len) {
		var slen = txt.length, count = 0;
		for(var k = 0; k < slen ; k++){
			var temp = txt.charAt(k);
			if(escape(temp).length > 4) count += 2;
			else count++;
			if (len < count) break;
		}
		return (slen == k)?txt:txt.substring(0, k-1)+'..';
	},
/**
 * ÇÑ±Û ¿À¸¥ÂÊÀÚ¸£±â
 * @param txt ´ë»ó ¹®ÀÚ
 * @param len ÀÚ¸¦ ¹®ÀÚ¼ö
 * @return º¯È¯µÈ ¹®ÀÚ
 */
	getHanCutR : function (txt, len) {
		var slen = txt.length, count = 0;
		for(var k = slen; k > 0 ; k--){
			var temp = txt.charAt(k);
			if(escape(temp).length > 4) count += 2;
			else count++;
			if (len < count) break;
		}
		return (k == 0)?txt:'..'+ txt.substring(k+2);
	},
	getKeyMove : function(event) {
		switch(event.keyCode){
			case 105 :  // KEY 9
				return {x:1,y:-1,z:0};
				break;
			case 99 :  // KEY 3
				return {x:1,y:1,z:0};
				break;
			case 97 :  // KEY 1
				return {x:-1,y:1,z:0};
				break;
			case 103 :  // KEY 7
				return {x:-1,y:-1,z:0};
				break;
			case 88 :  // KEY x
			case 98 :  // KEY 2
			case 40 : 
				return {x:0,y:1,z:0};
				break;
			case 83 :  // KEY s
			case 104 :  // KEY 8
			case 38 : 
				return {x:0,y:-1,z:0};
				break;
			case 67 :  // KEY c
			case 102 :  // KEY 6
			case 39 : 
				return {x:1,y:0,z:0};
				break;
			case 90 :  // KEY z
			case 100 :  // KEY 4
			case 37 : 
				return {x:-1,y:0,z:0};
				break;
			case 101 : 
			case 13 : 
				return {x:0,y:0,z:0};
				break;
			case 107 :   // KEY +
			case 68 :  // KEY d
				return {x:0,y:0,z:1};
				break;
			case 109 :   // KEY -
			case 65 :   // KEY a
				return {x:0,y:0,z:-1};
				break;
			default  :
				return null;
				break;
		}
	},
/**
 * Á¤±Ô Ç¥Çö½Ä °Ë»ç
 * @param reg Á¤±Ô Ç¥Çö½Ä
 * @param str °Ë»çÇÒ ¹®ÀÚ
 * @return ¹ß°ßµÈ ¹®ÀÚ group
 */
	find : function(reg, str) {
		var m = [];
		try {
			if (m = str.match(eval('/' + reg + '/'))) 
				return m;
			else 
				return false;
		} catch(ex) {
			return false;
		}
	},
/**
 * Base64 Encode
 * @param inp ´ë»ó ¹®ÀÚ
 * @return Encode µÈ ¹®ÀÚ
 */
	base64_encode : function(inp){
		var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + 
			"abcdefghijklmnopqrstuvwxyz" + 
			"0123456789+/=";
		var out = "";
		var chr1, chr2, chr3 = "";
		var enc1, enc2, enc3, enc4 = "";
		var i = 0;
		do {
			chr1 = inp.charCodeAt(i++);
			chr2 = inp.charCodeAt(i++);
			chr3 = inp.charCodeAt(i++);
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
			out = out + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) +
			keyStr.charAt(enc4);
			chr1 = chr2 = chr3 = "";
			enc1 = enc2 = enc3 = enc4 = "";
		} while (i < inp.length);
		return out;
	}
}

rain.Ajax_basexmlurl = null;

/**
 * rain.Ajax
 * Ajax Åë½Å
 */
if (rain.Ajax == null)
	rain.Ajax = Class.create();
rain.Ajax.prototype = {
/**
 * »ý¼ºÀÚ
 * @param send_data Àü¼ÛÇÒ µ¥ÀÌÅ¸ {}
 * @param call_back Àü¼Û¿Ï·á½Ã È£Ãâ ÇÔ¼ö
 * @param base_url È£Ãâ ÇÁ·Î±×·¥ URL
 * @param xml_method È£Ãâ Method [get|post]
 */
	initialize : function(send_data, call_back, base_url, xml_method) {
		if (xml_method == undefined)
			xml_method = 'post';
		if (base_url == null) 
			base_url = rain.Ajax_basexmlurl;
		if (typeof call_back == 'function') {
			this.call_back  = call_back;
			this.obj = new Ajax.Request(
				base_url, 	
				{
					method: xml_method, 
					parameters: $H(send_data).toQueryString(), 
					onComplete: this.onComplete.bind(this),
					onFailure : this.onFailure.bind(this)
				}
			);
		} else {
			this.call_back  = null;
			this.obj = new Ajax.Updater(	
				base_url, 	
				{
					method: xml_method, 
					parameters: $H(send_data).toQueryString()
				}
			);
		}
	},
/**
 * ¿Ï·á
 * @param response È£Ãâ °á°ú
 */
	onComplete : function(response) {
		var channel, xml = new rain.xmlParser(response);
		if (channel = xml.getNext()) {
			this.call_back(channel);
		} else {
			this.onFailure({stats:-1});
		}
	},
/**
 * ½ÇÆÐ
 * @param transport Transport
 * @param json Json
 */
	onFailure : function(transport, json) {
		var msg = '';
		switch(transport.status) {
			case 404 : 
				msg = 'Åë½Å ÇÁ·Î±×·¥À» Ã£À» ¼ö ¾ø½À´Ï´Ù.';
				break;
			case -1 :
				msg = 'Ã¤³ÎÀÌ µî·Ï µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù.';
				break;
			default :
				msg = '¾Ë¼ö ¾ø´Â ¿øÀÎÀ¸·Î Åë½ÅÀÌ µÇÁö ¾Ê¾Ò½À´Ï´Ù. code)' + transport.status;
				break;
		}
		this.call_back(null, msg);
	}
}

/**
 * rain.xmlParser
 * xml ÆÄ½Ì 
 */
rain.xmlParser = Class.create();
rain.xmlParser.prototype = {
/**
 * »ý¼ºÀÚ
 * @param feed ´ë»ó Feed
 */
	initialize : function(feed) {
		var tmp_feed = Try.these(
			function() { return new DOMParser().parseFromString(feed.responseText, 'text/xml'); },
			function() { return  feed.responseXML; }
		);
		this.current_no = 0;
		this.channels = Try.these(
			function() { return tmp_feed.documentElement.getElementsByTagName("channel"); },
			function() { return [];} 
		);
	},
/**
 * Ã¤³Î °¡Á®¿À±â
 * @param no ´ë»ó ¼ø¹ø
 * @return rain.xmlParser.Channel
 */
	getChannel : function(no) {
		if (this.channels.length > no) 
			return new rain.xmlParser.Channel(this.channels[no]);
		else
			return null;
	},
/**
 * ´ÙÀ½Ã¤³Î °¡Á®¿À±â
 * @return rain.xmlParser.Channel
 */
	getNext : function() {
		var channel = this.getChannel(this.current_no);
		if (channel) {
			this.current_no++;
			return channel;
		} else 
			return null
	}
}

/**
 * rain.xmlParser.Channel
 * xml Ã¤³Î ÅëÁ¦
 */
rain.xmlParser.Channel = Class.create();
rain.xmlParser.Channel.prototype = {
/**
 * »ý¼ºÀÚ
 * @param obj ´ë»ó Channel
 * @param items ´ë»ó Item [°­Á¦ Item ¼³Á¤½Ã¿¡¸¸ »ç¿ë]
 */
	initialize : function(obj, items) {
		this.channel = obj;
		this.current_no = 0;
		if (items != null)
			this.items = items;
		else {
			this.items = Try.these(
				function() { return obj.getElementsByTagName("item"); },
				function() { return [];}
			);
		}
	},
/**
 * Æ¯Á¤ Á¶°ÇÀ» ¸¸Á·ÇÏ´Â Item °¡Á®¿À±â
 * @param func Á¶°Ç ÇÔ¼ö
 * @return rain.xmlParser.Channel
 */
	findAll : function(func) {
		this.current_no = 0;
		var result = [];
		for(var i = 0; i < this.items.length; i++) {
			var item = new rain.xmlParser.item(this.items[i]);
			if (func(item)) result.push(this.items[i]);
		}
		return new rain.xmlParser.Channel(null, result);
	},
/**
 * Æ¯Á¤ Node ¸íÀ» °¡Áø Ã¹¹øÂ° °´Ã¼ °¡Á®¿À±â
 * @param nodeName Node ¸í
 * @return node Object
 */
	getNode : function(nodeName) {
		return rain.nodeUtil.getFirstChildNode(this.channel,nodeName);
	},
/**
 * Æ¯Á¤ ¹øÂ°ÀÇ Item °¡Á®¿À±â
 * @param no ¼ø¹ø
 * @return rain.xmlParser.item
 */
	getItem : function(no) {
		if (this.getItems().length > no) 
			return new rain.xmlParser.item(this.items[no]);
		else
			return null
	},
/**
 * ´ÙÀ½ Item °¡Á®¿À±â
 * @return rain.xmlParser.item
 */
	getNext : function() {
		var item = this.getItem(this.current_no);
		if (item) {
			this.current_no++;
			return item;
		} else 
			return null
	},
/**
 * ÀüÃ¼ Item °¡Á®¿À±â
 * @return Array
 */
	getItems : function() {
		return this.items;
	},
/**
 * ÆäÀÌÁö Á¤º¸ °¡Á®¿À±â
 * @param current_no ÇöÀç ¹øÈ£
 * @param ppage ÆäÀÌÁö´ç Ç¥½Ã¼ö
 * @return {cline : ÇöÀç¹øÈ£,total : ÀüÃ¼¼ö,page : ÇöÀçÆäÀÌÁö,pages : ÀüÃ¼ÆäÀÌÁö,start : ½ÃÀÛ ½ÃÁ¡,end : ¸¶Áö¸·½ÃÁ¡}
 */
	getPage : function (current_no, ppage) {
		if (current_no != undefined) 
			this.current_no = current_no;
		else 
			current_no = this.current_no;
		var total = this.getItems().length;
		if (current_no > total) 
			this.current_no = current_no = total;
		var start_line = (total > current_no)?current_no:0;
		var end_line = (total > start_line + ppage)?start_line + ppage:total;
		var curr_page = parseInt(start_line/ppage) + 1;
		var total_page = Math.ceil(total/ppage);
		return {
			cline : current_no,
			total : total,
			page : curr_page,
			pages : total_page,
			start : start_line,
			end : end_line
		}
	},
/**
 * ÇöÀç channel À» Object ÇüÀ¸·Î °¡Á®¿À±â
 * @return Object
 */
	getObject : function() {
		var result_obj = null;
		var rsstype = this.getNode('rsstype');
		var description = this.getNode('description');
		switch(rsstype) {
			case 'html' : 	
			case 'text' : 	
				result_obj = document.createElement('div');
				Element.setStyle(result_obj, {width:'100%',border:'1px solid #464646',padding:'3px'});
				if (rsstype == 'html')
					result_obj.innerHTML = description
				else {
					description = description.replace(/\r/g, '');
					description = description.replace(/\n/g, '<br>');
					result_obj.innerHTML = description;
				}
				break;
			case 'object' : 	
					try {
						eval('var testevalfunc = function(){' +description+ '} ');
						result_obj = testevalfunc();
					} catch(ex) {}
				break;
				
		}
		return result_obj;
	}
}

/**
 * rain.xmlParser.item
 * xml ¾ÆÀÌÅÛ ÅëÁ¦
 */
rain.xmlParser.item = Class.create();
rain.xmlParser.item.prototype = {
/**
 * »ý¼ºÀÚ
 * @param obj ´ë»ó Item
 */
	initialize : function(obj) {
		this.item = obj;
	},
/**
 * Æ¯Á¤ ³ëµå¸íÀ» °¡Áø °´Ã¼ °¡Á®¿À±â
 * @param nodeName ´ë»ó Node¸í
 * @return “u°ßµÈ Object
 */
	getNode : function(nodeName) {
		return rain.nodeUtil.getFirstChildNode(this.item,nodeName);
	}
}

/**
 * rain.Image
 * ÀÌ¹ÌÁö °ü·Ã ÅëÁ¦±â
 */
rain.Image = Class.create();
rain.Image.prototype = {
/**
 * ´ë»ó ÀÌ¹ÌÁö
 */
	imgobj : null,
/**
 * »ý¼ºÀÚ
 * @param style_class ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(style_class) {
		this.style_class = style_class;
		this.obj = rain.nodeUtil.getDiv({}, {width:'100px'});
		this.obj.appendChild(
			rain.nodeUtil.getDiv({innerHTML : '¿øº» º¸±â', onclick : this.showSource.bind(this)},{width:'90px',color : this.style_class.options.font, cursor:rain.nodeUtil.getCursor()})
		);
		this.obj.appendChild(
			rain.nodeUtil.getDiv({innerHTML : 'Exif Á¤º¸', onclick : this.showExif.bind(this)},{width:'90px',color : this.style_class.options.font, cursor:rain.nodeUtil.getCursor()})
		);
	},
/**
 * ÀÌ¹ÌÁö ÁöÁ¤
 * @param imgobj ÀÌ¹ÌÁö Object
 */
	setImg : function(imgobj) {
		this.imgobj = imgobj;	
	},
/**
 * ¿øº» ¼Ò½º URL °¡Á®¿À±â
 * @return String
 */
	getSource : function() {
		var reg = [];
		if (reg = rain.nodeUtil.find("^(.+)\\/thumb\\/(.+)_([^\.]+)\.png",this.imgobj.src.toString())) 
			return reg[1] + '/' + reg[2];
		else
			return this.imgobj.src;
	},
/**
 * ¿øº» ¼Ò½º º¸±â
 */
	showSource : function() {
		var newimg = new Image();
		newimg.src = this.getSource();
		if (newimg.width > 0) {
			rainCheck.imgView(newimg);
		} else {
			var popup_class = this.popup_class;
			rainPopup.alert('Àá½Ã¸¸ ±â´Ù·Á ÁÖ½Ê½Ã¿À. <br>¿øº» ÀÌ¹ÌÁö¸¦ Àü¼Û ¹Þ°í ÀÖ´Â ÁßÀÔ´Ï´Ù.');
			newimg.onload = function() {
				rainCheck.imgView(this);
			}
			newimg.onerror = function() {
				rainPopup.alert('¿øº» ÀÌ¹ÌÁö¿¡ ¿À·ù°¡ ÀÖ¾î »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.');
			}
		}
	},
/**
 * Exif Á¤º¸ º¸±â
 */
	showExif : function() {
		var imgurl = this.getSource();
		var reg = [];
		if (reg = rain.nodeUtil.find("^.+\\/uploads\\/(.+\.(jpg|JPEG|JPG|jpeg))$",imgurl)) {
			rainCheck.imgExif(reg[1]);
		} else {
			rainPopup.alert('ÇØ´ç ÀÌ¹ÌÁö´Â<br><b>Exif Á¤º¸</b>¸¦ Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê½À´Ï´Ù.');
		}
		
	}
}

/**
 * rain.Image.View
 * ÀÌ¹ÌÁö È®´ë º¸±â
 */
rain.Image.View = Class.create();
rain.Image.View.prototype = {
/**
 * ´ë»ó ÀÌ¹ÌÁö
 */
	imgobj : null,
/**
 * »ý¼ºÀÚ
 * @param img_obj ´ë»ó ÀÌ¹ÌÁö
 * @param style_class ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(img_obj, style_class) {
		var win_scrollbars = 'no';
		var img_name = '';
		this.style_class = style_class;
		if (typeof(img_obj) == 'string') {
			win_scrollbars = 'yes';
			img_name = base_upload_url + img_obj;
		} else if (img_obj.height > 300) {
			win_scrollbars = 'yes';
			img_name = img_obj.src;
		} else if (img_obj.width > 300) {
			win_scrollbars = 'yes';
			img_name = img_obj.src;
		} else {
			win_scrollbars = 'no';
			img_name = img_obj.src;
		}
		this.obj = rain.nodeUtil.getDiv({}, rain.extend(this.style_class.getStyle('scroll'),{
			width:((win_scrollbars=='yes')?'100px':'auto'),
			height:((win_scrollbars=='yes')?'100px':'auto'),
			overflowY:'auto' ,overflowX:'auto',
			padding: '3px'
		}));
		var imgobj = new Image();
		imgobj.src = img_name;
		imgobj.onload = this.reSize.bind(this);
		imgobj.onerror = this.error.bind(this);
		imgobj.onclick = this.close.bind(this);
		Element.setStyle(imgobj, {cursor:rain.nodeUtil.getCursor()});
		this.imgobj = this.obj.appendChild(imgobj);
		
		if (this.imgobj.width > 0) 
			this.reSize();
	},
/**
 * ÀÌ¹ÌÁö Å©±â Á¶Á¤
 */
	reSize : function() {
		Element.setStyle(this.obj, {
			width:(((this.imgobj.width > 480)?480:this.imgobj.width)+30) + 'px',
			height:(((this.imgobj.height > 400)?400:this.imgobj.height)+30) + 'px'}
		);
		if (this.popup_class != null) {
			this.popup_class.is_resized = false;
			this.popup_class.reSize();
		}
	},
/**
 * ÀÌ¹ÌÁö ¿À·ù Ã³¸®
 */
	error : function() {
		try {
			this.imgobj.onerror = null;
			this.imgobj.src = base_img_url +'nopic_article.gif';
			this.imgobj.width =55;
			this.imgobj.height= 70;
			this.imgobj.style.width ='55';
			this.imgobj.style.height ='70';
		} catch (ex) 	{}
	},
/**
 * »ó¼¼ º¸±â ´Ý±â
 */
	close : function() {
		this.popup_class.close();	
	}
}

/**
 * rain.Image.Exif
 * ÀÌ¹ÌÁö Exif Á¤º¸ º¸±â
 */
rain.Image.Exif = Class.create();
rain.Image.Exif.prototype = {
/**
 * »ý¼ºÀÚ
 * @param channel Channel
 * @param style_class ½ºÅ¸ÀÏ Å¬·¡½º
 */
	initialize : function(channel, style_class) {
		var obj = rain.nodeUtil.getDiv({}, Object.extend({width:'220px', height:'300px'}, style_class.getStyle('scroll')));
		var result_msg = channel.getNode('msg');
		var item = null;
		var seqn = 0;
		while(item = channel.getNext()) {
			obj.appendChild(rain.nodeUtil.getDiv({innerHTML : item.getNode('name') + ' :'}, {width:'200px', height:'20px', padding :'3px', textAlign:'left', color:style_class.options.font}));
			obj.appendChild(rain.nodeUtil.getDiv({innerHTML : '<b>' + item.getNode('description') + '</b>'}, {width:'200px', height:'20px', padding :'3px', textAlign:'right',color:style_class.options.font, borderBottom:'1px dotted ' + style_class.options.line}));
			seqn ++;
		}
		if (seqn > 0) 
			this.obj = obj;
		else
			this.obj = rain.nodeUtil.getDiv({innerHTML : 'ÇØ´ç »çÁøÀº <u>Exif Á¤º¸</u>¸¦ <br>Æ÷ÇÔÇÏ°í ÀÖÁö ¾Ê½À´Ï´Ù.'}, {width:'220px', height:'40px',color:style_class.options.font});
	}
}

