var g_bIsEventServiceFrame = false;

function CreateEventService( EventServiceUrl, UserKey, IsExternal, Mode, Version, BaseEventServiceUrl )
{
    g_bIsEventServiceFrame = true;
    try
    {
	    // Event Service Shim Object
	    if (Mode == "ActiveX")
	    {
            document.write( '<img onload="this.style.display = \'none\';" src="/ClientFormsImages/Common/MessageWindowBg.gif"/><OBJECT id="axEventManager" onreadystatechange="CheckEventServiceCtl(this);" height="0" onerror="OnApplicationLoadError(\'Unable to load the Toreion Client-Side Event System.\');" width="0" style="width:0px;height:0px" classid="ClientEventSystemShim/Toreion.Interop.ClientEventSystem.Shim.dll#Toreion.Interop.ClientEventSystem.Shim.EventManagerCtl"><PARAM NAME="EventServiceUrl" VALUE="' + EventServiceUrl + '"><PARAM NAME="UserKey" VALUE="' + UserKey + '"><PARAM NAME="IsExternal" VALUE="' + IsExternal + '"><script language="javascript">CheckEventServiceCtl(document.getElementById("axEventManager"));</script></OBJECT>' );
            
            var objEventService = null;
    
            if (window.GetEventService != null && window.GetEventService != undefined)
                objEventService = GetEventService();
               
            if (objEventService != null && objEventService != undefined)
            {
                objEventService.Mode = "Loading"
            }
        }
        else
        {
            //document.write('<img onload="this.style.display = \'none\';" src="/ClientFormsImages/Common/MessageWindowBg.gif"/>');

            AddPostInitializePageDelay('EventManager');
            
            if (DetectFlashVer(9, 0, 0))
            {                
                AC_FL_RunContent(
		                                'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
		                                'width', '0',
		                                'height', '0',
		                                'src', '/Flex/EventManager',
		                                'quality', 'high',
		                                'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
		                                'align', 'middle',
		                                'play', 'true',
		                                'loop', 'true',
		                                'scale', 'showall',
		                                'wmode', 'window',
		                                'devicefont', 'false',
		                                'id', 'WorkflowForm.EventManagerCtl',
		                                'bgcolor', '#ffffff',
		                                'name', 'EventManagerCtl',
		                                'menu', 'true',
		                                'allowFullScreen', 'false',
		                                'allowScriptAccess','always',
		                                'movie', '/Flex/EventManager',
		                                'salign', '',
		                                'flashVars', 'EventManagerVersion=' + Version + '&EventServiceUrl=' + EventServiceUrl + '?WSDL',
		                                "onerror", "OnApplicationLoadError(\'Unable to load the Toreion Client-Side Event System.\');"		                                
		                                ); //end AC code
		                                
                var objEventService = null;
    
                if (window.GetEventService != null && window.GetEventService != undefined)
                    objEventService = GetEventService();
                   
                if (objEventService != null && objEventService != undefined)
                {
                    objEventService.Mode = "Loading"
                    objEventService.BaseEventServiceUrl = BaseEventServiceUrl;
                }
            }
            else
            {
                OnApplicationLoad();
                
                var objEventService = null;
    
                if (window.GetEventService != null && window.GetEventService != undefined)
                    objEventService = GetEventService();
                   
                if (objEventService != null && objEventService != undefined)
                {
                    objEventService.SessionGuid = g_EventServiceSessionGuid;
                    objEventService.Mode = "Lite";
                }

                /*if (document.readyState == 'complete' && !g_bPostInitializePage)
                {
                    g_bPostInitializePage = true;
                    
                    PostInitializePage();
                }*/
                SetPostInitializePageDelay('EventManager', true);
            }
        }
    }
    catch(e)
    {
        throw new Error(0, "CreateEventService() - " + e.message);
    }
}

function GetXMLHttpRequest()
{
    try
    {
        var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");

        if(msie > 0)
        {
            var ver = parseInt(ua.substring(msie+5, ua.indexOf(".", msie )));
            
            if (ver < 7)
                return null;
            else
                return new XMLHttpRequest();
        }
        else
        {
            return new XMLHttpRequest();
        }
    }
    catch(e)
    {
        return null;
    }
}

var g_IFrameEventService = null;
var g_IFrameEventServiceRegister = null;

function FlashEventManagerCtlLoaded(strSessionGuid)
{
    document.cookie = "EventManagerMode=Flash;";
    
    OnApplicationLoad();
    
    var objEventService = null;
    
    if (window.GetEventService != null && window.GetEventService != undefined)
        objEventService = GetEventService();
       
    if (objEventService != null && objEventService != undefined)
    {
        objEventService.SessionGuid = strSessionGuid;
        objEventService.Mode = "Flash";
        objEventService.Object = document.getElementsByName("EventManagerCtl")[0];
        objEventService.FlashObject = document.getElementsByName("EventManagerCtl")[0];
    }

    /*if (!g_bPostInitializePage && document.readyState == "complete")
    {
        g_bPostInitializePage = true;
        PostInitializePage();
    }*/
    SetPostInitializePageDelay('EventManager', true);
}

function CheckEventServiceCtl( obj )
{    
    OnApplicationLoad();
    
    var objEventService = null;
    
    try
    {
        if (window.GetEventService != null && window.GetEventService != undefined)
            objEventService = GetEventService();
    }
    catch(e)
    {
        return;
    }

    if( obj == undefined || obj.object == null || obj.object == undefined )
    {
        // Just for now until the light versions of the event system are complete
        //return;
    
        var ua = window.navigator.userAgent;
        var msie = ua.indexOf("MSIE ");

        if(msie > 0)
        {
            var ver = parseInt(ua.substring(msie+5, ua.indexOf(".", msie )));
            if (ver < 7)
                return;
        }
    
        if (objEventService != null && objEventService != undefined)
            objEventService.SessionGuid = g_EventServiceSessionGuid;
    
        // load javascript event service
        g_IFrameEventService = document.getElementById("iframeEventService");
        objEventService.Mode = "IFrame";
        
        if (GetXMLHttpRequest() != null)
            objEventService.SupportsXMLHttpRequest = true;
        else
            objEventService.SupportsXMLHttpRequest = false;

        g_IFrameEventServiceRegister = document.getElementById("iframeEventServiceRegister");
    }
    else
    {
        if (objEventService != null && objEventService != undefined)
        {
            objEventService.SessionGuid = obj.SessionGuid;
            objEventService.Mode = "ActiveX";
            objEventService.Object = obj;
        }
    }
}

function OnEventServiceWindowReadyStateChange()
{
    if (g_IFrameEventService.readyState == "complete")
    {
        MessageWindow(null, "<span style=\"color:#CC0000\">Client Event System Disconnected. Immediate automatic reconnect.</span>", "True", "6000", "0");
        ShowDisabledScreen();
        ReloadEventServiceWindow();
    }
    else if (g_IFrameEventService.readyState == "interactive" && IsScreenDisabled())
    {
        MessageWindow(null, "<span style=\"color:#CC0000\">Client Event System Reconnected.</span>", "True", "6000", "0");
        HideDisabledScreen();
    }
}

var g_bListening = false;

function ReloadEventService(objReqEventService)
{
    window.status = "Done";
    
    if (objReqEventService.readyState == 4 && objReqEventService.status == 200)
    {
        try
        {
            if (navigator.userAgent.indexOf("Firefox")!=-1)
            {
                if (objReqEventService.responseXML != null && objReqEventService.responseXML.documentElement != null && objReqEventService.responseXML.documentElement.textContent != null && objReqEventService.responseXML.documentElement.textContent != "")
                {
                    eval(objReqEventService.responseXML.documentElement.textContent);
                }
            }
            else
            {
                if (objReqEventService.responseXML != null && objReqEventService.responseXML.documentElement != null && objReqEventService.responseXML.documentElement.text != null && objReqEventService.responseXML.documentElement.text != "")
                {
                    eval(objReqEventService.responseXML.documentElement.text);
                }
            }
            
            objReqEventService = null;
        }
        catch(e)
        {
            throw new Error(0, "ReloadEventService() - " + e.message);
        }
            
        if (navigator.userAgent.indexOf("Firefox")!=-1)
        {
            setTimeout(ReloadEventServiceWindow, 3000);
        }
        else
        {
            ReloadEventServiceWindow();
        }
    }
}

