// ###    eXtensible Remote Scripting utilities for client    ###
// ###    programed by freesk8ter (endymion@millesky.com)     ###
// ###    Copyright (c) 2005 Millesky Inc.                    ###
// ###    All rights reserved.                                ###

function XRSEnable()
{
	XRS = new _XRS_Object();
}

function XRSExecute(url,method)
{
	var cb, ecb, context;
	var params = new Array;
	var pn = 0;
	var len = XRSExecute.arguments.length;
	for (var i=2; i < len; i++)
		params[pn++] = XRSExecute.arguments[i];
		
	return XRS.invokeMethod(url, method, params);
}

function XRSGetASPObject(url)
{
	var cb, ecb, context;
	var params = new Array;
	var request = XRS.startRequest(url,'GetServerProxy',params,cb,ecb,context);

	if (request.status == XRS_COMPLETED)
	{
		var server = request.return_value;
		if (typeof(Function) == 'function')
		{
			for (var name in server)
				server[name] = Function('return XRS.invokeMethod(this.location,"' +  name + '",this.' + name + '.arguments);');
		}
		else
		{
			for (var name in server)
				server[name] = eval('function t(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pA,pB,pC,pD,pE,pF) { return XRS.invokeMethod(this.location,"' + name + '",this.' + name + '.arguments);} t');
		}
		server.location = url;
		return server;
	}
	alert(url + ' : ASP object¸¦ »ý¼ºÇÏ´Âµ¥ ½ÇÆÐÇß½À´Ï´Ù.');
	return null;
}

function XRSCallObject(cb, ecb, context)
{
	this.id = XRS.nextRequestID++;
	this.status = XRS_PENDING;
	this.message = '';
	this.data = '';
	this.return_value = '';
		
	this.callback = cb;
	this.error_callback = ecb;
	this.context = context;

	XRS.requestList[this.id] = this;
}

function _XRS_Object()
{
	HTTP_STATUS_OK = 200;
	WAITING_PERIOD = 100;
	XRS_FAIL = -1;
	XRS_COMPLETED = 0;
	XRS_PENDING = 1;
	XRS_PARTIAL = 2;

	this.httpMethod = "GET";
	this.remoteURL = null;
	this.asyncFunc = null;
	this.syncFlag = false;
	this.httpEquiv = "Content-type:";
	this.content = "text/html";
	this.elements = null;

	this.waitID = 0;
	this.blockMode = false;
	this.nextRequestID = 1;
	this.requestList = new Array;

	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
		try
		{
			this.XRSProxy = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e)
		{
			try
			{
				this.XRSProxy = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e)
			{
				this.XRSProxy = false;
			}
		}
	@end @*/

	if (!this.XRSProxy && typeof XMLHttpRequest != "undefined")
		this.XRSProxy = new XMLHttpRequest();

	this.xmlHttp = _XRS_xmlHttp;
	this.startRequest = _XRS_startRequest;
	this.invokeMethod = _XRS_invokeMethod;
	this.setWait = _XRS_setWait;
	this.waitHandler = _XRS_waitHandler;
	this.handleResponse = _XRS_handleResponse;
	this.getRequestID = _XRS_getRequestID;
	this.evaluateRequest = _XRS_evaluateRequest;
	this.buildURL = _XRS_buildURL;
}

function _XRS_xmlHttp()
{
	this.XRSProxy.open(this.httpMethod, this.remoteURL, this.syncFlag);
//	this.XRSProxy.setRequestHeader(this.httpEquiv, this.content);
//	this.XRSProxy.setRequestHeader("Referer:", this.remoteURL);

	try
	{
		if (!this.syncFlag)
		{
			this.XRSProxy.send(this.elements);
			if (this.XRSProxy.status > HTTP_STATUS_OK)
			{
				alert("ERROR:\nXRS¼­¹ö ÁúÀÇÁß ¿¡·¯°¡ ¹ß»ýÇß½À´Ï´Ù.!");
			}
			this.handleResponse(this.XRSProxy.responseText);
			this.blockMode = false;
		}
		else
		{
			this.XRSProxy.onreadystatechange = _XRS__onProcessAsync;
			this.XRSProxy.send(this.elements);
		}
	}
	catch(e)
	{
//		alert("ERROR:\nXRS¼­¹ö ÁúÀÇÁß ¿¡·¯°¡ ¹ß»ýÇß½À´Ï´Ù.!");
	}
}

function _XRS__onProcessAsync()
{
//******************************************************************************
//(0)Uninitialized °³Ã¼°¡ »ý¼ºµÇ¾úÁö¸¸ ÃÊ±âÈ­µÇÁö´Â ¸øÇß´Ù.
//		(open ¸Þ¼­µå¸¦ È£ÃâÇÏÁö ¾ÊÀº »óÅÂ) 
//(1)Loading °³Ã¼°¡ »ý¼ºµÇ¾ú°í ÃÊ±âÈ­µÇ¾úÁö¸¸ send ¸Þ¼­µå¸¦ È£ÃâÇÏÁö´Â ¾ÊÀº »óÅÂ 
//(2)Loaded send ¸Þ¼­µå°¡ È£ÃâµÇ¾úÀ¸³ª ¾ÆÁ÷ ÀÀ´ä´Ü°è´Â ¾Æ´Ô 
//(3)Interactive ºÎºÐ µ¥ÀÌÅÍ°¡ Àü¼Û.
//		responseBody³ª responseText¸¦ »ç¿ëÇÏ¿© ÀÌ ºÎºÐ µ¥ÀÌÅÍ¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù. 
//(4)Completed ¸ðµç µ¥ÀÌÅÍ°¡ Àü¼Û.
//		responseBody³ª responseText¸¦ »ç¿ëÇÑ ¸ðµç µ¥ÀÌÅÍ Àü¼Û ¿Ï·á 
//******************************************************************************
	if (XRS.XRSProxy.readyState == 4)
	{
		XRS.handleResponse(XRS.XRSProxy.responseText);
		XRS.blockMode = false;
	}

}

