/**
 ******************************************************************************
 * (c) Copyright 2001-2004. EMC Corporation.  All Rights Reserved.
 ******************************************************************************
 *
 * Project        Application Integrtatons
 * File           appintgevents.js
 * Description    Application Integrtaion Eventing Mechanism
 * Created on     Sep. 14th, 2004
 * Tab width      3
 *
 ******************************************************************************
 */

var APPINTG_DELIM = "_,_";

// Used for debugging in browser w/o client application integrations
var DEBUG_BROWSER_ONLY = false;

// traces each event
var Trace_APPINTGEVENTS = false;

var g_include_appintgevents;
if (g_include_appintgevents != true)
{
   g_include_appintgevents = true;

   /** ensure Trace_CLIENTEVENT is defined */
   if (typeof(Trace_CLIENTEVENTS) == "undefined")
   {
      Trace_CLIENTEVENTS = false;
   }
   
   function onPreSubmitClientEvent(arg1, arg2, arg3, arg4, arg5)
   {
      onAIEvent("event=ShowBusyCursor", arg1, arg2, arg3, arg4, arg5);
   }

   function onShowDialog(arg1, arg2, arg3, arg4, arg5)
   {
      onAIEvent("event=ShowDialog", arg1, arg2, arg3, arg4, arg5);
   }

   /**
    * Send AI the event
    *
    * Event args are passed as individual arguments.
    *
    * @strEventArgs - Event Arguments
    */
   function onAIEvent()
   {
      if (g_ai_enabled)
      {
         // Trace message
         if (Trace_CLIENTEVENTS)
         {
            var args = "";
            for (var i = 0; i < arguments.length; i++)
            {
               if (i > 0)
               {
                  args += ";";
               }
               args += arguments[i];
            }

            aievents_trace("onAIEvent(" + args + ")" );
         }

         // Build the arguments - remove any undefined arguments
         var args = "";
         for (var i = 0; i < arguments.length; i++)
         {
            // Ignore "undefined" args
            if ( ! isUndefined(arguments[i]) )
            {
               if (i > 0)
               {
                  args += APPINTG_DELIM;
               }
               //TODO; document
               if ( arguments[i].indexOf("aivar:") > -1 )
               {
                  // Add the actionmap argument
                  var varBegin = arguments[i].indexOf("aivar:");
                  var varEnd = arguments[i].length;
                  var argName = arguments[i].substring(0, varBegin);
                  var argValue = eval(arguments[i].substring(varBegin + 6 , varEnd ));
                  args = args + argName + argValue;
               }
               else
               {
                  // Add the argument
                  args = args + arguments[i];
               }
            }
         }

         // Call the Application Integrations to handle this event
         try
         {
            var safeArgs = args.replace (/"/g,'\\\'');
            setTimeout("fireAppIntgEvent(\"" + safeArgs + "\")", 1);
         }
         catch(sError)
         {
            throwError("AppIntgProcessEvent did not handle aiEvent(" + args + ")" );
         }
      }

   } // end onAIEvent()

   /**
    * Fire an app integration process event. Event will not be fired if not in 
    * an app integration environment.
    *
    * Pass multiple event args as individual arguments.
    *
    * @strEventArgs - Event Arguments
    */
   function fireAppIntgEvent(strEventArgs)
   {
      if (g_ai_enabled)
      {
         try
         {
            if (arguments.length > 1)
            {
               for (var i = 1; i < arguments.length; i++)
               {
                  strEventArgs += (APPINTG_DELIM + arguments[i]);
               }
            }
            
            if (Trace_CLIENTEVENTS || Trace_APPINTGEVENTS)
            {
               aievents_trace("fireAppIntgEvent('" + strEventArgs + "')");
            }
            window.external.AppIntgProcessEvent(strEventArgs);
         }
         catch(sError)
         {
            if (!DEBUG_BROWSER_ONLY)
            {
               aievents_trace("AppIntgProcessEvent did not handle aiEvent(" + strEventArgs + ")" );
            }
         }
      }
   }

   function isUndefined(a)
   {
       return typeof a == 'undefined';
   }

   /**
   * Trace AI Client Events
   *
   * @param  strMsg     the message
   */
   function aievents_trace(strMsg)
   {
      Trace_println("appintgevents.js: " + strMsg);
   }

   /**
    * Determine if window.external is defined and usable
    *
    * @return  true if window.external is defined, false otherwise
    */
   function isWindowExternalDefined()
   {
      var bWindowExternalDefined = false;
      try
      {
         // Using try/catch instead of typeof. typeof window.external returns "unknown" instead of
         // "undefined" and it seemed a little fragile to base the check on this deviance from normal
         // javascript behaviour
         if(window.external)
         {
            bWindowExternalDefined = true;
         }
      }
      catch(e)
      {
         if (Trace_CLIENTEVENTS)
         {
            aievents_trace("Exception accessing window.external!");
         }
         bWindowExternalDefined = false;
      }

      return bWindowExternalDefined;
   }

   /**
    * Determine if we're running in an app integration environment
    *
    * @return  true if we are, false otherwise
    */
   function isAppIntgEnvironment()
   {
      return (isWindowExternalDefined() && typeof window.external.AppIntgProcessEvent != 'undefined');
   }

   /**
    * Global variable - can be used to identify whether or not we're running in an app integration environment
    * [ see isAppIntgEnvironment() for details about conditions under which is gets set to true ]
    */
   var g_ai_enabled = false;

   // ensure the AI event handler is defined
   if (isAppIntgEnvironment() || DEBUG_BROWSER_ONLY)
   {
      g_ai_enabled = true;
      registerClientEventHandler(null, "aiEvent", "onAIEvent" );
      registerClientEventHandler(null, "ShowDialog", "onShowDialog" );
      reregisterPreSubmitClientEventHandler(null, postServerEvent.GENERIC_PRE_SUBMIT, "onPreSubmitClientEvent");
   }

}