function ReloadEventServiceWindow()
{   
    if (g_EventService.Mode == "Ajax")
    {
        var objReqEventService = GetXMLHttpRequest();
          
        objReqEventService.onreadystatechange = function() { ReloadEventService(objReqEventService); };

        if (navigator.userAgent.indexOf("Firefox")!=-1)
            objReqEventService.open("GET", "/EventService2.aspx?NoWait=True&SessionGuid=" + g_EventServiceSessionGuid, true);
        else
            objReqEventService.open("GET", "/EventService2.aspx?SessionGuid=" + g_EventServiceSessionGuid, true);

        objReqEventService.setRequestHeader("Connection", "close");
            
        objReqEventService.send(null);
        window.status = "Done";
    }
    else
    {
        g_IFrameEventService.onreadystatechange = OnEventServiceWindowReadyStateChange;
        g_IFrameEventService.src = "/EventService.aspx?SessionGuid=" + g_EventServiceSessionGuid;
    }
}

function OnApplicationLoad()
{
    try
    {
	    /*if( document.getElementById( "tblLoadingMsg" ) != undefined )
		    document.getElementById( "tblLoadingMsg" ).style.display = "none";
    		
	    document.getElementById( "lblLoadingMsg" ).style.display = "none";
    	
	    document.getElementById( "divApplication" ).style.zIndex = 3;
	    document.getElementById( "divApplication" ).style.top = 4;
	    document.getElementById( "divApplication" ).style.left = 4;
	    document.getElementById( "divApplication" ).style.width = 4;
	    document.getElementById( "divApplication" ).style.height = 4;*/
	}
	catch(e)
	{
	}
	
	bHasClientEventSystem = true;
}

var bErrorThrown = false;

function OnApplicationLoadError( str )
{
	document.getElementById( "tblLoadingMsg" ).style.display = "block";
	
	if( !bErrorThrown )
		document.getElementById( "lblLoadingMsg" ).innerHTML += "<br/>";
		
	document.getElementById( "lblLoadingMsg" ).innerHTML += '<br/><span style="color:red">' + str + '</span>';
	bErrorThrown = true;
}

var g_EventService = null; //GetEventService();

function EventService()
{
    this.Mode = null;
    this.Delegates = new Array(); 
    this.SessionGuid = GenerateGuid();
    this.Object = null;
    this.Properties = new Array();
    this.SupportsXMLHttpRequest = false;
    this.Document = document;
}

EventService.prototype.GetDelegates = function()
{
    if (this.Mode == "ActiveX")
        return this.Object.Delegates;
    else if (this.Mode == "Flash")
        return this.Object.GetDelegates();
    else
        return this.Delegates;
}

EventService.prototype.GetSessionGuid = function()
{
    return this.Object.SessionGuid;
}

EventService.prototype.GetDelegate = function(nIndex)
{
    if (this.Mode == "ActiveX")
        return this.Object.GetDelegate(nIndex);
    else if (this.Mode == "Flash")
        return this.Object.GetDelegate(nIndex);
    else
        return this.Delegates[nIndex];
}

EventService.prototype.Register = function(strViewGuid, strNamespace, strMethodName, arrFilters, strScope, strScopeGuid)
{
    AddFunctionCallLog("EventService.Register");
    if (this.Mode == "Flash")
    {
        this.Object.Register(strViewGuid, "JavaScript." + strNamespace, strMethodName, arrFilters, strScope, strScopeGuid);
    }
    else if (this.Mode == "ActiveX")
    {
        if (arrFilters == undefined)
            arrFilters = new Array();

        var aaFilters = document.axEventManager.GetAutomationArray();
        var aaFilter = null;

        for (var i = 0; i < arrFilters.length; i++)
        {
            aaFilter = document.axEventManager.GetAutomationArray();
            aaFilter.Add(arrFilters[i][0]);
            aaFilter.Add(arrFilters[i][1]);
            aaFilters.Add(aaFilter);
        }

        if (strScopeGuid == undefined)
            strScopeGuid = null;

        this.Object.Register(strViewGuid, strNamespace, strMethodName, aaFilters, strScope, strScopeGuid);
    }
    else
    {
        try
        {
            if (arrFilters == undefined)
                arrFilters = new Array();

            for (var i = 0; i < arrFilters.length; i++)
            {
                arrFilters[i] = new EventDelegateFilter(arrFilters[i][0], arrFilters[i][1]);
            }

            var objEventDelegate = new EventDelegate(strMethodName, strViewGuid, strNamespace, arrFilters, strScope, strScopeGuid)

            var bFilterMatch = true;
            var bFound = false;
            var ed = null;

            for (var i = 0; i < this.Delegates.length; i++)
            {
                if (this.Delegates[i].MethodName == objEventDelegate.MethodName && this.Delegates[i].ViewGuid == objEventDelegate.ViewGuid && this.Delegates[i].Namespace == objEventDelegate.Namespace)
                {
                    if (objEventDelegate.Filters.length != this.Delegates[i].Filters.Length)
                    {
                        bFilterMatch = false;
                        ed = i;
                        break;
                    }
                    else
                    {
                        for (var j = 0; j < objEventDelegate.Filters.length; j++)
                        {
                            for (var k = 0; k < this.Delegates[i].Filters.length; k++)
                            {
                                if (this.Delegates[i].Filters[k].Name == objEventDelegate.Filters[j].Name && this.Delegates[i].Filters[k].Value == objEventDelegate.Filters[j].Value)
                                {
                                    bFilterMatch = false;
                                    ed = i;
                                    break;
                                }
                            }

                            if (!bFilterMatch)
                                break;
                        }
                    }

                    bFound = true;
                    break;
                }
            }

            if (!bFilterMatch)
            {
                g_EventService.Delegates.splice(ed, 1);
            }

            if (!bFound || !bFilterMatch)
            {
                if (strScope == "Local")
                {
                    this.Delegates[this.Delegates.length] = objEventDelegate;
                }
                /*else
                {
                var strXml = "<root>";
                    
                strXml += objEventDelegate.RenderXml();
                    
                if (this.Properties.length > 0)
                {
                strXml += "<EventListenerProperties>";
                        
                for (var i = 0; i < this.Properties.length; i++)
                {
                strXml += this.Properties[i].RenderXml();
                }
                        
                strXml += "</EventListenerProperties>";
                }
                    
                strXml += "</root>";

                    if (this.SupportsXMLHttpRequest)
                {
                var objEventServiceRegister = GetXMLHttpRequest();
                        
                try
                {
                objEventServiceRegister.onreadystatechange = function() { g_EventService.OnRegistered(objEventServiceRegister, objEventDelegate, "Register"); };
                objEventServiceRegister.open("POST", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid, true);
                            
                strXml = "RegisterXml=" + strXml;

                            objEventServiceRegister.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                objEventServiceRegister.setRequestHeader("Content-length", strXml.length);
                objEventServiceRegister.setRequestHeader("Connection", "close");

                            objEventServiceRegister.send(strXml);
                }
                catch(e)
                {
                alert(e.message);
                }
                }
                else
                {
                var iframe = null;
                        
                if( navigator.appName == "Microsoft Internet Explorer" )
                {
                // throws javascript exception if iframe is loaded before parent document isn't complete
                if (document.readyState != "complete")
                {
                setTimeout(
                function()
                {
                iframe = top.document.createElement("<iframe onload=\"g_EventService.OnRegistered(this);\" style=\"display:none;\"></iframe>");
                            	        
                iframe.setAttribute( "Action", "Register" );
                iframe.setAttribute( "id", GenerateGuid() );
                iframe.setAttribute( "RegisterXml", strXml );
                iframe.EventDelegate = objEventDelegate;
                            	 
                document.body.appendChild(iframe);

	                                    iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid );
                }
                , 5000);
                }
                else
                {
                iframe = top.document.createElement("<iframe onload=\"g_EventService.OnRegistered(this);\" style=\"display:none;\"></iframe>");
                            	        
                iframe.setAttribute( "Action", "Register" );
                iframe.setAttribute( "id", GenerateGuid() );
                iframe.setAttribute( "RegisterXml", strXml );
                iframe.EventDelegate = objEventDelegate;
                    	 
                document.body.appendChild(iframe);

                                iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid );
                }
                }
                else
                {	       
                iframe = top.document.createElement("iframe");

                            // Firefox cannot do form submit if it's hidden
                //iframe.setAttribute( "style", "display:none;" );
                            
                iframe.setAttribute( "Action", "Register" );
                iframe.setAttribute( "id", GenerateGuid() );
                iframe.setAttribute( "RegisterXml", strXml );
        	                
                // Firefox doesn't allow us to attach object to DOM nodes
                //iframe.setAttribute("EventDelegate", objEventDelegate);
                var objCallback = function(){g_EventService.OnRegistered(iframe, objEventDelegate);};
                iframe.onload = objCallback;
                	        
                top.document.body.appendChild(iframe);
        	                
                iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid );
                }
                }
                }*/
            }
        }
        catch (e)
        {
            alert(e.message);
        }
    }
    RemoveFunctionCallLog();
}

