home *** CD-ROM | disk | FTP | other *** search
/ ftp.tcs3.com / ftp.tcs3.com.tar / ftp.tcs3.com / DRIVERS / Audio / Office2010 / ProPlus.WW / ProPsWW.cab / UTILITYFUNCTIONS.JS5 < prev    next >
Text File  |  2007-02-04  |  61KB  |  2,030 lines

  1. /*********************************************************************
  2.                                  Notice
  3.  
  4. You may not modify, use, copy or distribute this file or its contents. 
  5. Internal interfaces referenced in this file are nonpublic, unsupported 
  6. and subject to change without notice. These interfaces may not be 
  7. utilized in other software applications or components.
  8.  
  9.  
  10. *********************************************************************/
  11.  
  12. var g_FormRecord;
  13. var g_arrTabContents;
  14. var g_arrIntervals = new Array();
  15. var g_AlertShown = false;
  16. var g_ContactContextMenuFieldName = "";
  17. var g_IsMacro = false;
  18.  
  19. // Invalid date.
  20. var INVALID_DATE = -0xFFFFFFFFFFFFF;
  21.  
  22. // This enum is defined in code, but we
  23. // can't access it from here, so just redeclare it.
  24. var FormsUIState_Unknown            = 0;
  25. var FormsUIState_HomePage            = 1;
  26. var FormsUIState_ViewDesign            = 2;
  27. var FormsUIState_FormDesign            = 3;
  28. var FormsUIState_MacroDesign        = 4;
  29. var FormsUIState_SettingsAndOptions    = 5;
  30. var FormsUIState_ViewData            = 6;
  31. var FormsUIState_DocumentDisplay    = 7;
  32.  
  33. // These enums are defined in IDL, but we
  34. // can't access them from here, so just redeclare it.
  35. var GrooveFormsToolFieldSizeType_Characters = 0;
  36. var GrooveFormsToolFieldSizeType_Pixels = 1;
  37. var GrooveFormsToolFieldSizeType_Percent = 2;
  38.  
  39. var GrooveFormsToolTextFieldInitialValueType_Static = 0;
  40. var GrooveFormsToolTextFieldInitialValueType_Unique = 1;
  41. var GrooveFormsToolTextFieldInitialValueType_UserDisplayName = 2;
  42. var GrooveFormsToolTextFieldInitialValueType_TelespaceDisplayName = 3;
  43. var GrooveFormsToolTextFieldInitialValueType_ToolDisplayName = 4;
  44. var GrooveFormsToolTextFieldInitialValueType_Function = 5;
  45.  
  46. var GrooveFormsToolDateFieldInitialValueType_Static = 0;
  47. var GrooveFormsToolDateFieldInitialValueType_Today = 1;
  48. var GrooveFormsToolDateFieldInitialValueType_Tomorrow = 2;
  49. var GrooveFormsToolDateFieldInitialValueType_Function = 3;
  50.  
  51. var GrooveFormsToolDateTimeFieldInitialValueType_Static = 0;
  52. var GrooveFormsToolDateTimeFieldInitialValueType_Now = 1;
  53. var GrooveFormsToolDateTimeFieldInitialValueType_Function = 2;
  54.  
  55. // These enums are defined in IDL, but we can't access them
  56. // from here, so just redeclare them
  57. var    GrooveFormsToolContactOutputInformation_Fingerprint = 0;
  58. var    GrooveFormsToolContactOutputInformation_EmailAddress = 1;
  59. var    GrooveFormsToolContactOutputInformation_Affiliation = 2;
  60. var    GrooveFormsToolContactOutputInformation_FullName = 3;
  61. var    GrooveFormsToolContactOutputInformation_Alias = 4;
  62. var    GrooveFormsToolContactOutputInformation_ExplanatoryURL = 5;
  63. var    GrooveFormsToolContactOutputInformation_Title = 6;
  64. var    GrooveFormsToolContactOutputInformation_Role = 7;
  65. var    GrooveFormsToolContactOutputInformation_GivenName = 8;
  66. var    GrooveFormsToolContactOutputInformation_FamilyName = 9;
  67. var    GrooveFormsToolContactOutputInformation_OrganizationName = 10;
  68. var    GrooveFormsToolContactOutputInformation_OrganizationUnit = 11;
  69. var    GrooveFormsToolContactOutputInformation_AuthenticationColorString = 12;
  70. var    GrooveFormsToolContactOutputInformation_AuthenticationTooltip = 13;
  71. var GrooveFormsToolContactOutputInformation_WorkPhoneNumber = 14;
  72.  
  73. // NOTE: Input types are only used for new contacts.  Once
  74. // the contact has been set in the record it cannot be changed.
  75. // An exception will be generated if SetContactInfo is called
  76. // on a persisted contact.
  77. var    GrooveFormsToolContactInputInformation_FullName = 0;
  78. var    GrooveFormsToolContactInputInformation_EmailAddress = 1;
  79. var    GrooveFormsToolContactInputInformation_WorkPhoneNumber = 2;
  80. var    GrooveFormsToolContactInputInformation_ExplanatoryURL = 3;
  81. var    GrooveFormsToolContactInputInformation_Title = 4;
  82. var    GrooveFormsToolContactInputInformation_Role = 5;
  83. var    GrooveFormsToolContactInputInformation_GivenName = 6;
  84. var    GrooveFormsToolContactInputInformation_FamilyName = 7;
  85. var    GrooveFormsToolContactInputInformation_OrganizationName = 8;
  86. var    GrooveFormsToolContactInputInformation_OrganizationUnit = 9;
  87.  
  88. var GrooveContactOnlineState_Offline = 0;
  89. var GrooveContactOnlineState_OnlineAvailable = 1;
  90. var GrooveContactOnlineState_FreeToChat = 2;
  91. var GrooveContactOnlineState_Away = 3;
  92. var GrooveContactOnlineState_ExtendedAway = 4;
  93. var GrooveContactOnlineState_DoNotDisturb = 5;
  94.  
  95. // Defined in tom.idl.
  96. var tomUndefined = -9999999;
  97.  
  98. var tomFalse = 0;
  99. var tomTrue = -1;
  100.  
  101. var tomListBullet = 1;
  102.  
  103. var tomSingle = 1;
  104.  
  105. var tomAlignLeft = 0;
  106. var tomAlignCenter = 1;
  107. var tomAlignRight = 2;
  108. var tomAlignJustify = 3;
  109.  
  110. var GrooveTextParaFlag_AlignLeft = 0x00000000;
  111. var GrooveTextParaFlag_AlignCenter = 0x00000001;
  112. var GrooveTextParaFlag_AlignRight = 0x00000002;
  113. var GrooveTextParaFlag_AlignJustify = 0x00000003;
  114. var GrooveTextParaFlag_NumberNone = 0x00000000;
  115. var GrooveTextParaFlag_NumberBullet = 0x00000010;
  116. var GrooveTextParaFlag_IndentRelative = 0x00001000;
  117. var GrooveTextParaFlag_UseAlign = 0x01000000;
  118. var GrooveTextParaFlag_UseNumber = 0x02000000;
  119.  
  120. // Resourced String IDs
  121. var IDS_FORMS_TOOL_JS_ADD_CUSTOM_ENTRY_TEXT =2994;
  122. var IDS_FORMS_TOOL_JS_ADD_CUSTOM_ENTRY_TITLE =2995;
  123. var IDS_FORMS_TOOL_JS_ALL_SUBSTRINGS_ERROR =2996;
  124. var IDS_FORMS_TOOL_JS_ANY_SUBSTRINGS_ERROR =2997;
  125. var IDS_FORMS_TOOL_JS_ATTACHMENT_SAVING_ERROR =2998;
  126. var IDS_FORMS_TOOL_JS_BROWSE_IMAGE =2999;
  127. var IDS_FORMS_TOOL_JS_COMMAND_BAR_ADD_ATTACHMENT =3000;
  128. var IDS_FORMS_TOOL_JS_COMMAND_BAR_ALIGN_LEFT =3001;
  129. var IDS_FORMS_TOOL_JS_COMMAND_BAR_ALIGN_RIGHT =3002;
  130. var IDS_FORMS_TOOL_JS_COMMAND_BAR_BOLD =3003;
  131. var IDS_FORMS_TOOL_JS_COMMAND_BAR_BULLETS =3004;
  132. var IDS_FORMS_TOOL_JS_COMMAND_BAR_CENTER =3005;
  133. var IDS_FORMS_TOOL_JS_COMMAND_BAR_CHECK_SPELLING =3006;
  134. var IDS_FORMS_TOOL_JS_COMMAND_BAR_CHOOSE_COLOR =3007;
  135. var IDS_FORMS_TOOL_JS_COMMAND_BAR_CHOOSE_FONT =3008;
  136. var IDS_FORMS_TOOL_JS_COMMAND_BAR_DECREASE_INDENT =3009;
  137. var IDS_FORMS_TOOL_JS_COMMAND_BAR_DELETE_ATTACHMENT =3010;
  138. var IDS_FORMS_TOOL_JS_COMMAND_BAR_HYPERLINK =3011;
  139. var IDS_FORMS_TOOL_JS_COMMAND_BAR_INCREASE_INDENT =3012;
  140. var IDS_FORMS_TOOL_JS_COMMAND_BAR_ITALICIZE =3013;
  141. var IDS_FORMS_TOOL_JS_COMMAND_BAR_JUSTIFY =3014;
  142. var IDS_FORMS_TOOL_JS_COMMAND_BAR_LAUNCH_ATTACHMENT =3015;
  143. var IDS_FORMS_TOOL_JS_COMMAND_BAR_SAVE_ATTACHMENT =3016;
  144. var IDS_FORMS_TOOL_JS_COMMAND_BAR_UNDERLINE =3017;
  145. var IDS_FORMS_TOOL_JS_CONTACT_TITLE =3018;
  146. var IDS_FORMS_TOOL_JS_DATE_SAVING_ERROR =3019;
  147. var IDS_FORMS_TOOL_JS_DELETED_RESPONSE_ERROR =3020;
  148. var IDS_FORMS_TOOL_JS_DELETED_RESPONSE_TITLE =3021;
  149. var IDS_FORMS_TOOL_JS_EDIT_RECORD_DELETED_ERROR =3022;
  150. var IDS_FORMS_TOOL_JS_EMBEDDED_VIEW_INFO =3023;
  151. var IDS_FORMS_TOOL_JS_EXTERNAL_OPENER_ERROR =3024;
  152. var IDS_FORMS_TOOL_JS_FIELD_REQUIRED =3025;
  153. var IDS_FORMS_TOOL_JS_FIELD_TITLE =3026;
  154. var IDS_FORMS_TOOL_JS_FUTURE_FEATURE =3027;
  155. var IDS_FORMS_TOOL_JS_HASALPHABETIC_ERROR =3028;
  156. var IDS_FORMS_TOOL_JS_HASNUMERIC_ERROR =3029;
  157. var IDS_FORMS_TOOL_JS_IDLE_HOURS =3030;
  158. var IDS_FORMS_TOOL_JS_IDLE_HOURS_MINUTES =3031;
  159. var IDS_FORMS_TOOL_JS_IDLE_MINUTES =3032;
  160. var IDS_FORMS_TOOL_JS_IDLE_ONE_HOUR =3033;
  161. var IDS_FORMS_TOOL_JS_IDLE_ONE_HOUR_MINUTES =3034;
  162. var IDS_FORMS_TOOL_JS_IDLE_SINCE =3035;
  163. var IDS_FORMS_TOOL_JS_INVALID_DATE =3036;
  164. var IDS_FORMS_TOOL_JS_INVALID_DATE_RANGE =3037;
  165. var IDS_FORMS_TOOL_JS_INVALID_EMAIL =3038;
  166. var IDS_FORMS_TOOL_JS_INVALID_FORM_VALUES =3039;
  167. var IDS_FORMS_TOOL_JS_INVALID_FORM_VALUES_TITLE =3040;
  168. var IDS_FORMS_TOOL_JS_INVALID_ITEM_ERROR =3041;
  169. var IDS_FORMS_TOOL_JS_INVALID_MAX_DATE =3042;
  170. var IDS_FORMS_TOOL_JS_INVALID_MAX_LENGTH =3043;
  171. var IDS_FORMS_TOOL_JS_INVALID_MIN_DATE =3044;
  172. var IDS_FORMS_TOOL_JS_INVALID_MIN_LENGTH =3045;
  173. var IDS_FORMS_TOOL_JS_INVALID_NUMBER =3046;
  174. var IDS_FORMS_TOOL_JS_INVALID_PASSWORD =3047;
  175. var IDS_FORMS_TOOL_JS_INVALID_SELECTION_ERROR =3048;
  176. var IDS_FORMS_TOOL_JS_INVALID_SELECTION_TITLE =3049;
  177. var IDS_FORMS_TOOL_JS_INVALID_ZIPCODE =3050;
  178. var IDS_FORMS_TOOL_JS_ISALPHABETIC_ERROR =3051;
  179. var IDS_FORMS_TOOL_JS_ISNUMERIC_ERROR =3052;
  180. var IDS_FORMS_TOOL_JS_LOOKUP_ERROR =3053;
  181. var IDS_FORMS_TOOL_JS_MAX_NUMBER =3054;
  182. var IDS_FORMS_TOOL_JS_MIN_NUMBER =3055;
  183. var IDS_FORMS_TOOL_JS_NO_SUBSTRING_ERROR =3056;
  184. var IDS_FORMS_TOOL_JS_NO_SUBSTRINGS_ERROR =3057;
  185. var IDS_FORMS_TOOL_JS_OPTION_ERROR =3058;
  186. var IDS_FORMS_TOOL_JS_PREVIEW_RECORD_DELETED_ERROR =3059;
  187. var IDS_FORMS_TOOL_JS_PROPAGATION_ERROR =3060;
  188. var IDS_FORMS_TOOL_JS_RECORD_DELETED_TITLE =3061;
  189. var IDS_FORMS_TOOL_JS_REMOVE_CONTACT_DLG =3062;
  190. var IDS_FORMS_TOOL_JS_SELECT_FIELDS =3063;
  191. var IDS_FORMS_TOOL_JS_SUBSTRING_ERROR =3064;
  192. var IDS_FORMS_TOOL_JS_UNKNOWN_FIELD_INFO =3065;
  193. var IDS_FORMS_TOOL_JS_REMOVE_CONTACT_TITLE =4196;
  194. var IDS_FORMS_TOOL_JS_DELETED_FORM = 4690;
  195. var IDS_FORMS_TOOL_JS_DELETED_FORM_TITLE = 4691;
  196. var IDS_FORMS_TOOL_JS_NO_CONTACT_SELECTED = 4696;
  197.  
  198. function getScriptHostQI(i_Interface)
  199. {
  200.     try
  201.     {
  202.         // If these variables are valid, then you are in a form.
  203.         if (typeof g_IsSearch != "undefined")
  204.         {
  205.             if (!g_IsSearch && !g_IsFormPreview && !g_IsPrinting)
  206.                 return eval("window.external." + i_Interface);
  207.             else if (g_IsSearch)
  208.             {
  209.                 if (i_Interface.indexOf("IGrooveFormsToolUIDelegate") != -1)
  210.                 {
  211.                     var UIDelegate = window.external.IGrooveFormsToolSearchDialogDelegatePrivate.GetUIDelegate();
  212.                     return eval("UIDelegate." + i_Interface);
  213.                 }
  214.                 else
  215.                     return eval("window.external." + i_Interface);
  216.             }
  217.             else if (g_IsPrinting)
  218.             {
  219.                 if (i_Interface.indexOf("IGrooveFormsToolUIDelegate") != -1)
  220.                 {
  221.                     var UIDelegate = window.external.IGrooveFormsToolPrintDialogDelegatePrivate.GetUIDelegate();
  222.                     return eval("UIDelegate." + i_Interface);
  223.                 }
  224.                 else
  225.                     return eval("window.external." + i_Interface);
  226.             }
  227.             else
  228.             {
  229.                 var ScriptDispatch = window.external.GetScriptDispatch();
  230.                 if (ScriptDispatch != null)
  231.                     return eval("ScriptDispatch.GetUIDelegate()." + i_Interface);
  232.             }
  233.         }
  234.         else if (g_IsMacro)
  235.         {
  236.             var ScriptDispatch = window.external.IGrooveFormsToolUIMacroWindowPrivate;
  237.             if (ScriptDispatch != null)
  238.                 return eval("ScriptDispatch.GetUIDelegate()." + i_Interface);
  239.         }
  240.         else
  241.             return eval("window.external." + i_Interface);
  242.     }
  243.     catch (error)
  244.     {
  245.         if (!g_AlertShown)
  246.         {
  247.             // Can't resource this string because IGrooveFormsToolUIDelegate is not accessible.
  248.             alert("This web page should only be opened from within Groove. Please close the window.");
  249.             g_AlertShown = true;
  250.         }
  251.         return null;
  252.     }
  253. }
  254.  
  255. function getImageBindableURLByID(i_ID)
  256. {
  257.     return getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").GetBindableURLByID(i_ID);
  258. }
  259.  
  260. function processCallout(i_Function)
  261. {
  262.     try
  263.     {
  264.         var blnContinue = true;
  265.         if (typeof i_Function == "function" && i_Function() == false)
  266.             blnContinue = false;
  267.     }
  268.     catch (error) { }
  269.     finally
  270.     {
  271.         return blnContinue;
  272.     }
  273. }
  274.  
  275. function processCalloutWithParameter(i_Function, i_Parameter)
  276. {
  277.     try
  278.     {
  279.         var blnContinue = true;
  280.         if (typeof i_Function == "function" && i_Function(i_Parameter) == false)
  281.             blnContinue = false;
  282.     }
  283.     catch (error) { }
  284.     finally
  285.     {
  286.         return blnContinue;
  287.     }
  288. }
  289.  
  290. function getValueFromQueryString(i_Key, i_Querystring, i_Default)
  291. {
  292.     var strReturn = "";
  293.     if (typeof i_Default != "undefined")
  294.         strReturn = i_Default;
  295.  
  296.     var objRegExp = new RegExp(i_Key + "=[^&]*", "");
  297.     if (objRegExp.test(i_Querystring))
  298.     {
  299.         var strPair = objRegExp.exec(i_Querystring);
  300.         var arrPair = strPair[0].split("=");
  301.         if (arrPair.length == 2 && arrPair[0] == i_Key)
  302.             strReturn = unescape(arrPair[1]);
  303.     }
  304.  
  305.     return strReturn;
  306. }
  307.  
  308.  
  309. // === status bar functions ============================
  310. // these functions control the display of the status bar
  311. function displayStatusBar(i_Message, i_Icon)
  312. {
  313.     if (!g_IsSearch && !g_IsPreviewPane && !g_IsPrinting)
  314.         getScriptHostQI("IGrooveFormsToolUIDelegate").DisplayStatusBarMessage(i_Message, i_Icon);
  315. }
  316.  
  317. function clearStatusBar()
  318. {
  319.     if (!g_IsSearch && !g_IsPreviewPane && !g_IsPrinting)
  320.         getScriptHostQI("IGrooveFormsToolUIDelegate").ClearStatusBarMessage();
  321. }
  322.  
  323. // === event handlers ============================
  324. // these functions handle events for form elements
  325. function onBlurHandler()
  326. {
  327.     eventHandler("OnBlur");
  328. }
  329.  
  330. function onFocusHandler()
  331. {
  332.     eventHandler("OnFocus");
  333. }
  334.  
  335. function onClickHandler()
  336. {
  337.     eventHandler("OnClick");
  338. }
  339.  
  340. function onChangeHandler()
  341. {
  342.     eventHandler("OnChange");
  343. }
  344.  
  345. function eventHandler(i_strEvent)
  346. {
  347.     var Element = event.srcElement;
  348.     var ElementName = Element.id;
  349.  
  350.     // If this is a time element, remove the "_Time" portion from the name.
  351.     var ElementDataType = Element.getAttribute("DATATYPE");
  352.     if (ElementDataType == "Time")
  353.         ElementName = ElementName.substring(0, ElementName.length - 5);
  354.  
  355.     eventHandlerById(i_strEvent, ElementName);
  356. }
  357.  
  358. function eventHandlerById(i_strEvent, i_strId)
  359. {
  360.     try
  361.     {
  362.         if (g_BypassEventCallouts)
  363.             return;
  364.  
  365.         if (i_strId != null && i_strId != "")
  366.         {
  367.             var objElement = document.getElementById(i_strId);
  368.             if (eval("typeof " + i_strId + "_" + i_strEvent) != "undefined")
  369.                 eval(i_strId + "_" + i_strEvent + "(objElement)");
  370.         }
  371.     }
  372.     catch (error) { }
  373. }
  374.  
  375. // === object replacement ==========================================
  376. // these functions are called to replace object tags with empty divs
  377. function subInDivs()
  378. {
  379.     g_arrTabs = new Array();
  380.     g_arrTabContents = new Array();
  381.  
  382.     // Display the contents of all tabs when printing.
  383.     var arrDivs = document.getElementsByTagName("DIV");
  384.     for (var i = 0; i < arrDivs.length; i++)
  385.     {
  386.         var strObjectType = arrDivs[i].getAttribute("OBJECTTYPE");
  387.         if (strObjectType == "TabContents" && arrDivs[i].style.display == "none")
  388.         {
  389.             arrDivs[i].insertAdjacentHTML("beforeBegin", "<HR ID=\"" + arrDivs[i].id + "_line\" SIZE=\"1\" COLOR=\"#000000\">");
  390.             arrDivs[i].style.display = "";
  391.             g_arrTabContents.push(arrDivs[i]);
  392.         }
  393.     }
  394.  
  395.     // Hide all tabs when printing.
  396.     var arrDivs = document.getElementsByTagName("SPAN");
  397.     for (var i = 0; i < arrDivs.length; i++)
  398.     {
  399.         var strObjectType = arrDivs[i].getAttribute("OBJECTTYPE");
  400.         if (strObjectType == "Tab")
  401.         {
  402.             arrDivs[i].style.display = "none";
  403.             g_arrTabs.push(arrDivs[i]);
  404.         }
  405.     }
  406.  
  407.     // Replace all textarea and input boxes.
  408.     var arrInputs = document.getElementsByTagName("INPUT");
  409.     for (var i = 0; i < arrInputs.length; i++)
  410.     {
  411.         if (arrInputs[i].type == "text" || arrInputs[i].type == "password")
  412.             Object2Div(arrInputs[i], null, "inputPreview");
  413.     }
  414.  
  415.     var arrTextAreas = document.getElementsByTagName("TEXTAREA");
  416.     for (var i = 0; i < arrTextAreas.length; i++)
  417.         Object2Div(arrTextAreas[i], null, "textareaPreview");
  418.  
  419.     var arrSelects = document.getElementsByTagName("SELECT");
  420.     for (var i = 0; i < arrSelects.length; i++)
  421.         Object2Div(arrSelects[i], null, "selectPreview");
  422.  
  423.     // Handle rich text and attachments objects.
  424.     var arrObject = document.getElementsByTagName("OBJECT");
  425.     for (var i = 0; i < arrObject.length; i++)
  426.     {
  427.         var strDataType = arrObject[i].getAttribute("DataType");
  428.         var ObjectText = "";
  429.         if (strDataType == "RichText")
  430.         {
  431.             ObjectText = getScriptHostQI("IGrooveFormsToolUIDelegatePrintFormPrivate").OpenRTFContent(arrObject[i]);
  432.         }
  433.         else if (strDataType == "Attachments")
  434.         {
  435.             var AttachmentNameEnum = getScriptHostQI("IGrooveFormsToolUIDelegatePrintFormPrivate").OpenAttachmentNameEnum(g_AttachmentsElement);
  436.             ObjectText += "<UL>";
  437.             while (AttachmentNameEnum.HasMore())
  438.             {
  439.                 ObjectText += "<LI>";
  440.                 ObjectText += AttachmentNameEnum.OpenNext();
  441.                 ObjectText += "</LI>";
  442.             }
  443.             ObjectText += "</UL>";
  444.         }
  445.         Object2Div(arrObject[i], ObjectText);
  446.     }
  447.  
  448.     // Hide all buttons on the form.
  449.     var arrButtons = document.getElementsByTagName("BUTTON");
  450.     for (var i = 0; i < arrButtons.length; i++)
  451.     {
  452.         arrButtons[i].style.display = "none";
  453.     }
  454.  
  455.     // Hide all visible error icons.
  456.     var arrImages = document.getElementsByTagName("IMG");
  457.     for (var i = 0; i < arrImages.length; i++)
  458.     {
  459.         if (arrImages[i].title != "")
  460.         {
  461.             arrImages[i].style.display = "none";
  462.             arrImages[i].setAttribute("HIDDENFORPRINTING", "true");
  463.         }
  464.     }
  465. }
  466.  
  467. function putBackTextAreas()
  468. {
  469.     var arrInputs = document.getElementsByTagName("INPUT");
  470.     for (var i = 0; i < arrInputs.length; i++)
  471.     {
  472.         if (arrInputs[i].type == "text" || arrInputs[i].type == "password")
  473.             DivBackToObject(arrInputs[i]);
  474.     }
  475.  
  476.     var arrTextAreas = document.getElementsByTagName("TEXTAREA");
  477.     for (var i = 0; i < arrTextAreas.length; i++)
  478.         DivBackToObject(arrTextAreas[i]);
  479.  
  480.     var arrSelects = document.getElementsByTagName("SELECT");
  481.     for (var i = 0; i < arrSelects.length; i++)
  482.         DivBackToObject(arrSelects[i]);
  483.  
  484.     // Handle rich text objects.
  485.     var arrObject = document.getElementsByTagName("OBJECT");
  486.     var strDataType;
  487.     for (var i = 0; i < arrObject.length; i++)
  488.     {
  489.         strDataType = arrObject[i].getAttribute("DataType");
  490.         if (strDataType == "RichText" || strDataType == "Attachments")
  491.             DivBackToObject(arrObject[i]);
  492.     }
  493.     
  494.     // Display all buttons on the form.
  495.     var arrButtons = document.getElementsByTagName("BUTTON");
  496.     for (var i = 0; i < arrButtons.length; i++)
  497.     {
  498.         arrButtons[i].style.display = "";
  499.     }
  500.  
  501.     // Display all tabs on a form.
  502.     for (var i = 0; i < g_arrTabs.length; i++)
  503.     {
  504.         g_arrTabs[i].style.display = "";
  505.     }
  506.  
  507.     // Re-hide the contents of all tabs that should be hidden.
  508.     for (var i = 0; i < g_arrTabContents.length; i++)
  509.     {
  510.         var objLine = document.getElementById(g_arrTabContents[i].id + "_line");
  511.         if (objLine != null)
  512.             objLine.removeNode(true);
  513.         g_arrTabContents[i].style.display = "none";
  514.     }
  515.  
  516.     // Show all error icons that were hidden.
  517.     var arrImages = document.getElementsByTagName("IMG");
  518.     for (var i = 0; i < arrImages.length; i++)
  519.     {
  520.         var HiddenAttribute = arrImages[i].getAttribute("HIDDENFORPRINTING");
  521.         if (HiddenAttribute != null)
  522.         {
  523.             arrImages[i].style.display = "inline";
  524.             arrImages[i].removeAttribute("HIDDENFORPRINTING");
  525.         }
  526.     }
  527. }
  528.  
  529. function Object2Div(i_Object, i_Content, i_ClassName)
  530. {
  531.     var oNewDiv;
  532.  
  533.     oNewDiv = document.createElement("DIV");
  534.     oNewDiv.className = i_ClassName;
  535.     oNewDiv.id = i_Object.uniqueID + "_div";
  536.  
  537.     if (i_Content != null)
  538.     {
  539.         oNewDiv.innerHTML = i_Content;
  540.     }
  541.     else
  542.     {
  543.         var ObjectValue = i_Object.value;
  544.         if (i_Object.type == "password")
  545.         {
  546.             var ObjectValueLength = ObjectValue.length;
  547.             ObjectValue = "";
  548.             for (var i = 0; i < ObjectValueLength; i++)
  549.             {
  550.                 ObjectValue += "*";
  551.             }
  552.         }
  553.         else if (i_Object.type == "select-multiple")
  554.         {
  555.             var OptionValueArray = new Array();
  556.             for (var i = 0; i < i_Object.options.length; i++)
  557.             {
  558.                 if (i_Object.options[i].selected)
  559.                     OptionValueArray.push(i_Object.options[i].text);
  560.             }
  561.  
  562.             ObjectValue = OptionValueArray.join("\n");
  563.         }
  564.         oNewDiv.innerText = ObjectValue;
  565.     }
  566.  
  567.     i_Object.parentNode.insertBefore(oNewDiv, i_Object);
  568.     i_Object.style.display = "none";
  569. }
  570.  
  571. function DivBackToObject(i_Object)
  572. {
  573.     var oDivToRemove = document.all(i_Object.uniqueID + "_div");
  574.     if (oDivToRemove != null)
  575.         oDivToRemove.removeNode(true);
  576.  
  577.     i_Object.style.display = "";
  578. }
  579.  
  580. // === button handlers ============================================
  581. // these functions are called in response to a button being clicked
  582. function doCalendar(i_Name)
  583. {
  584.     try
  585.     {
  586.         // Get the INPUT object that the date value will be put into.
  587.         var objDate = document.getElementById(i_Name);
  588.         if (objDate != null)
  589.         {
  590.             var DateValue = objDate.value;
  591.  
  592.             // Clear any errors that the current date may have.
  593.             clearError(objDate, "Required");
  594.             clearError(objDate, "InvalidDate");
  595.             clearError(objDate, "Date");
  596.  
  597.             var bIsDateTime = false;
  598.             var FieldTypeAttribute = objDate.getAttribute("FIELDTYPE");
  599.             if (FieldTypeAttribute == FormObjectType_DateTime)
  600.                 bIsDateTime = true;
  601.  
  602.             // Get the new date from the choose date sub-form.
  603.             var FormatAttribute = objDate.getAttribute("FORMAT");
  604.             if (FormatAttribute != null)
  605.             {
  606.                 var intDateFormat = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").CreateDateFormatStyleFromAttributeValue(FormatAttribute);
  607.                 var intDate = getValidDateMillis(DateValue, intDateFormat, objDate);
  608.                 if (isNaN(intDate))
  609.                     intDate = new Date().valueOf();
  610.  
  611.                 var DateResult = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").DisplayRawDatePickerDialog(intDate, intDateFormat, bIsDateTime);
  612.                 if (DateResult.Result == GrooveDialogBoxResultCode_OK)
  613.                 {
  614.                     var DateValue = DateResult.Data;
  615.  
  616.                     if (bIsDateTime)
  617.                     {
  618.                         var DateAndTimeEnum = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").FormatDateAndTime(DateValue, intDateFormat, 3);
  619.                         if (DateAndTimeEnum.HasMore());
  620.                             objDate.value = DateAndTimeEnum.OpenNext();
  621.                         var objTime = document.getElementById(i_Name + "_Time");
  622.                         if (objTime != null && DateAndTimeEnum.HasMore())
  623.                             objTime.value = DateAndTimeEnum.OpenNext();
  624.                     }
  625.                     else
  626.                     {
  627.                         DateValue = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDate(DateValue, intDateFormat);
  628.                         objDate.value = DateValue;
  629.                     }
  630.  
  631.                     // Set the dirty bit if it needs to be set.
  632.                     int_setIsDirty(true);
  633.  
  634.                     // Call onblur to validate the date.
  635.                     objDate.fireEvent("onblur");
  636.  
  637.                     // Call onchange for designer scripts to use.
  638.                     objDate.fireEvent("onchange");
  639.                 }
  640.             }
  641.         }
  642.     }
  643.     catch (error)
  644.     {
  645.         var Priv = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate");
  646.         // IDS_FORMS_TOOL_JS_DATE_SAVING_ERROR
  647.         getScriptHostQI("IGrooveFormsToolUIDelegate").DisplayError(Priv.GetResourcedString(IDS_FORMS_TOOL_JS_DATE_SAVING_ERROR) + "\n\n" + error.description);
  648.     }
  649. }
  650.  
  651. // Rich text command bar button handlers.
  652. function doBold(i_Name)
  653. {
  654.     submitControlChar(i_Name, "B");
  655. }
  656.  
  657. function doItalic(i_Name)
  658. {
  659.     submitControlChar(i_Name, "I");
  660. }
  661.  
  662. function doUnderline(i_Name)
  663. {
  664.     submitControlChar(i_Name, "U");
  665. }
  666.  
  667. function submitControlChar(i_Name, i_String)
  668. {
  669.     var objTextView = document.getElementById(i_Name);
  670.     if (objTextView != null)
  671.     {
  672.         var CharCode = i_String.charCodeAt(0) & 0x1F;
  673.         objTextView.SubmitText(String.fromCharCode(CharCode));
  674.         objTextView.focus();
  675.     }
  676. }
  677.  
  678. function doAlignLeft(i_Name)
  679. {
  680.     submitParaChange(i_Name, GrooveTextParaFlag_UseAlign | GrooveTextParaFlag_AlignLeft, tomUndefined);
  681. }
  682.  
  683. function doCenter(i_Name)
  684. {
  685.     submitParaChange(i_Name, GrooveTextParaFlag_UseAlign | GrooveTextParaFlag_AlignCenter, tomUndefined);
  686. }
  687.  
  688. function doAlignRight(i_Name)
  689. {
  690.     submitParaChange(i_Name, GrooveTextParaFlag_UseAlign | GrooveTextParaFlag_AlignRight, tomUndefined);
  691. }
  692.  
  693. function doJustify(i_Name)
  694. {
  695.     submitParaChange(i_Name, GrooveTextParaFlag_UseAlign | GrooveTextParaFlag_AlignJustify, tomUndefined);
  696. }
  697.  
  698. function doBullets(i_Name)
  699. {
  700.     var objTextView = document.getElementById(i_Name);
  701.     if (objTextView != null)
  702.     {
  703.         var Flags = GrooveTextParaFlag_UseNumber;
  704.         var ListType = objTextView.TextCache.Document.Selection.Para.ListType;
  705.         if (ListType == tomUndefined)
  706.             Flags |= GrooveTextParaFlag_NumberBullet;
  707.         else if ((ListType & 0xFFFF) != tomListBullet)
  708.             Flags |= GrooveTextParaFlag_NumberBullet;
  709.         else
  710.             Flags |= GrooveTextParaFlag_NumberNone;
  711.  
  712.         submitParaChange(i_Name, Flags, tomUndefined);
  713.     }
  714. }
  715.  
  716. function doIncreaseIndent(i_Name)
  717. {
  718.     submitParaChange(i_Name, GrooveTextParaFlag_IndentRelative, 18.0);
  719. }
  720.  
  721. function doDecreaseIndent(i_Name)
  722. {
  723.     submitParaChange(i_Name, GrooveTextParaFlag_IndentRelative, -18.0);
  724. }
  725.  
  726. function doChooseFont(i_Name)
  727. {
  728.     var objTextView = document.getElementById(i_Name);
  729.     if (objTextView != null)
  730.     {
  731.         objTextView.ChooseFont();
  732.         objTextView.focus();
  733.     }
  734. }
  735.  
  736. function doChooseColor(i_Name)
  737. {
  738.     var objTextView = document.getElementById(i_Name);
  739.     if (objTextView != null)
  740.     {
  741.         objTextView.ChooseColor();
  742.         objTextView.focus();
  743.     }
  744. }
  745.  
  746. function submitParaChange(i_Name, i_Flags, i_Left)
  747. {
  748.     var objTextView = document.getElementById(i_Name);
  749.     if (objTextView != null)
  750.     {
  751.         var TabPositionEnum = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").CreateDoubleEnum();
  752.         var TabFlagsEnum = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").CreateLongEnum();
  753.  
  754.         objTextView.SubmitParaChange(i_Flags, tomUndefined, tomUndefined, i_Left, tomUndefined, tomUndefined, tomUndefined, TabPositionEnum, TabFlagsEnum);
  755.         objTextView.focus();
  756.     }
  757. }
  758.  
  759. function doSpellCheck(i_Name)
  760. {
  761.     var objTextView = document.getElementById(i_Name);
  762.     if (objTextView != null)
  763.     {
  764.         // GrooveTextKey_F7 = 1007 from GrooveTextTools.idl.
  765.         objTextView.SubmitKeyPress(1007, false, false);
  766.         objTextView.focus();
  767.     }
  768. }
  769.  
  770. function doHyperlink(i_Name)
  771. {
  772.     submitControlChar(i_Name, "H");
  773. }
  774.  
  775. function startInterval(i_Name)
  776. {
  777.     for (var i = 0; i < g_arrIntervals.length; i++)
  778.     {
  779.         if (g_arrIntervals[i].Name == i_Name)
  780.         {
  781.             g_arrIntervals[i].Stop();
  782.             break;
  783.         }
  784.     }
  785.  
  786.     var Interval = new CommandBarInterval();
  787.     Interval.Start(i_Name);
  788.     g_arrIntervals.push(Interval);
  789. }
  790.  
  791. function stopInterval(i_Name)
  792. {
  793.     for (var i = 0; i < g_arrIntervals.length; i++)
  794.     {
  795.         if (g_arrIntervals[i].Name == i_Name)
  796.         {
  797.             g_arrIntervals[i].Stop();
  798.             g_arrIntervals[i] = null;
  799.             g_arrIntervals.splice(i, 1);
  800.         }
  801.     }
  802. }
  803.  
  804. function updateCommandBar(i_Name)
  805. {
  806.     var objTextView = document.getElementById(i_Name);
  807.     if (objTextView != null)
  808.     {
  809.         setCommandPressedState(i_Name + "Bold", objTextView.SelectionFont.Bold == tomTrue);
  810.         setCommandPressedState(i_Name + "Italic", objTextView.SelectionFont.Italic == tomTrue);
  811.         setCommandPressedState(i_Name + "Underline", objTextView.SelectionFont.Underline == tomSingle);
  812.         setCommandPressedState(i_Name + "AlignLeft", objTextView.TextCache.Document.Selection.Para.Alignment == tomAlignLeft);
  813.         setCommandPressedState(i_Name + "Center", objTextView.TextCache.Document.Selection.Para.Alignment == tomAlignCenter);
  814.         setCommandPressedState(i_Name + "AlignRight", objTextView.TextCache.Document.Selection.Para.Alignment == tomAlignRight);
  815.         setCommandPressedState(i_Name + "Justify", objTextView.TextCache.Document.Selection.Para.Alignment == tomAlignJustify);
  816.  
  817.         var ListType = objTextView.TextCache.Document.Selection.Para.ListType;
  818.         if (ListType == tomUndefined || ((ListType & 0xFFFF) != tomListBullet))
  819.             setCommandPressedState(i_Name + "Bullets", false);
  820.         else
  821.             setCommandPressedState(i_Name + "Bullets", true);
  822.  
  823.         setCommandDisabledState(i_Name + "Spellcheck", !objTextView.CanCheckSpelling);
  824.     }
  825. }
  826.  
  827. // Object to store command bar interval data.
  828. function CommandBarInterval()
  829. {
  830.     this.Name;
  831.     this.ID;
  832. }
  833.  
  834. CommandBarInterval.prototype.Start = IntervalStart;
  835. CommandBarInterval.prototype.Stop = IntervalStop;
  836.  
  837. function IntervalStart(i_Name)
  838. {
  839.     this.Name = i_Name;
  840.     this.ID = window.setInterval("updateCommandBar('" + i_Name + "')", 250);
  841. }
  842.  
  843. function IntervalStop()
  844. {
  845.     window.clearInterval(this.ID);
  846. }
  847.  
  848. // Attachment command bar button handlers.
  849. function doAddAttachments()
  850. {
  851.     try
  852.     {
  853.         if (g_AttachmentsObject != null && g_AttachmentsElement != null)
  854.             getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").AddAttachments(g_AttachmentsObject, g_AttachmentsElement);
  855.     }
  856.     catch (error)
  857.     {
  858.         var Priv = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate");
  859.         // IDS_FORMS_TOOL_JS_ATTACHMENT_SAVING_ERROR
  860.         getScriptHostQI("IGrooveFormsToolUIDelegate").DisplayError(Priv.GetResourcedString(IDS_FORMS_TOOL_JS_ATTACHMENT_SAVING_ERROR));
  861.     }
  862. }
  863.  
  864. function doDeleteSelectedAttachments()
  865. {
  866.     if (g_AttachmentsObject != null)
  867.         getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").DeleteAttachments(g_AttachmentsObject);
  868. }
  869.  
  870. function doLaunchSelectedAttachments()
  871. {
  872.     if (g_AttachmentsObject != null)
  873.         getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").LaunchAttachments(g_AttachmentsObject, g_AttachmentsObject.id, g_RecordID);
  874. }
  875.  
  876. function doSaveSelectedAttachments()
  877. {
  878.     if (g_AttachmentsObject != null)
  879.         getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").SaveAttachments(g_AttachmentsObject);
  880. }
  881.  
  882. // Add a trim method to the String object.
  883. String.prototype.trim = function()
  884. {
  885.     // Replace leading and trailing spaces with an empty string.
  886.     return this.replace(/(^\s*)|(\s*$)/g, "");
  887. }
  888.  
  889. // A utility function to get the top or left position of a given object.
  890. function getOffset(i_objPos, i_strDir)
  891. {
  892.     var intOffset = 0;
  893.     var objOffset = i_objPos;
  894.     while (objOffset.tagName != "BODY")
  895.     {
  896.         if (i_strDir == "top")
  897.             intOffset += objOffset.offsetTop;
  898.         else if (i_strDir == "left")
  899.             intOffset += objOffset.offsetLeft;
  900.  
  901.         objOffset = objOffset.offsetParent;
  902.     }
  903.     return intOffset;
  904. }
  905.  
  906. function showContactMenu(i_FieldName)
  907. {
  908.     g_ContactContextMenuFieldName = i_FieldName;
  909.  
  910.     window.event.cancelBubble = true;
  911.     window.event.returnValue = false;
  912.  
  913.     var XPos = window.event.screenX;
  914.     var YPos = window.event.screenY;
  915.  
  916.     window.setTimeout(function () { showContactMenuDelayed(i_FieldName, XPos, YPos); }, 100);
  917. }
  918.  
  919. function sendMessage(i_FieldName)
  920. {
  921.     window.event.cancelBubble = true;
  922.  
  923.     window.setTimeout(function () { sendMessageDelayed(i_FieldName); }, 100);
  924. }
  925.  
  926. function showContactMenuDelayed(i_FieldName, i_XPos, i_YPos)
  927. {
  928.     var ContactField = document.getElementById(i_FieldName);
  929.     if (ContactField != null)
  930.     {
  931.         var Contact = g_RegisteredContactFields[i_FieldName];
  932.         if (Contact != null)
  933.             getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").DisplayContactContextMenu(Contact, i_XPos, i_YPos, g_IsReadOnly);
  934.     }
  935. }
  936.  
  937. function executeContactCommand(i_CommandName)
  938. {
  939.     window.setTimeout(function () { executeContactCommandDelayed(i_CommandName); }, 100);
  940. }
  941.  
  942. function executeContactCommandDelayed(i_CommandName)
  943. {
  944.     var ContactField = document.getElementById(g_ContactContextMenuFieldName);
  945.     if (ContactField != null)
  946.     {
  947.         var ContactURL = ContactField.getAttribute("CONTACTURL");
  948.         var ContactURLEnum = CreateBSTREnumFromArray(new Array(ContactURL));
  949.  
  950.         // We have to make sure that the field is in the contact store.
  951.         ensureContactInStore(g_ContactContextMenuFieldName, ContactURL);
  952.  
  953.         var pMessagingServices = getScriptHostQI("IGrooveFormsToolMessagingServices");
  954.         var pContactServices = getScriptHostQI("IGrooveFormsToolContactServices");
  955.  
  956.         switch (i_CommandName)
  957.         {
  958.             case "SendMessage":
  959.                 pMessagingServices.DisplaySendInstantMessageDialog(ContactURLEnum);
  960.                 break;
  961.             case "InviteToWorkspace":
  962.                 pMessagingServices.DisplaySendInvitationDialog(ContactURLEnum);
  963.                 break;
  964.             case "SendAlertToComeHere":
  965.                 pMessagingServices.SendInvitation(ContactURLEnum);
  966.                 break;
  967.             case "Properties":
  968.                 pContactServices.DisplayContactProperties(ContactURL);
  969.                 break;
  970.             case "AddToMyContacts":
  971.             {
  972.                 if (pContactServices.DoesContactExist(ContactURL))
  973.                 {
  974.                     var Contact = pContactServices.OpenContact(ContactURL);
  975.                     pContactServices.AddContactToPersonalContacts(Contact);
  976.                 }
  977.                 break;
  978.             }
  979.             case "Remove":
  980.             {
  981.                 var Priv = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate");
  982.                 // IDS_FORMS_TOOL_JS_REMOVE_CONTACT_DLG and IDS_FORMS_TOOL_JS_REMOVE_CONTACT_TITLE
  983.                 if (getScriptHostQI("IGrooveFormsToolUIDelegate").DisplayYesNoMessageBox(Priv.GetResourcedString(IDS_FORMS_TOOL_JS_REMOVE_CONTACT_DLG), Priv.GetResourcedString(IDS_FORMS_TOOL_JS_REMOVE_CONTACT_TITLE)))
  984.                     removeContact(g_ContactContextMenuFieldName);
  985.  
  986.                 break;
  987.             }
  988.         }
  989.     }
  990. }
  991.  
  992. function removeContact(i_FieldName)
  993. {
  994.     var Contact = g_RegisteredContactFields[i_FieldName];
  995.  
  996.     // Unregister the contact.
  997.     unregisterContact(Contact, i_FieldName);
  998.     // Display the contact information for a contact.
  999.     displayContactInfo(null, i_FieldName, true);
  1000.     // Set the dirty bit when a contact is removed.
  1001.     setIsDirty();
  1002.     // Set the attribute on the field so we know that this is empty.
  1003.     var ContactField = document.getElementById(i_FieldName);
  1004.     if (ContactField != null)
  1005.     {
  1006.         ContactField.setAttribute("CONTACTTYPE", "removed");
  1007.         ContactField.removeAttribute("CONTACTURL");
  1008.     }
  1009.     // Call the _OnChange event so scripts can work on this.
  1010.     contactOnChangeEvent(i_FieldName, null, Contact);
  1011. }
  1012.  
  1013. function ensureContactInStore(i_FieldName, i_ContactURL)
  1014. {
  1015.     var ContactField = document.getElementById(i_FieldName);
  1016.     var Contact = g_RegisteredContactFields[i_FieldName];
  1017.     if (ContactField != null && Contact != null)
  1018.     {
  1019.         var ContactType = ContactField.getAttribute("CONTACTTYPE");
  1020.         if (ContactType == "temporary")
  1021.             return;
  1022.  
  1023.         if (g_IsReadOnly || (ContactType != "new" && ContactType != "temporary"))
  1024.         {
  1025.             var FormRecord = GetFormRecord();
  1026.             var FieldNameInline = i_FieldName + "_Inline";
  1027.             if (FormRecord.HasField(i_FieldName) && FormRecord.HasField(FieldNameInline))
  1028.             {
  1029.                 var IsContactInline = FormRecord.OpenField(FieldNameInline);
  1030.                 if (IsContactInline)
  1031.                 {
  1032.                     // Unregister the original contact.
  1033.                     unregisterContact(Contact, i_FieldName);
  1034.  
  1035.                     // Set the contact and inline fields to the record.
  1036.                     if (!g_IsReadOnly)
  1037.                         FormRecord.SetField(i_FieldName, Contact);
  1038.                     FormRecord.SetField(FieldNameInline, false);
  1039.  
  1040.                     // Display the contact information for the contact.
  1041.                     displayContactInfo(Contact, i_FieldName, true);
  1042.                 }
  1043.             }
  1044.         }
  1045.         else if (ContactType == "new")
  1046.         {
  1047.             // Unregister the original contact.
  1048.             unregisterContact(Contact, i_FieldName);
  1049.  
  1050.             // Set the attribute on the field so we know that this is temporary.
  1051.             ContactField.setAttribute("CONTACTTYPE", "temporary");
  1052.             // Add to the contact store as a temporary contact.
  1053.             var NewContact = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").AddTemporaryContactToStore(Contact);
  1054.  
  1055.             // Display the contact information for the new contact.
  1056.             displayContactInfo(NewContact, i_FieldName, true);
  1057.         }
  1058.     }
  1059. }
  1060.  
  1061. function sendMessageDelayed(i_FieldName)
  1062. {
  1063.     var ContactField = document.getElementById(i_FieldName);
  1064.     if (ContactField != null)
  1065.     {
  1066.         var ContactURL = ContactField.getAttribute("CONTACTURL");
  1067.         if (ContactURL != null && ContactURL != "")
  1068.         {
  1069.             var Contact = g_RegisteredContactFields[i_FieldName];
  1070.             if (Contact != null)
  1071.             {
  1072.                 if (Contact.IsGroovey)
  1073.                 {
  1074.                     // We have to make sure that the field is in the contact store.
  1075.                     ensureContactInStore(i_FieldName, ContactURL);
  1076.  
  1077.                     var ContactURLEnum = CreateBSTREnumFromArray(new Array(ContactURL));
  1078.                     getScriptHostQI("IGrooveFormsToolMessagingServices").DisplaySendInstantMessageDialog(ContactURLEnum);
  1079.                 }
  1080.             }
  1081.         }
  1082.     }
  1083. }
  1084.  
  1085. function selectContact(i_FieldName)
  1086. {
  1087.     var ContactField = document.getElementById(i_FieldName);
  1088.     if (ContactField != null)
  1089.     {
  1090.         var OriginalContact = g_RegisteredContactFields[i_FieldName];
  1091.  
  1092.         var Contact = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").DisplayContactSearchDialog();
  1093.         if (Contact != null)
  1094.         {
  1095.             // Unregister the original contact.
  1096.             unregisterSameContacts(Contact);
  1097.             // Display the contact information for the new contact.
  1098.             displayContactInfo(Contact, i_FieldName, true);
  1099.             // Set the dirty bit when a new contact is selected.
  1100.             setIsDirty();
  1101.             // Set the attribute on the field so we know that this is new.
  1102.             ContactField.setAttribute("CONTACTTYPE", "new");
  1103.             // Call the _OnChange event so scripts can work on this.
  1104.             contactOnChangeEvent(i_FieldName, Contact, OriginalContact);
  1105.         }
  1106.  
  1107.         validateRequired(ContactField);
  1108.     }
  1109. }
  1110.  
  1111. function contactOnChangeEvent(i_FieldName, i_Contact, i_OriginalContact)
  1112. {
  1113.     try
  1114.     {
  1115.         if (eval("typeof " + i_FieldName + "_OnChange") != "undefined")
  1116.             eval(i_FieldName + "_OnChange(i_Contact, i_OriginalContact)");
  1117.     }
  1118.     catch (error) {}
  1119. }
  1120.  
  1121. function setContactName(i_FieldName, i_Name)
  1122. {
  1123.     var ContactSpan = document.getElementById(i_FieldName + "_Name");
  1124.     if (ContactSpan != null)
  1125.         ContactSpan.innerText = i_Name;
  1126. }
  1127.  
  1128. function displayContactInfo(i_Contact, i_FieldName, i_ToBeRegistered)
  1129. {
  1130.     if (i_Contact != null)
  1131.     {
  1132.         var ContactField = document.getElementById(i_FieldName);
  1133.         if (ContactField != null)
  1134.         {
  1135.             ContactField.setAttribute("CONTACTURL", i_Contact.ContactURL);
  1136.  
  1137.             // Set the color of the contact text if we should.
  1138.             if (ContactField.getAttribute("USEAUTHENTICATIONCOLOR") != null)
  1139.                 ContactField.style.color = i_Contact.GetContactInfo(GrooveFormsToolContactOutputInformation_AuthenticationColorString);
  1140.  
  1141.             var ContactName = i_Contact.GetContactInfo(GrooveFormsToolContactOutputInformation_FullName);
  1142.             setContactName(i_FieldName, ContactName);
  1143.  
  1144.             displayAwarenessInfo(i_Contact, GrooveContactOnlineState_Offline, "Offline", 0, ContactField);
  1145.  
  1146.             // Register the contact for awareness updates if the icon is visible.
  1147.             if (i_ToBeRegistered)
  1148.                 registerContact(i_Contact, i_FieldName);
  1149.         }
  1150.     }
  1151.     else
  1152.     {
  1153.         // IDS_FORMS_TOOL_JS_NO_CONTACT_SELECTED
  1154.         var Priv = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate");
  1155.         setContactName(i_FieldName, Priv.GetResourcedString(IDS_FORMS_TOOL_JS_NO_CONTACT_SELECTED));
  1156.  
  1157.         var ContactField = document.getElementById(i_FieldName);
  1158.         if (ContactField != null)
  1159.         {
  1160.             ContactField.removeAttribute("CONTACTURL");
  1161.  
  1162.             ContactField.title = "";
  1163.             ContactField.style.color = "";
  1164.         }
  1165.  
  1166.         var ContactIcon = document.getElementById(i_FieldName + "_Icon");
  1167.         if (ContactIcon != null)
  1168.             ContactIcon.style.display = "none";
  1169.     }
  1170. }
  1171.  
  1172. function registerContact(i_Contact, i_FieldName)
  1173. {
  1174.     if (i_Contact != null)
  1175.     {
  1176.         // Add the field name to the list of registered contacts.
  1177.         g_RegisteredContactFields[i_FieldName] = i_Contact;
  1178.         // Register the contact in the UIDelegate to receive awareness updates.
  1179.         getScriptHostQI("IGrooveFormsToolAwarenessServicesPrivate").RegisterContact(i_Contact);
  1180.     }
  1181. }
  1182.  
  1183. function unregisterContact(i_Contact, i_FieldName)
  1184. {
  1185.     if (i_Contact != null)
  1186.     {
  1187.         // Remove the contact from the global array.
  1188.         delete g_RegisteredContactFields[i_FieldName];
  1189.         // Unregister the contact if there is not still a reference to it.
  1190.         getScriptHostQI("IGrooveFormsToolAwarenessServicesPrivate").UnregisterContact(i_Contact);
  1191.     }
  1192. }
  1193.  
  1194. function unregisterSameContacts(i_Contact)
  1195. {
  1196.     // Unregister all contacts that are the same so awareness will work.
  1197.     for (var FieldName in g_RegisteredContactFields)
  1198.     {
  1199.         if (g_RegisteredContactFields[FieldName] != null && i_Contact != null)
  1200.         {
  1201.             if (g_RegisteredContactFields[FieldName].ContactURL == i_Contact.ContactURL)
  1202.                 getScriptHostQI("IGrooveFormsToolAwarenessServicesPrivate").UnregisterContact(i_Contact);
  1203.         }
  1204.     }
  1205. }
  1206.  
  1207. function OnlineStateChanged2(i_Contact, i_OnlineState, i_StateText, i_TimeWentIdle)
  1208. {
  1209.     if (i_Contact != null)
  1210.     {
  1211.         for (var i = 0; i < g_ContactFields.length; i++)
  1212.         {
  1213.             displayAwarenessInfo(i_Contact, i_OnlineState, i_StateText, i_TimeWentIdle, g_ContactFields[i]);
  1214.         }
  1215.     }
  1216. }
  1217.  
  1218. function displayAwarenessInfo(i_Contact, i_OnlineState, i_StateText, i_TimeWentIdle, i_ContactField)
  1219. {
  1220.     if (i_Contact != null)
  1221.     {
  1222.         var ContactURL = i_Contact.ContactURL;
  1223.         if (i_ContactField != null && i_ContactField.getAttribute("CONTACTURL") == ContactURL)
  1224.         {
  1225.             if (i_ContactField.getAttribute("ISAWARENESSICONHIDDEN") == null)
  1226.             {
  1227.                 var ContactIcon = document.getElementById(i_ContactField.id + "_Icon");
  1228.                 if (ContactIcon != null)
  1229.                 {
  1230.                     var IconSrc = "../../../ToolIcons/PersonalContact.ico";
  1231.                     if (i_Contact.IsGroovey)
  1232.                     {
  1233.                         switch (i_OnlineState)
  1234.                         {
  1235.                             case GrooveContactOnlineState_OnlineAvailable:
  1236.                             {
  1237.                                 if (i_TimeWentIdle > 0)
  1238.                                     IconSrc = "../../../ToolIcons/OnlineIdle.ico";
  1239.                                 else
  1240.                                     IconSrc = "../../../ToolIcons/OnLine.ico";
  1241.  
  1242.                                 break;
  1243.                             }
  1244.                             case GrooveContactOnlineState_Offline:
  1245.                                 IconSrc = "../../../ToolIcons/Offline.ico";
  1246.                                 break;
  1247.                         }
  1248.                     }
  1249.  
  1250.                     ContactIcon.src = IconSrc;
  1251.                     ContactIcon.style.display = "inline";
  1252.                 }
  1253.  
  1254.                 i_ContactField.setAttribute("TIMEWENTIDLE", i_TimeWentIdle);
  1255.             }
  1256.  
  1257.             updateContactTooltip(i_ContactField, i_Contact, i_TimeWentIdle);
  1258.         }
  1259.     }
  1260. }
  1261.  
  1262. function updateIdleTime(i_FieldName)
  1263. {
  1264.     var ContactField = document.getElementById(i_FieldName);
  1265.     if (ContactField != null)
  1266.     {
  1267.         var TimeWentIdle = ContactField.getAttribute("TIMEWENTIDLE");
  1268.         if (TimeWentIdle > 1)
  1269.         {
  1270.             var ContactURL = ContactField.getAttribute("CONTACTURL");
  1271.             if (ContactURL != "")
  1272.             {
  1273.                 var Contact = g_RegisteredContactFields[i_FieldName];
  1274.                 if (Contact != null)
  1275.                     updateContactTooltip(ContactField, Contact, TimeWentIdle);
  1276.             }
  1277.         }
  1278.     }
  1279. }
  1280.  
  1281. function updateContactTooltip(i_ContactField, i_Contact, i_TimeWentIdle)
  1282. {
  1283.     if (i_ContactField != null && i_Contact != null)
  1284.     {
  1285.         var sFullName = i_Contact.GetContactInfo(GrooveFormsToolContactOutputInformation_FullName);
  1286.         var sAlias    = i_Contact.GetContactInfo(GrooveFormsToolContactOutputInformation_Alias);
  1287.         var sOrg      = i_Contact.GetContactInfo(GrooveFormsToolContactOutputInformation_OrganizationName);
  1288.         var sTip      = i_Contact.GetContactInfo(GrooveFormsToolContactOutputInformation_AuthenticationTooltip);
  1289.  
  1290.         var Priv = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate");
  1291.  
  1292.         var sToolTip = sFullName;
  1293.         {
  1294.             if (sAlias && sAlias != sFullName)
  1295.                 sToolTip = sAlias + "\n" + sAlias;
  1296.             if (sOrg)
  1297.                 sToolTip = sToolTip + "\n" + sOrg;
  1298.             if (sTip)
  1299.                 sToolTip = sToolTip + "\n" + sTip;
  1300.  
  1301.             if (i_TimeWentIdle > 1)
  1302.             {
  1303.                 var Minutes = Math.floor((new Date().valueOf() - i_TimeWentIdle ) / 60000);
  1304.                 var Hours = Math.floor(Minutes / 60);
  1305.                 var IdleText = "";
  1306.  
  1307.                 if (Hours < 24)
  1308.                 {
  1309.                     Minutes %= 60;
  1310.                     if (Hours == 1)
  1311.                     {
  1312.                         if (Minutes > 0)
  1313.                         {
  1314.                             // IDS_FORMS_TOOL_JS_IDLE_ONE_HOUR_MINUTES
  1315.                             var MsgFormatEnum = CreateBSTREnumFromArray([Minutes]);
  1316.                             IdleText = Priv.MessageFormat(IDS_FORMS_TOOL_JS_IDLE_ONE_HOUR_MINUTES, MsgFormatEnum);
  1317.                         }
  1318.                         else
  1319.                             // IDS_FORMS_TOOL_JS_IDLE_ONE_HOUR
  1320.                             IdleText = Priv.GetResourcedString(IDS_FORMS_TOOL_JS_IDLE_ONE_HOUR);
  1321.                     }
  1322.                     else if (Hours > 1)
  1323.                     {
  1324.                         if (Minutes > 0)
  1325.                         {
  1326.                             // IDS_FORMS_TOOL_JS_IDLE_HOURS_MINUTES
  1327.                             var MsgFormatEnum = CreateBSTREnumFromArray([Hours, Minutes]);
  1328.                             IdleText = Priv.MessageFormat(IDS_FORMS_TOOL_JS_IDLE_HOURS_MINUTES, MsgFormatEnum);
  1329.                         }
  1330.                         else
  1331.                         {
  1332.                             // IDS_FORMS_TOOL_JS_IDLE_HOURS
  1333.                             var MsgFormatEnum = CreateBSTREnumFromArray([Hours]);
  1334.                             IdleText = Priv.MessageFormat(IDS_FORMS_TOOL_JS_IDLE_HOURS, MsgFormatEnum);
  1335.                         }
  1336.                     }
  1337.                     else
  1338.                     {
  1339.                         // IDS_FORMS_TOOL_JS_IDLE_MINUTES
  1340.                         var MsgFormatEnum = CreateBSTREnumFromArray([Minutes]);
  1341.                         IdleText = Priv.MessageFormat(IDS_FORMS_TOOL_JS_IDLE_MINUTES, MsgFormatEnum);
  1342.                     }
  1343.                 }
  1344.                 else
  1345.                 {
  1346.                     // IDS_FORMS_TOOL_JS_IDLE_SINCE
  1347.                     var MsgFormatEnum = CreateBSTREnumFromArray([GetApp().FormatDateTime(i_TimeWentIdle, GrooveIntlDateFormatStyle_Default, GrooveIntlDateFormatStyle_Default)]);
  1348.                     IdleText = Priv.MessageFormat(IDS_FORMS_TOOL_JS_IDLE_SINCE, MsgFormatEnum);
  1349.                 }
  1350.                 sToolTip += IdleText;
  1351.             }
  1352.         }
  1353.  
  1354.         i_ContactField.title = sToolTip;
  1355.     }
  1356. }
  1357.  
  1358. // === tab handlers ================
  1359. // these functions handle tab events
  1360.  
  1361. function tabClick(i_objTab, i_objTabGroup)
  1362. {
  1363.     var strOldTabName = i_objTabGroup.ActiveTabName;
  1364.     var strNewTabName = i_objTab.id;
  1365.     if (strNewTabName != strOldTabName)
  1366.     {
  1367.         var objOldTab = document.getElementById(strOldTabName);
  1368.         if (objOldTab != null)
  1369.             objOldTab.className = "inactiveTab";
  1370.         var objOldTabContents = document.getElementById(strOldTabName + "Contents");
  1371.         if (objOldTabContents != null)
  1372.             objOldTabContents.style.display = "none";
  1373.  
  1374.         i_objTab.className = "activeTab";
  1375.         var objNewTabContents = document.getElementById(strNewTabName + "Contents");
  1376.         if (objNewTabContents != null)
  1377.             objNewTabContents.style.display = "block";
  1378.  
  1379.         i_objTabGroup.ActiveTabName = strNewTabName;
  1380.  
  1381.         int_RefreshErrorIcons();
  1382.     }
  1383.  
  1384.     event.cancelBubble = true;
  1385. }
  1386.  
  1387. // Misc functions
  1388. function getUniqueID()
  1389. {
  1390.     return int_getUniqueID();
  1391. }
  1392.  
  1393. function int_getUniqueID()
  1394. {
  1395.     // format is firstpart-second part where first part is:
  1396.     //     First letter of first name+ first two letters of last name + last letter
  1397.     // Last part is:
  1398.     //    Number of ticks- always increasing so entries you create are always ascending
  1399.     //    in sequence.
  1400.     // Example: JOZE-5WWTYC
  1401.  
  1402.     // Extract ticks in milliseconds, converted to base16 uppercase string
  1403.     var d = new Date();
  1404.     var HexMilliseconds = d.getTime().toString(16);
  1405.     HexMilliseconds = HexMilliseconds.toUpperCase();
  1406.  
  1407.     // take the high order characters, e.g. the last nine characters 
  1408.     var HexUnique = HexMilliseconds.slice(-9);
  1409.  
  1410.     // get current user name
  1411.     var UserName = getScriptHostQI("IGrooveFormsToolUIDelegate").CurrentAuthorName;
  1412.  
  1413.     // clean the name.  First replace x.500 OU slashes with spaces
  1414.     var filteredUserName = UserName.replace(/\//,"\x20");
  1415.  
  1416.     // upcase
  1417.     filteredUserName = filteredUserName.toUpperCase();
  1418.  
  1419.     // handle special cases for name for short length
  1420.     var AlphaUnique;
  1421.     if (filteredUserName.length <= 4)
  1422.     {
  1423.         AlphaUnique = filteredUserName;
  1424.     }
  1425.     else
  1426.     {
  1427.         // split the username into it's possible token parts. 
  1428.  
  1429.         // Use the first and second tokens as likely unique first name, last name.
  1430.         // It's possible in the worst case to have first/middle/last/OU/.../, but 
  1431.         // just use first two tokens since we don't have specific structured 
  1432.         // fields in the user name -it's just a string!
  1433.  
  1434.         // split tokens separated by one or more spaces
  1435.         var TokenArray = filteredUserName.split(/\s+/);
  1436.         
  1437.         // first char of 1st token
  1438.         var Prefix1 = TokenArray[0].slice(0,1); 
  1439.  
  1440.         // first 2 chars of 2nd token if there is one, else remainder of 1st token
  1441.         var Prefix2;
  1442.         if (TokenArray.length > 1 && TokenArray[1].length >= 2)
  1443.         {
  1444.             Prefix2 = TokenArray[1].slice(0,2);
  1445.  
  1446.             // last char of 2nd token
  1447.             LastChar = TokenArray[1].slice(-1);
  1448.  
  1449.             Prefix2 = Prefix2+LastChar;
  1450.         }
  1451.         else
  1452.             Prefix2 = TokenArray[0].slice(1,2);
  1453.  
  1454.         AlphaUnique = Prefix1 + Prefix2;
  1455.     }
  1456.  
  1457.     return (AlphaUnique + "-" + HexUnique);
  1458. }
  1459.  
  1460. function grooveNavigate(i_URL)
  1461. {
  1462.     getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").GrooveNavigate(i_URL);
  1463. }
  1464.  
  1465. function int_GetLookupStringForObject(i_ObjectName)
  1466. {
  1467.     var TargetString = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").GetLookupTargetString(i_ObjectName);
  1468.     return TargetString;
  1469. }
  1470.  
  1471. function int_GetLookupStringForObjectFromMacro(i_ObjectName, i_FormsToolUIDelegate)
  1472. {
  1473.     var TargetString = i_FormsToolUIDelegate.IGrooveFormsToolUIDelegatePrivate.GetLookupTargetString(i_ObjectName);
  1474.     return TargetString;
  1475. }
  1476.  
  1477. // Pass through functions called from PublicFunctions.js.
  1478. function int_GetApp()
  1479. {
  1480.     return getScriptHostQI("IGrooveFormsToolUIDelegate");
  1481. }
  1482.  
  1483. function int_CreateBSTREnumFromArray(i_Array)
  1484. {
  1485.     var BSTREnumCreate = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").CreateBSTREnum();
  1486.     
  1487.     for (var i = 0; i < i_Array.length; i++)
  1488.     {
  1489.         BSTREnumCreate.IGrooveBSTREnumCreate.Add(i_Array[i]);
  1490.     }
  1491.     
  1492.     return BSTREnumCreate.IGrooveBSTREnum;
  1493. }
  1494.  
  1495. function int_SetFieldLabel(i_FieldName, i_Label)
  1496. {
  1497.     var objCell = null;
  1498.     var objLabelCell = document.getElementById(i_FieldName + "_label");
  1499.     if (objLabelCell != null)
  1500.         objCell = objLabelCell;
  1501.     else
  1502.     {
  1503.         var objFieldCell = document.getElementById(i_FieldName + "_field");
  1504.         if (objFieldCell != null)
  1505.             objCell = objFieldCell;
  1506.     }
  1507.  
  1508.     if (objCell != null)
  1509.     {
  1510.         // Get the font tag if this is a standard field, otherwise
  1511.         // this is a field in a field group.
  1512.         if (objCell.tagName == "TD")
  1513.         {
  1514.             var arrFont = objCell.getElementsByTagName("FONT");
  1515.             if (arrFont.length > 0)
  1516.                 objCell = arrFont[0];
  1517.         }
  1518.  
  1519.         objCell.innerText = i_Label;
  1520.     }
  1521. }
  1522.  
  1523. function int_HideField(i_FieldName, i_bHide)
  1524. {
  1525.     var objLabel = document.getElementById(i_FieldName + "_label");
  1526.     if (objLabel != null)
  1527.     {
  1528.         if (i_bHide)
  1529.             objLabel.style.display = "none"
  1530.         else
  1531.             objLabel.style.display = "inline";
  1532.     }
  1533.  
  1534.     var objField = document.getElementById(i_FieldName + "_field");
  1535.     if (objField != null)
  1536.     {
  1537.         if (i_bHide)
  1538.             objField.style.display = "none"
  1539.         else
  1540.             objField.style.display = "inline";
  1541.     }
  1542. }
  1543.  
  1544. function int_DisableField(i_FieldName, i_bDisable)
  1545. {
  1546.     var objField = document.getElementById(i_FieldName);
  1547.     if (objField != null && typeof objField.disabled != "undefined")
  1548.     {
  1549.         var intFieldType = objField.getAttribute("FIELDTYPE");
  1550.         if (intFieldType == FormObjectType_RichText)
  1551.             int_DisableRichTextField(objField, i_bDisable);
  1552.         else if (intFieldType == FormObjectType_Attachments)
  1553.             int_DisableAttachmentsField(objField, i_bDisable);
  1554.         else
  1555.             objField.disabled = i_bDisable;
  1556.  
  1557.         // Disable associated button if field has one.
  1558.         if (intFieldType == FormObjectType_DropDownList)
  1559.         {
  1560.             if (objField.getAttribute("CUSTOM") != null)
  1561.             {
  1562.                 var objCustomButton = document.getElementById(i_FieldName + "Button");
  1563.                 if (objCustomButton != null)
  1564.                     objCustomButton.disabled = i_bDisable;
  1565.             }
  1566.         }
  1567.         else if (intFieldType == FormObjectType_Date || intFieldType == FormObjectType_DateTime || intFieldType == FormObjectType_Contact)
  1568.         {
  1569.             var objCalendarButton = document.getElementById(i_FieldName + "Button");
  1570.             if (objCalendarButton != null)
  1571.                 objCalendarButton.disabled = i_bDisable;
  1572.         }
  1573.     }
  1574. }
  1575.  
  1576. function int_DisableRichTextField(i_Field, i_bDisable)
  1577. {
  1578.     var FieldName = i_Field.id;
  1579.     setCommandDisabledState(FieldName + "Bold", i_bDisable);
  1580.     setCommandDisabledState(FieldName + "Italic", i_bDisable);
  1581.     setCommandDisabledState(FieldName + "Underline", i_bDisable);
  1582.     setCommandDisabledState(FieldName + "ChooseFont", i_bDisable);
  1583.     setCommandDisabledState(FieldName + "ChooseColor", i_bDisable);
  1584.     setCommandDisabledState(FieldName + "AlignLeft", i_bDisable);
  1585.     setCommandDisabledState(FieldName + "Center", i_bDisable);
  1586.     setCommandDisabledState(FieldName + "AlignRight", i_bDisable);
  1587.     setCommandDisabledState(FieldName + "Justify", i_bDisable);
  1588.     setCommandDisabledState(FieldName + "Bullets", i_bDisable);
  1589.     setCommandDisabledState(FieldName + "IncreaseIndent", i_bDisable);
  1590.     setCommandDisabledState(FieldName + "DecreaseIndent", i_bDisable);
  1591.     setCommandDisabledState(FieldName + "SpellCheck", i_bDisable);
  1592.     setCommandDisabledState(FieldName + "Hyperlink", i_bDisable);
  1593.  
  1594.     i_Field.ReadOnly = i_bDisable;
  1595.  
  1596.     if (i_bDisable)
  1597.         i_Field.setAttribute("ISDISABLEDBYSCRIPT", "true");
  1598.     else
  1599.         i_Field.removeAttribute("ISDISABLEDBYSCRIPT");
  1600. }
  1601.  
  1602. function int_DisableAttachmentsField(i_Field, i_bDisable)
  1603. {
  1604.     var FieldName = i_Field.id;
  1605.     setCommandDisabledState(FieldName + "Add", i_bDisable);
  1606.     setCommandDisabledState(FieldName + "Delete", i_bDisable);
  1607.  
  1608.     i_Field.Properties.SetIsDragDropTarget(!i_bDisable);
  1609.     i_Field.Properties2.SetReadOnlyMode(i_bDisable);
  1610.  
  1611.     if (i_bDisable)
  1612.         i_Field.setAttribute("ISDISABLEDBYSCRIPT", "true");
  1613.     else
  1614.         i_Field.removeAttribute("ISDISABLEDBYSCRIPT");
  1615. }
  1616.  
  1617. function int_RefreshErrorIcons()
  1618. {
  1619.     // Blur all fields that have errors to re-validate.
  1620.     var arrFields = new Array();
  1621.     for (var i = 0; i < g_arrErrors.length; i++)
  1622.     {
  1623.         var objError = g_arrErrors[i];
  1624.         var objField = document.getElementById(objError.FieldName);
  1625.         if (objField != null)
  1626.             arrFields.push(objField);
  1627.     }
  1628.  
  1629.     for (var i = 0; i < arrFields.length; i++)
  1630.     {
  1631.         arrFields[i].fireEvent("onblur");
  1632.     }
  1633. }
  1634.  
  1635. function int_RefreshPreviewPane()
  1636. {
  1637.     if (g_IsPreviewPane)
  1638.         initFormPage(g_RecordID);
  1639. }
  1640.  
  1641. function int_GetIsNew() { return g_IsNew; }
  1642. function int_GetIsSearch() { return g_IsSearch; }
  1643. function int_GetIsFormPreview() { return g_IsFormPreview; }
  1644. function int_GetIsPreviewPane() { return g_IsPreviewPane; }
  1645. function int_GetIsReadOnly() { return g_IsReadOnly; }
  1646. function int_GetIsResponse() { return g_IsResponse; }
  1647. function int_GetIsVersioned() { return g_IsVersioned; }
  1648. function int_GetRecordID() { return g_RecordID; }
  1649. function int_GetFormID() { return g_FormID; }
  1650. function int_GetSelectedID() { return g_SelectedID; }
  1651. function int_GetFormRecord() { return g_FormRecord; }
  1652.  
  1653. function int_OpenThisRecord()
  1654. {
  1655.     if (g_IsPreviewPane)
  1656.     {
  1657.         var SelectedID = -1;
  1658.         if (g_FormRecord)
  1659.             SelectedID = g_FormRecord.OpenField("_ParentID");
  1660.  
  1661.         GetApp().NavigateToForm(g_FormID, g_RecordID, SelectedID);
  1662.     }
  1663. }
  1664.  
  1665. function int_GetHTMLFieldValue(i_FieldName)
  1666. {
  1667.     var FieldValue = "";
  1668.  
  1669.     var Field = document.getElementById(i_FieldName);
  1670.     if (Field != null)
  1671.     {
  1672.         var FieldType = Field.type;
  1673.         if (FieldType == "text" || FieldType == "textarea" || FieldType == "password")
  1674.         {
  1675.             FieldValue = Field.value;
  1676.         }
  1677.         else if (FieldType == "checkbox")
  1678.         {
  1679.             if (Field.checked)
  1680.                 FieldValue = Field.value;
  1681.         }
  1682.         else if (FieldType == "select-one")
  1683.         {
  1684.             var SelectedIndex = Field.selectedIndex;
  1685.             if (SelectedIndex >= 0)
  1686.                 FieldValue = Field.options[SelectedIndex].value;
  1687.         }
  1688.         else if (FieldType == "select-multiple")
  1689.         {
  1690.             for (var i = 0; i < Field.options.length; i++)
  1691.             {
  1692.                 if (Field.options[i].selected)
  1693.                 {
  1694.                     var TempValue = Field.options[i].value;
  1695.                     if (TempValue == "")
  1696.                         TempValue = Field.options[i].text;
  1697.  
  1698.                     if (FieldValue != "")
  1699.                         FieldValue += "\n" + TempValue;
  1700.                     else
  1701.                         FieldValue += TempValue;
  1702.                 }
  1703.             }
  1704.         }
  1705.         else if (FieldType == "radio")
  1706.         {
  1707.             var RadioField = document.GrooveFormBase[i_FieldName];
  1708.             if (RadioField != null)
  1709.             {
  1710.                 for (var i = 0; i < RadioField.length; i++)
  1711.                 {
  1712.                     if (RadioField[i].checked)
  1713.                     {
  1714.                         FieldValue = RadioField[i].value;
  1715.                         break;
  1716.                     }
  1717.                 }
  1718.             }
  1719.         }
  1720.     }
  1721.  
  1722.     return FieldValue;
  1723. }
  1724.  
  1725. function int_GetHTMLFieldValueAsNumber(i_FieldName)
  1726. {
  1727.     var FieldValue = 0;
  1728.  
  1729.     var Field = document.getElementById(i_FieldName);
  1730.     if (Field != null)
  1731.     {
  1732.         var FieldType = Field.type;
  1733.         var FieldDataType = Field.getAttribute("DATATYPE");
  1734.  
  1735.         if (FieldType == "text" && FieldDataType == "Numeric")
  1736.         {
  1737.             var TempValue = Field.value;
  1738.             if (typeof TempValue != "undefined" && TempValue != null && TempValue != "")
  1739.                 FieldValue = getValidNumber(Field);
  1740.         }
  1741.     }
  1742.  
  1743.     return FieldValue;
  1744. }
  1745.  
  1746. function int_GetHTMLFieldValueAsDate(i_FieldName)
  1747. {
  1748.     var FieldValue = INVALID_DATE;
  1749.  
  1750.     var Field = document.getElementById(i_FieldName);
  1751.     if (Field != null)
  1752.     {
  1753.         var FieldType = Field.type;
  1754.         var FieldDataType = Field.getAttribute("DATATYPE");
  1755.  
  1756.         if (FieldType == "text" && FieldDataType == "Date")
  1757.         {
  1758.             var DateFormat = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").CreateDateFormatStyleFromAttributeValue(Field.getAttribute("FORMAT"));
  1759.             FieldValue = getValidDateMillis(Field.value, DateFormat, Field);
  1760.         }
  1761.     }
  1762.  
  1763.     return FieldValue;
  1764. }
  1765.  
  1766. function int_SetHTMLFieldValue(i_FieldName, i_Value)
  1767. {
  1768.     var Field = document.getElementById(i_FieldName);
  1769.     if (Field != null)
  1770.     {
  1771.         var FieldType = Field.type;
  1772.  
  1773.         if (FieldType == "text" || FieldType == "textarea" || FieldType == "password")
  1774.         {
  1775.             Field.value = i_Value;
  1776.         }
  1777.         else if (FieldType == "checkbox")
  1778.         {
  1779.             if (i_Value != "")
  1780.                 Field.checked = true;
  1781.             else
  1782.                 Field.checked = false;
  1783.         }
  1784.         else if (FieldType == "select-one")
  1785.         {
  1786.             for (var i = 0; i < Field.options.length; i++)
  1787.             {
  1788.                 if (Field.options[i].value == i_Value)
  1789.                 {
  1790.                     Field.options[i].selected = true;
  1791.                     break;
  1792.                 }
  1793.             }
  1794.         }
  1795.         else if (FieldType == "select-multiple")
  1796.         {
  1797.             var ElementValueArray = i_Value.split("\n");
  1798.             for (var i = 0; i < ElementValueArray.length; i++)
  1799.             {
  1800.                 for (var j = 0; j < Field.options.length; j++)
  1801.                 {
  1802.                     if (Field.options[j].value == ElementValueArray[i])
  1803.                     {
  1804.                         Field.options[j].selected = true;
  1805.                         break;
  1806.                     }
  1807.                 }
  1808.             }
  1809.         }
  1810.         else if (FieldType == "radio")
  1811.         {
  1812.             var RadioField = document.GrooveFormBase[i_FieldName];
  1813.             if (RadioField)
  1814.             {
  1815.                 for (var i = 0; i < RadioField.length; i++)
  1816.                 {
  1817.                     if (RadioField[i].value == i_Value)
  1818.                     {
  1819.                         RadioField[i].checked = true;
  1820.                         break;
  1821.                     }
  1822.                 }
  1823.             }
  1824.         }
  1825.     }
  1826. }
  1827.  
  1828. function int_SetHTMLFieldValueAsNumber(i_FieldName, i_Value)
  1829. {
  1830.     var Field = document.getElementById(i_FieldName);
  1831.     if (Field != null)
  1832.     {
  1833.         var FieldName = Field.id;
  1834.         var FieldDataType = Field.getAttribute("DATATYPE");
  1835.  
  1836.         if (FieldDataType == "Numeric")
  1837.         {
  1838.             var FieldValue = "";
  1839.  
  1840.             var FieldTypeAttribute = Field.getAttribute("FIELDTYPE");
  1841.             if (FieldTypeAttribute == FormObjectType_Number)
  1842.                 FieldValue = formatNumericValue(Field, i_Value);
  1843.             else if (FieldTypeAttribute == FormObjectType_Currency)
  1844.                 FieldValue = formatCurrencyValue(Field, i_Value);
  1845.  
  1846.             Field.value = FieldValue;
  1847.         }
  1848.     }
  1849. }
  1850.  
  1851. function int_SetHTMLFieldValueAsDate(i_FieldName, i_Value)
  1852. {
  1853.     var Field = document.getElementById(i_FieldName);
  1854.     if (Field != null)
  1855.     {
  1856.         var FieldName = Field.id;
  1857.         var FormatAttribute = Field.getAttribute("FORMAT");
  1858.  
  1859.         var DateFormat = getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").CreateDateFormatStyleFromAttributeValue(FormatAttribute);
  1860.         var NumberValue = Number(i_Value);
  1861.         if (!isNaN(NumberValue))
  1862.         {
  1863.             var FieldTypeAttribute = Field.getAttribute("FIELDTYPE");
  1864.             if (FieldTypeAttribute == FormObjectType_DateTime)
  1865.             {
  1866.                 var DateTimeEnum = getScriptHostQI("IGrooveFormsToolUIDelegatePrivate").FormatDateAndTime(NumberValue, DateFormat, 3);
  1867.                 if (DateTimeEnum.HasMore())
  1868.                     DateValue = DateTimeEnum.OpenNext();
  1869.                 if (DateTimeEnum.HasMore())
  1870.                     TimeValue = DateTimeEnum.OpenNext();
  1871.             }
  1872.             else
  1873.                 DateValue = getScriptHostQI("IGrooveFormsToolUIDelegate").FormatDate(NumberValue, DateFormat);
  1874.         }
  1875.  
  1876.         Field.value = DateValue;
  1877.         if (FieldTypeAttribute == FormObjectType_DateTime)
  1878.         {
  1879.             var TimeElement = document.getElementById(FieldName + "_Time");
  1880.             if (TimeElement != null)
  1881.                 TimeElement.value = TimeValue;
  1882.         }
  1883.     }
  1884. }
  1885.  
  1886. function int_InsertBSTREnumIntoListField(i_BSTREnum, i_FieldName, i_bAllowDuplicates)
  1887. {
  1888.     var Field = document.getElementById(i_FieldName);
  1889.     if (Field != null)
  1890.     {
  1891.         while (i_BSTREnum.HasMore())
  1892.         {
  1893.             var Value = i_BSTREnum.OpenNext();
  1894.             if (!i_bAllowDuplicates)
  1895.             {
  1896.                 var bDuplicateFound = false;
  1897.                 for (var i = 0; i < Field.options.length; i++)
  1898.                 {
  1899.                     if (Field.options[i].value == Value)
  1900.                     {
  1901.                         bDuplicateFound = true;
  1902.                         break;
  1903.                     }
  1904.                 }
  1905.  
  1906.                 if (bDuplicateFound)
  1907.                     continue;
  1908.             }
  1909.  
  1910.             var NewOption = document.createElement("OPTION");
  1911.             NewOption.value = Value;
  1912.             if (Value.length > 100)
  1913.                 Value = Value.substring(0, 96) + "...";
  1914.             NewOption.text = Value;
  1915.             Field.options.add(NewOption);
  1916.         }
  1917.     }
  1918. }
  1919.  
  1920. function int_DoesFunctionExist(i_FunctionName)
  1921. {
  1922.     if (eval("typeof " + i_FunctionName) == "function")
  1923.         return true;
  1924.     else
  1925.         return false;
  1926. }
  1927.  
  1928. function int_IsValidDate(i_Value)
  1929. {
  1930.     if (i_Value != INVALID_DATE)
  1931.         return true;
  1932.     else
  1933.         return false;
  1934. }
  1935.  
  1936. function int_HasValidationErrors()
  1937. {
  1938.     if (g_arrErrors.length > 0)
  1939.         return true;
  1940.     else
  1941.         return false;
  1942. }
  1943.  
  1944. function int_SetContactFieldValue(i_FieldName, i_Contact)
  1945. {
  1946.     if (i_Contact != null)
  1947.     {
  1948.         var ContactField = document.getElementById(i_FieldName);
  1949.         if (ContactField != null)
  1950.         {
  1951.             // Unregister the original contact.
  1952.             unregisterContact(g_RegisteredContactFields[i_FieldName], i_FieldName);
  1953.             // Display the contact information for the new contact.
  1954.             displayContactInfo(i_Contact, i_FieldName, true);
  1955.             // Set the dirty bit when a new contact is selected.
  1956.             setIsDirty();
  1957.             // Set the attribute on the field so we know that this is new.
  1958.             ContactField.setAttribute("CONTACTTYPE", "new");
  1959.         }
  1960.     }
  1961.     else
  1962.         removeContact(i_FieldName);
  1963. }
  1964.  
  1965. function int_GetContactFieldValue(i_FieldName)
  1966. {
  1967.     return g_RegisteredContactFields[i_FieldName];
  1968. }
  1969.  
  1970. function int_GetAttachmentCount()
  1971. {
  1972.     try
  1973.     {
  1974.         if (g_AttachmentsElement != null)
  1975.             return getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").GetAttachmentCount(g_AttachmentsElement);
  1976.         else
  1977.             return null;
  1978.     }
  1979.     catch(error)
  1980.     {
  1981.         return null;
  1982.     }
  1983. }
  1984.  
  1985. function int_LoadAddAttachmentDialog()
  1986. {
  1987.     try
  1988.     {
  1989.         if (g_AttachmentsObject != null && g_AttachmentsElement != null)
  1990.             getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").AddAttachments(g_AttachmentsObject, g_AttachmentsElement);
  1991.         else if (g_AttachmentsObject != null && g_AttachmentsElement == null)
  1992.             window.setTimeout("int_LoadAddAttachmentDialog()", 250);
  1993.     }
  1994.     catch (error)
  1995.     {
  1996.     }
  1997. }
  1998.  
  1999. function int_CreateAttachmentsNameSizeEnum()
  2000. {
  2001.    try
  2002.    {
  2003.         if (g_AttachmentsElement != null)
  2004.            return getScriptHostQI("IGrooveFormsToolUIDelegateFormPrivate").CreateAttachmentsNameSizeEnum(g_AttachmentsElement);
  2005.         else
  2006.             return null;
  2007.    }
  2008.    catch(error)
  2009.    {
  2010.         return null;
  2011.    } 
  2012. }
  2013.  
  2014. // These functions used to be in PublicFunctions.js, so a copy is left here for
  2015. // backward compatibility.
  2016. function NavigateToForm(i_FormID, i_RecordID, i_SelectedID)
  2017. {
  2018.     if (typeof i_RecordID == "undefined" || i_RecordID == null)
  2019.         i_RecordID = -1;
  2020.     if (typeof i_SelectedID == "undefined" || i_SelectedID == null)
  2021.         i_SelectedID = -1;
  2022.  
  2023.     getScriptHostQI("IGrooveFormsToolUIDelegate").NavigateToForm(i_FormID, i_RecordID, i_SelectedID);
  2024. }
  2025.  
  2026. function NavigateToView(i_ViewID)
  2027. {
  2028.     getScriptHostQI("IGrooveFormsToolUIDelegate").NavigateToView(i_ViewID);
  2029. }
  2030.