Number.prototype._NaN = function()
{
	return isNaN(this) ? 0 : this;
}


Object.prototype._expand = function()
{
	var org = arguments[0];
	var isOverwrite = arguments[1];
	
	if ( typeof(org) == 'object' ) {
		for ( var prop in org ) {
			if ( !this[prop] || (Number(isOverwrite)._NaN() > 0) ) {
				this[prop] = org[prop];
			}
		}
	}
	
	return this;
}


var Com = {
	$Class: {
		bind: function()
		{
			return function()
			{
				if ( this.Init ) {
					if ( !(arguments.length ==2 && (arguments[1] == null)) )
						this.Init.apply(this, arguments);
				}
			}
		},
		
		root: function()
		{
			return (window.$CLASS) ? window.$CLASS : window.$CLASS={}
		}
	},
	
	Cookie: {
		gets: function()
		{
			var searchCookie = arguments[0];
			var cookieValue;
			
			var cookies = document.cookie.split(';');
			
			for ( var i=0; i < cookies.length; i++) {
				if ( cookies[i].split('=')[0].replace(/\s/gi, '') == searchCookie ) {
					cookieValue = cookies[i].split('=')[1];
					break;
				}
			}
			
			return cookieValue;
		},
		
		sets: function()
		{
			var cookieName = arguments[0];
			var cookieVal = arguments[1];
			
			document.cookie = cookieName + '=' + cookieVal + '; path=/;'; 
		}
	},
	
	QueryString: {
		exist: function(){
			var param = arguments[0];
			var doc = arguments[1]||document.URL;
			
			var re = eval('/([\\?|&])' + param + '=(([^&])*)/gi') ;
			
			var rtn = false;
			if ( doc.search(re) != -1 )
				rtn = true;
			
			return rtn;
		},
		
		gets: function()
		{
			var param = arguments[0];
			var doc = arguments[1]||document.URL;

			var rtn = '';
			
			if ( !(!param) ) {
				var re = eval('/([\\?|&])' + param + '=(([^&])*)/gi') ;
				
	
				var matcher = doc.match(re);
	
				if ( !(!matcher) ) 
					rtn = matcher[0].replace(re, '$2');
			}
			else 
				rtn = doc.substring(doc.indexOf('?')+1);
				
			return rtn;
		},
		
		sets: function()
		{
			var param = arguments[0];
			var val = arguments[1];
			var docUrl = arguments[2]||document.URL;
			var rtn = '';
			
			if ( !(!param) ) {
				rtn = '?' + param + '=' + val;
			
				var splitPos = docUrl.indexOf('?');
			
				if ( splitPos != -1 ) {
					rtn = docUrl.substring(splitPos);
					
					var re = eval('/([\\?|&])(' + param + '=)(([^&])*)/gi') ;
					
					if ( docUrl.search(re) != -1 )
						rtn = rtn.replace(re, '$1$2'+val);
					else {
						rtn += '&' + param + '=' + val;
					}
				}
				
				return rtn;
			}
		}
	},
	
	Dom: {
		getParent: function()
		{
			var elm = arguments[0];
			var attr = arguments[1];
			var attrVal = arguments[2];
			var rtnObj = null;
			
			while ( elm.parentNode ) {
				elm = elm.parentNode;
				
				if (elm.getAttribute(attr) == attrVal) {
					rtnObj = elm;
					break;
				}
			}
			
			return rtnObj;
		}
	},
	
	Form: {
		check: function()
		{
			var formObj = arguments[0];
			
			for ( var i=0; i < formObj.elements.length; i++ ) {
				switch ( formObj.elements[i].getAttribute('_constraint') ) {
					case 'value':
						var elmData = this.getElementData(formObj.elements[i].value);
						
						if (!elmData || !elmData.replace(/\s/gi, '') ) {
							var msg = formObj.elements[i].getAttribute('_msg');
							if ( !(!msg) )
								alert(msg);
							return false;
						}
					default:
						break;
				}	
			}
			
			return true;
		},
		
		getElementData: function()
		{
			var data = arguments[0];
				
			if ( data.indexOf('^') == 0 ) {
				switch ( data.split('_')[0].substr(1) ) {
					case 'QS':
						data = Com.QueryString.gets(data.substr(4));
						break;
					case 'CK':
						data = Com.Cookie.gets(data.substr(4));
						break;
					default:
						break;
				}
			}
			
			return data||'';
		},
		
		getFormData: function()
		{
			var formObj = arguments[0];
			var dataSet = '';
			
			for ( var i=0; i < formObj.elements.length; i++ )
				dataSet += '&' + formObj.elements[i].name + '=' + this.getElementData(formObj.elements[i].value);
			
			if ( !(!dataSet) )
				dataSet = dataSet.substring(1);
			
			return dataSet;	
		},
		
		request: function()
		{
			var requestUrl = arguments[0];	/* ?Ã» URL */
			var innerObj = arguments[1];	/* ?´ä ¹ÞÀ» °´Ã¼ */
			var formObj = arguments[2];		/* ??°´Ã¼ */
			var resultFn = arguments[3];
			var faultFn = arguments[4];
			
			if (!(!formObj) && !this.check(formObj) ) 
				return;
			
			if (!(!innerObj) ) {
				
				var oParam = {
					isXml: false,
					callBack: true,
					fnResult: resultFn,
					fnError: faultFn,
					data: this.getFormData(formObj),
					url: requestUrl
				}

				new window.$CLASS.HttpRequest().send(oParam);
			}
		},
		
		submit: function()
		{
			var targetUrl = arguments[0];
			var formObj = arguments[1];
			
			if ( !this.check(formObj) ) 
				return;
			
			formObj.action = targetUrl;
			formObj.submit();
		}
	},
	
	TabNavi: {
		lists: new Array(),
		
		gets: function(){
			var groupId = arguments[0];
			var targetProp = arguments[1];
			var targetPropVar = arguments[2];
			var targetStyle = arguments[3];
			var eventGroupId = arguments[4];
			var eventStyle = arguments[5];
			var eventStyleProc = arguments[6];
			var eventStyleVar = arguments[7];
			
			var navigateObj = this.lists[groupId]||new window.$CLASS.TabNavigate(groupId);
			var eventObj = this.lists[eventGroupId]||new window.$CLASS.TabNavigate(eventGroupId);
			eventObj.procCmd(targetProp, targetPropVar, eventStyle, eventStyleProc, eventStyleVar);
			return navigateObj.procCmd(targetProp, targetPropVar, targetStyle);
		}
	}
}