EventService.prototype.OnRegistered = function(obj, objEventDelegate, strAction)
{
    try
    {
        if (strAction != "ReRegister" && (objEventDelegate == null || objEventDelegate == undefined))
            objEventDelegate = obj.EventDelegate;

        if (this.SupportsXMLHttpRequest)
        {
            if( obj != null && obj.readyState == 4 && obj.status == 200 && objEventDelegate != undefined && objEventDelegate != null )
            {
                if( strAction == "Register" )
                {
                    var nCount = this.Delegates.length;
                    this.Delegates[this.Delegates.length] = objEventDelegate;

                    if( nCount == 0 )
                    {
                        //ReloadEventServiceWindow();
                    }
                }
            }
        }
        else
        {
            var objIFrame = null;
            
            if( navigator.appName == "Microsoft Internet Explorer" )
                objIFrame = top.document.frames( obj.id );
            else
            {
                for( var i = 0; i < top.frames.length; i++ )
                {
                    if( top.frames[i].frameElement.id == obj.id )
                    {
                        objIFrame = top.frames[i];
                        break;
                    }
                }
            }
            
            if (objIFrame == null || objIFrame == undefined || objIFrame.document == null || objIFrame.document == undefined || objIFrame.document.getElementById("RegisterFrameId") == null || objIFrame.document.getElementById("RegisterFrameId") == undefined)
            {
                top.document.body.removeChild(obj);
                return;
            }
            
            var objForm = objIFrame.document.getElementById( "RegisterForm" );

            if( objIFrame.document.getElementById("RegisterFrameId").value == "" || objIFrame.document.getElementById("RegisterFrameId").value == null )
            {
                objIFrame.document.getElementById("RegisterXml").value = obj.getAttribute( "RegisterXml" );
                objIFrame.document.getElementById("RegisterFrameId").value = obj.id;
                    
                objForm.submit();
            }
            else
            {
                top.document.body.removeChild(obj);
                if( objEventDelegate != undefined && objEventDelegate != null )
                {
                    if( obj.getAttribute( "Action" ) == "Register" )
                    {
                        var nCount = this.Delegates.length;
                        this.Delegates[this.Delegates.length] = objEventDelegate;

                        if( nCount == 0 )
                        {
                            //ReloadEventServiceWindow();
                        }
                    }
                }
            }
        }
    }
    catch(e)
    {
        throw new Error(0, "EventService::OnRegistered() - " + e.message);
    }
}

EventService.prototype.Logoff = function()
{
    AddFunctionCallLog("EventService.Logoff");
    if (this.Mode == "ActiveX")
    {
        this.Object.Logoff();
    }
    else if (this.Mode == "Flash")
    {
        /*iframe = document.createElement("<iframe src=\"" + this.BaseEventServiceUrl + "/Logoff?SessionGuid=" + this.SessionGuid.toUpperCase() + "\"></iframe>");
        document.body.appendChild(iframe);*/

        //window.open(this.BaseEventServiceUrl + "/Logoff?SessionGuid=" + this.SessionGuid.toUpperCase());

        try
        {
            this.Object.Logoff();
        }
        catch (e)
        {
            //alert(e.message);
        }
        
        /*var objXMLHttpRequest = GetXMLHttpRequest();
        try
        {
        objXMLHttpRequest.open("GET", this.BaseEventServiceUrl + "/Logoff?SessionGuid=" + g_EventServiceSessionGuid, false);
        objXMLHttpRequest.send(null);
        }
        catch(e)
        {
        //alert(e.message);
        }*/
    }
    /*else if (this.SupportsXMLHttpRequest)
    {
        var objXMLHttpRequest = GetXMLHttpRequest();

        try
        {
            objXMLHttpRequest.open("GET", "/EventServiceAPI.aspx?Action=Logoff&SessionGuid=" + g_EventServiceSessionGuid, false);
            objXMLHttpRequest.send(null);
        }
        catch (e)
        {
            alert(e.message);
        }
    }
    else
    {
        var iframe = null;

        if (navigator.appName == "Microsoft Internet Explorer")
        {
            iframe = top.document.createElement("<iframe onload=\"g_EventService.OnLogoff(this);\" style=\"display:none;\" src=\"/EventServiceAPI.aspx?Action=Logoff&SessionGuid=" + g_EventServiceSessionGuid + "\"></iframe>");

            iframe.setAttribute("id", GenerateGuid());

            document.body.appendChild(iframe);
        }
        else
        {
            iframe = top.document.createElement("iframe");

            iframe.setAttribute("onload", "g_EventService.OnLogoff(this);");

            top.document.body.appendChild(iframe);

            iframe.setAttribute("src", "/EventServiceAPI.aspx?Action=Logoff&SessionGuid=" + g_EventServiceSessionGuid);
        }
    }*/

    RemoveFunctionCallLog();
}

EventService.prototype.OnLogoff = function(obj)
{
    /*if (!this.SupportsXMLHttpRequest)
    {
        top.document.body.removeChild(obj);
    }*/
}

EventService.prototype.AddListenerProperty = function(strKey, strValue)
{
    AddFunctionCallLog("EventService.AddListenerProperty");
    if (this.Mode == "ActiveX" || this.Mode == "Flash")
    {
        this.Object.AddListenerProperty(strKey, strValue);
    }
    else if (this.SupportsXMLHttpRequest)
    {
        /*var objXMLHttpRequest = GetXMLHttpRequest();
                
        try
        {
            objXMLHttpRequest.open("GET", "/EventServiceAPI.aspx?Action=AddListenerProperty&SessionGuid=" + g_EventServiceSessionGuid + "&Key=" + escape(strKey) + "&Value=" + escape(strValue), true);
            objXMLHttpRequest.onreadystatechange = function() { g_EventService.OnAddListenerProperty(null); };

            objXMLHttpRequest.send(null);
        }
        catch(e)
        {
            alert("AddListenerProperty - " + e.message);
        }*/
    }
    else
    {
        /*var objEventListenerProperty = null;
        
        for (var i = 0; i < this.Properties.length; i++)
        {
            if (this.Properties[i].Key == strKey)
            {
                objEventListenerProperty = this.Properties[i];
                objEventListenerProperty.Value = strValue;
                break;
            }
        }
        
        if (objEventListenerProperty == null)
        {
            objEventListenerProperty = new EventListenerProperty(strKey, strValue);
            this.Properties[this.Properties.length] = objEventListenerProperty;
        }*/
    
        /*
        var iframe = null;
            
        if( navigator.appName == "Microsoft Internet Explorer" )
        {
            iframe = top.document.createElement("<iframe onload=\"g_EventService.OnAddListenerProperty(this);\" style=\"display:none;\" src=\"/EventServiceAPI.aspx?Action=AddListenerProperty&SessionGuid=" + g_EventServiceSessionGuid + "&Key=" + escape(strKey) + "&Value=" + escape(strValue) + "\"></iframe>");
        	        
            iframe.setAttribute( "id", GenerateGuid() );
	 
            document.body.appendChild(iframe);
        }
        else
        {	       
            iframe = top.document.createElement("iframe");

            iframe.setAttribute( "onload", "g_EventService.OnAddListenerProperty(this);" );
	        
            top.document.body.appendChild(iframe);
	        
            iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=AddListenerProperty&SessionGuid=" + g_EventServiceSessionGuid + "&Key=" + escape(strKey) + "&Value=" + escape(strValue) );
        }
        */
    }

    RemoveFunctionCallLog();
}

