prompting.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| BI and PM: prmt
  5. *| (C) Copyright IBM Corp. 2002, 2021
  6. *|
  7. *| US Government Users Restricted Rights - Use, duplication or
  8. *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  9. *|
  10. *+------------------------------------------------------------------------+
  11. */
  12. /*
  13. TEMPORARILY DUPLICATE CONTENT OF constants.js HERE FOR STUDIOS USING prompting.js
  14. */
  15. var K_PRMT_DEBUG = 0;
  16. var K_PRMT_DEBUG_TABLEBORDER = 0;
  17. var K_PRMT_sAPOS = "'";
  18. var K_PRMT_sEMPTY = "";
  19. var K_PRMT_sBACKSLASH = "\\";
  20. var K_PRMT_sCOLON = ":";
  21. var K_PRMT_sDBL_BACKSLASH = K_PRMT_sBACKSLASH + K_PRMT_sBACKSLASH;
  22. var K_PRMT_sDOT = ".";
  23. var K_PRMT_sEQ_QU = '="';
  24. var K_PRMT_sG = "g";
  25. var K_PRMT_sGI = "gi";
  26. var K_PRMT_sGT = ">";
  27. var K_PRMT_sLT = "<";
  28. var K_PRMT_sSL = "/";
  29. var K_PRMT_sSP = " ";
  30. var K_PRMT_sQU = '"';
  31. var K_PRMT_sQU_encoded = "&quot;";
  32. var K_PRMT_sLT_SL = K_PRMT_sLT + K_PRMT_sSL;
  33. var K_PRMT_sIMG_ERROR_PREFIX = "PRMT_IMG_ERROR_";
  34. var K_PRMT_sTIME_MIN = "T00:00:00.000";
  35. var K_PRMT_sTIME_MAX = "T23:59:59.999";
  36. var K_PRMT_sDV = "dv";
  37. var K_PRMT_sNULLUSE = "nullUse";
  38. var K_PRMT_sUSE = "use";
  39. var K_PRMT_sDISPLAY = "display";
  40. var K_PRMT_sATTR_DISABLED = "@disabled";
  41. var K_PRMT_sATTR_DISPLAY_VALUE = "@displayValue";
  42. var K_PRMT_sATTR_NULL = "@nullUse";
  43. var K_PRMT_sATTR_USE_VALUE = "@useValue";
  44. var K_PRMT_sDEFAULTSKIN = "../skins/corporate";
  45. var K_PRMT_sBOOLEAN = "boolean";
  46. var K_PRMT_sFUNCTION = "function";
  47. var K_PRMT_sOBJECT = "object";
  48. var K_PRMT_sSTRING = "string";
  49. var K_PRMT_sUNDEFINED = "undefined";
  50. var K_PRMT_sXML = "XML";
  51. var K_PRMT_sCLS_DISABLED = "clsDisabled";
  52. var K_PRMT_sINTERVAL_PREFIX = "PRMT_INTERVAL_";
  53. var K_PRMT_sINTERVAL_NEGATIVE = "negative";
  54. var K_PRMT_sINTERVAL_DAYS = "days";
  55. var K_PRMT_sINTERVAL_HOURS = "hours";
  56. var K_PRMT_sINTERVAL_MINUTES = "minutes";
  57. var K_PRMT_sINTERVAL_SECONDS = "seconds";
  58. var K_PRMT_sINTERVAL_MILLIS = "millis";
  59. var K_PRMT_sLIST_BOX_SELECT_PREFIX = "PRMT_LIST_BOX_SELECT_";
  60. var K_PRMT_sLIST_BUTTON_INSERT_PREFIX = "PRMT_LIST_BUTTON_INSERT_";
  61. var K_PRMT_sLIST_BUTTON_REMOVE_PREFIX = "PRMT_LIST_BUTTON_REMOVE_";
  62. var K_PRMT_sLIST_FEEDBACK_PREFIX = "PRMT_FB_";
  63. var K_PRMT_sLIST_LINK_DESELECT_PREFIX = "PRMT_LIST_LINK_DESELECT_";
  64. var K_PRMT_sLIST_LINK_SELECT_PREFIX = "PRMT_LIST_LINK_SELECT_";
  65. var K_PRMT_sNO_SUBMIT = "NO_SUBMIT";
  66. var K_PRMT_sRANGE_FROM_PREFIX = "F_";
  67. var K_PRMT_sRANGE_ROW_DEFAULT_PREFIX = "PRMT_RANGE_DEFAULT_";
  68. var K_PRMT_sRANGE_ROW_INPUT_PREFIX = "PRMT_RANGE_INPUT_";
  69. var K_PRMT_sRANGE_TO_PREFIX = "T_";
  70. var K_PRMT_RANGE_FORCE_BOUNDRANGE = "@forceBoundRange";
  71. var K_PRMT_sSV_LINK_DESELECT_PREFIX = "PRMT_SV_LINK_DESELECT_";
  72. var K_PRMT_sSV_LINK_SELECT_PREFIX = "PRMT_SV_LINK_SELECT_";
  73. var K_PRMT_sSV_PREFIX = "PRMT_SV_";
  74. var K_PRMT_sTB_PREFIX = "PRMT_TB_";
  75. var K_PRMT_ALERT_CHOICES_SUFFIX = "choices";
  76. var K_PRMT_reBLANK_STRING = new RegExp( "^\\s*$" );
  77. var K_PRMT_reINTERVAL_FORMAT = new RegExp( "\\s*(-)?\\s*(\\d+\\s+)?\\s*(\\d+)?\\s*(:\\d+)?\\s*(:\\d+)?\\s*(\\.\\d+\\s*)?$" );
  78. var K_PRMT_reINTERVAL_NODIGITS = new RegExp( "[^\\d]", K_PRMT_sG );
  79. var K_PRMT_reQU = new RegExp( K_PRMT_sQU, K_PRMT_sG );
  80. var K_PRMT_reXSD_FORMAT = new RegExp( "(-)?P(\\d+D)?T?(\\d+H)?(\\d+M)?(\\d+)?(\\.\\d+S)?" );
  81. var K_PRMT_reTIMEPART = new RegExp( "(T\\d\\d:\\d\\d:\\d\\d\\.\\d\\d\\d)?$" );
  82. var K_ACTION_BACK = "back";
  83. var K_ACTION_CANCEL = "cancel";
  84. var K_ACTION_FINISH = "finish";
  85. var K_ACTION_FORWARD = "forward";
  86. var K_ACTION_NEXT = "next";
  87. var K_ACTION_PROMPT = "prompt";
  88. var K_ACTION_REPROMPT = "reprompt";
  89. var K_ACTION_SEARCH = "search";
  90. // custom labels
  91. // constants specific to C_Choices
  92. var K_PRMT_LABEL_CHOICES = "@choicesText";
  93. var K_PRMT_LABEL_INSERT = "@insertText";
  94. var K_PRMT_LABEL_REMOVE = "@removeText";
  95. var K_PRMT_LABEL_CHOICES_SELECT_ALL = "@choicesSelectAllText";
  96. var K_PRMT_LABEL_CHOICES_DESELECT_ALL = "@choicesDeselectAllText";
  97. var K_PRMT_LABEL_RESULTS_SELECT_ALL = "@resultsSelectAllText";
  98. var K_PRMT_LABEL_RESULTS_DESELECT_ALL = "@resultsDeselectAllText";
  99. // select value
  100. var K_PRMT_LABEL_DESELECT = "@deselectText";
  101. // range
  102. var K_PRMT_LABEL_RANGE_FROM = "@fromText";
  103. var K_PRMT_LABEL_RANGE_TO = "@toText";
  104. var K_PRMT_LABEL_RANGE_LOWEST = "@lowestValueText";
  105. var K_PRMT_LABEL_RANGE_HIGHEST = "@highestValueText";
  106. // search
  107. var K_PRMT_LABEL_SEARCH_KEYWORDS = "@keywordsText";
  108. var K_PRMT_LABEL_SEARCH_INSTRUCTIONS_TEXT = "@searchInstructionsText";
  109. var K_PRMT_LABEL_SEARCH_BTN_LABEL = "@searchText";
  110. var K_PRMT_LABEL_SEARCH_OPTIONS_TEXT = "@optionsText";
  111. var K_PRMT_LABEL_SEARCH_RESULTS_TEXT = "@resultsText";
  112. // interval
  113. var K_PRMT_LABEL_INTERVAL_DAYS = "@daysText";
  114. var K_PRMT_LABEL_INTERVAL_HOURS = "@hoursText";
  115. var K_PRMT_LABEL_INTERVAL_MINUTES = "@minutesText";
  116. var K_PRMT_LABEL_INTERVAL_SECONDS = "@secondsText";
  117. var K_PRMT_LABEL_INTERVAL_MILLISECONDS = "@millisecondsText";
  118. // tree
  119. var K_PRMT_TREE_MOVE_UP = -1;
  120. var K_PRMT_TREE_MOVE_DOWN = 1;
  121. var K_PRMT_TREE_MOVE_PARENT_LEVEL = -2;
  122. var K_PRMT_TREE_MOVE_CHILD_LEVEL = 2;
  123. var K_PRMT_TREE_EXPAND = 1;
  124. var K_PRMT_TREE_COLLAPSE = -1;
  125. var K_PRMT_FOCUS_MOVE_UP = -1;
  126. var K_PRMT_FOCUS_MOVE_DOWN = 1;
  127. // keycodes
  128. var K_KEY_LEFT = 0x25;
  129. var K_KEY_UP = 0x26;
  130. var K_KEY_RIGHT = 0x27;
  131. var K_KEY_DOWN = 0x28;
  132. var K_KEY_SPACE = 0x20;
  133. var K_KEY_ENTER = 0x0d;
  134. var K_KEY_TAB = 0x09;
  135. // CSS classnames
  136. var K_PRMT_CSS_CHECKBOX_CHECKED = "dijitInline dijitCheckBox dijitCheckBoxChecked";
  137. var K_PRMT_CSS_RADIOBUTTON_CHECKED = "dijitInline dijitRadio dijitRadioChecked";
  138. var K_PRMT_CSS_CHECKBOX = "dijitInline dijitCheckBox";
  139. var K_PRMT_CSS_RADIOBUTTON = "dijitInline dijitRadio";
  140. var K_PRMT_CSS_CHECKBOX_PARTIAL = "dijitInline dijitCheckBox dijitCheckBoxMixed";
  141. var K_PRMT_TREE_TOGGLE_CLOSED = "dijitTreeExpando dijitTreeExpandoClosed";
  142. var K_PRMT_TREE_TOGGLE_OPENED = "dijitTreeExpando dijitTreeExpandoOpened";
  143. var K_PRMT_TREE_TOGGLE_NONE = "dijitTreeExpando dijitTreeExpandoNone";
  144. var K_PRMT_TREE_TOGGLE_TEXT = "dijitExpandoText";
  145. // ARIA, tree roles
  146. var K_PRMT_ARIA_ROLE = "role";
  147. var K_PRMT_ARIA_SELECTED = "aria-selected";
  148. var K_PRMT_ARIA_CHECKED = "aria-checked";
  149. var K_PRMT_ARIA_ROLE_PRESENTATION = "presentation";
  150. var K_PRMT_TREE_ROLE_TREEITEM = "treeitem";
  151. var K_PRMT_TREE_ROLE_TREE = "tree";
  152. var K_PRMT_TREE_ROLE_GROUP = "group";
  153. var K_PRMT_TREE_ROLE_CHECKBOX = "checkbox";
  154. var K_PRMT_TREE_STATE_EXPANDED = "aria-expanded";
  155. var K_PRMT_TREE_ROLE_BUTTON = "button";
  156. var K_PRMT_SF_CONTAINER = "PRMT_SF_CONTAINER";
  157. var K_PRMT_SF_INPUT_PREFIX = "PRMT_SF_INPUT_";
  158. /*
  159. END OF constants.
  160. */
  161. //
  162. // This is the main JavaScript file for prompting. It is actually required for the report as well as prompt pages because
  163. // there is little difference between the two.
  164. //
  165. var gsCSS_DEFAULT_STYLE = "align,background,border,clear,direction,display,float,height,margin,overflow,padding,vertical-align,visibility,width";
  166. // This function is used to specify whether to go back a prompt page
  167. // or go to the next prompt page
  168. // method='back' or 'forward'
  169. function SetPromptMethod(setting)
  170. {
  171. var frm = document.forms[0];
  172. if (frm["ui.action"])
  173. {
  174. frm["ui.action"].value = setting;
  175. }
  176. if (frm.method)
  177. {
  178. frm.method.value = setting;
  179. }
  180. }
  181. //return the current method (e.g. 'back' or 'forward')
  182. //the method determines whether to move forward or
  183. //backwards through prompt pages
  184. function GetPromptMethod()
  185. {
  186. var setting;
  187. var frm = document.forms[0];
  188. if (frm)
  189. {
  190. if (frm.method)
  191. {
  192. setting = frm.method.value;
  193. }
  194. if (frm["ui.action"])
  195. {
  196. setting = frm["ui.action"].value;
  197. }
  198. }
  199. return setting;
  200. }
  201. // This function is used to tell the server
  202. // to Finish a prompt page and run the report
  203. // finish now: 'false'
  204. // continue prompting: 'true'
  205. function SetPromptContinue(setting)
  206. {
  207. var frm = document.forms[0];
  208. if (frm["run.prompt"])
  209. {
  210. frm["run.prompt"].value = setting;
  211. }
  212. if (frm.prompt)
  213. {
  214. frm.prompt.value = setting;
  215. }
  216. }
  217. // This function is used to control reprompting. Call it with "prompt" and the request will be resubmitted and the query
  218. // will be reexectued, unlike the next page request
  219. function SetPromptControl(setting)
  220. {
  221. if ( f_CSW_tryCVPromptAction(setting) || f_getPromptRequestSubmitFlag() )
  222. {
  223. return false;
  224. }
  225. f_setPromptRequestSubmitFlag(true);
  226. //test that all required fields are valid
  227. var bSubmit = true;
  228. var aPreProcess = getPreProcessControlArray();
  229. if (aPreProcess)
  230. {
  231. preProcessForm(aPreProcess);
  232. //don't verify if this is a reprompt or search
  233. if ( needPromptValidation(setting) )
  234. {
  235. bSubmit = canSubmitPrompt();
  236. }
  237. }
  238. //validate are required fields before submitting
  239. if (bSubmit === true)
  240. {
  241. var frm = document.forms[0];
  242. genHiddenInputHTML( frm.name, "_promptControl", setting );
  243. if (setting == K_ACTION_REPROMPT)
  244. {
  245. //set the proper server method
  246. SetPromptMethod(K_ACTION_FORWARD);
  247. }
  248. frm.submit();
  249. return true;
  250. }
  251. return false;
  252. }
  253. /**
  254. Call this function to know if all required prompts have valid inputs.
  255. */
  256. function canSubmitPrompt(autoSubmitParameter, optionalCVObject)
  257. {
  258. var bFormValid = true;
  259. var aPreProcess = getPreProcessControlArray(optionalCVObject);
  260. if (aPreProcess)
  261. {
  262. var kCount = aPreProcess.length;
  263. var k = 0;
  264. for (k=0; k<kCount; k++)
  265. {
  266. var promptElement = eval(aPreProcess[k]);
  267. // can autosubmit when there is a cascade
  268. if (autoSubmitParameter && promptElement["@cascadeOn"] && promptElement["@cascadeOn"] == autoSubmitParameter) {
  269. bFormValid = true;
  270. break;
  271. }
  272. else if ( promptElement.isValid() === false )
  273. {
  274. bFormValid = false;
  275. }
  276. }
  277. }
  278. if (bFormValid === false)
  279. {
  280. if (!autoSubmitParameter){
  281. var sPrompt_Required_Values_missing = "sPrompt_Required_Values_missing";
  282. if (typeof PMT_UIM_PROMPT_CONFIRMATION_VALUE_MISSING == K_PRMT_sSTRING) {
  283. sPrompt_Required_Values_missing = PMT_UIM_PROMPT_CONFIRMATION_VALUE_MISSING;
  284. }
  285. alert (sPrompt_Required_Values_missing);
  286. }
  287. return false;
  288. }
  289. return true;
  290. }
  291. function needPromptValidation(sAction)
  292. {
  293. if ( sAction == K_ACTION_SEARCH || sAction == K_ACTION_REPROMPT || sAction == K_ACTION_CANCEL || sAction == K_ACTION_BACK || GetPromptMethod() == K_ACTION_BACK )
  294. {
  295. return false;
  296. }
  297. return true;
  298. }
  299. //preprocess any registered controls
  300. //to ensure that they submit the correct data
  301. function preProcessForm(ar)
  302. {
  303. if (ar)
  304. {
  305. var kCount = ar.length;
  306. var k = 0;
  307. for (k=0; k<kCount; k++)
  308. {
  309. eval(ar[k]).preProcess();
  310. }
  311. }
  312. }
  313. function debugPreprocess(ar)
  314. {
  315. var sDebug="Array length: " + ar.length + "\n";
  316. sDebug += "Arrays: " + ar.toString() + "\n";
  317. var j=0;
  318. if (ar)
  319. {
  320. for (j=0; j<ar.length; j++)
  321. {
  322. sDebug += "Array " + j + K_PRMT_sCOLON + ar[j] + K_PRMT_sCOLON + eval(ar[j]).m_oHiddenChoices.value + "\n";
  323. }
  324. alert (sDebug);
  325. }
  326. }
  327. //this function is used to trap change events when the
  328. //user selects the same value in a drop down list and expects it
  329. //to autosubmit.
  330. function catchAutoSubmit(o, sSubmitType)
  331. {
  332. if (o.m_bAutoSubmitTrigger === true)
  333. {
  334. //submit the form
  335. SetPromptMethod(K_ACTION_FORWARD);
  336. SetPromptControl(sSubmitType);
  337. }
  338. else
  339. {
  340. //prime the trigger to submit
  341. o.m_bAutoSubmitTrigger = true;
  342. }
  343. }
  344. function sDecodeU003( sText )
  345. {
  346. if ( typeof sText != K_PRMT_sSTRING )
  347. {
  348. return sText;
  349. }
  350. var v_reU003C = new RegExp( K_PRMT_sDBL_BACKSLASH + "U003C", K_PRMT_sG );
  351. var v_reU003E = new RegExp( K_PRMT_sDBL_BACKSLASH + "U003E", K_PRMT_sG );
  352. return ( sText.replace(v_reU003E, K_PRMT_sGT).replace(v_reU003C, K_PRMT_sLT) );
  353. }
  354. function sQuotEncode( sText )
  355. {
  356. return ( sText.replace(K_PRMT_reQU, K_PRMT_sQU_encoded) );
  357. }
  358. //take an input string and convert it into
  359. //xml friendly entity references
  360. function sXmlEncode(sInputString)
  361. {
  362. var sOutputString = sHtmlEncode(sInputString);
  363. if ((sOutputString == '0') || ((sInputString !== null) && (sInputString !== false)))
  364. {
  365. //&quot;
  366. sOutputString = sQuotEncode( sOutputString );
  367. //&apos;
  368. var reApos = new RegExp( K_PRMT_sAPOS, K_PRMT_sG );
  369. sOutputString = sOutputString.replace(reApos, "&apos;");
  370. // linefeeds
  371. sOutputString = sOutputString.replace(/\n/g, "&#10;");
  372. // carriage returns
  373. sOutputString = sOutputString.replace(/\r/g, "&#13;");
  374. }
  375. else if (!sInputString)
  376. {
  377. //return empty string if the value is null or false
  378. sOutputString = K_PRMT_sEMPTY;
  379. }
  380. return sOutputString;
  381. }
  382. function sHtmlEncode(sInputString)
  383. {
  384. var sOutputString = K_PRMT_sEMPTY + sInputString;
  385. if ((sOutputString == '0') || ((sInputString !== null) && (sInputString !== false)))
  386. {
  387. //&amp;
  388. sOutputString = sOutputString.replace(/&/g, "&amp;");
  389. //&lt;
  390. sOutputString = sOutputString.replace(/</g, "&lt;");
  391. //&gt;
  392. sOutputString = sOutputString.replace(/>/g, "&gt;");
  393. }
  394. else if (!sInputString)
  395. {
  396. //return empty string if the value is null or false
  397. sOutputString = K_PRMT_sEMPTY;
  398. }
  399. return sOutputString;
  400. }
  401. //Localize Strings
  402. //Used to perform string substitutions to localize strings
  403. //in a placement neutral way.
  404. //for example: replace ^1 with '10' in the string
  405. //"values between ^1 and ^2"
  406. function sReplaceToken(sMessage, sTokenValue, sNewValue)
  407. {
  408. var newString = K_PRMT_sEMPTY;
  409. var startPtr = 0;
  410. var tempStrPtr = sMessage.indexOf(sTokenValue);
  411. while (tempStrPtr > -1)
  412. {
  413. newString += sMessage.substring(startPtr, tempStrPtr);
  414. newString += sNewValue;
  415. startPtr = tempStrPtr + sTokenValue.length;
  416. tempStrPtr = sMessage.indexOf(sTokenValue, startPtr);
  417. }
  418. newString += sMessage.substring(startPtr, sMessage.length);
  419. return newString;
  420. }
  421. //Strip leading and trailing quotes from a string
  422. //this function is used to return the value of a
  423. //string in single quotes
  424. function stripSingleQuote(s)
  425. {
  426. var newString = s;
  427. //strip the trailing quote
  428. var rTrailingQuote = /[']$/;
  429. newString = newString.replace (rTrailingQuote, K_PRMT_sEMPTY);
  430. //strip leading quote
  431. var rLeadingQuote = /^[']/;
  432. newString = newString.replace (rLeadingQuote, K_PRMT_sEMPTY);
  433. return newString;
  434. }
  435. //return a string for use in regular expressions
  436. //that takes care of escape values that may be part
  437. //of regular expression syntax
  438. function sEscapeRegularExpression(sRegExpString)
  439. {
  440. //replace .
  441. sRegExpString = sRegExpString.replace(/\./g, K_PRMT_sBACKSLASH + K_PRMT_sDOT);
  442. //replace $
  443. sRegExpString = sRegExpString.replace(/\$/g, K_PRMT_sBACKSLASH + "$");
  444. //replace (
  445. sRegExpString = sRegExpString.replace(/\(/g, K_PRMT_sBACKSLASH + "(");
  446. //replace )
  447. sRegExpString = sRegExpString.replace(/\)/g, K_PRMT_sBACKSLASH + ")");
  448. //replace +
  449. sRegExpString = sRegExpString.replace(/\+/g, K_PRMT_sBACKSLASH + "+");
  450. return sRegExpString;
  451. }
  452. /* button functions */
  453. function buttonOver (obj)
  454. {
  455. obj.className = "clsToolbarButton_hover";
  456. }
  457. function buttonOut (obj)
  458. {
  459. obj.className = "clsToolbarButton";
  460. }
  461. function buttonDown (obj)
  462. {
  463. obj.className = "clsToolbarButton_active";
  464. }
  465. /* Dynamic HTML positioning functions */
  466. //walk up through a document and pass the total offset
  467. function iOffsetFromBodyX(obj)
  468. {
  469. var oChild = obj;
  470. var iTotalOffsetX = 0;
  471. do {
  472. if (iTotalOffsetX + oChild.offsetLeft >= 0)
  473. {
  474. iTotalOffsetX += oChild.offsetLeft;
  475. }
  476. oChild = oChild.offsetParent;
  477. } while (oChild !== null);
  478. return iTotalOffsetX;
  479. }
  480. //walk up through a document and pass the total offset
  481. function iOffsetFromBodyY(obj)
  482. {
  483. var oChild = obj;
  484. var iTotalOffsetY = 0;
  485. do {
  486. iTotalOffsetY += oChild.offsetTop;
  487. oChild = oChild.offsetParent;
  488. } while ((oChild !== null) && (oChild.id != 'RVContent'));
  489. return iTotalOffsetY;
  490. }
  491. /* Page level notification functions */
  492. // This notifies observers of any changes on the page
  493. function notify(iState, oNotifier)
  494. {
  495. //notify any range controls to update their states
  496. if ((typeof rangeNotify != K_PRMT_sUNDEFINED) && (rangeNotify) )
  497. {
  498. rangeNotify();
  499. }
  500. //notify any prompt buttons to update their states
  501. if ((typeof promptButtonNotify != K_PRMT_sUNDEFINED) && (promptButtonNotify) )
  502. {
  503. promptButtonNotify();
  504. }
  505. //notify any multiple selection controls to update their states
  506. if ((typeof multipleObserverNotify != K_PRMT_sUNDEFINED) && (multipleObserverNotify) )
  507. {
  508. multipleObserverNotify();
  509. }
  510. for (var idxNotif = 0; idxNotif < gaNotifyTargets.length; idxNotif++)
  511. {
  512. var oTarget = gaNotifyTargets[idxNotif];
  513. if (typeof oTarget != K_PRMT_sUNDEFINED && typeof oTarget.notify == K_PRMT_sFUNCTION)
  514. {
  515. oTarget.notify(iState, oNotifier);
  516. }
  517. }
  518. }
  519. //send notifications to multiple choice controls
  520. //this allows the compound multiple choice prompts to
  521. //listen for changes in state to their child controls
  522. function multipleObserverNotify()
  523. {
  524. if ((typeof multipleObserverArray != K_PRMT_sUNDEFINED) && (multipleObserverArray))
  525. {
  526. var kCount = multipleObserverArray.length;
  527. var k = 0;
  528. for (k=0; k<kCount; k++)
  529. {
  530. var promptElement = multipleObserverArray[k];
  531. if ( typeof promptElement == K_PRMT_sSTRING )
  532. {
  533. promptElement = eval(promptElement);
  534. }
  535. //check the insert / remove buttons
  536. promptElement.checkInsertRemove();
  537. }
  538. }
  539. }
  540. //send notifications to controls that wish to be notified
  541. //the Reprompt button was selected
  542. function repromptObserverNotify(oCV)
  543. {
  544. var v_aObservers = ((typeof aRepromptObservers != K_PRMT_sUNDEFINED) ? aRepromptObservers : f_getObserverArray('repromptObserverArray', oCV));
  545. // Set focus on reprompt button
  546. // Storing layoutName of button to set focus after page submit
  547. // example:
  548. // layoutName = 0: ""reprompt1_NS_""
  549. var sOuter = this.document.activeElement.outerHTML;
  550. var layoutstr = sOuter.match(/layoutname="\w+"/ );
  551. if (layoutstr !== null) {
  552. var layoutString = layoutstr[0];
  553. var Regexp = /".*"/;
  554. var layoutName = Regexp.exec(layoutString);
  555. oCV.setCurrentPromptControlFocus(layoutName[0]);
  556. }
  557. else {
  558. oCV.setCurrentPromptControlFocus(null);
  559. }
  560. if (v_aObservers)
  561. {
  562. var kCount = v_aObservers.length;
  563. var k = 0;
  564. for (k=0; k<kCount; k++)
  565. {
  566. var v_oPrompt = v_aObservers[k];
  567. if (typeof v_oPrompt == K_PRMT_sSTRING)
  568. {
  569. v_oPrompt = eval( v_oPrompt );
  570. }
  571. if (v_oPrompt && v_oPrompt.handleNotify)
  572. {
  573. // e.g. clear the cache for the tree
  574. v_oPrompt.handleNotify();
  575. }
  576. }
  577. }
  578. }
  579. //send notifications to controls that use pop up date pickers
  580. //listen for changes in state to other date picker controls
  581. function datePickerObserverNotify(aDatePickersObservers)
  582. {
  583. var v_aObservers = ((typeof aDatePickersObservers != K_PRMT_sUNDEFINED) ? aDatePickersObservers : f_getObserverArray('datePickerObserverArray'));
  584. if (v_aObservers)
  585. {
  586. var kCount = v_aObservers.length;
  587. var k = 0;
  588. for (k=0; k<kCount; k++)
  589. {
  590. var v_oPrompt = v_aObservers[k];
  591. if (typeof v_oPrompt == K_PRMT_sSTRING)
  592. {
  593. v_oPrompt = eval( v_oPrompt );
  594. }
  595. if (v_oPrompt && v_oPrompt.handleNotify)
  596. {
  597. //check the toggle state of the popups
  598. v_oPrompt.handleNotify();
  599. }
  600. }
  601. }
  602. }
  603. //iterate through a list of pickers and hide any that are open
  604. //this is used to clean up the UI
  605. //
  606. //pickers are typically registered to the g_pickerObservers
  607. //observer array once they are instantiated
  608. function hidePickers()
  609. {
  610. if ((typeof g_pickerObservers != K_PRMT_sUNDEFINED) && (g_pickerObservers))
  611. {
  612. var kCount = g_pickerObservers.length;
  613. for (var k=0; k<kCount; k++)
  614. {
  615. var promptElement = eval(g_pickerObservers[k]);
  616. if (typeof promptElement != K_PRMT_sUNDEFINED)
  617. {
  618. promptElement.hide();
  619. }
  620. }
  621. }
  622. }
  623. //
  624. // This function is called just before the main form is submitted when the user presses the Enter Key
  625. // in a search control or text box
  626. // Anything that needs to be done before submitting must be done here.
  627. //
  628. function execute()
  629. {
  630. SetPromptMethod(K_ACTION_FORWARD);
  631. var submitSetting = K_ACTION_PROMPT;
  632. var currentSetting = GetSubmitSetting();
  633. if (currentSetting !== null)
  634. {
  635. submitSetting = currentSetting;
  636. }
  637. SetPromptControl(submitSetting);
  638. return true;
  639. }
  640. function SetSubmitSetting(s)
  641. {
  642. var frm = document.forms[0];
  643. if (frm._promptControl)
  644. {
  645. frm._promptControl.value = s;
  646. }
  647. }
  648. function GetSubmitSetting()
  649. {
  650. var frm = document.forms[0];
  651. if (frm._promptControl)
  652. {
  653. return frm._promptControl.value;
  654. }
  655. return null;
  656. }
  657. //
  658. // Browser Sniffing code
  659. // These functions give an indication of what level of support a particular browser has.
  660. // They are not meant to be the definitive way to determine the user's browser
  661. //
  662. function browserIsNS7()
  663. {
  664. var bBrowserTest = ((!window.ie) && (document.getElementById)) ? true : false;
  665. return bBrowserTest;
  666. }
  667. // prevent a form from submitting when the user presses enter
  668. function preventSubmitEvent(evt)
  669. {
  670. var v_oEvt = (evt ? evt : (typeof event != K_PRMT_sUNDEFINED ? event : null ));
  671. if ( v_oEvt )
  672. {
  673. if (v_oEvt.keyCode == 13)
  674. {
  675. if (typeof v_oEvt.stopPropagation == K_PRMT_sFUNCTION) { v_oEvt.stopPropagation(); }
  676. if (typeof v_oEvt.preventDefault == K_PRMT_sFUNCTION) { v_oEvt.preventDefault(); }
  677. v_oEvt.cancelBubble = true;
  678. return false;
  679. }
  680. }
  681. }
  682. //prevent the event from bubbling to other elements
  683. function cancelBub(evt)
  684. {
  685. //get the event in a cross-browser fashion
  686. evt = (evt) ? evt : ((event) ? event : null);
  687. //prevent the click from proceeding to other nodes
  688. if (typeof evt.cancelBubble != K_PRMT_sUNDEFINED)
  689. {
  690. evt.cancelBubble = true;
  691. }
  692. if (typeof evt.stopPropagation != K_PRMT_sUNDEFINED)
  693. {
  694. evt.stopPropagation();
  695. }
  696. }
  697. //test to see if the string contains only numbers
  698. function bNumbersOnly(s)
  699. {
  700. var rNoIntegers = new RegExp('[^0-9]', K_PRMT_sG); //non numerals
  701. if (s)
  702. {
  703. var z = s.search(rNoIntegers);
  704. if (z == -1)
  705. {
  706. return true;
  707. }
  708. }
  709. return false;
  710. }
  711. /* Variables */
  712. //broadcaster-observer array for picker controls
  713. var g_pickerObservers = [];
  714. var gaNotifyTargets = [];
  715. var gaSelectControls = [];
  716. var goSelectControlsTimer = null;
  717. var gFAIL = 0;
  718. var gPASS = 1;
  719. var gUPDATE = 2;
  720. ////////////////////////////////////////////////////////////////////////
  721. // Common utility functions used in rendering prompt controls with JS
  722. ////////////////////////////////////////////////////////////////////////
  723. ////////////////////////////////////////////////////////////////////////
  724. // Insert / Remove buttons
  725. ////////////////////////////////////////////////////////////////////////
  726. function genInsertButtonHTML(sPromptId, defaultAction, sName)
  727. {
  728. if (!verifyPromptId(sPromptId))
  729. {
  730. return;
  731. }
  732. var HTMLOut = "<button type='button' title='" + PMT_UIM_INSERTTIP + "' id='" + sName + "' name='" + sName + "' onclick='" + defaultAction + "; return false;' class='clsInsertRemoveButton' onmouseover=\"this.className='clsInsertRemoveButtonOver'\" onmouseout=\"this.className='clsInsertRemoveButton'\">" + PMT_UIM_INSERT + " <img src='" + getPromptSkin() + "/prompting/images/insert.gif' alt='" + PMT_UIM_INSERTTIP + "' border='0' height='16' width='16' align='top' /></button>";
  733. renderPromptControlHTML("getInsertButton" + sPromptId, HTMLOut);
  734. }
  735. function genRemoveButtonHTML(sPromptId, defaultAction, sName)
  736. {
  737. if (!verifyPromptId(sPromptId))
  738. {
  739. return;
  740. }
  741. var HTMLOut = "<button type='button' title='" + PMT_UIM_REMOVETIP + "' id='" + sName + "' name='" + sName + "' onclick='" + defaultAction + "; return false;' class='clsInsertRemoveButton' onmouseover=\"this.className='clsInsertRemoveButtonOver'\" onmouseout=\"this.className='clsInsertRemoveButton'\"><img src='" + getPromptSkin() + "/prompting/images/remove.gif' alt='" + PMT_UIM_REMOVETIP + "' border='0' height='16' width='16' align='top' /> " + PMT_UIM_REMOVE + "</button>";
  742. renderPromptControlHTML("getRemoveButton" + sPromptId, HTMLOut);
  743. }
  744. // This function returns the path to the skin folder
  745. // to use for prompt controls.
  746. function getPromptSkin()
  747. {
  748. if (typeof p_sSkinFolder == K_PRMT_sSTRING && p_sSkinFolder)
  749. {
  750. return p_sSkinFolder;
  751. }
  752. // return the default skin folder.
  753. return (getWebContentURI() + "/skins/corporate");
  754. }
  755. function getWebContentURI()
  756. {
  757. var v_sURI = "..";
  758. if (typeof p_sWebContentURI == K_PRMT_sSTRING && p_sWebContentURI)
  759. {
  760. v_sURI = p_sWebContentURI;
  761. }
  762. else
  763. {
  764. var vBase = document.getElementsByTagName("base");
  765. if (vBase)
  766. {
  767. v_sURI += "/..";
  768. }
  769. }
  770. return v_sURI;
  771. }
  772. function StringArray() {
  773. this.stringArray = [];
  774. this.append = StringArray_append;
  775. this.toString = StringArray_toString;
  776. this.reset = StringArray_reset;
  777. }
  778. function StringArray_append(strValue) {
  779. this.stringArray[this.stringArray.length]= strValue;
  780. }
  781. function StringArray_toString() {
  782. return this.stringArray.join(K_PRMT_sEMPTY);
  783. }
  784. function StringArray_reset() {
  785. this.stringArray = [];
  786. }
  787. function jsEncodeStr(str)
  788. {
  789. if (typeof str == K_PRMT_sUNDEFINED || !str)
  790. {
  791. return K_PRMT_sEMPTY;
  792. }
  793. if (typeof str != K_PRMT_sSTRING)
  794. {
  795. return str;
  796. }
  797. var reBackSlash = new RegExp( K_PRMT_sDBL_BACKSLASH, K_PRMT_sG );
  798. return str.replace(reBackSlash, K_PRMT_sDBL_BACKSLASH).replace(K_PRMT_reQU, K_PRMT_sBACKSLASH + K_PRMT_sQU);
  799. }
  800. function jsDecodeStr(str)
  801. {
  802. if (typeof str == K_PRMT_sUNDEFINED || !str)
  803. {
  804. return K_PRMT_sEMPTY;
  805. }
  806. if (typeof str != K_PRMT_sSTRING)
  807. {
  808. return str;
  809. }
  810. var reBackSlashApos = new RegExp( K_PRMT_sDBL_BACKSLASH + K_PRMT_sAPOS, K_PRMT_sG );
  811. var reBackSlashQuote = new RegExp( K_PRMT_sDBL_BACKSLASH + K_PRMT_sQU, K_PRMT_sG );
  812. var reBSBS = new RegExp( K_PRMT_sDBL_BACKSLASH + K_PRMT_sDBL_BACKSLASH, K_PRMT_sG );
  813. var reLT = new RegExp( K_PRMT_sDBL_BACKSLASH + K_PRMT_sLT, K_PRMT_sG );
  814. var reGT = new RegExp( K_PRMT_sDBL_BACKSLASH + K_PRMT_sGT, K_PRMT_sG );
  815. return str.replace(reBackSlashApos, K_PRMT_sAPOS).replace(reBackSlashQuote, K_PRMT_sQU).replace(reGT, K_PRMT_sGT).replace(reLT, K_PRMT_sLT).replace(reBSBS, K_PRMT_sBACKSLASH);
  816. }
  817. function verifyPromptId(sPromptId)
  818. {
  819. if (sPromptId.indexOf( K_PRMT_sBACKSLASH + "U003C") > -1 || sPromptId.indexOf(K_PRMT_sBACKSLASH + "U003E") > -1 )
  820. {
  821. return false;
  822. }
  823. return true;
  824. }
  825. //creates an escape character that won't break when put in a javascript string or written to HTML
  826. function alterDoubleQuote(str)
  827. {
  828. if (typeof str == K_PRMT_sUNDEFINED || !str)
  829. {
  830. return K_PRMT_sEMPTY;
  831. }
  832. var reQ1 = new RegExp( K_PRMT_sDBL_BACKSLASH + K_PRMT_sQU, K_PRMT_sG );
  833. return str.replace(reQ1, '~quote~').replace(K_PRMT_reQU, '~quote~');
  834. }
  835. /**
  836. Add or update a field in a form.
  837. @param {string} sFormName name of the form in which to add/update the form field.
  838. @param {string} sInputName name of the form field to add/update
  839. @param {string} sValue value to use for the form field.
  840. */
  841. function addHiddenInputHTML(sFormName, sInputName, sValue)
  842. {
  843. var sHTML = genHiddenInputHTML(sFormName, sInputName, sValue);
  844. if (sHTML)
  845. {
  846. document.write(sHTML);
  847. }
  848. }
  849. /**
  850. Update a field in a form or generate the HTML if the <form> is not ready yet.
  851. @param {string} sFormName name of the form in which to add/update the form field.
  852. @param {string} sInputName name of the form field to add/update
  853. @param {string} sValue value to use for the form field.
  854. @type string
  855. @return A HTML string that represents the <input> field to add. The string is empty is the <input> or the <form> already exists.
  856. */
  857. function genHiddenInputHTML(sFormName, sInputName, sValue)
  858. {
  859. var sHTML = K_PRMT_sEMPTY;
  860. var oInput = null;
  861. var oForm = document.forms[sFormName];
  862. if (oForm)
  863. {
  864. oInput = oForm.elements[sInputName];
  865. // [IE] We check for the readyState because IE have issues when adding nodes (with appendChild) when the page isn't fully parsed.
  866. if (!oInput && (!document.readyState || document.readyState == "complete"))
  867. {
  868. oInput = document.createElement("input");
  869. oInput.type = "hidden";
  870. oInput.id = sInputName;
  871. oInput.name = sInputName;
  872. oInput.value = sValue;
  873. oForm.appendChild(oInput);
  874. }
  875. }
  876. if (oInput) {
  877. oInput.value = (sValue === null ? K_PRMT_sEMPTY : sValue);
  878. }
  879. else {
  880. sHTML = '<input type="hidden" name="' + alterDoubleQuote(sInputName) + '" value="' + (sValue === null ? K_PRMT_sEMPTY : sValue) + '"/>';
  881. }
  882. return sHTML;
  883. }
  884. function addSelectChoices(oSubmit, sValues)
  885. {
  886. var sSubmitValues = oSubmit.value;
  887. if (typeof sSubmitValues != K_PRMT_sSTRING || !sSubmitValues)
  888. {
  889. sSubmitValues = "<selectChoices></selectChoices>";
  890. }
  891. if (typeof sValues == K_PRMT_sSTRING && sSubmitValues.indexOf(sValues) == -1)
  892. {
  893. // strip out <selectChoices nodes> from previous values
  894. sSubmitValues = sSubmitValues.replace(/^\s*<selectChoices>\s*/i,K_PRMT_sEMPTY).replace(/\s*<\/selectChoices>\s*$/i,K_PRMT_sEMPTY);
  895. sValues = sValues.replace(/^\s*<selectChoices>\s*/i,K_PRMT_sEMPTY).replace(/\s*<\/selectChoices>\s*$/i,K_PRMT_sEMPTY);
  896. // add new values
  897. sSubmitValues = "<selectChoices>" + sSubmitValues + sValues + "</selectChoices>";
  898. }
  899. oSubmit.value = sSubmitValues;
  900. }
  901. function registerForNotications(oObject)
  902. {
  903. if (typeof oObject != K_PRMT_sUNDEFINED)
  904. {
  905. gaNotifyTargets[gaNotifyTargets.length] = oObject;
  906. }
  907. }
  908. function CPromptControl()
  909. {
  910. this.m_sCVId = K_PRMT_sEMPTY;
  911. }
  912. CPromptControl.prototype.checkPass = function()
  913. {
  914. if (this.m_oErrorFeedback)
  915. {
  916. this.m_oErrorFeedback.className = "clsFeedbackWidget";
  917. }
  918. this.notify(gPASS, this);
  919. };
  920. //render the validation error state
  921. CPromptControl.prototype.checkFail = function()
  922. {
  923. if (this.m_oErrorFeedback)
  924. {
  925. this.m_oErrorFeedback.className = (typeof this.m_sErrorFeedbackClass == K_PRMT_sSTRING ? this.m_sErrorFeedbackClass : "clsFeedbackWidgetParseError");
  926. }
  927. this.notify(gFAIL, this);
  928. };
  929. CPromptControl.prototype.getCV = function()
  930. {
  931. var oRetVal = window;
  932. if (typeof this.m_oCV == K_PRMT_sOBJECT)
  933. {
  934. oRetVal = this.m_oCV;
  935. }
  936. else
  937. {
  938. try {
  939. oRetVal = eval("oCV" + this.getCVId());
  940. if (typeof oRetVal == K_PRMT_sOBJECT)
  941. {
  942. this.m_oCV = oRetVal;
  943. }
  944. }
  945. catch (e)
  946. {
  947. oRetVal = window;
  948. }
  949. }
  950. return oRetVal;
  951. };
  952. CPromptControl.prototype.getCVId = function()
  953. {
  954. return this.m_sCVId;
  955. };
  956. CPromptControl.prototype.getObserverArray = function(v_sName)
  957. {
  958. var v_a = null;
  959. var oCV = this.getCV();
  960. if (typeof oCV != K_PRMT_sUNDEFINED) {
  961. v_a = oCV[v_sName];
  962. }
  963. return v_a;
  964. };
  965. //get the validity without checking the data first
  966. CPromptControl.prototype.getValid = function()
  967. {
  968. return this.m_bValid;
  969. };
  970. CPromptControl.prototype.notify = function(iState, oNotifier)
  971. {
  972. var oCV = this.getCV();
  973. if (oCV && typeof oCV.notify == K_PRMT_sFUNCTION)
  974. {
  975. oCV.notify(iState, oNotifier);
  976. }
  977. };
  978. CPromptControl.prototype.f_isBUX = function()
  979. {
  980. var v_oCV = this.getCV();
  981. return (typeof v_oCV == K_PRMT_sOBJECT && v_oCV.isBux? true :false);
  982. };
  983. CPromptControl.prototype.isRequired = function()
  984. {
  985. return (this.m_bRequired===true);
  986. };
  987. CPromptControl.prototype.isValid = function()
  988. {
  989. if (typeof this.checkData == K_PRMT_sFUNCTION)
  990. {
  991. this.checkData();
  992. }
  993. return (this.m_bValid===true);
  994. };
  995. //Trap whether the user has pressed the delete key
  996. //in the choices box. Note that this function is
  997. //IE specific
  998. CPromptControl.prototype.catchDeleteKey = function(iKeyCode)
  999. {
  1000. //catch the Delete key code
  1001. if (iKeyCode == 46 && typeof this.remove == K_PRMT_sFUNCTION)
  1002. {
  1003. this.remove(this.m_oLstChoices);
  1004. }
  1005. };
  1006. CPromptControl.prototype.removeSelectedChoices = function()
  1007. {
  1008. var iFirstSelection = null;
  1009. if (typeof this.m_oLstChoices == K_PRMT_sOBJECT)
  1010. {
  1011. iFirstSelection = this.m_oLstChoices.selectedIndex;
  1012. }
  1013. if (typeof iFirstSelection != "number")
  1014. {
  1015. return;
  1016. }
  1017. if (iFirstSelection != -1)
  1018. {
  1019. for (var idxSelection = this.m_oLstChoices.options.length-1; idxSelection > -1 ; idxSelection--)
  1020. {
  1021. if (this.m_oLstChoices.options[idxSelection].selected)
  1022. {
  1023. this.m_oLstChoices.options[idxSelection] = null;
  1024. }
  1025. }
  1026. }
  1027. else
  1028. {
  1029. var sPrompt_Select_Item_First = "sPrompt_Select_Item_First";
  1030. if (typeof PMT_UIM_sPrompt_Select_Item_First == K_PRMT_sSTRING)
  1031. {
  1032. sPrompt_Select_Item_First = PMT_UIM_sPrompt_Select_Item_First;
  1033. }
  1034. alert(sPrompt_Select_Item_First);
  1035. }
  1036. this.checkData();
  1037. };
  1038. CPromptControl.prototype.addOptions = function(aOptions)
  1039. {
  1040. var sDisplayValue, sUseValue, bSel;
  1041. if (aOptions instanceof Array)
  1042. {
  1043. for (var idxOption = 0; idxOption < aOptions.length; idxOption++)
  1044. {
  1045. var aOpt = aOptions[idxOption];
  1046. if (aOpt && aOpt.length)
  1047. {
  1048. sDisplayValue = (aOpt.length > 0 ? aOpt[0] : K_PRMT_sEMPTY);
  1049. sUseValue = (aOpt.length > 1 ? aOpt[1] : K_PRMT_sEMPTY);
  1050. bSel = (aOpt.length > 2 ? aOpt[2] : false);
  1051. sParent = (aOpt.length > 3 ? aOpt[3] : null);
  1052. this.addNoUpdate(sDisplayValue, sUseValue, bSel, sParent);
  1053. }
  1054. }
  1055. this.update();
  1056. }
  1057. };
  1058. CPromptControl.prototype.setCVId = function(sId)
  1059. {
  1060. if (typeof sId == K_PRMT_sSTRING && sId !== K_PRMT_sEMPTY & sId != K_PRMT_sUNDEFINED)
  1061. {
  1062. this.m_sCVId = sId;
  1063. }
  1064. // Signal viewer that a prompt control was created.
  1065. // The assumption is all classes derived from this class invoke
  1066. // this method in their constructor.
  1067. var cv = this.getCV();
  1068. if (cv && typeof cv.setHasPrompts == "function")
  1069. {
  1070. cv.setHasPrompts(true);
  1071. }
  1072. };
  1073. function renderPromptControlHTML(sElementId, sHTML)
  1074. {
  1075. var oElement = document.getElementById(sElementId);
  1076. if (oElement !== null)
  1077. {
  1078. oElement.innerHTML = sHTML;
  1079. }
  1080. }
  1081. function executePromptControlJS(sJSCode)
  1082. {
  1083. eval(sJSCode);
  1084. }
  1085. function generatePromptProperties(oPropertiesSource, oPropertiesToAdd)
  1086. {
  1087. var sRetval = K_PRMT_sEMPTY;
  1088. var oProperties = oPropertiesSource;
  1089. if (oPropertiesToAdd)
  1090. {
  1091. // clone oProperties first, to prevent overridding values in oPropertiesSource.
  1092. oProperties = {};
  1093. for (var idxProp in oPropertiesSource)
  1094. {
  1095. oProperties[idxProp] = oPropertiesSource[idxProp];
  1096. }
  1097. // add new values
  1098. for (var idxPropToAdd in oPropertiesToAdd)
  1099. {
  1100. oProperties[idxPropToAdd] = oPropertiesToAdd[idxPropToAdd];
  1101. }
  1102. }
  1103. for (var idxProp in oProperties)
  1104. {
  1105. if(sRetval)
  1106. {
  1107. sRetval += ",";
  1108. }
  1109. sRetval += idxProp + K_PRMT_sCOLON;
  1110. switch(typeof oProperties[idxProp])
  1111. {
  1112. case K_PRMT_sSTRING:
  1113. // replace \ by \\, ' by \' and </ by <'+'/'+'
  1114. var reBackslash = new RegExp(K_PRMT_sDBL_BACKSLASH, K_PRMT_sG);
  1115. var reApos = new RegExp(K_PRMT_sAPOS, K_PRMT_sG);
  1116. var reEndTag = new RegExp(K_PRMT_sLT+K_PRMT_sSL, K_PRMT_sG);
  1117. sRetval += K_PRMT_sAPOS + oProperties[idxProp].replace(reBackslash, K_PRMT_sDBL_BACKSLASH).replace(reApos, K_PRMT_sBACKSLASH + K_PRMT_sAPOS).replace(reEndTag, "<'+'/'+'") + K_PRMT_sAPOS;
  1118. break;
  1119. case K_PRMT_sOBJECT:
  1120. if (oProperties[idxProp] instanceof Array)
  1121. {
  1122. var sArray = K_PRMT_sEMPTY;
  1123. for (var idxArray in oProperties[idxProp])
  1124. {
  1125. if(sArray)
  1126. {
  1127. sArray += ",";
  1128. }
  1129. sArray += oProperties[idxProp][idxArray];
  1130. }
  1131. sRetval+= "[" + sArray + "]";
  1132. }
  1133. else if (oProperties[idxProp] === null)
  1134. {
  1135. sRetval += 'null';
  1136. }
  1137. else
  1138. {
  1139. sRetval += generatePromptProperties(oProperties[idxProp]);
  1140. }
  1141. break;
  1142. case K_PRMT_sUNDEFINED:
  1143. sRetval += 'null';
  1144. break;
  1145. default:
  1146. sRetval += oProperties[idxProp];
  1147. }
  1148. }
  1149. return "{" + sRetval + "}";
  1150. }
  1151. function getCVInstance(oProperties)
  1152. {
  1153. var sRetVal = K_PRMT_sEMPTY;
  1154. var sCVId = getCVId(oProperties);
  1155. if (typeof sCVId == K_PRMT_sSTRING && eval("typeof oCV" + sCVId) != K_PRMT_sUNDEFINED)
  1156. {
  1157. sRetVal = "oCV" + sCVId + K_PRMT_sDOT;
  1158. }
  1159. return sRetVal;
  1160. }
  1161. function CPromptControl_updateSelectWidth( oSelect )
  1162. {
  1163. if ( typeof gaSelectControls == K_PRMT_sUNDEFINED )
  1164. {
  1165. gaSelectControls = new Array();
  1166. }
  1167. if ( oSelect && !oSelect.id && oSelect.name)
  1168. {
  1169. oSelect.id = oSelect.name;
  1170. }
  1171. if ( oSelect && !gaSelectControls[ oSelect.id ] )
  1172. {
  1173. oSelect.m_sOriginalWidth = oSelect.style.width;
  1174. gaSelectControls[ oSelect.id ] = oSelect;
  1175. }
  1176. if (document.readyState == "complete")
  1177. {
  1178. for (var sId in gaSelectControls)
  1179. {
  1180. var oTemp = gaSelectControls[ sId ];
  1181. if (oTemp && oTemp.m_oSelectElt)
  1182. {
  1183. oTemp = oTemp.m_oSelectElt;
  1184. }
  1185. if (oTemp && oTemp.style)
  1186. {
  1187. // Only update if the width wasn't previously set or it's 'auto'
  1188. if ( !CPromptControl_hasExplicitWidth( oTemp ) )
  1189. {
  1190. // Setting the width to "auto" will resize the box
  1191. oTemp.style.width = "auto";
  1192. if (oTemp.offsetWidth < 200)
  1193. {
  1194. // the box is too small, reset the width to its previous value.
  1195. oTemp.style.width = "200px";
  1196. }
  1197. }
  1198. }
  1199. }
  1200. }
  1201. else if ( document.readyState )
  1202. {
  1203. // IE is still loading the page.
  1204. if ( typeof goSelectControlsTimer != K_PRMT_sUNDEFINED && goSelectControlsTimer )
  1205. {
  1206. clearTimeout( goSelectControlsTimer );
  1207. }
  1208. goSelectControlsTimer = setTimeout(CPromptControl_updateSelectWidth, 100);
  1209. }
  1210. else
  1211. {
  1212. // Firefox, Mozilla: remove min-width if width is explicitly set in the style.
  1213. if ( !CPromptControl_hasExplicitWidth( oSelect ) )
  1214. {
  1215. oSelect.style.minWidth = "200px";
  1216. }
  1217. }
  1218. }
  1219. function CPromptControl_hasExplicitWidth( oHTMLElement )
  1220. {
  1221. var sWidth = null;
  1222. if (oHTMLElement)
  1223. {
  1224. sWidth = oHTMLElement.m_sOriginalWidth;
  1225. if ( typeof sWidth == K_PRMT_sUNDEFINED )
  1226. {
  1227. sWidth = oHTMLElement.style.width;
  1228. }
  1229. }
  1230. // Only update if the width was previously set and it's not 'auto'
  1231. return ( sWidth && sWidth.match(/\d/g) );
  1232. }
  1233. function getCVId(oProperties)
  1234. {
  1235. var sRetVal = K_PRMT_sEMPTY;
  1236. if (typeof oProperties == K_PRMT_sOBJECT && typeof oProperties.CVId == K_PRMT_sSTRING && oProperties.CVId !== K_PRMT_sEMPTY)
  1237. {
  1238. sRetVal = oProperties.CVId;
  1239. }
  1240. return sRetVal;
  1241. }
  1242. function getPreProcessControlArray(optionalCVObject)
  1243. {
  1244. var aPreProcess = null;
  1245. if (typeof preProcessControlArray != K_PRMT_sUNDEFINED)
  1246. {
  1247. aPreProcess = preProcessControlArray;
  1248. } else if (typeof optionalCVObject != K_PRMT_sUNDEFINED){
  1249. aPreProcess = optionalCVObject.preProcessControlArray;
  1250. }
  1251. else if (typeof window.gCognosViewer != K_PRMT_sUNDEFINED)
  1252. {
  1253. aPreProcess = window.gCognosViewer.preProcessControlArray;
  1254. }
  1255. return aPreProcess;
  1256. }
  1257. function f_getObserverArray( v_sName, oCV )
  1258. {
  1259. var v_a = null;
  1260. if(typeof oCV != K_PRMT_sUNDEFINED)
  1261. {
  1262. v_a = oCV[v_sName];
  1263. }
  1264. else if (typeof window[v_sName] != K_PRMT_sUNDEFINED)
  1265. {
  1266. v_a = window[v_sName];
  1267. }
  1268. else if (window.gCognosViewer && typeof window.gCognosViewer[v_sName] != K_PRMT_sUNDEFINED)
  1269. {
  1270. v_a = window.gCognosViewer[v_sName];
  1271. }
  1272. return v_a;
  1273. }
  1274. /*
  1275. Returns multiple styles at a time, appropriate for HTML style parsing.
  1276. */
  1277. function cssParser( sStyle, sDesiredStyle, bValueOnly )
  1278. {
  1279. if ( !sStyle || typeof sStyle != K_PRMT_sSTRING || !sDesiredStyle || typeof sDesiredStyle != K_PRMT_sSTRING )
  1280. {
  1281. return K_PRMT_sEMPTY;
  1282. }
  1283. var v_sStyleParsed = sStyle.replace(/\s*;\s*$/g, K_PRMT_sEMPTY);
  1284. v_sStyleParsed = v_sStyleParsed.replace(/\s*;\s*/g,';');
  1285. v_sStyleParsed = v_sStyleParsed.replace(/\s*:\s*/g,K_PRMT_sCOLON);
  1286. var aStyle = v_sStyleParsed.split(";");
  1287. var aDesiredStyle = sDesiredStyle.split(",");
  1288. var sReturnedStyle = K_PRMT_sEMPTY;
  1289. for ( var v_iDesiredStyle = 0; v_iDesiredStyle < aDesiredStyle.length; v_iDesiredStyle++ )
  1290. {
  1291. for ( var v_iStyle = 0; v_iStyle < aStyle.length; v_iStyle++ )
  1292. {
  1293. var aTempValue = aStyle[v_iStyle].split(K_PRMT_sCOLON);
  1294. var regexpCSSProperty = new RegExp("^" + aDesiredStyle[v_iDesiredStyle] + "(-.*)?$"); //match the property name between the style and desired style aswell as their sub-properties ex:background and background-color
  1295. if ( aTempValue[0].match(regexpCSSProperty) && aTempValue[1] != K_PRMT_sEMPTY )
  1296. {
  1297. if (!bValueOnly)
  1298. {
  1299. sReturnedStyle += aTempValue[0] + K_PRMT_sCOLON;
  1300. }
  1301. sReturnedStyle += aTempValue[1];
  1302. if (!bValueOnly)
  1303. {
  1304. sReturnedStyle += ";";
  1305. }
  1306. }
  1307. }
  1308. }
  1309. return sReturnedStyle;
  1310. }
  1311. function f_getPromptRequestSubmitFlag()
  1312. {
  1313. var v_bFlag = false;
  1314. if ( typeof window != K_PRMT_sUNDEFINED )
  1315. {
  1316. if ( typeof window.gCognosViewer != K_PRMT_sUNDEFINED && typeof window.gCognosViewer.gbPromptRequestSubmitted != K_PRMT_sUNDEFINED )
  1317. {
  1318. v_bFlag = window.gCognosViewer.gbPromptRequestSubmitted;
  1319. }
  1320. else if ( typeof window.gbPromptRequestSubmitted != K_PRMT_sUNDEFINED )
  1321. {
  1322. v_bFlag = window.gbPromptRequestSubmitted;
  1323. }
  1324. else
  1325. {
  1326. v_bFlag = window.gbPromptRequestSubmitted = false;
  1327. }
  1328. }
  1329. else if ( typeof gbPromptRequestSubmitted != K_PRMT_sUNDEFINED )
  1330. {
  1331. v_bFlag = gbPromptRequestSubmitted;
  1332. }
  1333. return v_bFlag;
  1334. }
  1335. function f_setPromptRequestSubmitFlag(v_bFlag)
  1336. {
  1337. if ( typeof window != K_PRMT_sUNDEFINED )
  1338. {
  1339. if ( typeof window.gCognosViewer != K_PRMT_sUNDEFINED && typeof window.gCognosViewer.gbPromptRequestSubmitted != K_PRMT_sUNDEFINED )
  1340. {
  1341. window.gCognosViewer.gbPromptRequestSubmitted = v_bFlag;
  1342. }
  1343. else
  1344. {
  1345. window.gbPromptRequestSubmitted = v_bFlag;
  1346. }
  1347. }
  1348. else if ( typeof gbPromptRequestSubmitted != K_PRMT_sUNDEFINED )
  1349. {
  1350. gbPromptRequestSubmitted = v_bFlag;
  1351. }
  1352. }
  1353. /**
  1354. @private
  1355. @param {string} sAction Should be one of: back, cancel, forward, next, reprompt.
  1356. @param {string} sArg Url for 'back'
  1357. @return {boolean} 'true' if successfully called the CognosViewer's promptAction().
  1358. @desc Re-route old promptAction() calls to CognosViewer's promptAction().
  1359. (Custom Scripts Workaround)
  1360. */
  1361. function f_CSW_tryCVPromptAction(sAction, sArg)
  1362. {
  1363. if ( needPromptValidation(sAction) )
  1364. {
  1365. canSubmitPrompt(); // trigger validation before submitting values.
  1366. }
  1367. if ( typeof window != K_PRMT_sUNDEFINED && typeof window.gCognosViewer != K_PRMT_sUNDEFINED && typeof window.gCognosViewer.promptAction == K_PRMT_sFUNCTION )
  1368. {
  1369. window.gCognosViewer.promptAction(sAction, sArg);
  1370. return true;
  1371. }
  1372. return false;
  1373. }
  1374. /**
  1375. @private
  1376. @desc Maps document.formWarpRequest to document.formWarpRequest_NS_
  1377. (Custom Scripts Workaround)
  1378. */
  1379. function f_CSW_setFWR()
  1380. {
  1381. if (typeof SYSTEMPROPERTY_CREATE_CUSTOM_SCRIPTS_REFS != "undefined" && SYSTEMPROPERTY_CREATE_CUSTOM_SCRIPTS_REFS === false)
  1382. {
  1383. return;
  1384. }
  1385. if ( !window.gCognosViewer )
  1386. {
  1387. // Browser or CognosViewer not ready, try again later.
  1388. setTimeout( f_CSW_setFWR, 100 );
  1389. }
  1390. else
  1391. {
  1392. var v_doc = document;
  1393. var v_sFWR = "formWarpRequest";
  1394. var sId = (window.gCognosViewer && window.gCognosViewer.getId ? window.gCognosViewer.getId() : "");
  1395. if (v_doc[v_sFWR + sId] && !v_doc[v_sFWR])
  1396. {
  1397. // map document.formWarpRequest to document.formWarpRequest_NS_
  1398. v_doc[v_sFWR] = v_doc[v_sFWR + sId];
  1399. if ( typeof SYSTEMPROPERTY_CUSTOM_SCRIPTS_OVERRIDE_FORM_SUBMIT != "undefined" && SYSTEMPROPERTY_CUSTOM_SCRIPTS_OVERRIDE_FORM_SUBMIT )
  1400. {
  1401. // Overwrite submit of form.
  1402. v_doc[v_sFWR].submit = f_CSW_tryCVPromptAction;
  1403. }
  1404. }
  1405. }
  1406. }
  1407. if ( typeof SYSTEMPROPERTY_CREATE_CUSTOM_SCRIPTS_REFS == "undefined" || SYSTEMPROPERTY_CREATE_CUSTOM_SCRIPTS_REFS )
  1408. {
  1409. // Sets document.formWarpRequest
  1410. // (Custom Scripts Workaround)
  1411. f_CSW_setFWR();
  1412. }