﻿//////////////////////////////////////////////////////////////////
// webservice.js
//
// David Yang (prowyh@hotmail.com)
// Levensoft Co., Ltd. (www.levensoft.com)
// Copyright (C) 2007.4.3
//
// Description
// WebService Framework for Client
//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////
// Object declaration
Levensoft.JS.WebServiceFramework = function(utilObject)
{
	this._callID = null;
	this._prevServiceName = null;
	this._registeredHandler = null;
	this._registeredControl = null;
	this._utility = utilObject;
};

//////////////////////////////////////////////////////////////////
// interface definition & implementation
// initialize the proxy
Levensoft.JS.WebServiceFramework.prototype.getCurrentService = function()
{
	return this._prevServiceName;
};

Levensoft.JS.WebServiceFramework.prototype.initialize = function(serviceName)
{
	try
	{
		var wbService = document.getElementById("webservice");
		if (wbService)
		{
			if (wbService.readyState != "complete") return;
			if (this._callID == null || serviceName != this._prevServiceName)
			{
				wbService.useService("http://" + location.hostname + ":" + (location.port == "" ? "80" : location.port) + "/webServices/" + serviceName + ".asmx?WSDL", serviceName);
			}
			this._prevServiceName = serviceName;
		}
	}
	catch (e)
	{
		// exception may be thrown by wbService.useService!
		alert("webservice.initialize: " + e.description);
	}
};

// webservice framework for client entry point
Levensoft.JS.WebServiceFramework.prototype.callService = function(servicename, verb, cparams, vparamlist)
{
	// calling convention
	// callService(callback, serviceName, parameter1[, parameter2...]
	var webservice = document.getElementById("webservice");
	if (webservice)
	{
	    var svc = eval("webservice." + servicename);
		if (!svc) return;
		
	    switch (cparams)
	    {
	        case 0:
	            this._callID = svc.callService(__webServiceCallback, verb);
	            break;
	        case 1:
	            this._callID = svc.callService(__webServiceCallback, verb, vparamlist);
	            break;
	        default:
	            vparamlist = vparamlist.replace(/;/g, "','");
	            vparamlist = vparamlist.replace(/\r\n/g, "");
                this._callID = eval("svc.callService(__webServiceCallback,'" + verb + "','" + vparamlist + "')");
	            break;
	    }
	}
};

Levensoft.JS.WebServiceFramework.prototype.registerHandler = function(pHandler)
{
    this._registeredHandler = new Object();
	this._registeredHandler.action = pHandler;
	if (arguments.length > 1)
	{
	    this._registeredHandler.params = new Array();
	    for (var i = 1; i < arguments.length; i++)
	    {
	        this._registeredHandler.params.push(arguments[i]);
        }
    }
};

Levensoft.JS.WebServiceFramework.prototype.unregisterHandler = function()
{
    if (this._registeredHandler != null)
    {
	    this._registeredHandler.action = null;
	    this._registeredHandler.params = null;
	    this._registeredHandler = null;
    }
};

// control registered by client that is disabled while calling service.
// it must be enabled once called service returned.
Levensoft.JS.WebServiceFramework.prototype.registerControl = function(ctrl)
{
    this.registeredControl = ctrl;
};

Levensoft.JS.WebServiceFramework.prototype.invokeCallback = function()
{
    if (arguments.length == 1)
    {
        this._registeredHandler.action(arguments[0], this._registeredHandler.params);
    }
    else
    {
        this._registeredHandler.action(this._registeredHandler.params);
    }
};

//////////////////////////////////////////////////////////////////
// callback routine
function __webServiceCallback(result)
{
    if (webServiceFramework.registeredControl != null)
    {
        webServiceFramework._utility.enableButton(webServiceFramework.registeredControl);
        webServiceFramework.registeredControl = null;
    }
    
	if (webServiceFramework._callID != result.id) return;

    if (result.error && webServiceFramework._utility.errorMessaging)
    {
        webServiceFramework._utility.errorMessaging(result.errorDetail.string);
        return;
    }

	var objXMLDoc = webServiceFramework._utility.getXmlDocument();
	try
	{
	    var objXMLNode = result.value;
	    objXMLDoc.async = false;
	    objXMLDoc.loadXML(objXMLNode.xml);

        if (objXMLDoc.parseError.errorCode != 0 && webServiceFramework._utility.errorMessaging)
        {
             throw new Error(objXMLDoc.parseError.errorCode, objXMLDoc.parseError.reason);
        }

	    var node = objXMLDoc.firstChild.firstChild;
        var tnode = node.selectSingleNode("StateCode");
        if (tnode.text != "0")
        {
			throw new Error(tnode.text, node.selectSingleNode("StateMessage").text);
		}

        tnode = node.selectSingleNode("ResponseType");
        switch (tnode.text.toLowerCase())
        {
            case "rpc":
                tnode = node.selectSingleNode("StateMessage");
                if (webServiceFramework._utility.errorMessaging && tnode.text != "") webServiceFramework._utility.errorMessaging(tnode.text);
                if (webServiceFramework._registeredHandler != null) webServiceFramework.invokeCallback(tnode);
                break;
            case "document":
				tnode = node.selectSingleNode("StateMessage");
				if (webServiceFramework._utility.closeMessaging) webServiceFramework._utility.closeMessaging();
				if (webServiceFramework._registeredHandler == null)
				{
					var mainArea = document.getElementById("mainArea");
					if (mainArea && tnode.hasChildNodes)
					{
						tnode = tnode.firstChild;
						if (tnode.nodeName == "#cdata-section")
						{
							mainArea.innerHTML = tnode.nodeValue;
						}
						else
						{
							mainArea.innerHTML = tnode.xml;
						}
					}
					
					// initialize Datebox
					var cmdColl = document.getElementsByTagName("INPUT");
					for (var i = 0; i < cmdColl.length; i++)
					{
						if (cmdColl[i].className == "datebox")
						{
							eval("Calendar.setup({inputField:\"" + cmdColl[i].id + "\",ifFormat:\"%Y-%m-%d\",button:\"" + cmdColl[i].getAttribute("cmdbtn") + "\"});");
						}
					}						
				}
				else
				{
					// call customized handler
					webServiceFramework.invokeCallback(tnode);
				}
                break;
        }
	}
	catch (e)
	{
		webServiceFramework.unregisterHandler();
	    if (webServiceFramework._utility.errorMessaging) webServiceFramework._utility.errorMessaging(e.description);
	}
	finally
	{
		objXMLDoc = null;
	}
}


/////////////////////////////////////////////////////////////////
// 
var webServiceFramework = new Levensoft.JS.WebServiceFramework(new Levensoft.JS.Utility());

// clean environment while unloading.........
function __releaseWebServiceFramework()
{
	webServiceFramework._callID = null;
	webServiceFramework._prevServiceName = null;
	webServiceFramework._registeredHandler = null;
	webServiceFramework._utility = null;
	webServiceFramework = null;
}

webServiceFramework._utility.attachUnloadEventHandler(__releaseWebServiceFramework);