EventService.prototype.Pause = function() 
{
    AddFunctionCallLog("EventService.Pause");
    if (this.Mode == "Flash") {
        try{
            this.Object.Pause();
        }
        catch (e) {
        }
    }
}

EventService.prototype.Resume = function()
{
    AddFunctionCallLog("EventService.Resume");
    if (this.Mode == "Flash") 
    {
        try{
            this.Object.Resume();
        }
        catch(e){
        }
    }
}

EventService.prototype.OnAddListenerProperty = function(obj)
{   
    /*if (!this.SupportsXMLHttpRequest)
    {
        top.document.body.removeChild(obj);
    }*/
}

EventService.prototype.FireEvent = function(strTarget, strEventName, arrParameters, strScopeGuid) {
    AddFunctionCallLog("EventService.FireEvent");
    try {
        if (this.Mode == "ActiveX") {
            var objArrParameterName = this.Object.GetAutomationArray();
            var objArrParameterValue = this.Object.GetAutomationArray();

            for (var i = 0; i < arrParameters.length; i++) {
                objArrParameterName.Add(arrParameters[i][0]);
                objArrParameterValue.Add(arrParameters[i][1]);
            }

            this.Object.FireEvent(strTarget, strEventName, objArrParameterName, objArrParameterValue, strScopeGuid);
        }
        else {
            
            if (strTarget == "Local") {
                var objEvent = new Event("False", strEventName, "", "");

                objEvent.ScopeGuid = strScopeGuid;

                for (var i = 0; i < arrParameters.length; i++) {
                    if (typeof (arrParameters[i][1]) == "string")
                        objEvent.AddParameter(new EventParameter(arrParameters[i][0], new AutomationArray(new Array(arrParameters[i][1]))));
                    else
                        objEvent.AddParameter(new EventParameter(arrParameters[i][0], new AutomationArray(arrParameters[i][1])));
                }

                this.ExecuteEvent(objEvent);
            }
        }
    }
    catch (e) {
        throw new Error(0, "EventService::FireEvent(EventName:'" + strEventName + "') - " + e.message);
    }

    RemoveFunctionCallLog();
}

EventService.prototype.ReRegister = function()
{
    AddFunctionCallLog("EventService.ReRegister");
    try
    {
        if( this.Delegates.length > 0 )
        {
            var strXml = "<root>";
            
            for( var i = 0; i < this.Delegates.length; i++ )
            {
                if (this.Delegates[i].Scope != "Local")
                    strXml += this.Delegates[i].RenderXml();
            }
            
            if (this.Properties.length > 0)
            {
                strXml += "<EventListenerProperties>";
                
                for (var i = 0; i < this.Properties.length; i++)
                {
                    strXml += this.Properties[i].RenderXml();
                }
                
                strXml += "</EventListenerProperties>";
            }
            
            strXml += "</root>";
            
            if (this.Mode == "Ajax")
            {
                alert("EventService.prototype.ReRegister is currently not implemented for Event Service of mode " + this.Mode);
            }
            else if (this.Mode == "IFrame")
            {
                if (this.SupportsXMLHttpRequest)
                {
                    var objEventServiceRegister = GetXMLHttpRequest();
                    
                    objEventServiceRegister.open("POST", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid, true);
                    
                    strXml = "RegisterXml=" + strXml;

                    objEventServiceRegister.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    objEventServiceRegister.setRequestHeader("Content-length", strXml.length);
                    objEventServiceRegister.setRequestHeader("Connection", "close");

                    objEventServiceRegister.send(strXml);
                }
                else
                {    
                    var iframe = null;
                    
                    if( navigator.appName == "Microsoft Internet Explorer" )
                    {   
                        iframe = top.document.createElement("<iframe onload=\"g_EventService.OnRegistered(this);\" style=\"display:none;\"></iframe>");
                        	        
                        iframe.setAttribute( "Action", "ReRegister" );
                        iframe.setAttribute( "id", GenerateGuid() );
                        iframe.setAttribute( "RegisterXml", strXml );
            	 
                        document.body.appendChild(iframe);

                        iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid );
                    }
                    else
                    {
                        iframe = top.document.createElement("iframe");

                        // Firefox cannot do form submit if it's hidden
                        //iframe.setAttribute( "style", "display:none;" );
                        
                        iframe.setAttribute( "Action", "ReRegister" );
                        iframe.setAttribute( "id", GenerateGuid() );
                        iframe.setAttribute( "RegisterXml", strXml );
    	                
                        // Firefox doesn't allow us to attach object to DOM nodes
                        //iframe.setAttribute("EventDelegate", objEventDelegate);
                        var objCallback = function(){g_EventService.OnRegistered(iframe, objEventDelegate);};
                        iframe.onload = objCallback;
            	        
                        top.document.body.appendChild(iframe);
    	                
                        iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=Register&SessionGuid=" + g_EventServiceSessionGuid );
                    }
                }
            }
        }
    }
    catch(e)
    {
        throw new Error(0, "EventService::ReRegister() - " + e.message);
    }

    RemoveFunctionCallLog();
}

EventService.prototype.Unregister = function(strViewID, strDOMLocation, strJSDelegate)
{
    AddFunctionCallLog("EventService.Unregister");
    try
    {
        if (this.Mode == "Flash")
        {
            setTimeout("try{GetEventService().Object.Unregister('" + strViewID + "', '" + strDOMLocation + "', '" + strJSDelegate + "');}catch(e){}", 1);
            //this.Object.Unregister(strViewID, strDOMLocation, strJSDelegate);
        }
        else if (this.Mode == "ActiveX")
        {
            this.Object.Unregister(strViewID, strDOMLocation, strJSDelegate);
        }
        else
        {
            var objEventDelegate = null;
            strDOMLocation = strDOMLocation.replace(/JavaScript./g, "");

            for (var i = 0; i < this.Delegates.length; i++)
            {
                if (this.Delegates[i].MethodName == strJSDelegate && this.Delegates[i].ViewGuid == strViewID && this.Delegates[i].Namespace == strDOMLocation)
                {
                    objEventDelegate = this.Delegates[i];
                    this.Delegates.splice(i, 1);
                    break;
                }
            }

            /*
            if (objEventDelegate != null && objEventDelegate.Scope != "Local")
            {
            objEventDelegate.Filters = new Array();
                
            var strXml = "<root>";
            strXml += objEventDelegate.RenderXml();
            strXml += "</root>";

                if (this.SupportsXMLHttpRequest)
            {
            var objXMLHttpRequest = GetXMLHttpRequest();
                    
            try
            {
            objXMLHttpRequest.onreadystatechange = function() { g_EventService.OnUnregistered(objXMLHttpRequest, objEventDelegate, "Unregister"); };
            objXMLHttpRequest.open("POST", "/EventServiceAPI.aspx?Action=Unregister&SessionGuid=" + g_EventServiceSessionGuid, true);
                        
            strXml = "UnregisterXml=" + strXml;

                        objXMLHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            objXMLHttpRequest.setRequestHeader("Content-length", strXml.length);
            objXMLHttpRequest.setRequestHeader("Connection", "close");

                        objXMLHttpRequest.send(strXml);
            }
            catch(e)
            {
            alert(e.message);
            }
            }
            else
            {
            var iframe = null;
                    
            if( navigator.appName == "Microsoft Internet Explorer" )
            {
            iframe = top.document.createElement("<iframe onload=\"g_EventService.OnUnregistered(this);\" style=\"display:none;\" src=\"/EventServiceAPI.aspx?Action=Unregister&SessionGuid=" + g_EventServiceSessionGuid + "\"></iframe>");
                    	        
            iframe.setAttribute( "Action", "Unregister" );
            iframe.EventDelegate = objEventDelegate;
            iframe.setAttribute( "id", GenerateGuid() );
            iframe.setAttribute( "UnregisterXml", strXml );
            	 
            document.body.appendChild(iframe);
            }
            else
            {	       
            iframe = top.document.createElement("iframe");

                        var objCallback = function(){g_EventService.OnUnregistered(iframe, objEventDelegate);};
            iframe.onload = objCallback;
            	        
            top.document.body.appendChild(iframe);
            	        
            iframe.setAttribute( "Action", "Unregister" );
            iframe.setAttribute( "id", GenerateGuid() );
            iframe.setAttribute( "UnregisterXml", strXml );
                        
            iframe.setAttribute( "src", "/EventServiceAPI.aspx?Action=Unregister&SessionGuid=" + g_EventServiceSessionGuid );
            }
            }
            }
            */
        }
    }
    catch (e)
    {
        throw new Error(0, "EventService::Unregister() - " + e.message);
    }

    RemoveFunctionCallLog();
}