function _XRS_startRequest(url, method, args, cb, ecb, context)
{
	var request = new XRSCallObject(cb, ecb, context);
	if (this.XRSProxy == null)
	{
		var errmsg = 'ERROR:\nXRSÅë½ÅÀÌ ÁØºñµÇÁö ¾ÊÀº »óÅÂÀÔ´Ï´Ù.';
		request.status = XRS_FAIL;
		request.message = errmsg; 
		alert(errmsg);
	}

	if (request.status != XRS_FAIL)
	{
		url = this.buildURL(request.id, url, method, args);
		url_context = window.location.href;

		if (typeof(cb) == 'function')
		{
			this.syncFlag = true;
			this.setWait(url);
		}
		else
		{
			this.syncFlag = false;
			this.blockMode = true;
			this.remoteURL = url;
			this.xmlHttp();
		}
	}
	return request;
}

function _XRS_invokeMethod(url, method, args)
{
	var cb, ecb, context;
	var params = new Array;
	var pn = 0;
	var i = 0;
	for (var i=0; i < args.length; i++)
	{
		if (typeof(args[i]) == 'function')
		{
			pn = -1;
			if (typeof(cb) == 'undefined')
				cb = args[i];
			else
				ecb = args[i];
		}
		else if (pn != -1)
		{
			params[pn++] = args[i];
		}
		else
			context = args[i];
	}

	return XRS.startRequest(url, method, params, cb, ecb, context);
}

function _XRS_setWait(url)
{
	this.waitID = window.setTimeout("XRS.waitHandler('" + url + "')",WAITING_PERIOD,"javascript");
}

function _XRS_waitHandler(url)
{
	if (this.XRSProxy.readyState == 0 ||this.XRSProxy.readyState == 4)
	{
		this.blockMode = true;
		this.remoteURL = url;
		this.xmlHttp();
	}
	else
        this.setWait(url);
}

function _XRS_handleResponse(responseData)
{
	var request = this.requestList[this.getRequestID(responseData)];
    if (typeof(request) == 'undefined')
	{
        alert('XRS ERROR:\n¾Ë¼ö ¾ø´Â request idÀÔ´Ï´Ù.');
		return;
	}

	request.data = responseData;
	request.status = XRS_COMPLETED;
	this.evaluateRequest(request);
	if (request.status == XRS_FAIL)
	{
		if (typeof(request.error_callback) == 'function')
			request.error_callback(request);
		else
			alert('XRS Error\n' + request.message);
	}
	else
	{
		if (typeof(request.callback) == 'function')
			request.callback(request);
	}
	this.requestList[request.id] = null;
}

function _XRS_getRequestID(data)
{
	var start_index = 0;
	var end_index = 0;
	var start_key = '<' + 'RID';
	var end_key = '<' + '/RID>';

	if ((start_index = data.indexOf(start_key)) != -1)
	{
		var data_start_index = data.indexOf('>',start_index) + 1;
		end_index = data.indexOf(end_key,data_start_index);
		if (end_index == -1) 
			end_index = data.length;
		return unescape(data.substring(data_start_index,end_index));
	}
	else
		return -1;
}

function _XRS_evaluateRequest(request)
{
	var data = request.data;
	var start_index = 0;
	var end_index = 0;
	var start_key = '<' + 'RETURN_VALUE';
	var end_key = '<' + '/RETURN_VALUE>';

	if ((start_index = data.indexOf(start_key)) != -1)
	{
		var data_start_index = data.indexOf('>',start_index) + 1;
		end_index = data.indexOf(end_key,data_start_index);
		if (end_index == -1) 
			end_index = data.length;
		var metatag = data.substring(start_index,data_start_index);
		if (metatag.indexOf('TYPE=SIMPLE') != -1)
		{
			request.return_value = unescape(data.substring(data_start_index,end_index));
		}
		else if (metatag.indexOf('TYPE=EVAL_OBJECT') != -1)
		{
			request.return_value = data.substring(data_start_index,end_index);
			request.return_value = eval(unescape(request.return_value));
		}
		else if (metatag.indexOf('TYPE=ERROR') != -1)
		{
			request.status = XRS_FAIL;
			request.message = unescape(data.substring(data_start_index,end_index));		
		}
	}
	else
	{
		request.status = XRS_FAIL;
		request.message = 'XRS ERROR:\n ¿äÃ»ÇÑ ¼­¹ö ÆäÀÌÁö´Â XRS¸¦ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù.';			
	}
}

function _XRS__escapePlus(value)
{
	for (var i = 0, newValue = ''; i < value.length; i++)
		newValue += (value.charAt(i) == '+' ? '%2B' : value.charAt(i));
	return newValue;
}

function _XRS_buildURL(rid, url, method, args)
{
	if (url == '') url = window.location.pathname;
	if (typeof(method) == 'string')
	{
		url += '?_id=' + rid;
		url += '&_method=' + method;
		url += '&_mtype=execute';
		var params = '&pcount=0';
		if (typeof(args) != 'undefined' && args.length)
		{
			params = '&pcount=' + args.length 
			for (var i = 0; i < args.length; i++) 
			{
				var arg = args[i];
				params += '&p' + i + '=' + _XRS__escapePlus(escape(arg));
			}
		}
		url += params;
	}
	return url;
}

function StringToArray(psData)
{
	var laUNRow = new Array();

	laUNRow = psData.split("|*|");
	for (i = 0 ; i < laUNRow.length; i++)
		laUNRow[i] = laUNRow[i].split("|+|");

	return laUNRow;
}