/**
 *	 Event Class : 이벤트를 Listener 형식으로 사용합니다.
 *   			 : FF와 IE에서 같은 이름으로 사용하기 위한 클래스 입니다.
 *   			 : (각 메소드 조건문에서 true인 경우가 FF, false인 경우가 IE)
 *   
 *   Event.addEvent(대상엘리먼트, 이벤트 객체, 콜백메소드) : 이벤트를 등록한다.
 *   Event.removeEvent(대상엘리먼트, 이벤트 객체, 콜백메소드) : 이벤트를 삭제한다.
 *   Event.target(이벤트 객체) : 해당 이벤트의 대상이 되는 엘리먼트를 반환한다.
 *   Event.stopEvent(이벤트 객체) : stopPropagation, preventDefault를 실행한다.
 *   Event.stopPropagation(이벤트 객체) : 이벤트의 전파를 중지한다.
 *   Event.preventDefault(이벤트 객체) : 기본 에벤트를 중지한다.
 *   
 */
var Event = {
	addEvent : function(element, event, callback, useCapture){
		useCapture = useCapture || false;
		
		if (element.addEventListener) {
			element.addEventListener(event, callback, useCapture);
		} else if (element.attachEvent) {
			element.attachEvent('on' + event, callback);
		}		
	},
	removeEvent : function(element, event, callback, useCapture){
		useCapture = useCapture || false;
		
		if (element.removeEventListener) {
			element.removeEventListener(event, callback, useCapture);
		} else if (element.detachEvent) {
			element.detachEvent('on' + event, callback);
		}		
	},
	bindEvent : function(func, obj){
		return function(){
			return func.apply(obj, arguments);	
		}
	},
	stopEvent : function(event){
		this.stopPropagation(event);
		this.preventDefault(event);
	},
	target : function(event) {
		if (event == null) return null;
		if (event.target) return event.target;
		else if (event.srcElement) return event.srcElement;
		return null;		
	},
	stopPropagation : function(event){
		if (event.stopPropagation) {
		    event.stopPropagation();
		} else {
		    event.cancelBubble = true;
		}		
	},
	preventDefault : function(event){
		if (event.preventDefault){
			event.preventDefault();
		} else {
			event.returnValue = false;
		}	
	}
}

/**
 *	ajax Package
 *  ajax.Request(URL, 파라미터, 콜백메소드, Post or Get)
 *  : Ajax 기본 코드 입니다.
 *  : 기존 doDisplay 와 같은 유용한 Ajax관련 함수를 작성하신다면, 
 *  : ajax.doDisplay = function(){} 과 같이 패키지 선언을 해주세요. 
 */
var ajax = {};
 
ajax.Request = function(url, parameters, callback, method){
	this.url = url;
	this.parameters = parameters;
	this.callback = callback;
	this.method = method;
	this.send();	
}

ajax.Request.prototype = {
	
	getXMLHttpRequest: function(){
		try {
			return new XMLHttpRequest();	// Firefox, Opera, Safari and 'IE7'
		} catch (e) {
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");	// Internet Explorer 6.0+
			} catch (e) {
				try {
					return new ActiveXObject("Microsoft.XMLHTTP");	//Internet Explorer 5.5+
				} catch (e) {
					alert("Your browser does not support AJAX!");                                                              
					return false;
				}
			}
		}
	},
	send : function(){	
		this.xmlHttp = this.getXMLHttpRequest();

		var ajaxMethod = this.method ? (this.method.toUpperCase()=='POST' ? this.method.toUpperCase() : 'GET') : 'GET';
		var ajaxParameters = (this.parameters == null || this.parameters == '') ? null : this.parameters;		
		var ajaxUrl = (ajaxMethod == 'GET' && ajaxParameters != null) ? this.url + "?" + this.parameters: this.url; 
		
		this.xmlHttp.open(ajaxMethod, ajaxUrl, true);
		this.xmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		this.xmlHttp.setRequestHeader('charset', 'utf-8');
		
		var request = this;
		this.xmlHttp.onreadystatechange = function(){
			request.onReadyState.call(request);
		}
		
		this.xmlHttp.send(ajaxMethod == 'POST' ? ajaxParameters : null);		
	},
	onReadyState : function(){
		this.callback(this.xmlHttp);
	}	
}