EventService.prototype.OnUnregistered = function(obj, objEventDelegate, strAction)
{
    if (objEventDelegate == null || objEventDelegate == undefined)
        objEventDelegate = obj.EventDelegate;
        
    if (this.SupportsXMLHttpRequest)
    {
        if( objEventDelegate != undefined )
        {
            if( strAction == "Unregister" )
            {
                for (var i = 0; i < this.Delegates.length; i++)
                {
                    if (this.Delegates[i].Guid ==  objEventDelegate.Guid)
                    {
                        this.Delegates.splice(i,1);
                        break;
                    }
                }
            }
        }
    }
    else
    {
        var objIFrame = null;
        
        if( navigator.appName == "Microsoft Internet Explorer" )
            objIFrame = top.document.frames( obj.id );
        else
        {
            for( var i = 0; i < top.frames.length; i++ )
            {
                if( top.frames[i].frameElement.id == obj.id )
                {
                    objIFrame = top.frames[i];
                    break;
                }
            }
        }
        
        if (objIFrame == null || objIFrame == undefined || objIFrame.document == null || objIFrame.document == undefined || objIFrame.document.getElementById("UnregisterFrameId") == null || objIFrame.document.getElementById("UnregisterFrameId") == undefined)
        {
            top.document.body.removeChild(obj);
            return;
        }
        
        var objForm = objIFrame.document.getElementById( "RegisterForm" );

        if( objIFrame.document.getElementById("UnregisterFrameId").value == "" )
        {
            objIFrame.document.getElementById("UnregisterXml").value = obj.getAttribute( "UnregisterXml" );
            objIFrame.document.getElementById("UnregisterFrameId").value = obj.id;
            objForm.submit();
        }
        else
        {
            top.document.body.removeChild(obj);
         
            if( objEventDelegate != undefined )
            {
                if( obj.getAttribute( "Action" ) == "Unregister" )
                {
                    for (var i = 0; i < this.Delegates.length; i++)
                    {
                        if (this.Delegates[i].Guid ==  objEventDelegate.Guid)
                        {
                            this.Delegates.splice(i,1);
                            break;
                        }
                    }
                }
            }
        }
    }
}

EventService.prototype.ParseXml = function(objEventsXmlNode, strScopeGuid)
{
    AddFunctionCallLog("EventService.ParseXml");
    try
    {
        if (this.Mode == "ActiveX" || this.Mode == "Flash")
        {
            for (var nIndex = 0; nIndex < objEventsXmlNode.length; nIndex++)
            {
                if (navigator.appName == "Microsoft Internet Explorer")
                {
                    this.Object.ParseXml(objEventsXmlNode[nIndex].xml, strScopeGuid);
                }
                else
                {
                    var s = new XMLSerializer();
                    this.Object.ParseXml(s.serializeToString(objEventsXmlNode[nIndex]), strScopeGuid);
                }
            }
        }
        else
        {
            for (var nIndex = 0; nIndex < objEventsXmlNode.length; nIndex++)
            {
                objEventsXmlNode = objEventsXmlNode[nIndex].getElementsByTagName("Event");

                var objEvent = null;
                var objEventService = GetEventService();
                var objParameters = null;
                var objParameterDataItems = null;
                var objParameterDataItemsArray = null;

                for (var i = 0; i < objEventsXmlNode.length; i++)
                {
                    objEvent = new Event(objEventsXmlNode[0].getAttribute("System"), objEventsXmlNode[0].getAttribute("MethodName"), objEventsXmlNode[0].getAttribute("ViewGuid"), objEventsXmlNode[0].getAttribute("Namespace"));
                    objEvent.ScopeGuid = strScopeGuid;

                    objParameters = objEventsXmlNode[0].getElementsByTagName("Parameter");

                    if (objParameters != null && objParameters.length > 0)
                    {
                        for (var j = 0; j < objParameters.length; j++)
                        {
                            objParameterDataItems = objParameters[j].getElementsByTagName("DataItem");

                            if (objParameterDataItems != null && objParameterDataItems.length > 0)
                            {
                                objParameterDataItemsArray = new AutomationArray();

                                for (var k = 0; k < objParameterDataItems.length; k++)
                                {
                                    /*if (navigator.userAgent.indexOf("Firefox") != -1)
                                    objParameterDataItemsArray.SetItem(objParameterDataItems[k].textContent);
                                    else
                                    objParameterDataItemsArray.SetItem(objParameterDataItems[k].text);*/
                                    if (navigator.appName == "Microsoft Internet Explorer")
                                        objParameterDataItemsArray.SetItem(objParameterDataItems[k].text);
                                    else
                                        objParameterDataItemsArray.SetItem(objParameterDataItems[k].textContent);
                                }

                                objEvent.AddParameter(new EventParameter(objParameters[j].getAttribute("Name"), objParameterDataItemsArray));
                            }
                            else
                                objEvent.AddParameter(new EventParameter(objParameters[j].getAttribute("Name"), new top.AutomationArray()));
                        }
                    }

                    this.ExecuteEvent(objEvent);
                }
            }
        }
    }
    catch (e)
    {
        throw new Error(0, "EventService::ParseXml()::" + e.message);
    }

    RemoveFunctionCallLog();
}

EventService.prototype.ExecuteEvent = function(objEvent) {

    AddFunctionCallLog("EventService.ExecuteEvent");
    try {
        if (objEvent.System == "True" && objEvent.MethodName == "ReRegister") {
            this.ReRegister();
        }
        else {
            var objWin = null;

            if (objEvent.Namespace == null || objEvent.Namespace == "") {
                var objDelegates = this.GetDelegates();
                var objDelegate = null;

                for (var i = 0; i < objDelegates.length; i++) {
                    objDelegate = this.GetDelegate(i);
                    
                    if (objDelegate != null && objDelegate.MethodName == objEvent.MethodName && (objDelegate.ScopeGuid == objEvent.ScopeGuid || objEvent.ScopeGuid == null || objEvent.ScopeGuid == "")) {
                        var bNamespaceExists = false;
                        var bSinkExists = false;

                        // make sure that the DOM Location still exists
                        try {
                            objWin = EvalPath(objDelegate.Namespace.replace(/JavaScript./g, ""));

                            eval("objWin.title;");
                            bNamespaceExists = true;

                            eval("if(objWin." + objDelegate.MethodName + " != undefined && objWin." + objDelegate.MethodName + " != null){bSinkExists = true;}");
                        }
                        catch (e) {
                            //alert(e.message);
                        }

                        if (bNamespaceExists && bSinkExists)
                            eval("try{ objWin." + objDelegate.MethodName + "( objEvent ); }catch(e){throw new Error(0, \"eval()::" + objDelegate.MethodName + "()::\" + e.message );}");
                        else
                            this.Unregister(objDelegate.ViewGuid, objDelegate.Namespace, objDelegate.MethodName);
                    }
                }
            }
            else {
                var bNamespaceExists = false;
                var bSinkExists = false;

                // make sure that the DOM Location still exists
                try {
                    objWin = EvalPath(objEvent.Namespace.replace(/JavaScript./g, ""));

                    eval("objWin.title;");
                    bNamespaceExists = true;

                    eval("if(objWin." + objEvent.MethodName + " != undefined && objWin." + objEvent.MethodName + " != null){bSinkExists = true;}");
                }
                catch (e) {
                    //alert(e.message);
                }

                if (bNamespaceExists && bSinkExists)
                    eval("try{ objWin." + objEvent.MethodName + "( objEvent ); }catch(e){throw new Error(0, \"eval()::" + objEvent.MethodName + "()::\" + e.message );}");
                else
                    this.Unregister(objEvent.ViewGuid, objEvent.Namespace, objEvent.MethodName);
            }
        }
    }
    catch (e) {
        throw new Error(0, "EventService::ExecuteEvent()::" + e.message);
    }

    RemoveFunctionCallLog();
}

