/*
#-----------------------------------------------------------------------------------------
#				The APMSOFT Template AJAX SOLUTION License, version 1.0
#			Copyright (c) 2006 김종관(ApmSoft.net). All rights reserved......
#
#=============+================+===========================+=============================+
#    개발자   |     연락처     |          홈페이지         |            Editor           |
#-------------+----------------+---------------------------+-----------------------------+
#    김종관   |  011-726-7046  |   http://www.apmsoft.net  | EditPlus 굴림체 Regular 9pt |
#-------------+----------------+---------------------------+-----------------------------+
# 1. 저작권 표시를 훼손하면 안됩니다.
# 2. update : 2006-12-08
EUC-KR
update : 2006-10-25/2007-11-28
===================================*/
var ajax = {};
ajax.ApmSoftNet = {};

/** url : register.php, params : GET | POST,
callback : function name, method : id=userid&pwd=pwd, divid : out (<div id='out'></div>), path : 이미지경로
mode : 현재실행 모드, loadingbar 출력 옵션 : 아이디
*/
ajax.ApmSoftNet.REQ = function(url, params, callback, method, divid, imgsrc, mode, loadingid)
{
	this.url		= url;
	this.params		= params;
	this.callback	= callback;
	this.method		= method;
	this.divid		= divid;
	this.imgsrc		= imgsrc;
	this.loadingId	= loadingid;

	this.mode		= mode;  // 현재 실행 모드를 참고 하기위해 2007-01-16
	this.send();
}

ajax.ApmSoftNet.REQ.prototype = {
	getXMLHttpRequest: function()
	{
		if (window.ActiveXObject)
		{
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e){
				try {
					return new ActiveXObject("Microsoft.XMLHTTP");
				} catch(e1) {
					return null;
				}
			}
		} else if (window.XMLHttpRequest){
			return new XMLHttpRequest();
		} else {
			return null;
		}
	},

	send: function()
	{
		this.req = this.getXMLHttpRequest();

		// method
		var apmMethod = this.method ? this.method : 'GET';
		if (apmMethod != 'GET' && apmMethod != 'POST') {
			apmMethod = 'GET';
		}

		// params
		if(this.params == null || this.params == ''){ var apmParams =null; }
		else{ var apmParams = this.params;	}

		// file url
		var apmUrl = this.url;
		if (apmMethod == 'GET' && apmParams != null) {
			apmUrl = apmUrl + "?" + apmParams+'&time='+new Date();
		}

		// run
		this.req.open(apmMethod, apmUrl, true);
		this.req.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );

		var request = this;
		this.req.onreadystatechange = function() {
			request.processReq.call(request);
		}

		this.req.send(apmMethod == 'POST' ? apmParams : null);
	},

	// error msg || loading... msg 출력
	processReq : function()
	{
		var loadmsg = '';
		var ermsg	= '';
		var errormsg= '';

		switch(this.req.readyState){
			case 1:
			case 2:
			case 3: break;
			case 4:
			
			// only if "OK"
			switch(this.req.status){
				case 200: // 외부 함수 호출						
					if(this.callback){
						this.callback(this.req);
					}
				break;
				case 403: alert('403:접근거부'); break;
				case 404: alert('404:페이지를 찾을 수 없습니다'); break;
				case 406: alert('406:Not acceptable, 허용할 수 없음'); break;
				case 407: alert('407:Proxy authentication required, 프록시 인증 필요'); break;
				case 408: alert('408:408 : Request timeout, 요청시간이 지남'); break;
				case 500: alert('500:서버 애플리케이션 버그'); break;
				case 503: alert('503:서버 애플리케이션 사용불가'); break;
			}
			break;
			default:
				alert("There was a problem retrieving the 'XMLHttpRequest Object' : "+this.req.status);
		}
	},
	
	getParams: function() {
		var pArr	= new Array();
		var arr		= this.params.split('&');		
		for(var i=0; i<arr.length; i++){
			if(arr[i]){
				var kv = arr[i].split('=');
				var k = kv[0];
				var v = kv[1];

				pArr[k] = v;
			}
		}
		
		return pArr;
	},

	// div id 출력
	printMsg : function(msg){
		if (this.divid){
			var output = document.getElementById(this.divid);
			if(output){ output.innerHTML = msg; }
		}
	}
}

