//// mini append function
//// 
////

window.safari = (window.webkit == true || window.webkit419 == true || window.webkit420 == true) ? true : false;

Element.extend({
	
	//// 레이어 토글 (mode:show, hide)
	toggle: function(mode){
		if((this.getStyle('display') == 'none' && mode != 'hide') || mode == 'show')
			this.setStyle('display','');
		else
			this.setStyle('display','none');
	}
});

String.extend({
	
	//// 태그를 제거한다 
	stripTag: function(){
		return this.toString().replace(/\<([^\>]+)\>/ig,'');
	},
	
	//// HTML 문자를 escape한다
	escapeHTML: function(){
		return this.toString().replace(/\&/ig,'&amp;').replace(/\'/ig,'&#039;').replace(/\"/ig,'&quot;').replace(/\</ig,'&lt;').replace(/\>/ig,'&gt;');
	},
	
	//// 문자열을 기준으로 잘라 배열을 만든다
	explode: function(splitChar){

		var tmp = new Array();
		
		// 기본 자름 기준 문자열 지정
		if(!splitChar) splitChar = ',';

		var tmp = this.trim().split(splitChar);
		
		// 없을때 제거
		for(var i=0;i<tmp.length;i++){
			if(!$chk(tmp[i].trim())){
				tmp.remove(tmp[i]);
			}			
		}
		
		return tmp;
	}
});

//// 에러 표시
function error(msg) {
	
	// 엘레멘트 생성
	var errorOutput = new Element('div',{
		id: 'errorDiv' + $random(0,999),
		styles: {
			border: '3px solid #efefef',
			backgroundColor: 'red',
			color: '#ffffff',
			fontSize: '9pt',
			fontFamily: '돋움',
			fontWeight: 'bold',
			padding: '7px',
			display: '',
			zIndex: '0',
			position: 'absolute'
		}
	}).setHTML(msg).inject(document.body);
	
	// 에러 개수를 참조해서 상단 위치를 설정
	var errorTop = $$('div[id^=errorDiv]').length * (errorOutput.getSize().size.y + 3);
	
	// 위치 지정
	errorOutput.setStyles({
		left: (window.getWidth() / 2) - errorOutput.getSize().size.x / 2,
		top: (window.getHeight()) - errorTop  
	});
	
	// 효과 생성
//	errorOutput.addEvent('click',function(){ this.toggle('hide'); });
	var errorFix = fix.periodical(100, errorOutput, 
		errorOutput.getStyle('top'),
		errorOutput.getStyle('left')
	);
	
	(function(){
		new Fx.Style(errorOutput,'opacity', {
			duration: 1000,
			wait: true,
			onComplete: function(){ $clear(errorFix); errorOutput.remove(); }
		}).start(1,0);		
	}).delay(2000);
}

//// 레이어 고정
function fix(top, left) {
	
	var obj = this; 
	
	if (parseInt(obj.getStyle('top')) != (parseInt(top) + window.getScrollTop())) {
		new Fx.Style(obj,'top', {
			duration: 100,
			wait: false
		}).start(parseInt(obj.getStyle('top')), parseInt(top) + window.getScrollTop());
	}
	
	if (parseInt(obj.getStyle('left')) != (parseInt(left) + window.getScrollLeft())) {
		new Fx.Style(obj,'left', {
			duration: 100,
			wait: false
		}).start(parseInt(obj.getStyle('left')), parseInt(left)+window.getScrollLeft());
	}
}

//// 이벤트 정의(mootools 버그)
function setEvent(event) {
	var e = { page:{}, client:{} };
	
	if (window.ie) {
		$extend(e,event);
		e.code = event.keyCode;
		e.shift = event.shiftKey;
		e.control = event.ctrlKey;
		e.alt = event.altKey;
	
		e.wheel = (window.ie6 || window.ie7) ? event.wheelData : false;
		e.page.x = event.screenX;
		e.page.y = event.screenY;
		e.client.x = event.clientX;
		e.client.y = event.clientY;
		if($chk(event.srcElement)) e.target = event.srcElement;
		if($chk(event.fromElement)) e.relatedTarget = event.fromElement;
		
		switch (e.code) {			
			case 13: e.key = 'enter'; break;
			case 38: e.key = 'up'; break;
			case 40: e.key = 'down'; break;
			case 37: e.key = 'left'; break;
			case 39: e.key = 'right'; break;
			case 32: e.key = 'space'; break;
			case 8: e.key = 'backspace'; break;
			case 46: e.key = 'delete'; break;
			case 27: e.key = 'esc'; break;
			case 9: e.key = 'tab'; break;
			case 16: e.key = 'shift'; break;
			case 17: e.key = 'ctrl'; break;
			case 18: e.key = 'alt'; break;
			case 20: e.key = 'capslock'; break;
			case 229: e.key = 'hangle'; break;
			default: e.key = String.fromCharCode(e.code).toLowerCase(); 
		}	
	}
	else e = new Event(event);
	
	return e;
}

//// Array , Object 내용보기
//// 구분 : Debug
//// 용법 : print_r.ini(object)
var print_r = {
	
	objTmp: new Object(), // 이전 오브젝트를 담아둘 객체
	printDiv: {},
	printDiv2: {},
	printDivContents: {},
	printUl: {},
	selectfunction: 0,
	selectclass: 0,
	selectelement: 0,
	selectstring: 0,	
	selectobject: 0,	
	
	init: function(obj){
		
		// 객체 저장
		this.objTmp = obj;
		
		// 출력 레이어 생성
		this.printDiv = new Element('div',{
			styles: {
				width: '400px',
				height: '400px',
				position: 'absolute',
				top: '100px',
				left: '100px',
				border: '1px solid #e1e1e1',
				backgroundColor: '#ffffff'			
			}
		}).inject(document.body);
		
		// 제목 레이어 생성
		this.printDiv2 = new Element('div',{
			styles: {
				backgroundColor: '#e1e1e1',
				fontFamily: 'verdana',
				fontSize: '8pt',
				fontWeight: 'bold',
				padding: '3px',
				paddingLeft: '15px',
				height: '15px'
			}
		}).setHTML('Print_r&nbsp;&nbsp;| <a href=\'#\' onclick=\'print_r.select("function",event);return false;\'>[function]</a> <a href=\'#\' onclick=\'print_r.select("class",event);return false;\'>[class]</a> <a href=\'#\' onclick=\'print_r.select("object",event);return false;\'>[object]</a> <a href=\'#\' onclick=\'print_r.select("element",event);return false;\'>[element]</a> <a href=\'#\' onclick=\'print_r.select("string",event);return false;\'>[string]</a> <a href=\'#\' onclick=\'print_r.printDiv.remove();\'>[X]</a>').inject(this.printDiv);
		
		// 드래그 활성화
		new Drag.Move(this.printDiv, {handle: this.printDiv2});		
		
		this.printDivContents = new Element('div',{
			styles: {
				fontFamily: 'verdana',
				fontSize: '8pt',
				display: 'block',
				height: (this.printDiv.getSize().size.y - this.printDiv2.getSize().size.y - 1),
				overflow: 'auto'
			}
		}).inject(this.printDiv);
		
		// 1단계 생성	
		this.printUl = new Element('ul').inject(this.printDivContents);
		var printLi;
		var typeVal;
		var tmp;
		var typeObj = $type(obj);
		
		// 배열이나 객체일 경우 리스트를 생성한다
		if (typeObj == 'array' || typeObj == 'object' || typeObj == 'collection' || typeObj == 'element') {
			
			for (var val in obj){

				typeVal = $type(obj[val]);				
				printLi = new Element('li', { id: typeVal});
			
				if (val == 'constructor')
					printLi.setHTML('<b>'+val+'</b>: '+obj.constructor);

				else if (typeVal == 'array' || typeVal == 'object' || typeVal == 'collection' || typeVal == 'element') {
					printLi.setHTML('<b>'+val+'</b>: <a href=\'#\' onclick=\'print_r.toggle("'+val+'",this);return false;\'>['+typeVal+']</a>');	
				}
				
				// 함수일때
				else if (typeVal == 'function' || typeVal == 'class') {
					printLi.setHTML('<b>'+val+'</b>: <a href=\'#\' onclick=\'this.parentNode.childNodes[4].toggle();return false;\'>['+typeVal+']</a> <div style=\'display:none;border:1px solid #e1e1e1;padding:5px;color:gray;\'>'+tmp+'</div>');
				}

				// 값일때
				else if ($chk(obj[val]))
					printLi.setHTML('<b>'+val+'</b>['+typeVal+']: ').appendText(obj[val]);
				
				// 삽입
				if(printLi.innerHTML) printLi.inject(this.printUl);
			}
		}
		else if($chk(obj))
			this.printUl.setHTML(typeObj+':<br />'+obj);
		else
			this.printUl.setHTML('Value Undefined!');
	},

	//// 하위 펼침 생성	
	toggle: function(name,target){

		//eval('var obj = this.objTmp['+name+']');
		eval('var obj = this.objTmp.'+name);
		
		// 이미 펼쳐진것이라면 토글만 한다
		if (target.parentNode.childNodes[3]) 
			target.parentNode.childNodes[3].toggle();
		
		// 생성한다
		else {	
			var printUl = new Element('ul').inject(target.parentNode);
			var printLi;
			var typeVal;
			var typeObj = $type(obj);
			
			// 배열이나 객체일 경우 리스트를 생성한다
			if (typeObj == 'array' || typeObj == 'object' || typeObj == 'collection' || typeObj == 'element') {
				
				for (var val in obj){

					typeVal = $type(obj[val]);					
					printLi = new Element('li', { id: typeVal });
					
					if (val == 'constructor')
						printLi.setHTML('<b>'+val+'</b>: '+obj.constructor);					
				
					else if (typeVal == 'array' || typeVal == 'object' || typeVal == 'collection' || typeVal == 'element') {
						printLi.setHTML('<b>'+name+'.'+val+'</b>: <a href=\'\' onclick=\'print_r.toggle("'+name+'.'+val+'",this);return false;\'>['+typeVal+']</a>');	
					}
					
					// 함수일때
					else if (typeVal == 'function' || typeVal == 'class') {
						printLi.setHTML('<b>'+name+'.'+val+'</b>: <a href=\'\' onclick=\'this.parentNode.childNodes[4].toggle();return false;\'>['+typeVal+']</a> <div style=\'display:none;border:1px solid #e1e1e1;padding:5px;color:gray;\'>'+obj[val].toString().replace(/\</ig,'&lt;')+'</div>');
					}
	
					// 값일때
					else if ($chk(obj[val])) 				
						printLi.setHTML('<b>'+name+'.'+val+'</b>['+typeVal+']: ').appendText(obj[val]);
										
					// 삽입
					if(printLi.innerHTML) printLi.inject(printUl);
				}
			}
			else if ($chk(obj))
				printUl.setHTML(typeObj+':<br />'+Obj);
			else
				printUl.setHTML('Value Undefined!');
		}
	},
	
	//// 분류별 보기
	select: function(name, event){
		
		eval('var selectValue = this.select'+name+';');
		var toggleArg = selectValue ? 'show' : 'hide';
		var toggleColor = selectValue ? 'black' : 'gray';
		
		// 토글하기
		var selectObj = $$('li');
		if ($chk(selectObj)) {
			selectObj.each(function(item, index){
				if (item.id == name)
					item.toggle(toggleArg);
			});
		}
		
		// text 변화		
		var event = new Event(event);
		event.target.style.color = toggleColor;		
		
		selectValue = selectValue ? 0 : 1;
		eval('this.select'+name+' = selectValue;');			
	}
};

//// lightbox effect
//// width, height
var iiPopup = {
	
	//// 생성
	init: function(url, setting){
		
		if (!setting['mode']) setting['mode'] = 'iframe';
		if (!setting['width']) setting['width'] = 600;
		if (!setting['height']) setting['height'] = 480;
		if (!setting['border']) setting['border'] = '';
		if (!setting['backgroundColor']) setting['backgroundColor'] = '#ffffff';
		
		var windowWidth = window.getWidth();
		var windowHeight = window.getHeight();
		
		var popupDivBackground = new Element('div', {
			styles: {
				width: window.getScrollWidth(),
				height: window.getScrollHeight(),
				position: 'absolute',
				top: 0,
				left: 0,
				opacity: 0,
				backgroundColor: '#000000'
			},			
			events: {
				click: function() {
					popupDivBackground.remove();
					popupDiv.remove();
				}
			}
		}).inject(document.body);

		// 효과		
		new Fx.Style(popupDivBackground, 'opacity', {
			duration: 300
		}).start(0,0.25);
		
		// 내용레이어 생성
		var popupDiv = new Element('div',{
			styles: {
				width: setting['width'],
				height: setting['height'],
				position: 'absolute',
				top: (windowHeight/2) - (setting['height']/2),
				left: (windowWidth/2) - (setting['width']/2),
				backgroundColor: setting['backgroundColor'],
				border: setting['border']
			}
		}).inject(document.body);

		// 따라가기 효과
		if (setting['width'] < windowWidth && setting['height'] < windowHeight) {
			fix.periodical(100, popupDiv,
				((windowHeight/2) - (setting['height']/2)), 
				((windowWidth/2) - (setting['width']/2))
			);
		}
		
		// 내용 삽입
		switch (setting['mode']) {
			
			// iframe 삽입
			case 'iframe' :
				var popupIframe = new Element('iframe',{
					src: url,
					styles: {
						width: setting['width'],
						height: setting['height'],
						border: 0,
						overflow: 'auto'
					}					
				}).inject(popupDiv);
				break;
		}
	}
}





function getVal(asd)
{
	if(asd == null || asd == undefined || asd == "") return 0;
	else if(asd.constructor == Array) return "array";
	else if(asd.constructor == Object || asd == "[object]" || asd.toString().match(/^\[object.*\]$/g)) return "object";
	else return "text";	
} // END function

function checkForm(Obj, val)
{
	if(getVal(Obj)=='object'){
		if(Obj.tagName == 'SELECT'){ // Select
			for(i=Obj.options.length-1;i>=0;i--)
				if(Obj.options[i].value.replace(/\'/g,'&#39;').replace(/\</g,'&lt;') == val)
					Obj.options[i].selected = true;
		}
		else if(Obj.tagName=='INPUT'){ // Checkbox
			if(Obj.value.replace(/\'/g,'&#39;').replace(/\</g,'&lt;') == val)
				Obj.checked = true;
			else
				Obj.checked = false;
		}
		else { // RadioButton
			for(i=0;i<Obj.length;i++)
				if(Obj[i].value.replace(/\'/g,'&#39;').replace(/\</g,'&lt;') == val)
					Obj[i].checked = true;
		}
	}
} // END function

function checkBG(asd,url,msg)
{
	asd.style.backgroundColor='#efefef';
	asd.style.cursor='hand';
	asd.onmouseover = function (){ this.style.backgroundColor='#efefef'; };
	asd.onmouseout = function (){ this.style.backgroundColor=''; };
	if(url) asd.onclick = function (){ 
		if(window.event.srcElement.nodeName!='INPUT' && window.event.srcElement.type != 'checkbox') {
		if(msg) {
			if(confirm(msg)) 
				document.location.href = url; 
			else
				return false;
		}
		else
			document.location.href = url; 
		}
	};
}

/* AJAX 관련 */
var ajax = new Object();

//// AJAX 요청
// URL : 요청 URL
// func : request 완료시에 호출될 함수명
// mode : mode 값이 있다면 text 로 받아옴
function ajaxRequest(URL,func,mode)
{
	var xml = '';
	var request = '';

	// XMLHTTPREQUEST 얻기
	try { request = new XMLHttpRequest(); }
	catch(trymicrosoft) {
		try { request = new ActiveXObject("Msxml2.XMLHTTP"); }
		catch(othermicrosoft) {
			try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
			catch(failed) { request = false; }
		} 
	}

	request.open('GET', URL, true); 
	request.send(''); 
	request.onreadystatechange = function() { 
		if(request.readyState==4 && request.status == 200 && request.statusText=='OK') { 
			if(mode){ 
				xml = request.responseText;
			}

			func(xml);
		} 
	};
}