home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 July / 07_02.iso / software / mdmx / files / DreamweaverMXInstaller.exe / Disk1 / data1.cab / Configuration_En / Commands / EditOpsCmn.js < prev    next >
Encoding:
JavaScript  |  2002-05-01  |  37.2 KB  |  1,126 lines

  1.  
  2. // Copyright 2000-2002 Macromedia, Inc. All rights reserved.
  3.  
  4.     
  5. //**********************GLOBAL VARS********************
  6.  
  7. var PREFIX = "editOps_";
  8.  
  9. // participants -- stored as globals because the overhead of getting them can be high, and
  10. // some may be re-used
  11. var PART_TEXT, PART_TF,PART_TA, PART_CB, PART_DYN_CB, PART_RG,PART_DYN_RG;     
  12. var PART_SELECT,PART_OPTION,PART_DYN_MENU,PART_TR,PART_TR_RG,PART_TR_RB;     
  13. var PART_TR_TA,PART_TABLE,PART_BEGIN_LOOP,PART_END_LOOP,PART_CHECKED_ATTR;
  14. var PART_SELECTED_ATTR,PART_DYN_OPTION,PART_DYN_OP_NOSEL;
  15. var PART_HF, PART_PF, PART_FF;
  16.  
  17. var TEXTFIELD     =  MM.LABEL_TextField;
  18. var HIDDENFIELD   =  MM.LABEL_HiddenField;
  19. var PASSWORDFIELD =  MM.LABEL_PasswordField;
  20. var PASSWORD      =  MM.LABEL_Password;
  21. var FILEFIELD     =  MM.LABEL_FileField;
  22. var TEXTAREA      =  MM.LABEL_TextArea;
  23. var MENU          =  MM.LABEL_Menu;
  24. var CHECKBOX      =  MM.LABEL_CheckBox;
  25. var RADIOGROUP    =  MM.LABEL_RadioGroup;
  26. var TEXT          =  MM.LABEL_Text;
  27. var NUMERIC       =  MM.LABEL_Numeric;
  28. var DATE          =  MM.LABEL_Date;
  29. var DATEMSACCESS  =  MM.LABEL_DateMSAccess;
  30. var CHECKBOXYN    =  MM.LABEL_CheckBoxYN;
  31. var CHECKBOX10    =  MM.LABEL_CheckBox10;
  32. var CHECKBOXNEG10 =  MM.LABEL_CheckBoxNeg10;
  33. var CHECKBOXACCESS=  MM.LABEL_CheckBoxAccess;
  34.  
  35. var STR_DIVIDER = "* *";
  36. var STR_ELEMENT_NAMES = STR_DIVIDER;
  37.  
  38. var STR_CURR_RS = "";
  39.  
  40.  
  41. // stores separate file dom needed for dynamic UI
  42. var DOM_UI_PIECES = dw.getDocumentDOM("EditOpsAltHTML.htm"); 
  43.  
  44.  
  45. // global form widget variables
  46. var MENU_CONN, MENU_TABLES, MENU_DISPLAY, MENU_SUBMIT;
  47. var MENU_RS, MENU_COLS; // only for Update
  48. var TF_REDIRECT_URL, TF_LABEL, GRID_COLS, CB_NUMERIC;
  49.  
  50. var ARR_COLS_TO_ADD = new Array();
  51. var ARR_COL_TYPES = new Array();
  52. var EMPTY_LIST = new Array();
  53. var EDIT_OP_TYPE;
  54. var SUBMIT_BTN_TEXT = (EDIT_OP_TYPE == "Insert")?MM.BTN_InsertRecord:MM.BTN_UpdateRecord;
  55. var GROUP_DYN_DATA;
  56.  
  57. //********************API FUNCTIONS******************************    
  58.  
  59.  
  60. function commandButtons(){
  61.   return new Array(MM.BTN_OK,       "okayClicked()",
  62.                    MM.BTN_Cancel,   "cancelClicked()",
  63.                    MM.BTN_Help,     "displayHelp()");
  64.  
  65. }
  66.  
  67.  
  68. function canInsertObject()
  69. {
  70.   var retVal = true;
  71.   
  72.   var errMsgStr = "";
  73.   
  74.   if (EDIT_OP_TYPE != "Insert" && dwscripts.getRecordsetNames().length == 0) 
  75.   { 
  76.     errMsgStr = dwscripts.sprintf(MM.MSG_NeedRecordsetForObject, dwscripts.getRecordsetDisplayName());
  77.   }
  78.  
  79.   if (!errMsgStr)
  80.   {
  81.     //check if a script of this type already exists
  82.     var editOpType = (EDIT_OP_TYPE == "Insert") ? "insertRecord" : "updateRecord";
  83.     var editOpTitle = (EDIT_OP_TYPE == "Insert") ? MM.LABEL_TitleInsertRecord : MM.LABEL_TitleUpdateRecord;
  84.  
  85.     var ssRecs = dw.serverBehaviorInspector.getServerBehaviors();
  86.  
  87.     var found = false;
  88.     for (var i=0; !found && i < ssRecs.length; i++)
  89.     {
  90.       found = (ssRecs[i].type == editOpType);
  91.     }
  92.     
  93.     if (found) 
  94.     {
  95.       errMsgStr = errMsg(MM.MSG_OnlyOneServerBehAllowed,editOpTitle);
  96.     }
  97.   }
  98.   
  99.   if (errMsgStr)
  100.   {
  101.     alert (errMsgStr);
  102.     retVal = false;
  103.   }
  104.   
  105.   return retVal;
  106. }
  107.  
  108.  
  109.  
  110. //********************LOCAL FUNCTIONS******************************    
  111.  
  112. function getCommandTitle(){
  113.   var titleStr = dw.getDocumentDOM().getElementsByTagName("TITLE").item(0).innerHTML;
  114.   
  115.   // strip starting white space
  116.   while ( titleStr[0] == " " )  titleStr = titleStr.substring(1); 
  117.   
  118.   return titleStr;
  119. }
  120.  
  121.  
  122.  
  123. function okayClicked(){
  124.   var conn = MMDB.getConnectionString(MENU_CONN.get());
  125.   var editOpTypeIsInsert = ( EDIT_OP_TYPE == "Insert" );
  126.   var rs = "",col="", colQuote, dom = dw.getDocumentDOM();
  127.   var table = MENU_TABLES.getValue();
  128.   var redirectURL   = (TF_REDIRECT_URL.value)?TF_REDIRECT_URL.value:"";
  129.   if ( !editOpTypeIsInsert ) {
  130.     rs  = MENU_RS.getValue();
  131.     col = MENU_COLS.getValue();
  132.     colQuote = (CB_NUMERIC.checked.toString() == "true")?"":"'";
  133.   }
  134.   
  135.   // check for error conditions
  136.   var errMsgStr = "";
  137.   if (!conn) {
  138.     errMsgStr = MM.MSG_NoConnection;
  139.   } else if (!table) {
  140.     errMsgStr = MM.MSG_NoTables;
  141.   } else if ( !editOpTypeIsInsert && !col) {
  142.     errMsgStr = MM.MSG_NoColumn;
  143.   }
  144.   if ( !editOpTypeIsInsert && !errMsgStr) {
  145.     // check that the selected column exists in the recordset
  146.     var colList = dwscripts.getFieldNames(MENU_RS.getValue()),i, found=true;
  147.     for (i=0, found=false; !found && i < colList.length; i++)
  148.       found = (colList[i].toLowerCase() == col.toLowerCase());  
  149.     if (!found)
  150.     {
  151.       errMsgStr = dwscripts.sprintf(MM.MSG_NoColumnInRS, dwscripts.getRecordsetDisplayName());
  152.     }
  153.   }
  154.  
  155.   // if error condition, alert it and return
  156.   if (errMsgStr){
  157.     alert (errMsgStr);
  158.     return;
  159.   }
  160.   
  161.   // if no error conditions, build the edits to apply to the document
  162.   MM.setBusyCursor();
  163.   // if cursor is inside of a form, set the selection so that the cursor is just outside
  164.   // of the form
  165.   checkThatCursorIsNotInsideOfAForm();
  166.   // call generic selection handling for non-object insertion
  167.   fixUpInsertionPoint();
  168.   
  169.   // create participant group to apply/insert into document
  170.   var formContent = createFormContent(GRID_COLS.valueList,rs,col);
  171.   var editOpsGroup = new Group( (editOpTypeIsInsert)?"insertRecord":"updateRecord" ); 
  172.   var customGroup = new Group();
  173.   var formActionPart = new Participant("editOps_formAttr"); 
  174.   var formPart = new Participant("editOps_form");
  175.   
  176.   customGroup.addParticipants(editOpsGroup.getParticipants("aboveHTML"));
  177.   
  178.   // comment out below line if using insertHTML
  179.   customGroup.addParticipants(Array(formPart));
  180.  
  181.  
  182.   // create parameter object used to provide variables for this edit op
  183.   // server behavior
  184.   var paramObj = new Object();
  185.   paramObj.table   = wrapNamesWithSpaces(table);
  186.   //paramObj.elemStr = determineElementsString();
  187.   setFieldsAndColumns(paramObj);
  188.   paramObj.redirect__url     = redirectURL;
  189.   paramObj.conn    = conn;
  190.   paramObj.username = (MENU_CONN.object) ? MMDB.getUserName(MENU_CONN.get()) : '';
  191.   paramObj.password = (MENU_CONN.object) ? MMDB.getPassword(MENU_CONN.get()) : '';
  192.   paramObj.driver   = (MENU_CONN.object) ? MMDB.getDriverName(MENU_CONN.get()) : '';  
  193.   if (!editOpTypeIsInsert){
  194.     paramObj.rs  = rs;
  195.     paramObj.col = col;
  196.     paramObj.colQuote = colQuote;
  197.   }
  198.   
  199.   paramObj.formContent = formContent;
  200.   paramObj.formAction  = killEndingWhiteSpace(formActionPart.getInsertString());
  201.   paramObj.formName    = makeUniqueName("FORM","form");
  202.   
  203.   // needed for connection participant
  204.   paramObj.cname   = (MENU_CONN.object) ? MENU_CONN.get() : '';
  205.   paramObj.relpath = getConnectionsPath(paramObj.cname);
  206.   paramObj.ext = getServerExtension();
  207.   
  208.   
  209.   // H: uncomment out below to use dw.insertHTML
  210.   //var formStr = formPart.getInsertString(paramObj);
  211.   //dom.insertHTML(formStr);
  212.   customGroup.apply(paramObj);
  213.   
  214.   MM.clearBusyCursor();
  215.   window.close();
  216.   
  217. }
  218.  
  219.  
  220. function cancelClicked(){
  221.   MM.commandReturnValue = "";
  222.   window.close();
  223. }
  224.  
  225. function initializeUI(){ 
  226.  
  227.    defineGlobalsBasedOnServerModel();
  228.    
  229.    // define global form elements
  230.    MENU_CONN   = new ListControl("Connection")
  231.    MENU_TABLES = new ListControl("TableToUpdate");
  232.    MENU_DISPLAY = new ListControl("DisplayAs");
  233.    MENU_SUBMIT = new ListControl("SubmitAs");
  234.    if (EDIT_OP_TYPE == "Update"){
  235.      MENU_RS = new ListControl("SelectRecordFrom");
  236.      MENU_COLS = new ListControl("UniqueKeyColumn");
  237.      CB_NUMERIC  = findObject("Numeric");
  238.    } 
  239.    TF_REDIRECT_URL  = findObject("GoToURL");
  240.    TF_LABEL    = findObject("ElementLabel");
  241.    GRID_COLS   = new GridWithNavControls("ColumnNames");
  242.    GRID_COLS.setColumnNames(MM.LABEL_ColGrid);
  243.  
  244.    // populate menus
  245.    var displayAsArr = new Array(TEXTFIELD,TEXTAREA,MENU,HIDDENFIELD,CHECKBOX,
  246.                                 RADIOGROUP,PASSWORDFIELD,TEXT);
  247.    var submitAsArr  = new Array(TEXT,NUMERIC,DATE,DATEMSACCESS,CHECKBOXYN,CHECKBOX10,CHECKBOXNEG10,CHECKBOXACCESS);
  248.    MENU_DISPLAY.setAll(displayAsArr,displayAsArr);
  249.    MENU_SUBMIT.setAll(submitAsArr,submitAsArr);
  250.    updateUI("populateConnectionList");
  251.  
  252.    // if "Update Record", then populate recordset list
  253.    if (EDIT_OP_TYPE == "Update"){ 
  254.      var rsNames = dwscripts.getRecordsetNames();
  255.      if (rsNames) {
  256.        MENU_RS.setAll(rsNames,rsNames);
  257.        STR_CURR_RS = MENU_RS.get();
  258.      }
  259.      else
  260.      {
  261.        MENU_RS.setAll(new Array(dwscripts.sprintf(MM.LABEL_NoRecordsets, 
  262.                                                   dwscripts.getRecordsetDisplayName())), 
  263.                                                   EMPTY_LIST);
  264.      }
  265.    }
  266.   
  267.   elts = document.forms[0].elements;
  268.   if (elts && elts.length)
  269.     elts[0].focus();
  270. }
  271.  
  272.  
  273. function updateUI(whichSection){ 
  274.   
  275.    switch (whichSection){
  276.      case "defineConnection":
  277.        var pickedValue = MENU_CONN.getValue();
  278.        MMDB.showConnectionMgrDialog()
  279.        updateUI("populateConnectionList");
  280.        break;
  281.          
  282.      case "populateConnectionList":
  283.        var connNames = MMDB.getConnectionList();
  284.        connNames.unshift(MM.LABEL_None);
  285.        if (connNames.length > 0) 
  286.          MENU_CONN.setAll(connNames,connNames);
  287.        else
  288.          MENU_CONN.setAll(new Array(MM.LABEL_NoConnections), EMPTY_LIST);
  289.        if (pickedValue)
  290.          MENU_CONN.pickValue(pickedValue);
  291.        updateUI("tableMenu");
  292.        break;
  293.       
  294.      case "tableMenu":
  295.        var tableNames = new Array(), tableName,i;
  296.        if (MENU_CONN.get() != MM.LABEL_None) {
  297.          var tableObjects = MMDB.getTables(MENU_CONN.get());
  298.          for (var i = 0; i < tableObjects.length; i++) {
  299.            var tableName = "";
  300.            if (tableObjects[i].schema != "") {
  301.              tableName = Trim(tableObjects[i].schema) + ".";
  302.            } else if (tableObjects[i].catalog != "") {
  303.              tableName = Trim(tableObjects[i].catalog) + ".";
  304.            }
  305.            tableName += tableObjects[i].table;
  306.            if (tableName) {
  307.              tableNames.push(tableName);
  308.            }
  309.          }
  310.        }
  311.        if (tableNames.length > 0) {
  312.          MENU_TABLES.setAll(tableNames,tableNames);
  313.          MENU_TABLES.setIndex(0);
  314.        }
  315.        else {
  316.          MENU_TABLES.setAll(new Array(MM.LABEL_NoTables), EMPTY_LIST);
  317.        }
  318.        updateUI('columnGrid');
  319.        break;
  320.         
  321.       case "RSHasChanged":
  322.         if (STR_CURR_RS != ""){
  323.           updateDefaultFormFieldValues(STR_CURR_RS,MENU_RS.getValue());
  324.           displayGridFieldValues();
  325.           STR_CURR_RS = MENU_RS.getValue();
  326.         }
  327.         break;
  328.         
  329.         
  330.       case "tableColList":
  331.         // check for checking numeric box here
  332.         var column = MENU_COLS.get();
  333.         if (ARR_COL_TYPES[column] != null) {
  334.           if (dwscripts.isNumericDBColumnType(ARR_COL_TYPES[column])) {
  335.             CB_NUMERIC.setAttribute("checked","true");
  336.           } else {
  337.             CB_NUMERIC.removeAttribute("checked");
  338.           }
  339.         }
  340.         break;
  341.         
  342.       case "columnGrid": 
  343.         // populate grid, and populate UI according to first grid item
  344.         populateColumnGrid();
  345.         displayGridFieldValues();
  346.         
  347.         // if Update, populate uniqueID menu
  348.        if (EDIT_OP_TYPE == "Update") {
  349.          var i, colArr = new Array();
  350.          for (i in ARR_COL_TYPES){
  351.            colArr.push(i);
  352.        }
  353.        if (colArr.length > 0)
  354.          MENU_COLS.setAll(colArr, colArr);
  355.        else
  356.          MENU_COLS.setAll(new Array(MM.LABEL_NoColumns), EMPTY_LIST); 
  357.        updateUI("tableColList");
  358.   }
  359.         break;     
  360.    
  361.       default:
  362.         break;
  363.  
  364.    }
  365. }
  366.  
  367.  
  368. function populateColumnGrid(){
  369.   // clear additional column list
  370.   // it lists columns that don't get populated in the grid, and needs to be cleared
  371.   updateAdditionalColumnList('clear'); 
  372.   
  373.   // if there are no tables, then clear grid, and return
  374.   if ( !connectionHasBeenChosen() ){
  375.     GRID_COLS.setAllRows(new Array(),new Array());
  376.     return;
  377.   }
  378.   
  379.   var colsAndTypes = MMDB.getColumnAndTypeOfTable(MENU_CONN.get(),MENU_TABLES.getValue())
  380.   var nColumns = colsAndTypes.length/2, rowInfo, i;
  381.   var rowTextArr = new Array();
  382.   var rowValArr  = new Array();
  383.   ARR_COL_TYPES = new Array();
  384.   
  385.   for (var i=0; i < colsAndTypes.length; i+=2) {
  386.      ARR_COL_TYPES[colsAndTypes[i]] = colsAndTypes[i+1];
  387.      if (EDIT_OP_TYPE == "Update") {
  388.        rowInfo = getRowTextAndValue(colsAndTypes[i],colsAndTypes[i+1],MENU_RS.get());
  389.      } else {  // if Insert (and recordset menu does not exist)
  390.        rowInfo = getRowTextAndValue(colsAndTypes[i],colsAndTypes[i+1]);
  391.      }
  392.      rowTextArr.push(rowInfo[0]);
  393.      rowValArr.push(rowInfo[1]);
  394.   }
  395.   
  396.   GRID_COLS.setAllRows(rowTextArr,rowValArr);
  397.   
  398.   // clear global field names array (used to check for dupe field names)
  399.   STR_ELEMENT_NAMES = STR_DIVIDER;
  400.   
  401.   
  402. }
  403.  
  404.  
  405. // Note: rsName is last parameter because it is only used for Update
  406. function getRowTextAndValue(colName,colType,rsName){
  407.   var rowValObj = new Object();
  408.   var colLabel = getLabelFromColumnName(colName);
  409.   // default to password display type if "password" appears in field name
  410.   var colFieldType = (colName.toLowerCase().indexOf(PASSWORD) != -1)?
  411.                       PASSWORDFIELD:getFieldTypeFromColumnType(colType);
  412.   var colSubmitType = getSubmitTypeFromColumnType(colType);
  413.   var rowText = colName + "|" + colLabel + "|" + colFieldType + "|" + colSubmitType;
  414.       
  415.   rowValObj.column = colName;
  416.   rowValObj.label = colLabel;
  417.   rowValObj.displayAs = getFormFieldStorageObjectFromFormFieldType(colFieldType);
  418.   rowValObj.submitAs = colSubmitType;
  419.   rowValObj.fieldName = getElementNameFromColumnName(colName);
  420.   rowValObj.defaultStr = "";
  421.   rowValObj.passwordStr = "";
  422.  
  423.   // populate storage object with any default values
  424.   if (EDIT_OP_TYPE == "Update" && rowValObj.displayAs.type != "passwordField"){
  425.     var rs = (rsName)?rsName:MENU_RS.getValue();
  426.     rowValObj = populateFormFieldStorageType(rowValObj,rs,colName);
  427.   }
  428.           
  429.   return new Array(rowText,rowValObj);
  430. }
  431.  
  432.  
  433. // note: this fn is only called when the row is first created, which is why
  434. // it only lists some of the available form types
  435.  
  436. function populateFormFieldStorageType(rowValObj,rsName,colName){
  437.   var displayType = rowValObj.displayAs.type;
  438.   var dynDataVal = createDynamicData(rsName,colName);
  439.   rowValObj.defaultStr = dynDataVal;
  440.   
  441.   if  (displayType == "textField" || displayType  == "textArea" || 
  442.        displayType  == "hiddenField" ) {
  443.     rowValObj.displayAs.value = dynDataVal;
  444.   } else if (displayType == "text" ){
  445.     rowValObj.displayAs.text = dynDataVal;
  446.   } else if (displayType == "dynamicCheckBox"){
  447.     rowValObj.displayAs.checkIf = dynDataVal;
  448.   }
  449.  
  450.   return rowValObj;
  451. }
  452.  
  453.  
  454. function getFormFieldStorageObjectFromFormFieldType(fieldType){
  455.   var retObj = "";
  456.     
  457.   if (fieldType == TEXT){
  458.     retObj = new eoText();
  459.   } else if (fieldType == TEXTFIELD){
  460.     retObj = new eoTextField();
  461.   } else if (fieldType == HIDDENFIELD){
  462.     retObj = new eoHiddenField();
  463.   } else if (fieldType == PASSWORDFIELD){
  464.     retObj = new eoPasswordField();
  465.   } else if (fieldType == FILEFIELD){
  466.     retObj = new eoFileField();
  467.   } else if (fieldType == TEXTAREA){
  468.     retObj = new eoTextArea();
  469.   } else if (fieldType == MENU){
  470.     retObj = new eoMenu();
  471.   } else if (fieldType == RADIOGROUP){
  472.     retObj = new eoRadioGroup();
  473.   } else if (fieldType == CHECKBOX){
  474.     retObj = (EDIT_OP_TYPE == "Insert")?new eoCheckBox():new eoDynamicCheckBox();
  475.   } 
  476.  
  477.   return retObj;
  478. }
  479.  
  480.  
  481.  
  482. // function: showDifferentParams
  483. // description: shows form field specific parameters at the bottom of the dialog
  484. // for instance, shows "Menu Properties" button for menu, value field for textfield, etc.
  485.  
  486. function showDifferentParams(displayDefaultStr){
  487.   
  488.    // don't bother if connection has not been chosen
  489.    if ( !connectionHasBeenChosen() ){
  490.      return;
  491.    }
  492.    var displayAs = MENU_DISPLAY.getValue()?MENU_DISPLAY.getValue():"none";
  493.    var tables = DOM_UI_PIECES.getElementsByTagName("TABLE"), param, i;
  494.    var mmParamsTag = document.body.getElementsByTagName("mmParams").item(0);
  495.    
  496.    toggleSubmitAsVisibility(displayAs); // enable or disable Submit As Menu
  497.    toggleLabelVisibility(displayAs);    // enable or disable Label textfield
  498.  
  499.    if (displayAs == TEXTFIELD || displayAs == TEXTAREA || displayAs == HIDDENFIELD ||
  500.        displayAs == PASSWORDFIELD || displayAs == FILEFIELD) {
  501.      param = "textField";
  502.    } else if (displayAs == TEXT){
  503.      param = "text";
  504.    } else if (displayAs == RADIOGROUP){
  505.      param = "radio";
  506.    } else if (displayAs == MENU){
  507.      param = "menu";
  508.    } else if (displayAs == CHECKBOX){
  509.      param = (EDIT_OP_TYPE == "Insert") ? "checkBox" : "dynamicCheckBox";
  510.    } else if (displayAs == "none"){
  511.      param = "none";
  512.    }
  513.    
  514.    for (i=0;i<tables.length;i++){
  515.       if (tables[i].name && tables[i].name == param){
  516.          mmParamsTag.innerHTML = tables[i].innerHTML;
  517.          break;
  518.       }
  519.    }
  520.    // if display as equals text, text area, or text field, and the display as menu has
  521.    // just been changed, then display the default text for this column
  522.    if (displayDefaultStr) {
  523.      var rowInfoObj = GRID_COLS.getRowValue();
  524.      var defaultStr = GRID_COLS.getRowValue().defaultStr;
  525.      var passwordStr = GRID_COLS.getRowValue().passwordStr;
  526.      
  527.      if ( displayAs == TEXTFIELD || displayAs == TEXTAREA ||
  528.           displayAs == HIDDENFIELD || displayAs == FILEFIELD ) {
  529.          findObject("SetValueTo").value = rowInfoObj.displayAs.value = defaultStr;  // set UI
  530.      } else if ( displayAs == PASSWORDFIELD ) {
  531.          findObject("SetValueTo").value = rowInfoObj.displayAs.value = passwordStr;    // set UI
  532.      } else if ( displayAs == TEXT ) {
  533.          findObject("Text").value = rowInfoObj.displayAs.text = defaultStr;    // set UI
  534.      } else if ( param == "dynamicCheckBox" ){
  535.          findObject("CheckIf").value = rowInfoObj.displayAs.checkIf = defaultStr;
  536.      }
  537.    }
  538.     
  539. }
  540.  
  541. // function: updateGridRow
  542. // description: called whenever the label, submitAs, or displayAs fields are edited
  543. // updates both the actual text display in the grid, 
  544. // and the object that stores the information about the display
  545. // whichColumn: the parameter which has been edited -- displayAs, submitAs, or label
  546.  
  547. function updateGridRow(whichColumn){
  548.   // check that connection has been chosen before proceeding
  549.   if ( !connectionHasBeenChosen() ){
  550.     alert( MM.MSG_NoConnectionSelected );
  551.     // MENU_DISPLAY.setIndex(0); // set display menu back to first item
  552.     return;
  553.   }
  554.   
  555.   var currRowObj  = GRID_COLS.getRowValue();
  556.   var currRowText = GRID_COLS.getRow();
  557.   var currColName = currRowText.substring(  0,currRowText.indexOf("|")  );
  558.   
  559.   // update grid row text
  560.   var newRowText = currColName + "|" + TF_LABEL.value + "|" + MENU_DISPLAY.get() + "|"; 
  561.   newRowText += (findObject("SubmitAs")) ? MENU_SUBMIT.get() : "";
  562.   GRID_COLS.setRow(newRowText);
  563.   
  564.   // update object that stores information about grid row
  565.   // this object is stored in a value attribute of the Grid object
  566.   // these objects are stored in an array: GridObj.valueList
  567.   
  568.   switch (whichColumn){
  569.     case "label":
  570.       currRowObj.label = TF_LABEL.value;
  571.       break;
  572.       
  573.     case "submitAs":
  574.       currRowObj.submitAs = MENU_SUBMIT.get();
  575.       break;
  576.       
  577.     case "displayAs": 
  578.       currRowObj.displayAs = getFormFieldStorageObjectFromFormFieldType(MENU_DISPLAY.getValue());
  579.       // need to update submit property, because changing displayAs menu can
  580.       // auto-change submit type
  581.       if ( findObject("SubmitAs") ) {
  582.         currRowObj.submitAs = MENU_SUBMIT.getValue();
  583.       }
  584.       
  585.       var defaultStr = currRowObj.defaultStr;
  586.       var passwordStr = currRowObj.passwordStr;
  587.       var fieldType = currRowObj.displayAs.type;
  588.       
  589.       if ( fieldType == "textField"  || fieldType == "hiddenField" || 
  590.            fieldType == "fileField"  ||  fieldType == "textArea" ){
  591.            currRowObj.displayAs.value = defaultStr;
  592.       } else if ( fieldType == "passwordField"){
  593.            currRowObj.displayAs.value = passwordStr;          
  594.       } else if ( fieldType == "text"){
  595.            currRowObj.displayAs.text = defaultStr;
  596.       } else if ( fieldType == "menu"){
  597.            currRowObj.displayAs.defaultSelected = defaultStr;
  598.       } else if ( fieldType == "radioGroup"){
  599.            currRowObj.displayAs.defaultChecked = defaultStr;
  600.       } else if (fieldType == "dynamicCheckBox"){
  601.            currRowObj.displayAs.checkIf = defaultStr;
  602.       }
  603.       break;
  604.       
  605.     default:
  606.       break;
  607.   }
  608. }
  609.  
  610.  
  611. // function: displayGridFieldValues
  612. // description: called when the user clicks on a new row in the grid,
  613. // changes the values of the UI fields to display the correct information
  614.  
  615. function displayGridFieldValues(){ 
  616.   // don't bother if grid is empty -- needed because this fn is also
  617.   // called when the connection or table changes
  618.   if (GRID_COLS.list.length == 0){
  619.     TF_LABEL.value = "";
  620.     return;
  621.   }
  622.     
  623.    var currRowText = GRID_COLS.getRow();
  624.    var currRowVal  = GRID_COLS.getRowValue();
  625.    var rowTextTokens = getTokens(currRowText,"|");
  626.  
  627.       
  628.    TF_LABEL.value = rowTextTokens[1]; // update label field
  629.    MENU_DISPLAY.pickValue(rowTextTokens[2]); // update display menu
  630.    
  631.    // change UI at bottom of dialog, if relevent
  632.    // for instance, if prior row had displayAs = Text, but this row has displayAs = Menu
  633.    showDifferentParams(); 
  634.    
  635.    if (  findObject("SubmitAs")  ) 
  636.      MENU_SUBMIT.pickValue(rowTextTokens[3]); // update submit menu
  637.    
  638.    // fill in form parameters at bottom of UI
  639.    // note that in the case of radio or menu, there is nothing to fill in
  640.    switch (currRowVal.displayAs.type){
  641.      
  642.      case "text":
  643.        findObject("Text").value = currRowVal.displayAs.text = currRowVal.defaultStr;
  644.        break;
  645.      case "textArea":
  646.      case "textField":
  647.      case "hiddenField":
  648.      case "fileField":
  649.        findObject("SetValueTo").value = currRowVal.displayAs.value = currRowVal.defaultStr;
  650.        break;
  651.      case "passwordField":
  652.        findObject("SetValueTo").value = currRowVal.displayAs.value = currRowVal.passwordStr;
  653.        break;
  654.      case "checkBox": 
  655.        // note: findObject doesn't work with radios, so manual references are needed
  656.        var InitialStateRadios = document.forms[0].InitialState;
  657.        if ( currRowVal.displayAs.checked.toString() == "true"){
  658.          InitialStateRadios[0].checked = true; InitialStateRadios[1].checked = false;
  659.        } else {
  660.          InitialStateRadios[0].checked = false; InitialStateRadios[1].checked = true;
  661.        }
  662.        break;
  663.        
  664.      case "dynamicCheckBox":
  665.        findObject("CheckIf").value = currRowVal.displayAs.checkIf;
  666.        findObject("EqualTo").value = currRowVal.displayAs.equalTo;
  667.        break;
  668.        
  669.      case "default":
  670.        break; 
  671.    }
  672.   
  673.    GRID_COLS.setRowIndex(GRID_COLS.getRowIndex());
  674. }
  675.  
  676.  
  677. // function: deleteGridRow
  678. // description: called when the user clicks the "--" image button
  679.  
  680. function deleteGridRow(){
  681.   var currRow = GRID_COLS.getRow();
  682.   var currCol = currRow.substring(0,currRow.indexOf("|") );
  683.   var nRows = GRID_COLS.list.length;
  684.   
  685.   if (nRows > 1){
  686.     updateAdditionalColumnList('add',currCol);
  687.     GRID_COLS.delRow();
  688.     displayGridFieldValues(); 
  689.   } else {
  690.     alert(MM.MSG_NeedOneColumnInList);
  691.   }
  692. }
  693.  
  694.  
  695. // function: addGridRow
  696. // description: if there are columns not already displayed in the grid
  697. // pop up the "Add Columns" dialog, and allow the user to add them
  698.  
  699. function addGridRow(){
  700.   // check to see if there are columns to add first
  701.   if (ARR_COLS_TO_ADD.length == 0){
  702.     alert(MM.MSG_NoMoreColumnsToAdd);
  703.     return;
  704.   }
  705.   
  706.   var colsToAdd = callCommand('Add Column.htm',ARR_COLS_TO_ADD);
  707.   if (!colsToAdd) return; // user clicked Cancel
  708.   var nCols = colsToAdd.length,i, currCol, rowInfoArr;
  709.   
  710.   for (i=0;i<nCols;i++){
  711.     currCol = colsToAdd[i];
  712.     rowInfoArr = getRowTextAndValue(currCol,ARR_COL_TYPES[currCol]);
  713.     GRID_COLS.addRow(rowInfoArr[0],rowInfoArr[1]);
  714.     updateAdditionalColumnList('del',currCol);
  715.   }
  716. }
  717.  
  718.  
  719. // function: updateAdditionalColumnList
  720. // description: the + button calls up an Add Columns dialog, allowing
  721. // the user to add additional columns to the list. When the Add Columns
  722. // dialog is called, it is populated with the "additional columns list".
  723. // This list is updated when a user adds or deletes a column from the UI.
  724. // The action argument can be add, del, or clear
  725.  
  726. function updateAdditionalColumnList(action,col){
  727.    var addColArr = ARR_COLS_TO_ADD; 
  728.    if (action == 'add'){
  729.       addColArr.push(col);
  730.    } else if ( action == 'clear'){
  731.       // addColArr.length = 0;
  732.       ARR_COLS_TO_ADD = new Array();
  733.    } else { // delete an item from additional column list
  734.      var nItems = addColArr.length,i;
  735.      
  736.      for (i=0;i<nItems;i++){
  737.        if (addColArr[i] == col){
  738.          addColArr.splice(i,1);
  739.          break;
  740.        }
  741.      }
  742.    }
  743. }
  744.  
  745.  
  746. // function: popUpFormFieldPropertiesDialog
  747. // description: pops up the Radio or Menu Properties dialog,
  748. // and passes in the current menu/radio storage object
  749. // so that the dialog can be initialized correctly
  750. // "whichOne" argument can be "Radio" or "Menu";
  751.  
  752. function popUpFormFieldPropertiesDialog(whichOne){
  753.   var commandFileName = whichOne + " Properties.htm";
  754.   var rowObj = GRID_COLS.getRowValue();
  755.   var fieldInfoObj = callCommand(commandFileName,rowObj.displayAs)
  756.  
  757.  
  758.   // note: use the "type" property on the menuInfoObj to see which
  759.   // type of object was returned
  760.   if (fieldInfoObj) {
  761.     rowObj.displayAs = fieldInfoObj;
  762.   }
  763. }
  764.  
  765.  
  766. function getFieldTypeFromColumnType(colType){
  767.   return ( dwscripts.isBooleanDBColumnType(colType)) ? CHECKBOX : TEXTFIELD;
  768. }
  769.  
  770.  
  771. function getLabelFromColumnName(colName){
  772.   return colName.charAt(0).toUpperCase() + colName.substring(1) + MM.LABEL_Delimiter;      
  773. }
  774.  
  775. // function: getSubmitTypeFromColumnType
  776. // description: called when the grid is populated, to choose a submit type based
  777. // on the column type
  778. // Note: this function is used during initial population only.
  779. // changeSubmitTypeBasedOnElementType() is used when the element type is changed
  780.  
  781. function getSubmitTypeFromColumnType(colType){
  782.   var retVal = "";
  783.   var colIsNumeric = dwscripts.isNumericDBColumnType(colType);
  784.   var colIsDate    = dwscripts.isDateDBColumnType(colType);
  785.   var colIsBoolean = dwscripts.isBooleanDBColumnType(colType);
  786.   
  787.   if ( colIsNumeric ){
  788.     retVal = (colIsBoolean) ? CHECKBOX10 : NUMERIC;
  789.   } else if ( colIsDate ){
  790.     retVal = DATE;
  791.   } else { // if text-based
  792.     retVal = (colIsBoolean) ? CHECKBOXYN : TEXT;
  793.   }
  794.   return retVal;
  795.  
  796. }
  797.  
  798. function connectionHasBeenChosen(){
  799.   return ( MENU_CONN.getIndex() != 0 );
  800. }
  801.  
  802.  
  803. function setFieldsAndColumns(paramObj) {
  804.   var colInfoObjs = GRID_COLS.valueList, nCols = colInfoObjs.length, i, currObj;
  805.   var fieldsStr = "",columnsStr = "", submitType;
  806.   
  807.   // create mini-lookup table
  808.   var lookupTable = new Object();
  809.   lookupTable[TEXT]          = "',none,''";
  810.   lookupTable[NUMERIC]       = "none,none,NULL";
  811.   lookupTable[DATE]          = "',none,NULL";
  812.   lookupTable[DATEMSACCESS]  = "#,none,NULL";
  813.   lookupTable[CHECKBOXYN]    = "none,'Y','N'";
  814.   lookupTable[CHECKBOX10]    = "none,1,0";
  815.   lookupTable[CHECKBOXNEG10] = "none,-1,0";
  816.   lookupTable[CHECKBOXACCESS]= "none,Yes,No";
  817.   
  818.   for (i=0;i<nCols;i++){
  819.     currObj = colInfoObjs[i];
  820.     if (currObj.displayAs.type != "text"){ // if a form element
  821.       submitType = currObj.submitAs;  
  822.       fieldsStr += currObj.fieldName + "|value|";
  823.       columnsStr += wrapNamesWithSpaces(currObj.column) + "|" + lookupTable[submitType] + "|";
  824.     }
  825.   }
  826.   
  827.   // remove last separators
  828.   fieldsStr = fieldsStr.substring(0,fieldsStr.length-1);
  829.   columnsStr = columnsStr.substring(0,columnsStr.length-1);
  830.   
  831.   if (dw.getDocumentDOM() != null && 
  832.       dw.getDocumentDOM().serverModel.getServerName() == "Cold Fusion") {
  833.     fieldsStr = fieldsStr.replace(/#/g,"##");
  834.     columnsStr = columnsStr.replace(/#/g,"##");      
  835.   }
  836.   
  837.   paramObj.fieldsStr = fieldsStr;
  838.   paramObj.columnsStr = columnsStr;
  839. }
  840.  
  841.  
  842. // function: checkThatCursorIsNotInsideOfAForm
  843. // description: before inserting a form, check that cursor is not inside of 
  844. // an existing form. If it is, set IP location to be just after the form
  845.  
  846. function checkThatCursorIsNotInsideOfAForm(){
  847.   var dom = dw.getDocumentDOM();
  848.   var formNode = findForm(dom);
  849.   
  850.   if (formNode){ // if inside of a form tag
  851.     formArr = dom.nodeToOffsets(formNode);
  852.     dom.setSelection(formArr[1]+1,formArr[1]+1);
  853.   }
  854. }
  855.  
  856. function findForm(dom){
  857.   var formObj="";
  858.   var selArr = dom.getSelection();
  859.   var selObj = dom.offsetsToNode(selArr[0],selArr[1]);
  860.  
  861.   while (formObj=="" && selObj.parentNode){
  862.     if (selObj.nodeType == Node.ELEMENT_NODE && selObj.tagName=="FORM")
  863.     formObj=selObj;
  864.   else
  865.     selObj = selObj.parentNode;
  866.   }
  867.   
  868.   return formObj;
  869. }
  870.  
  871.  
  872. function changeSubmitTypeBasedOnElementType(){
  873.   
  874.   // don't bother if conection hasn't been chosen
  875.   if ( !connectionHasBeenChosen() ){
  876.     return;
  877.   }
  878.   
  879.   var elemType = MENU_DISPLAY.get();
  880.   var submitType = MENU_SUBMIT.get();
  881.   var newSubmitType = "";
  882.   var colType = ARR_COL_TYPES[ GRID_COLS.getRowValue().column ];
  883.   var colIsNumeric = dwscripts.isNumericDBColumnType(colType);
  884.   var colIsDate    = dwscripts.isDateDBColumnType(colType);
  885.   
  886.   if ( elemType == CHECKBOX ) { // if display element is a checkbox
  887.     if (colIsNumeric)       
  888.       newSubmitType = CHECKBOX10;
  889.     else
  890.       newSubmitType = CHECKBOXYN;
  891.   } else { // display type does not equal checkbox
  892.   
  893.     // if submit type is currently a checkbox type,
  894.     // then change it back to the most appropriate
  895.     // non-checkbox type
  896.     
  897.     if (submitType==CHECKBOXYN    || submitType==CHECKBOX10 ||
  898.         submitType==CHECKBOXNEG10 || submitType == CHECKBOXACCESS) {
  899.         if (colIsNumeric) {
  900.           newSubmitType = NUMERIC;
  901.         } else if (colIsDate) {
  902.           newSubmitType = DATE;
  903.         } else {
  904.           newSubmitType = TEXT;
  905.         }
  906.     }
  907.   }
  908.   
  909.   if (newSubmitType)
  910.     MENU_SUBMIT.pickValue(newSubmitType);
  911.  
  912. }
  913.  
  914.  
  915.  
  916. // function: toggleSubmitAsVisibility 
  917. // description: toggles the visibility of "Submit As: [menu]" that appears
  918. // on the UI.
  919. // This menu should be visible for all items except text
  920.  
  921. function toggleSubmitAsVisibility(displayAs){
  922.   var currentVal = MENU_SUBMIT.getValue();
  923.   if ( displayAs != TEXT && (currentVal == " " || !currentVal)) { // if any form field is chosen in displayAs menu
  924.       MENU_SUBMIT.enable();
  925.       MENU_SUBMIT.del();
  926.       var submitType = getSubmitTypeFromColumnType(ARR_COL_TYPES[GRID_COLS.getRowValue().column]);
  927.       MENU_SUBMIT.pickValue(submitType);
  928.   } else if (displayAs == TEXT)  { // if plain text was chosen in displayAs menu
  929.       MENU_SUBMIT.append(" ");
  930.       MENU_SUBMIT.disable();
  931.   }
  932. }
  933.  
  934.  
  935.  
  936. // function: toggleLabelVisibility
  937. // description: toggles the visibility of "Label: [textfield]" that appears
  938. // on the UI.
  939. // This textfield should be visible for all items except hidden fields
  940.  
  941. function toggleLabelVisibility(displayAs){
  942.   var labelFieldIsVisible = !( TF_LABEL.disabled == "true");
  943.   
  944.    if (displayAs != HIDDENFIELD && !labelFieldIsVisible) { // if non-hidden field & non-visible label field
  945.       TF_LABEL.setAttribute("disabled","false")                     // then make label field visible
  946.       TF_LABEL.setAttribute("value",GRID_COLS.getRowValue().label); // and set value of it 
  947.       
  948.   } else if (displayAs == HIDDENFIELD && labelFieldIsVisible)  {  // if hidden field
  949.       TF_LABEL.setAttribute("value","");                          // then set value field to empty string
  950.       TF_LABEL.setAttribute("disabled","true");                   // and make it non-editable
  951.   }
  952. }
  953.  
  954.  
  955. function updateUIBasedOnDisplayAsMenuChange(){
  956.   showDifferentParams(true);
  957.   changeSubmitTypeBasedOnElementType();
  958.   updateGridRow('displayAs')
  959. }
  960.  
  961.  
  962.  
  963. function getElementNameFromColumnName(col){
  964.   var elemName = col;
  965.   var counter = 2;
  966.   var divider = STR_DIVIDER;
  967.   
  968.   // replace spaces with underscores
  969.   var regExp = / /g;
  970.   elemName = elemName.replace(regExp,"_");
  971.   // strip out all characters that are not alpha-numeric, or underscores
  972.   regExp = /[^a-zA-Z_0-9]/g;
  973.   elemName = elemName.replace(regExp,"");
  974.   // don't allow the first character to be numeric
  975.   while (parseInt(elemName.charAt(0)) &&
  976.          parseInt(elemName.charAt(0) ) == elemName.charAt(0) ){
  977.      elemName = elemName.substring(1);
  978.   }
  979.  
  980.   // in the unlikely case that no characters are left after the above,
  981.   // then name element generically as "element"
  982.   if (elemName.length == 0) {
  983.     elemName = MM.LABEL_Element;
  984.   }
  985.  
  986.   // ensure that name is not a dupe
  987.   var tempName = elemName; 
  988.   while (STR_ELEMENT_NAMES.indexOf(divider + elemName + divider) != -1){
  989.     elemName = tempName + counter++;
  990.   }
  991.  
  992.   // add name to global names list
  993.   STR_ELEMENT_NAMES += elemName + divider;
  994.   
  995.   return elemName;
  996. }
  997.  
  998.  
  999.  
  1000. // function: displayDynamicDataDialog
  1001. // description: pops up the dialog allowing the user to choose dynamic data
  1002. function displayDynamicDataDialog(textFieldObj){
  1003.   var serverModel = dw.getDocumentDOM().serverModel.getServerName();
  1004.   var expression = dw.showDynamicDataDialog(textFieldObj.value);
  1005.   
  1006.    if (expression) {
  1007.      
  1008.      // NOTE: removed to fix bug 42279
  1009.      // if (serverModel == "Cold Fusion") {
  1010.      //   expression = stripCFOutput(expression);
  1011.      // }
  1012.      
  1013.      textFieldObj.value = expression;
  1014.    }
  1015. }
  1016.  
  1017.  
  1018. function createDynamicData(rs,col){
  1019.   var retVal = "";
  1020.   if (rs){
  1021.     var colArray = dwscripts.getFieldNames(rs);
  1022.     if (dwscripts.findInArray(colArray, col) != -1){
  1023.       var paramObj = new Object();
  1024.       paramObj.rsName = rs;
  1025.       paramObj.bindingName = col;
  1026.  
  1027.       retVal = GROUP_DYN_DATA.getInsertStrings(paramObj,"replaceSelection");
  1028.     }
  1029.   }
  1030.   return retVal;
  1031. }
  1032.  
  1033. // go through the default values, and replace references to the old
  1034. // recordset with the new recordset
  1035.  
  1036. function updateDefaultFormFieldValues(oldRS,newRS){
  1037.   var rowObjs = GRID_COLS.valueList;
  1038.   var nRows = rowObjs.length, i, fieldType, currRowObj, regExp;
  1039.   
  1040.   for (i=0;i<nRows;i++){
  1041.     currRowObj = rowObjs[i];
  1042.     regExp = new RegExp(oldRS,"g");
  1043.     currRowObj.defaultStr = currRowObj.defaultStr.toString().replace(regExp,newRS);
  1044.     currRowObj.passwordStr = currRowObj.passwordStr.toString().replace(regExp,newRS);
  1045.  
  1046.     // update the current display
  1047.     switch(currRowObj.displayAs.type){
  1048.       case "textField":
  1049.       case "textArea":
  1050.       case "hiddenField":
  1051.         currRowObj.displayAs.value = currRowObj.defaultStr;
  1052.         break;
  1053.       case "passwordField":
  1054.          currRowObj.passwordField.value = currRowObj.passwordStr;
  1055.          break;
  1056.       case "text":
  1057.         currRowObj.displayAs.text = currRowObj.defaultStr;
  1058.         break;
  1059.       case "radioGroup":
  1060.       case "dynamicRadioGroup":
  1061.         currRowObj.displayAs.defaultChecked = currRowObj.defaultStr;
  1062.         break;
  1063.       case "menu":
  1064.       case "dynamicMenu":
  1065.         currRowObj.displayAs.defaultSelected = currRowObj.defaultStr;
  1066.         break;
  1067.       case "dynamicCheckBox":
  1068.         currRowObj.displayAs.checkIf = currRowObj.defaultStr;
  1069.         break;
  1070.       case "default":
  1071.         break;  
  1072.     }
  1073.   } 
  1074.  
  1075. }
  1076.  
  1077.  
  1078. function killEndingWhiteSpace(textStr){
  1079.   var str = textStr;
  1080.   while (  str.length > 0 &&
  1081.            ( str.charAt( str.length - 1 ) == "\n" ||
  1082.              str.charAt( str.length - 1 ) == "\r" ||
  1083.              str.charAt( str.length - 1 ) == " " )) {    
  1084.        
  1085.                str = str.substring(0,str.length-1);  
  1086.   }
  1087.   
  1088.   return str;
  1089. }
  1090.  
  1091.  
  1092. // function: defineGlobalsBasedOnServerModel
  1093. // description: define global variables that depend on the server model
  1094. function defineGlobalsBasedOnServerModel(){
  1095.   PART_TEXT       =   new Participant(PREFIX + "text");   
  1096.   PART_TF         =   new Participant(PREFIX + "textField");
  1097.   PART_TA         =   new Participant(PREFIX + "textArea");
  1098.   PART_HF         =   new Participant(PREFIX + "hiddenField");         
  1099.   PART_PF         =   new Participant(PREFIX + "passwordField");
  1100.   PART_FF         =   new Participant(PREFIX + "fileField");
  1101.   PART_CB         =   new Participant(PREFIX + "checkBox");  
  1102.   PART_DYN_CB     =   new Participant(PREFIX + "dynamicCheckBox");
  1103.   PART_RG         =   new Participant(PREFIX + "radioGroup"); 
  1104.   PART_DYN_RG     =   new Participant(PREFIX + "dynamicRadioGroup"); 
  1105.   PART_SELECT     =   new Participant(PREFIX + "select");      
  1106.   PART_OPTION     =   new Participant(PREFIX + "option");    
  1107.   PART_DYN_OPTION =   new Participant("dynamicList_option");
  1108.   PART_DYN_OP_NOSEL = new Participant("dynamicListNoSel_option");
  1109.   PART_DYN_MENU   =   new Participant(PREFIX + "dynamicMenu"); 
  1110.   PART_TR         =   new Participant(PREFIX + "tableRow");  
  1111.   PART_TR_RG      =   new Participant(PREFIX + "radioGroupTableRow"); 
  1112.   PART_TR_RB      =   new Participant(PREFIX + "radioButtonTableRow"); 
  1113.   PART_TR_TA      =   new Participant(PREFIX + "textAreaTableRow"); 
  1114.   PART_TABLE      =   new Participant(PREFIX + "table");    
  1115.   PART_BEGIN_LOOP =   new Participant("dynamicList_begin");
  1116.   PART_END_LOOP   =   new Participant("dynamicList_end");
  1117.   PART_CHECKED_ATTR = new Participant("dynamicRadioButtons_attrib");
  1118.   PART_SELECTED_ATTR = new Participant("dynamicList_attrib");
  1119.  
  1120.   GROUP_DYN_DATA = new Group("dynamicData");
  1121.  
  1122. }
  1123.  
  1124.  
  1125.  
  1126.