EventService.prototype.Reload = function()
{
    ReloadEventServiceWindow();
}

EventService.prototype.ExecuteTrigger = function(strWorkflowModuleGuid, arrPins)
{
    AddFunctionCallLog("EventService.ExecuteTrigger");
    if (this.Mode == "Flash")
    {
        try
        {
            var str = "<Parameters>";

            if (arrPins != null && arrPins != undefined)
            {
                for (var i = 0; i < arrPins.length; i++)
                {
                    str += "<Parameter Name=\"" + arrPins[i][0] + "\">";

                    if (arrPins[i].length > 1)
                    {
                        if (typeof (arrPins[i][1]) == "string")
                        {
                            str += "<DataItem>" + arrPins[i][1] + "</DataItem>";
                        }
                        else
                        {
                            for (var j = 0; j < arrPins[i][1].length; j++)
                                str += "<DataItem>" + arrPins[i][1][j] + "</DataItem>";
                        }
                    }

                    str += "</Parameter>";
                }
            }

            str += "</Parameters>";

            this.Object.ExecuteTrigger(strWorkflowModuleGuid, str);
        }
        catch (e)
        {
            throw new Error(0, "EventService::ExecuteTrigger()::" + e.message);
        }
    }
    RemoveFunctionCallLog();
}

function EventDelegate( strMethodName, strViewGuid, strNamespace, arrFilters, strScope, strScopeGuid )
{
    this.Guid = GenerateGuid();

    this.MethodName = strMethodName;
    this.ViewGuid = strViewGuid;
    this.Namespace = strNamespace;
    this.ScopeGuid = strScopeGuid;
    this.Filters = arrFilters;
    this.Scope = strScope;
}

EventDelegate.prototype.RenderXml = function()
{
    var strXml = "<EventDelegate>";
    
    strXml += "<MethodName><![CDATA[" + this.MethodName + "]]></MethodName>";
    strXml += "<ViewGuid><![CDATA[" + this.ViewGuid + "]]></ViewGuid>";
    strXml += "<Namespace><![CDATA[" + this.Namespace + "]]></Namespace>";
    
    if( this.Filters.length > 0 )
    {
        strXml += "<Filters>";
        
        for( var i = 0; i < this.Filters.length; i++ )
        {
            strXml += "<Filter>";
            
            strXml += "<Name><![CDATA[" + this.Filters[i].Name + "]]></Name>";
            strXml += "<Value><![CDATA[" + this.Filters[i].Value + "]]></Value>";
            
            strXml += "</Filter>";
        }
        
        strXml += "</Filters>";
    }
    
    strXml += "</EventDelegate>";
    
    return strXml;
}

EventDelegate.prototype.AddFilter = function( strName, strValue )
{
}

function EventDelegateFilter( strName, strValue )
{
    this.Name = strName;
    this.Value = strValue;
}

function EventListenerProperty(strKey, strValue)
{
    this.Key = strKey;
    this.Value = strValue;
}

EventListenerProperty.prototype.RenderXml = function()
{
    var strXml = "<EventListenerProperty>";
    
    strXml += "<Key><![CDATA[" + this.Key + "]]></Key>";
    strXml += "<Value><![CDATA[" + this.Value + "]]></Value>";
    
    strXml += "</EventListenerProperty>";
    
    return strXml;
}

function Event( strSystem, strMethodName, strViewGuid, strNamespace )
{
    this.System = strSystem;
    this.MethodName = strMethodName;
    this.ViewGuid = strViewGuid;
    this.Namespace = strNamespace;
    
    this.Parameters = new Array();
    this.Mode = "JavaScript";
}

Event.prototype.toString = function()
{
    return "Event";
}