/* ================================
HISTORY, FAVORITE

# 선언은 히스토리를 사용하고자 하는 곳에서 한다.
*/
ajax.win = {}
ajax.win.History = function(){
	this.ie = /MSIE/.test(navigator.userAgent);
	this.ieUse = true;
	this.hash= '';
}

ajax.win.History.prototype = {
	check:	function(){
		var h = document.location.hash;
		if (h != this.hash){
			this.hash = h;
			this.onHashChanged(h);
		}
	},
	init:	function(){			
		var thash =  document.location.hash;
		if (this.ie && this.ieUse) {
			var frame = document.createElement("iframe");
			frame.id = "state-frame";
			frame.style.display = "none";
			document.body.appendChild(frame);
			this.writeFrame("");
		}
		
		var self = this;
			
		// IE
		if ("onpropertychange" in document && "attachEvent" in document){
			document.attachEvent("onpropertychange", function () {
				if (event.propertyName == "location") {
					self.check();
				}
			});
		}
		
		if(thash){
			var thashold = /,/g;
			if(thash){
				self.setHash(thash.replace(thashold,"&"));
			}
			self.onHashChanged(this.hash);
		}		
		// poll for changes of the hash
		self.onHashChanged(thash);
		window.setInterval(function () { self.check(); }, 100);
	},
	setHash: function(s) {
		var shash = '';
		var hisArr = new Array();		
		var arr = s.split('&');

		for(var i=0; i<arr.length; i++){
			if(arr[i]){
				var kv = arr[i].split('=');
				var k = kv[0];
				var v = kv[1];
				if(v){
					if(!hisArr[k]){
						hisArr[k] = v;
						switch(k){
							case 'passwd':
							case 'tname': break;
							//case 'keyword': shash+=k+'='+v+','; break;
							default : shash+=k+'='+this.chkEncode(v)+',';
						}
					}
				}
			}
		}
		
		if(shash){
			var strpoint	= shash.lastIndexOf(',');
			var subshash	= shash.substring(0,strpoint);
		}
		
		// Mozilla always adds an entry to the history
		this.hash = '#'+subshash;
		if(this.hash != document.location.hash){
			if (this.ie && this.ieUse){
				this.writeFrame(subshash);
			}else{ document.location.hash = subshash; }
		}
	},
	
	writeFrame:	function(s) {
		var f = document.getElementById("state-frame");
		var d = f.contentDocument || f.contentWindow.document;
		d.open();
		d.write("<script>window._hash = '" + s + "'; window.onload = parent.his.syncHash;<\/script>");
		d.close();
	},
	syncHash:function(){
		var s = this._hash;
		if (s != '#'+this.hash){
			document.location.hash = s;
		}
	},
	getParams: function(s) {
		var modev	= '';
		var parv	= '';
		var pagev	= 1;
		if(s){
			sv = s.replace("#",'');
			var arr		= sv.split(',');
			
			for(var i=0; i<arr.length; i++){
				if(arr[i]){
					var kv = arr[i].split('=');
					var k = kv[0];
					var v = kv[1];
					if(v){
						switch(k){
							case 'mode' : modev = v; break;
							case 'tname':
							case 'passwd': break;
							case 'page': 
								pagev = (v)?v : 1;
								parv+=k+'='+v+'&';
							break;
							//case 'keyword': shash+=k+'='+v+','; break;
							default : parv+=k+'='+this.chkDecode(v)+'&';
						}
					}
				}
			}
			
			var strpoint	= parv.lastIndexOf('&');
			var subparv		= parv.substring(0,strpoint);
		}
		return {mode:modev, page:pagev, params:subparv};
	},
	
	chkEncode: function(v){
		var result ='';
		
		var encodStr = encodeURIComponent(v);
		if(encodStr == v) result = v;
		else result = encodeURIComponent(v);
		
	return result;
	},
	
	chkDecode: function(v){
		var result ='';
		
		var encodStr = decodeURIComponent(v);
		if(encodStr == v) result = v;
		else result = decodeURIComponent(v);
		
	return result;
	},
	onHashChanged:function(s){}
};