/**
 * 	isNavigator() : 브라우저,OS인지 여부를 리턴(true/false)합니다. 
 */
function Agent(){
	var nu = navigator.userAgent;
	var np = navigator.platform;

	return {
		IE : /MSIE/.test(nu),
		IE6 : /MSIE 6/.test(nu),
		IE7 : /MSIE 7/.test(nu),
		FF : /Firefox/.test(nu),
		Safari : /Safari/.test(nu),
		Opera : /Opera/.test(nu),
		Windows : /Win/.test(np),
		Linux : /Linux/.test(np),
		Mac : /Mac/.test(np)		
	}
}
/**
 * 	$() : Object를 리턴합니다.
 * 		: 아시다시피 prototype.js 에서 퍼왔습니다.
 */
function $(){
	var obj = [];
	for(var i=0; i < arguments.length; i++) {
		if(typeof arguments[i] == 'string') {
			obj.push(document.getElementById(arguments[i]));
		}else{
			obj.push(arguments[i]);
		}
	}
	return obj.length > 1 ? obj : obj[0];
}
/**
 *  $c() : 엘리먼트를 생성합니다.
 */
function $C(elementName) {
	return document.createElement(elementName);
}
/**
 * 	Serialize(해당 폼의 ID값) 
 * 	: 폼안의 엘리먼트를 파라미터 형식으로 리턴합니다.	
 * 	: prototype.js 의 Form.Serialize 함수를 대체하기 위해 작성했습니다.
 */
function Serialize(formID){
	var formObj = $(formID);
	var inputs = formObj.getElementsByTagName("INPUT");
	var selects = formObj.getElementsByTagName("SELECT");
	var textareas = formObj.getElementsByTagName("TEXTAREA");	
	var strSerialize = "";
		
	for (i = 0; i < inputs.length; i++) {
		if (inputs[i].tagName == "INPUT") {
			if (inputs[i].type == "text") {
				strSerialize += inputs[i].name + "=" + encodeURIComponent(inputs[i].value) + "&";
			}
			if (inputs[i].type == "hidden") {
				strSerialize += inputs[i].name + "=" + encodeURIComponent(inputs[i].value) + "&";
			}
			if (inputs[i].type == "checkbox") {
				if (inputs[i].checked) {
					strSerialize += inputs[i].name + "=" + encodeURIComponent(inputs[i].value) + "&";
				} else {
					strSerialize += inputs[i].name + "=&";
				}
			}
			if (inputs[i].type == "radio") {
				if (inputs[i].checked) {
					strSerialize += inputs[i].name + "=" + encodeURIComponent(inputs[i].value) + "&";
				}
			}
		}		
	}
	
	for (i = 0; i < selects.length; i++) {
		if (selects[i].tagName == "SELECT") {
			var sel = selects[i];
				strSerialize += sel.name + "=" + encodeURIComponent(sel.options[sel.selectedIndex].value) + "&";
		}		
	}
	
	for (i = 0; i < textareas.length; i++) {
		if (textareas[i].tagName == "TEXTAREA") {
			strSerialize += textareas[i].name + "=" + encodeURIComponent(textareas[i].value) + "&";			
		}		
	}

	return strSerialize;
}


//=== 아래는 재정리가 필요함. 예전코드 확인안됀코드 불펌한코드 정리없이 섞여있음.