Event.prototype.RemoveJSString = function(str)
{
    if (str != null && typeof(str) == "string")
    {
        str = str.replace(/\\\\/g, "\\");
        str = str.replace(/\\'/g, "'");
    }

    return str;
}

Event.prototype.SetObject = function(objEvent, strMode)
{
    this.Object = objEvent;
    this.Mode = strMode;

    if (this.Mode == "Flash")
    {
        this.System = this.Object.System;
        this.MethodName = this.Object.MethodName;
        this.ViewGuid = this.Object.ViewGuid;
        this.Namespace = this.Object.Namespace.substr(11);
        this.Parameters = new Array();

        var arrParameterValues = null;
        var obj = null;

        for (var strKey in this.Object.Parameters)
        {
            obj = this.Object.Parameters[strKey];

            strKey = strKey.replace(/___32___/g, " ");
            strKey = strKey.replace(/___33___/g, "!");
            strKey = strKey.replace(/___34___/g, "\"");
            strKey = strKey.replace(/___35___/g, "#");
            strKey = strKey.replace(/___36___/g, "$");
            strKey = strKey.replace(/___37___/g, "%");
            strKey = strKey.replace(/___38___/g, "&");
            strKey = strKey.replace(/___39___/g, "'");
            strKey = strKey.replace(/___40___/g, "(");
            strKey = strKey.replace(/___41___/g, ")");
            strKey = strKey.replace(/___42___/g, "*");
            strKey = strKey.replace(/___43___/g, "+");
            strKey = strKey.replace(/___44___/g, ",");
            strKey = strKey.replace(/___45___/g, "-");
            strKey = strKey.replace(/___46___/g, ".");
            strKey = strKey.replace(/___47___/g, "/");
            strKey = strKey.replace(/___58___/g, ":");
            strKey = strKey.replace(/___59___/g, ";");
            strKey = strKey.replace(/___60___/g, "<");
            strKey = strKey.replace(/___61___/g, "=");
            strKey = strKey.replace(/___62___/g, ">");
            strKey = strKey.replace(/___63___/g, "?");
            strKey = strKey.replace(/___64___/g, "@");
            strKey = strKey.replace(/___91___/g, "[");
            strKey = strKey.replace(/___92___/g, "\\");
            strKey = strKey.replace(/___93___/g, "]");
            strKey = strKey.replace(/___94___/g, "^");
            strKey = strKey.replace(/___96___/g, "`");
            strKey = strKey.replace(/___123___/g, "{");
            strKey = strKey.replace(/___124___/g, "|");
            strKey = strKey.replace(/___125___/g, "}");
            strKey = strKey.replace(/___126___/g, "~");

            if (typeof (obj) == "object")
            {
                arrParameterValues = new AutomationArray();

                for (var strKey2 in obj)
                {
                    if (strKey2 != "uid" && typeof (obj[strKey2]) == "string")
                    {
                        arrParameterValues.SetItem(this.RemoveJSString(obj[strKey2]));
                    }
                    else
                    {
                        for (var strKey3 in obj[strKey2])
                        {
                            if (strKey3 == "source")
                            {
                                if (typeof (obj[strKey2][strKey3]) == "string")
                                {

                                    arrParameterValues.SetItem(this.RemoveJSString(obj[strKey2][strKey3]));
                                }
                                else
                                {
                                    for (var i = 0; i < obj[strKey2][strKey3].length; i++)
                                    {
                                        arrParameterValues.SetItem(this.RemoveJSString(obj[strKey2][strKey3][i]));
                                    }
                                }
                            }
                        }


                    }
                }

                if (arrParameterValues.length == 0)
                    arrParameterValues.SetItem("");
                    
                this.Parameters[this.Parameters.length] = new EventParameter(strKey, arrParameterValues);
            }
            else
            {
                this.Parameters[this.Parameters.length] = new EventParameter(strKey, new AutomationArray(new Array(this.RemoveJSString(new String(obj)))));
            }
        }
    }
}

Event.prototype.AddParameter = function( objEventParameter )
{
    this.Parameters[this.Parameters.length] = objEventParameter;
}

Event.prototype.GetParameter = function( strName ) {
    try
    {
        for( var i = 0; i < this.Parameters.length; i++ )
        {
            if( this.Parameters[i].Name == strName )
            {
                return this.Parameters[i].Values.GetValue(0);
            }
        }
    }
    catch (e) {
        throw new Error(0, "Event.prototype.GetParameter() - " + e.message);
    }
    return null;
}

Event.prototype.GetParameterArray = function( strName ) 
{
    try
    {
        for( var i = 0; i < this.Parameters.length; i++ )
        {
            if( this.Parameters[i].Name == strName )
            {
                return this.Parameters[i].Values;
            }
        }
    }
    catch (e) {
        throw new Error(0, "Event.prototype.GetParameterArray() - " + e.message);
    }
    return new AutomationArray();
}

Event.prototype.SetParameterArray = function( strName, objArrValues )
{
    var bFound = false;
    
    for( var i = 0; i < this.Parameters.length; i++ )
    {
        if( this.Parameters[i].Name == strName )
        {
            this.Parameters[i].Values = objArrValues;
            bFound = true;
            break;
        }
    }
    
    if (!bFound)
    {
        this.Parameters[this.Parameters.length] = new EventParameter(strName, objArrValues);
    }
}

Event.prototype.IsArray = function(strName) 
{
    try
    {
        for( var i = 0; i < this.Parameters.length; i++ )
        {
            if( this.Parameters[i].Name == strName )
            {
                if( this.Parameters[i].Values.length > 1 )
                    return true;
                else
                    return false;
                break;
            }
        }
    }
    catch (e) {
        throw new Error(0, "Event.prototype.IsArray() - " + e.message);
    }
    return false;
}

Event.prototype.RenderViewVariables = function( str )
{
	return RenderViewVariablesByIndex(str, 0);
}

Event.prototype.RenderViewVariablesByIndex = function(str, nIndex)
{
    /*if (this.Mode == "Flash")
    {
    var objEventService = GetEventService();
    //return objEventService.Object.RenderViewVariablesByIndex(str, nIndex, this.Parameters);
    return objEventService.Object.RenderViewVariablesByIndex(str, nIndex, null, this.Object.ParametersXml);
    //return str;
    }
    else
    {*/
    var strReturnValue = "";
    try
    {
        var bIsInFormatting = false;
        var nLeft = -1;
        var strNewValue = "";
        var nLeftFormatting = -1;
        var nRight = -1;
        var aa = null;
        var bIsInHtmlTag = false;
        var bIsInHtmlTagAttributeEqual = false;
        var bIsInHtmlTagAttributeSingleQuotes = false;
        var bIsInHtmlTagAttributeDoubleQuotes = false;
        var strFormatting = "";

        if (str != null && str.indexOf("@") > -1)
        {
            for (var i = 0; i < str.length; i++)
            {
                if (str.charAt(i) == '<')
                    bIsInHtmlTag = true;
                else if (str.charAt(i) == '>')
                    bIsInHtmlTag = false;
                else if (str.charAt(i) == '=' && bIsInHtmlTag && !bIsInHtmlTagAttributeEqual && !bIsInHtmlTagAttributeDoubleQuotes && !bIsInHtmlTagAttributeSingleQuotes)
                    bIsInHtmlTagAttributeEqual = true;
                else if (str.charAt(i) == ' ' && bIsInHtmlTag && bIsInHtmlTagAttributeEqual && !bIsInHtmlTagAttributeDoubleQuotes && !bIsInHtmlTagAttributeSingleQuotes)
                    bIsInHtmlTagAttributeEqual = false;
                else if (str.charAt(i) == '\'' && bIsInHtmlTag && bIsInHtmlTagAttributeEqual && !bIsInHtmlTagAttributeSingleQuotes)
                    bIsInHtmlTagAttributeSingleQuotes = true;
                else if (str.charAt(i) == '\'' && bIsInHtmlTag && bIsInHtmlTagAttributeEqual && bIsInHtmlTagAttributeSingleQuotes)
                {
                    bIsInHtmlTagAttributeSingleQuotes = false;

                    if (!bIsInHtmlTagAttributeDoubleQuotes)
                        bIsInHtmlTagAttributeEqual = false;
                }
                else if (str.charAt(i) == '"' && bIsInHtmlTag && bIsInHtmlTagAttributeEqual && !bIsInHtmlTagAttributeDoubleQuotes)
                    bIsInHtmlTagAttributeDoubleQuotes = true;
                else if (str.charAt(i) == '"' && bIsInHtmlTag && bIsInHtmlTagAttributeEqual && bIsInHtmlTagAttributeDoubleQuotes)
                {
                    bIsInHtmlTagAttributeDoubleQuotes = false;

                    if (!bIsInHtmlTagAttributeSingleQuotes)
                        bIsInHtmlTagAttributeEqual = false;
                }

                if (nLeft > -1 && str.charAt(i) == '{')
                {
                    nLeftFormatting = i;
                    strFormatting = "";
                    bIsInFormatting = true;
                }
                else if (nLeft > -1 && bIsInFormatting && str.charAt(i) == '}')
                {
                    //nLeftFormatting = -1;
                    bIsInFormatting = false;
                }
                else if (nLeft > -1 && bIsInFormatting)
                {
                    strFormatting += str.charAt(i);
                }

                if (str.charAt(i) == '@')
                {
                    if (nLeft == -1)
                    {
                        nLeft = i;
                    }
                    else if (nLeft + 1 == i)
                    {
                        strNewValue += "@@";
                        nLeft = -1;
                    }
                    else
                    {
                        if (bIsInFormatting)
                        {
                            if (nLeftFormatting == -1)
                                nLeftFormatting = i;
                        }
                        else
                        {
                            strReturnValue += strNewValue;


                            if (nLeftFormatting == -1)
                                nLeftFormatting = i;

                            if ((aa = this.GetParameterArray(str.substring(nLeft + 1, nLeftFormatting))) != null)
                            {
                                if (aa.Length > nIndex)
                                {
                                    //sb.Append(ApplyViewVariableFormatting(Convert.ToString(aa[idx]), strFormatting));

                                    strNewValue = aa.GetValue(nIndex);
                                    
                                    if (strFormatting.indexOf(":C") == 0)
                                    {
                                        if (strFormatting.length > 2 && strFormatting.indexOf(":", 2) == 2)
                                        {
                                            if (strFormatting.indexOf(":", 3) > -1)
                                                strNewValue = "$" + parseFloat(strNewValue).toFixed(this.RenderViewVariablesByIndex(strFormatting.substring(3, strFormatting.indexOf(":", 3)), nIndex));
                                            else
                                                strNewValue = "$" + parseFloat(strNewValue).toFixed(this.RenderViewVariablesByIndex(strFormatting.substring(3), nIndex));
                                        }
                                        else
                                            strNewValue = "$" + parseFloat(strNewValue).toFixed(2);
                                    }

                                    if (bIsInHtmlTagAttributeEqual)
                                    {
                                        if (!bIsInHtmlTagAttributeDoubleQuotes && !bIsInHtmlTagAttributeSingleQuotes)
                                            strReturnValue += "\"";

                                        if (bIsInHtmlTagAttributeSingleQuotes)
                                            strReturnValue += strNewValue.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, "&quot;");
                                        else
                                            strReturnValue += strNewValue.replace(/"/g, "&quot;");

                                        if (!bIsInHtmlTagAttributeDoubleQuotes && !bIsInHtmlTagAttributeSingleQuotes)
                                            strReturnValue += "\"";
                                    }
                                    else
                                        strReturnValue += strNewValue;
                                }
                            }

                            nLeft = -1;
                            nRight = i + 1;
                            strNewValue = "";
                            strFormatting = "";
                            nLeftFormatting = -1;
                            bIsInFormatting = false;
                        }
                    }
                }
                else if (nLeft == -1)
                {
                    strNewValue += str.charAt(i);
                }
            }

            if (strNewValue != "")
            {
                strReturnValue += strNewValue;
            }

            str = strReturnValue;
        }

        if (str != null)
        {
            str = str.replace(/##/g, "#");
        }
    }
    catch (e)
    {
        throw new Error(0, "Event::RenderViewVariablesByIndex() - " + e.message);
    }

    return str;
    //}
}

Event.prototype.GetViewVariablesUBound = function( str )
{
    var nUBound = 0;
    var bIsInViewVariable = false;
    var bIsInFormatting = false;
    var strViewVariable = "";
    var aa = null;
    
    if (str != null && str.indexOf("@") > -1)
    {
        for (var i = 0; i < str.length; i++)
        {
            if (bIsInViewVariable && str.charAt(i) == '{')
            {
                bIsInFormatting = true;
            }
            else if (bIsInViewVariable && bIsInFormatting && str.charAt(i) == '}')
            {
                bIsInFormatting = false;
            }
            else if (str.charAt(i) == '@')
            {
                if (!bIsInViewVariable)
                {
                    bIsInViewVariable = true;
                }
                else
                {
                    aa = this.GetParameterArray(strViewVariable);
                    if (aa != null)
                    {
                        if (nUBound < aa.Length)
                            nUBound = aa.Length;
                    }

                    strViewVariable = "";
                    bIsInFormatting = false;
                    bIsInViewVariable = false;
                }
            }
            else if (bIsInViewVariable && !bIsInFormatting)
            {
                strViewVariable += str.charAt(i);
            }
        }
    }

    return nUBound;
}

function EventParameter( strName, arrValues )
{
    this.Name = strName;
    this.Values = arrValues;
}

EventParameter.prototype.toString = function()
{
    return "EventParameter";
}

function Register(strViewGuid, strNamespace, strMethodName, arrFilters, strScope, strScopeGuid)
{
    try
	{
	    var objEventService = GetEventService();
	    objEventService.Register(strViewGuid, strNamespace, strMethodName, arrFilters, strScope, strScopeGuid);
    }
	catch( e )
	{
		throw new Error(0, "Register() - " + e.message);
	}
}

function ReRegister()
{   
    try
	{
	    var objEventService = GetEventService();
	    
	    objEventService.ReRegister();
    }
	catch( e )
	{
		//alert( e.description );
	}
}

function Unregister( strViewID, strDOMLocation, strJSDelegate )
{
	try
	{
	    var objEventService = GetEventService();
	    
	    objEventService.Unregister(strViewID, strDOMLocation, strJSDelegate);
	}
	catch( e )
	{
		//alert( e.description );
	}
}

function UnregisterView( strViewID )
{
	try
	{
		//document.axApplication.UnregisterView( strViewID );
		
		document.axEventManager.UnregisterView( strViewID );
	}
	catch( e )
	{
		//alert( e.description );
	}
}

function EndSubscribe( strJSDelegate, strDOMLocation, jsParamsElem )
{
	try
	{		
		if( strDOMLocation != null && strDOMLocation != "" )
		{
			eval( strDOMLocation + "." + strJSDelegate + "( jsParamsElem );" );
		}
		else
		{
			eval( strJSDelegate + "( jsParamsElem );" );
		}
	}
	catch( e ) 
	{

	}
}

function FlashSubscribeSink(eEvent)
{
    AddFunctionCallLog("FlashSubscribeSink");
	try
    {
	    var jsEvent = new Event();
	    jsEvent.SetObject(eEvent, "Flash");
	    
	    var bNamespaceExists = false;
	    var bSinkExists = false;
	    var objWin = null;
	    
	    // make sure that the DOM Location still exists
	    try
	        {
        
            objWin = EvalPath(jsEvent.Namespace.replace(/JavaScript./g, ""));

            eval("objWin.title;");
	        bNamespaceExists = true;

	        eval("if(objWin." + jsEvent.MethodName + " != undefined && objWin." + jsEvent.MethodName + " != null){bSinkExists = true;}");
	    }
	    catch(e)
	    {
	        
	    }
	    
	    if (bNamespaceExists && bSinkExists)
	    {
		    if( jsEvent.Namespace != null && jsEvent.Namespace != "" )
		    {
		        eval("try{ objWin." + jsEvent.MethodName + "( jsEvent ); }catch(e){throw new Error(0, \"eval()::" + jsEvent.MethodName + "()::\" + e.message );}");
		    }
		    else
		    {
		        eval(jsEvent.MethodName + "( jsEvent );");
		    }
		}
	}
	catch( e ) 
	{
	    MessageWindow(null, "FlashSubscribeSink : <span style=\"color:#CC0000\">" + e.message + ".</span>", "True", "6000", "0");
	}
	RemoveFunctionCallLog();
}

function EndSubscribeSink( strJSDelegate, strDOMLocation, eEvent )
{
	try
	{	
	    var bNamespaceExists = false;
	    var bSinkExists = false;
	    
	    // make sure that the DOM Location still exists
	    try
        {
	        eval( strDOMLocation + ".title;" );
	        bNamespaceExists = true;
	        
	        eval( "if(" + strDOMLocation + "." +  strJSDelegate + " != undefined){bSinkExists = true;}");
	    }
	    catch(e)
	    {
	        
	    }
	    
	    if (bNamespaceExists && bSinkExists)
	    {
		    if( strDOMLocation != null && strDOMLocation != "" )
		    {
			    eval( strDOMLocation + "." + strJSDelegate + "( eEvent );" );
		    }
		    else
		    {
			    eval( strJSDelegate + "( eEvent );" );
		    }
		}
	}
	catch( e ) 
	{
         MessageWindow(null, "EndSubscribeSink : <span style=\"color:#CC0000\">" + e.message + ".</span>", "True", "6000", "0");
	}
}

function OnException( strSource, strLevel, strMessage, strDetails )
{
    if (strLevel != "Info")
        ShowDisabledScreen();
    else if (strMessage == "Client Event System Reconnected.")
        HideDisabledScreen();

    if ((strLevel != "Info" || strMessage == "Client Event System Reconnected.") && window.MessageWindow != undefined)
        MessageWindow(null, "<span style=\"color:#CC0000\">" + strMessage + ".</span>", "True", "6000", "0");
}

var g_objDisabledScreen = null;

function ShowDisabledScreen()
{
    top.document.body.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)progid:DXImageTransform.Microsoft.Fade(duration=3)";

    if (g_objDisabledScreen == null || g_objDisabledScreen == undefined)
    {
        g_objDisabledScreen = top.document.createElement("<div id=\"EventManager_DisabledScreen\" style=\"z-index:10;position:absolute;background-image:url('/Images/Transparent.gif');left:0px;top:0px;width:100%;height:100%;\"></div>");
        top.document.body.appendChild(g_objDisabledScreen);
    }
    else
    {
        g_objDisabledScreen.style.visibility = "visible";
    }
    
    try
    {
        top.document.body.filters[0].Apply();
        top.document.body.filters[1].Apply();
        top.document.body.filters[0].GrayScale = 1;
        top.document.body.filters[0].Play();
        top.document.body.filters[1].Play();
    }
    catch(e)
    {
    }
}

function HideDisabledScreen()
{
    try
    {
        top.document.body.filters[0].Apply();
        top.document.body.filters[1].Apply();
        top.document.body.filters[0].GrayScale = 0;
        top.document.body.filters[0].Play();
        top.document.body.filters[1].Play();
    }
    catch(e)
    {
    }
    setTimeout(RemoveDisabledScreen, 3400);
}

function RemoveDisabledScreen()
{
    g_objDisabledScreen.style.visibility = "hidden";
    top.document.body.style.removeAttribute( "filter" );
}

function IsScreenDisabled()
{
    if (g_objDisabledScreen != null && g_objDisabledScreen.style.visibility != "hidden")
        return true;
    else
        return false;
}