var HttpRequest = (Com.$Class.root().HttpRequest = Com.$Class.bind()).prototype = {
	$param: {
		loadTime: 5000,
		callBack: true,
		fnResult: null,
		fnError: null,
		data: null,
		isXml: true,
		url: '',
		method: 'GET'
	},
	
	//[ Constructor ]
	Init: function(){
		
	},
	
	response: function()
	{
		var $param = this.$param;

		if ( $param.fnResult ) {
			if ( !this.sender.responseXML.documentElement ) {
				if ( $param.fnResult.Html )
					$param.fnResult.Html(this.sender.responseText);
				else {
					alert('require Function fnResult.Html');
				}
			}
			else {
				var oDocumentElement = this.sender.responseXML.documentElement;
				
				if ( oDocumentElement ) {
					var oResult = oDocumentElement.attributes.getNamedItem('result');
					
					if ( oResult == null ) {
						switch ( typeof($param.fnResult) ) {
							case 'function':
								$param.fnResult(this.sender.responseXML);
								break;
							
							case 'object':
								if (typeof($param.fnResult.F)=='function') {
									$param.fnResult.F(this.sender.responseXML);
								}
								else
									alert('define fnResult.F function!!');
								break;
								
							default:
								alert('define fnResult function!!');
								break;
						}
					}
					else {
						switch ( typeof($param.fnResult) ) {
							case 'function':
								$param.fnResult(this.sender.responseXML);
								break;
							
							case 'object':
								if ( oResult.nodeValue.toUpperCase() == 'T' ) {
									if (typeof($param.fnResult.T)=='function') {
										$param.fnResult.T(this.sender.responseXML);
									}
									else 
										alert('define fnResult.T function!!');
								}
								else {
									if (typeof($param.fnResult.F)=='function') {
										$param.fnResult.F(this.sender.responseXML);
									}
									else
										alert('define fnResult.F function!!');
								}
								break;
								
							default:
								alert('define fnResult function!!');
								break;
						}
					}
				}
				else 
					alert(this.sender.responseText);
			}
		}
//		else {
//			alert('require fnResult Object!!');
//		}
	},
	
	send: function()
	{
		if ( this.validate() ) {
			if (typeof(arguments[0])=='object')
				this.$param = arguments[0]._expand(this.$param);
			
			this.$param.url += (this.$param.url.split('?').length > 1) ? '&' : '?';
			this.$param.url += 'iProcess=' + new Date().toString().replace(/\s/gi, '');
			
			//alert(this.$param.fnResult.toString());
			if ( !(!this.$param.data) )
				this.$param.method = 'POST';
			this.sender.open(this.$param.method, this.$param.url, this.$param.callBack);
			
			//this.oRequester.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.sender.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
			this.sender.setRequestHeader("Cache-Control","");
			this.sender.setRequestHeader("Pragma","");
			this.sender.setRequestHeader('Accept', 'text/javascript, text/html, application/xml, text/xml, */*');
			
			if (this.$param.callBack) {
				(this.sender.onreadystatechange = function(){
					if (!arguments.callee._CLASS) 
						arguments.callee._CLASS = arguments.callee.caller._CLASS;
					
					var ownerClass = arguments.callee._CLASS;
					var requester = ownerClass.sender;
					
					if (requester.readyState == '4') {
						if (requester.status == '200') {
							ownerClass.response();
						}
					}
				})._CLASS = this;
			}
			
			this.sender.send(this.$param.data);
		}
		else {
			alert('Object is used already!! [ new Instance Create and Use ]');
		}
	},
	
	sender: ((window.XMLHttpRequest) ? new window.XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP")),
			
	validate: function()
	{
		var rtn = true;
		
		if ( !(this instanceof window.$CLASS.HttpRequest) ) {
			alert('Invalid Request Object!!');
			rtn = false;
		}
			
		return rtn;
	}
}


var TabNavigate = (Com.$Class.root().TabNavigate = Com.$Class.bind()).prototype = {
	_id: null,
	_lists: new Array(),
	
	Init: function()
	{
		this._id = arguments[0];
		this._lists = document.getElementsByName(this._id);
	},
	
	procCmd: function(){
		var rtnObj = null;
		var prop = arguments[0];
		var propVar = arguments[1];
		var cmdStyle = arguments[2];
		var procCode = arguments[3];
		var procVar = arguments[4];
		
		for( var i=0; i < this._lists.length; i++ ) {
			if ( this._lists[i].getAttribute(prop) == propVar )
				rtnObj = this.procStyle(this._lists[i], cmdStyle, 1, procCode, procVar);
			else
				this.procStyle(this._lists[i], cmdStyle, 0, procCode, procVar);
		}
		
		return rtnObj;
	},
	
	procStyle: function()
	{
		var obj = arguments[0];
		var cmd = arguments[1];
		var bit = arguments[2];
		var procCode = arguments[3];
		var procVar = arguments[4];
		
		switch ( cmd.toUpperCase() ) {
			case 'DISPLAY':
				if ( bit )
					obj.style.display = 'block';
				else
					obj.style.display = 'none';
				break;
				
			case 'SRC':
				switch ( procCode.toUpperCase() ) {
					case 'ADD':
						if ( bit ) {
							if ( obj.src.indexOf(procVar) == -1 )
								obj.src = obj.src.substring(0, obj.src.length-procVar.split('.')[1].length-1) + procVar;
						}
						else {
							if ( obj.src.indexOf(procVar) != -1 )
								obj.src = obj.src.substring(0, obj.src.length-procVar.length) + '.' + procVar.split('.')[1];
						}
					default:
						break;
				}
				break;
				
			default:
				break; 	
		}
		
		return obj;
	}
}