var Util = {
	mousePosition : function(evt){	// FF & MSIE
		if(evt.pageX || evt.pageY){
			return {x:evt.pageX, y:evt.pageY};
		}
		return {
			x:evt.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:evt.clientY + document.body.scrollTop  - document.body.clientTop
		};
	},
	mouseOffset : function(tg, evt){
		evt = evt || window.event;
		var targetPoint    = Util.targetPosition(tg);
		var mousePoint  = Util.mousePosition(evt);
		return {x:mousePoint.x - targetPoint.x, y:mousePoint.y - targetPoint.y};
	},
	targetPosition : function(tg){
		var left = 0;
		var top  = 0;

		while (tg.offsetParent){
			left += tg.offsetLeft;
			top  += tg.offsetTop;
			tg = tg.offsetParent;
		}

		left += tg.offsetLeft;
		top  += tg.offsetTop;

		return {x:left, y:top};
	},
	setOpacity : function(element, opacity){
		if (element.filters) {
			element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';
		} else {
			element.style.opacity = opacity;
		}		
	},
	getXY : function(element){
		// el은 문서에 포함되어 있어야 하고, 화면에 보여야 한다.
		if (element.parentNode == null || element.style.display == 'none') {
			return false;
		}
		
		var parent = null;
		var pos = [];
		var box;
		
		if (document.getBoxObjectFor) { // gecko 엔진 기반
			box = document.getBoxObjectFor(element);
			pos = [box.x, box.y];
		} else { // 기타 브라우저
			pos = [element.offsetLeft, element.offsetTop];
			parent = element.offsetParent;
			if (parent != element) {
				while (parent) {
					pos[0] += parent.offsetLeft;
					pos[1] += parent.offsetTop;
					parent = parent.offsetParent;
				}
			}
		}
		
		if (element.parentNode) { parent = element.parentNode; }
		else { parent = null; }
		
		// body 또는 html 이외의 부모 노드 중에 스크롤되어 있는
		// 영역이 있다면 알맞게 처리한다.
		while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') {
			pos[0] -= parent.scrollLeft;
			pos[1] -= parent.scrollTop;
			
			if (parent.parentNode) { parent = parent.parentNode; }
			else { parent = null; }
		}
		return {x: pos[0], y: pos[1]};		
	},
	setXY : function(element, x, y){
		var pageXY = Util.getXY(element);
		if (pageXY === false) { return false; }
		var position = Util.getStyle(element, 'position');
		if (!position || position == 'static') {
			element.style.position = 'relative';
		}
		var delta = {
			x: parseInt( Util.getStyle(element, 'left'), 10 ),
			y: parseInt( Util.getStyle(element, 'top'), 10 )
		};
		if ( isNaN(delta.x) ) { delta.x = 0; }
		if ( isNaN(delta.y) ) { delta.y = 0; }
		
		if (x != null) {
			element.style.left = (x - pageXY.x + delta.x) + 'px';
		}
		if (y != null) {
			element.style.top = (y - pageXY.y + delta.y) + 'px';
		}
		
		return true;		
	},
	getBounds : function(element){
		var xy = Util.getXY(element);
		return {
			x: xy.x,
			y: xy.y,
			width: element.offsetWidth,
			height: element.offsetHeight
		};		
	},
	getStyle : function(el, property){
		var value = null;
		var dv = document.defaultView;
		
		if (property == 'opacity' && el.filters) {// IE opacity
			value = 1;
			try {
				value = el.filters.item('alpha').opacity / 100;
			} catch(e) {}
		} else if (el.style[property]) {
			value = el.style[property];
		} else if (el.currentStyle && el.currentStyle[property]) {
			value = el.currentStyle[property];
		} else if ( dv && dv.getComputedStyle ) {
			// 대문자를 소문자로 변환하고 그 앞에 '-'를 붙인다.
			var converted = '';
			for(i = 0, len = property.length;i < len; ++i) {
				if (property.charAt(i) == property.charAt(i).toUpperCase()) {
					converted = converted + '-' + 
					            property.charAt(i).toLowerCase();
				} else {
					converted = converted + property.charAt(i);
				}
			}
			if (dv.getComputedStyle(el, '').getPropertyValue(converted)) {
				value = dv.getComputedStyle(el, '').getPropertyValue(converted);
			}
		}
		return value;		
	}
}


function $A(collection) {
	var obj = [];
	for(var i=0; i < collection.length; i++) obj[obj.length] = collection[i];
	return obj; 
}

document.getElementsByClassName = function(className, parentElement) {
	var children = ($(parentElement) || document.body).getElementByTagName('*');
	var elements = [];
	for (var i = 0, len = children.length ; i < len ; i++){		
		if(children[i].className.length == 0) continue;	
		if(children[i].className == className || child.className.match( new RegExp("(^|\\s)" + className + "(\\s|$)") ) ) {
			elements.push(children[i]);
		}		
	}
    return elements;	
}

