home *** CD-ROM | disk | FTP | other *** search
/ Practical Internet Web Designer 86 / PIWD86.iso / pc / contents / dreamweaver / software / dwmx2004.exe / Disk1 / data1.cab / Configuration_En / Commands / EditOpsCmn.js < prev    next >
Encoding:
JavaScript  |  2003-09-05  |  37.8 KB  |  1,145 lines

  1.  
  2. // Copyright 2000, 2001, 2002, 2003 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.       case "GoToURL":
  362.       {
  363.         browseFile(TF_REDIRECT_URL);
  364.         
  365.         var currServerModel = dw.getDocumentDOM().serverModel.getServerName();
  366.         if (currServerModel == "ASP" || currServerModel == "JSP")
  367.         {
  368.           var theRedirect_url = TF_REDIRECT_URL.value; 
  369.  
  370.           if (theRedirect_url.length > 0)
  371.           {
  372.             // convert any script blocks to concat values
  373.             theRedirect_url = theRedirect_url.replace(/<%=?\s*/gi, "\" + ");
  374.             theRedirect_url = theRedirect_url.replace(/\s*%>/gi, " + \"");
  375.  
  376.             TF_REDIRECT_URL.value = theRedirect_url;       
  377.           }
  378.         }
  379.         break;
  380.       }
  381.    
  382.       default:
  383.         break;
  384.  
  385.    }
  386. }
  387.  
  388.  
  389. function populateColumnGrid(){
  390.   // clear additional column list
  391.   // it lists columns that don't get populated in the grid, and needs to be cleared
  392.   updateAdditionalColumnList('clear'); 
  393.   
  394.   // if there are no tables, then clear grid, and return
  395.   if ( !connectionHasBeenChosen() ){
  396.     GRID_COLS.setAllRows(new Array(),new Array());
  397.     return;
  398.   }
  399.   
  400.   var colsAndTypes = MMDB.getColumnAndTypeOfTable(MENU_CONN.get(),MENU_TABLES.getValue())
  401.   var nColumns = colsAndTypes.length/2, rowInfo, i;
  402.   var rowTextArr = new Array();
  403.   var rowValArr  = new Array();
  404.   ARR_COL_TYPES = new Array();
  405.   
  406.   for (var i=0; i < colsAndTypes.length; i+=2) {
  407.      ARR_COL_TYPES[colsAndTypes[i]] = colsAndTypes[i+1];
  408.      if (EDIT_OP_TYPE == "Update") {
  409.        rowInfo = getRowTextAndValue(colsAndTypes[i],colsAndTypes[i+1],MENU_RS.get());
  410.      } else {  // if Insert (and recordset menu does not exist)
  411.        rowInfo = getRowTextAndValue(colsAndTypes[i],colsAndTypes[i+1]);
  412.      }
  413.      rowTextArr.push(rowInfo[0]);
  414.      rowValArr.push(rowInfo[1]);
  415.   }
  416.   
  417.   GRID_COLS.setAllRows(rowTextArr,rowValArr);
  418.   
  419.   // clear global field names array (used to check for dupe field names)
  420.   STR_ELEMENT_NAMES = STR_DIVIDER;
  421.   
  422.   
  423. }
  424.  
  425.  
  426. // Note: rsName is last parameter because it is only used for Update
  427. function getRowTextAndValue(colName,colType,rsName){
  428.   var rowValObj = new Object();
  429.   var colLabel = getLabelFromColumnName(colName);
  430.   // default to password display type if "password" appears in field name
  431.   var colFieldType = (colName.toLowerCase().indexOf(PASSWORD) != -1)?
  432.                       PASSWORDFIELD:getFieldTypeFromColumnType(colType);
  433.   var colSubmitType = getSubmitTypeFromColumnType(colType);
  434.   var rowText = colName + "|" + colLabel + "|" + colFieldType + "|" + colSubmitType;
  435.       
  436.   rowValObj.column = colName;
  437.   rowValObj.label = colLabel;
  438.   rowValObj.displayAs = getFormFieldStorageObjectFromFormFieldType(colFieldType);
  439.   rowValObj.submitAs = colSubmitType;
  440.   rowValObj.fieldName = getElementNameFromColumnName(colName);
  441.   rowValObj.defaultStr = "";
  442.   rowValObj.passwordStr = "";
  443.  
  444.   // populate storage object with any default values
  445.   if (EDIT_OP_TYPE == "Update" && rowValObj.displayAs.type != "passwordField"){
  446.     var rs = (rsName)?rsName:MENU_RS.getValue();
  447.     rowValObj = populateFormFieldStorageType(rowValObj,rs,colName);
  448.   }
  449.           
  450.   return new Array(rowText,rowValObj);
  451. }
  452.  
  453.  
  454. // note: this fn is only called when the row is first created, which is why
  455. // it only lists some of the available form types
  456.  
  457. function populateFormFieldStorageType(rowValObj,rsName,colName){
  458.   var displayType = rowValObj.displayAs.type;
  459.   var dynDataVal = createDynamicData(rsName,colName);
  460.   rowValObj.defaultStr = dynDataVal;
  461.   
  462.   if  (displayType == "textField" || displayType  == "textArea" || 
  463.        displayType  == "hiddenField" ) {
  464.     rowValObj.displayAs.value = dynDataVal;
  465.   } else if (displayType == "text" ){
  466.     rowValObj.displayAs.text = dynDataVal;
  467.   } else if (displayType == "dynamicCheckBox"){
  468.     rowValObj.displayAs.checkIf = dynDataVal;
  469.   }
  470.  
  471.   return rowValObj;
  472. }
  473.  
  474.  
  475. function getFormFieldStorageObjectFromFormFieldType(fieldType){
  476.   var retObj = "";
  477.     
  478.   if (fieldType == TEXT){
  479.     retObj = new eoText();
  480.   } else if (fieldType == TEXTFIELD){
  481.     retObj = new eoTextField();
  482.   } else if (fieldType == HIDDENFIELD){
  483.     retObj = new eoHiddenField();
  484.   } else if (fieldType == PASSWORDFIELD){
  485.     retObj = new eoPasswordField();
  486.   } else if (fieldType == FILEFIELD){
  487.     retObj = new eoFileField();
  488.   } else if (fieldType == TEXTAREA){
  489.     retObj = new eoTextArea();
  490.   } else if (fieldType == MENU){
  491.     retObj = new eoMenu();
  492.   } else if (fieldType == RADIOGROUP){
  493.     retObj = new eoRadioGroup();
  494.   } else if (fieldType == CHECKBOX){
  495.     retObj = (EDIT_OP_TYPE == "Insert")?new eoCheckBox():new eoDynamicCheckBox();
  496.   } 
  497.  
  498.   return retObj;
  499. }
  500.  
  501.  
  502.  
  503. // function: showDifferentParams
  504. // description: shows form field specific parameters at the bottom of the dialog
  505. // for instance, shows "Menu Properties" button for menu, value field for textfield, etc.
  506.  
  507. function showDifferentParams(displayDefaultStr){
  508.   
  509.    // don't bother if connection has not been chosen
  510.    if ( !connectionHasBeenChosen() ){
  511.      return;
  512.    }
  513.    var displayAs = MENU_DISPLAY.getValue()?MENU_DISPLAY.getValue():"none";
  514.    var tables = DOM_UI_PIECES.getElementsByTagName("TABLE"), param, i;
  515.    var mmParamsTag = document.body.getElementsByTagName("mmParams").item(0);
  516.    
  517.    toggleSubmitAsVisibility(displayAs); // enable or disable Submit As Menu
  518.    toggleLabelVisibility(displayAs);    // enable or disable Label textfield
  519.  
  520.    if (displayAs == TEXTFIELD || displayAs == TEXTAREA || displayAs == HIDDENFIELD ||
  521.        displayAs == PASSWORDFIELD || displayAs == FILEFIELD) {
  522.      param = "textField";
  523.    } else if (displayAs == TEXT){
  524.      param = "text";
  525.    } else if (displayAs == RADIOGROUP){
  526.      param = "radio";
  527.    } else if (displayAs == MENU){
  528.      param = "menu";
  529.    } else if (displayAs == CHECKBOX){
  530.      param = (EDIT_OP_TYPE == "Insert") ? "checkBox" : "dynamicCheckBox";
  531.    } else if (displayAs == "none"){
  532.      param = "none";
  533.    }
  534.    
  535.    for (i=0;i<tables.length;i++){
  536.       if (tables[i].name && tables[i].name == param){
  537.          mmParamsTag.innerHTML = tables[i].innerHTML;
  538.          break;
  539.       }
  540.    }
  541.    // if display as equals text, text area, or text field, and the display as menu has
  542.    // just been changed, then display the default text for this column
  543.    if (displayDefaultStr) {
  544.      var rowInfoObj = GRID_COLS.getRowValue();
  545.      var defaultStr = GRID_COLS.getRowValue().defaultStr;
  546.      var passwordStr = GRID_COLS.getRowValue().passwordStr;
  547.      
  548.      if ( displayAs == TEXTFIELD || displayAs == TEXTAREA ||
  549.           displayAs == HIDDENFIELD || displayAs == FILEFIELD ) {
  550.          findObject("SetValueTo").value = rowInfoObj.displayAs.value = defaultStr;  // set UI
  551.      } else if ( displayAs == PASSWORDFIELD ) {
  552.          findObject("SetValueTo").value = rowInfoObj.displayAs.value = passwordStr;    // set UI
  553.      } else if ( displayAs == TEXT ) {
  554.          findObject("Text").value = rowInfoObj.displayAs.text = defaultStr;    // set UI
  555.      } else if ( param == "dynamicCheckBox" ){
  556.          findObject("CheckIf").value = rowInfoObj.displayAs.checkIf = defaultStr;
  557.      }
  558.    }
  559.     
  560. }
  561.  
  562. // function: updateGridRow
  563. // description: called whenever the label, submitAs, or displayAs fields are edited
  564. // updates both the actual text display in the grid, 
  565. // and the object that stores the information about the display
  566. // whichColumn: the parameter which has been edited -- displayAs, submitAs, or label
  567.  
  568. function updateGridRow(whichColumn){
  569.   // check that connection has been chosen before proceeding
  570.   if ( !connectionHasBeenChosen() ){
  571.     alert( MM.MSG_NoConnectionSelected );
  572.     // MENU_DISPLAY.setIndex(0); // set display menu back to first item
  573.     return;
  574.   }
  575.   
  576.   var currRowObj  = GRID_COLS.getRowValue();
  577.   var currRowText = GRID_COLS.getRow();
  578.   var currColName = currRowText.substring(  0,currRowText.indexOf("|")  );
  579.   
  580.   // update grid row text
  581.   var newRowText = currColName + "|" + TF_LABEL.value + "|" + MENU_DISPLAY.get() + "|"; 
  582.   newRowText += (findObject("SubmitAs")) ? MENU_SUBMIT.get() : "";
  583.   GRID_COLS.setRow(newRowText);
  584.   
  585.   // update object that stores information about grid row
  586.   // this object is stored in a value attribute of the Grid object
  587.   // these objects are stored in an array: GridObj.valueList
  588.   
  589.   switch (whichColumn){
  590.     case "label":
  591.       currRowObj.label = TF_LABEL.value;
  592.       break;
  593.       
  594.     case "submitAs":
  595.       currRowObj.submitAs = MENU_SUBMIT.get();
  596.       break;
  597.       
  598.     case "displayAs": 
  599.       currRowObj.displayAs = getFormFieldStorageObjectFromFormFieldType(MENU_DISPLAY.getValue());
  600.       // need to update submit property, because changing displayAs menu can
  601.       // auto-change submit type
  602.       if ( findObject("SubmitAs") ) {
  603.         currRowObj.submitAs = MENU_SUBMIT.getValue();
  604.       }
  605.       
  606.       var defaultStr = currRowObj.defaultStr;
  607.       var passwordStr = currRowObj.passwordStr;
  608.       var fieldType = currRowObj.displayAs.type;
  609.       
  610.       if ( fieldType == "textField"  || fieldType == "hiddenField" || 
  611.            fieldType == "fileField"  ||  fieldType == "textArea" ){
  612.            currRowObj.displayAs.value = defaultStr;
  613.       } else if ( fieldType == "passwordField"){
  614.            currRowObj.displayAs.value = passwordStr;          
  615.       } else if ( fieldType == "text"){
  616.            currRowObj.displayAs.text = defaultStr;
  617.       } else if ( fieldType == "menu"){
  618.            currRowObj.displayAs.defaultSelected = defaultStr;
  619.       } else if ( fieldType == "radioGroup"){
  620.            currRowObj.displayAs.defaultChecked = defaultStr;
  621.       } else if (fieldType == "dynamicCheckBox"){
  622.            currRowObj.displayAs.checkIf = defaultStr;
  623.       }
  624.       break;
  625.       
  626.     default:
  627.       break;
  628.   }
  629. }
  630.  
  631.  
  632. // function: displayGridFieldValues
  633. // description: called when the user clicks on a new row in the grid,
  634. // changes the values of the UI fields to display the correct information
  635.  
  636. function displayGridFieldValues(){ 
  637.   // don't bother if grid is empty -- needed because this fn is also
  638.   // called when the connection or table changes
  639.   if (GRID_COLS.list.length == 0){
  640.     TF_LABEL.value = "";
  641.     return;
  642.   }
  643.     
  644.    var currRowText = GRID_COLS.getRow();
  645.    var currRowVal  = GRID_COLS.getRowValue();
  646.    var rowTextTokens = getTokens(currRowText,"|");
  647.  
  648.       
  649.    TF_LABEL.value = rowTextTokens[1]; // update label field
  650.    MENU_DISPLAY.pickValue(rowTextTokens[2]); // update display menu
  651.    
  652.    // change UI at bottom of dialog, if relevent
  653.    // for instance, if prior row had displayAs = Text, but this row has displayAs = Menu
  654.    showDifferentParams(); 
  655.    
  656.    if (  findObject("SubmitAs")  ) 
  657.      MENU_SUBMIT.pickValue(rowTextTokens[3]); // update submit menu
  658.    
  659.    // fill in form parameters at bottom of UI
  660.    // note that in the case of radio or menu, there is nothing to fill in
  661.    switch (currRowVal.displayAs.type){
  662.      
  663.      case "text":
  664.        findObject("Text").value = currRowVal.displayAs.text = currRowVal.defaultStr;
  665.        break;
  666.      case "textArea":
  667.      case "textField":
  668.      case "hiddenField":
  669.      case "fileField":
  670.        findObject("SetValueTo").value = currRowVal.displayAs.value = currRowVal.defaultStr;
  671.        break;
  672.      case "passwordField":
  673.        findObject("SetValueTo").value = currRowVal.displayAs.value = currRowVal.passwordStr;
  674.        break;
  675.      case "checkBox": 
  676.        // note: findObject doesn't work with radios, so manual references are needed
  677.        var InitialStateRadios = document.forms[0].InitialState;
  678.        if ( currRowVal.displayAs.checked.toString() == "true"){
  679.          InitialStateRadios[0].checked = true; InitialStateRadios[1].checked = false;
  680.        } else {
  681.          InitialStateRadios[0].checked = false; InitialStateRadios[1].checked = true;
  682.        }
  683.        break;
  684.        
  685.      case "dynamicCheckBox":
  686.        findObject("CheckIf").value = currRowVal.displayAs.checkIf;
  687.        findObject("EqualTo").value = currRowVal.displayAs.equalTo;
  688.        break;
  689.        
  690.      case "default":
  691.        break; 
  692.    }
  693. }
  694.  
  695.  
  696. // function: deleteGridRow
  697. // description: called when the user clicks the "--" image button
  698.  
  699. function deleteGridRow(){
  700.   var currRow = GRID_COLS.getRow();
  701.   var currCol = currRow.substring(0,currRow.indexOf("|") );
  702.   var nRows = GRID_COLS.list.length;
  703.   
  704.   if (nRows > 1){
  705.     updateAdditionalColumnList('add',currCol);
  706.     GRID_COLS.delRow();
  707.     displayGridFieldValues(); 
  708.   } else {
  709.     alert(MM.MSG_NeedOneColumnInList);
  710.   }
  711. }
  712.  
  713.  
  714. // function: addGridRow
  715. // description: if there are columns not already displayed in the grid
  716. // pop up the "Add Columns" dialog, and allow the user to add them
  717.  
  718. function addGridRow(){
  719.   // check to see if there are columns to add first
  720.   if (ARR_COLS_TO_ADD.length == 0){
  721.     alert(MM.MSG_NoMoreColumnsToAdd);
  722.     return;
  723.   }
  724.   
  725.   var colsToAdd = callCommand('Add Column.htm',ARR_COLS_TO_ADD);
  726.   if (!colsToAdd) return; // user clicked Cancel
  727.   var nCols = colsToAdd.length,i, currCol, rowInfoArr;
  728.   
  729.   for (i=0;i<nCols;i++){
  730.     currCol = colsToAdd[i];
  731.     rowInfoArr = getRowTextAndValue(currCol,ARR_COL_TYPES[currCol]);
  732.     GRID_COLS.addRow(rowInfoArr[0],rowInfoArr[1]);
  733.     updateAdditionalColumnList('del',currCol);
  734.   }
  735. }
  736.  
  737.  
  738. // function: updateAdditionalColumnList
  739. // description: the + button calls up an Add Columns dialog, allowing
  740. // the user to add additional columns to the list. When the Add Columns
  741. // dialog is called, it is populated with the "additional columns list".
  742. // This list is updated when a user adds or deletes a column from the UI.
  743. // The action argument can be add, del, or clear
  744.  
  745. function updateAdditionalColumnList(action,col){
  746.    var addColArr = ARR_COLS_TO_ADD; 
  747.    if (action == 'add'){
  748.       addColArr.push(col);
  749.    } else if ( action == 'clear'){
  750.       // addColArr.length = 0;
  751.       ARR_COLS_TO_ADD = new Array();
  752.    } else { // delete an item from additional column list
  753.      var nItems = addColArr.length,i;
  754.      
  755.      for (i=0;i<nItems;i++){
  756.        if (addColArr[i] == col){
  757.          addColArr.splice(i,1);
  758.          break;
  759.        }
  760.      }
  761.    }
  762. }
  763.  
  764.  
  765. // function: popUpFormFieldPropertiesDialog
  766. // description: pops up the Radio or Menu Properties dialog,
  767. // and passes in the current menu/radio storage object
  768. // so that the dialog can be initialized correctly
  769. // "whichOne" argument can be "Radio" or "Menu";
  770.  
  771. function popUpFormFieldPropertiesDialog(whichOne){
  772.   var commandFileName = whichOne + " Properties.htm";
  773.   var rowObj = GRID_COLS.getRowValue();
  774.   var fieldInfoObj = callCommand(commandFileName,rowObj.displayAs)
  775.  
  776.  
  777.   // note: use the "type" property on the menuInfoObj to see which
  778.   // type of object was returned
  779.   if (fieldInfoObj) {
  780.     rowObj.displayAs = fieldInfoObj;
  781.   }
  782. }
  783.  
  784.  
  785. function getFieldTypeFromColumnType(colType){
  786.   return ( dwscripts.isBooleanDBColumnType(colType)) ? CHECKBOX : TEXTFIELD;
  787. }
  788.  
  789.  
  790. function getLabelFromColumnName(colName){
  791.   return colName.charAt(0).toUpperCase() + colName.substring(1) + MM.LABEL_Delimiter;      
  792. }
  793.  
  794. // function: getSubmitTypeFromColumnType
  795. // description: called when the grid is populated, to choose a submit type based
  796. // on the column type
  797. // Note: this function is used during initial population only.
  798. // changeSubmitTypeBasedOnElementType() is used when the element type is changed
  799.  
  800. function getSubmitTypeFromColumnType(colType){
  801.   var retVal = "";
  802.   var colIsNumeric = dwscripts.isNumericDBColumnType(colType);
  803.   var colIsDate    = dwscripts.isDateDBColumnType(colType);
  804.   var colIsBoolean = dwscripts.isBooleanDBColumnType(colType);
  805.   
  806.   if ( colIsNumeric ){
  807.     retVal = (colIsBoolean) ? CHECKBOX10 : NUMERIC;
  808.   } else if ( colIsDate ){
  809.     retVal = DATE;
  810.   } else { // if text-based
  811.     retVal = (colIsBoolean) ? CHECKBOXYN : TEXT;
  812.   }
  813.   return retVal;
  814.  
  815. }
  816.  
  817. function connectionHasBeenChosen(){
  818.   return ( MENU_CONN.getIndex() != 0 );
  819. }
  820.  
  821.  
  822. function setFieldsAndColumns(paramObj) {
  823.   var colInfoObjs = GRID_COLS.valueList, nCols = colInfoObjs.length, i, currObj;
  824.   var fieldsStr = "",columnsStr = "", submitType;
  825.   
  826.   // create mini-lookup table
  827.   var lookupTable = new Object();
  828.   lookupTable[TEXT]          = "',none,''";
  829.   lookupTable[NUMERIC]       = "none,none,NULL";
  830.   lookupTable[DATE]          = "',none,NULL";
  831.   lookupTable[DATEMSACCESS]  = "#,none,NULL";
  832.   lookupTable[CHECKBOXYN]    = "none,'Y','N'";
  833.   lookupTable[CHECKBOX10]    = "none,1,0";
  834.   lookupTable[CHECKBOXNEG10] = "none,-1,0";
  835.   lookupTable[CHECKBOXACCESS]= "none,Yes,No";
  836.   
  837.   for (i=0;i<nCols;i++){
  838.     currObj = colInfoObjs[i];
  839.     if (currObj.displayAs.type != "text"){ // if a form element
  840.       submitType = currObj.submitAs;  
  841.       fieldsStr += currObj.fieldName + "|value|";
  842.       columnsStr += wrapNamesWithSpaces(currObj.column) + "|" + lookupTable[submitType] + "|";
  843.     }
  844.   }
  845.   
  846.   // remove last separators
  847.   fieldsStr = fieldsStr.substring(0,fieldsStr.length-1);
  848.   columnsStr = columnsStr.substring(0,columnsStr.length-1);
  849.   
  850.   if (dw.getDocumentDOM() != null && 
  851.       dw.getDocumentDOM().serverModel.getServerName() == "Cold Fusion") {
  852.     fieldsStr = fieldsStr.replace(/#/g,"##");
  853.     columnsStr = columnsStr.replace(/#/g,"##");      
  854.   }
  855.   
  856.   paramObj.fieldsStr = fieldsStr;
  857.   paramObj.columnsStr = columnsStr;
  858. }
  859.  
  860.  
  861. // function: checkThatCursorIsNotInsideOfAForm
  862. // description: before inserting a form, check that cursor is not inside of 
  863. // an existing form. If it is, set IP location to be just after the form
  864.  
  865. function checkThatCursorIsNotInsideOfAForm(){
  866.   var dom = dw.getDocumentDOM();
  867.   var formNode = findForm(dom);
  868.   
  869.   if (formNode){ // if inside of a form tag
  870.     formArr = dom.nodeToOffsets(formNode);
  871.     dom.setSelection(formArr[1]+1,formArr[1]+1);
  872.   }
  873. }
  874.  
  875. function findForm(dom){
  876.   var formObj="";
  877.   var selArr = dom.getSelection();
  878.   var selObj = dom.offsetsToNode(selArr[0],selArr[1]);
  879.  
  880.   while (formObj=="" && selObj.parentNode){
  881.     if (selObj.nodeType == Node.ELEMENT_NODE && selObj.tagName=="FORM")
  882.     formObj=selObj;
  883.   else
  884.     selObj = selObj.parentNode;
  885.   }
  886.   
  887.   return formObj;
  888. }
  889.  
  890.  
  891. function changeSubmitTypeBasedOnElementType(){
  892.   
  893.   // don't bother if conection hasn't been chosen
  894.   if ( !connectionHasBeenChosen() ){
  895.     return;
  896.   }
  897.   
  898.   var elemType = MENU_DISPLAY.get();
  899.   var submitType = MENU_SUBMIT.get();
  900.   var newSubmitType = "";
  901.   var colType = ARR_COL_TYPES[ GRID_COLS.getRowValue().column ];
  902.   var colIsNumeric = dwscripts.isNumericDBColumnType(colType);
  903.   var colIsDate    = dwscripts.isDateDBColumnType(colType);
  904.   
  905.   if ( elemType == CHECKBOX ) { // if display element is a checkbox
  906.     if (colIsNumeric)       
  907.       newSubmitType = CHECKBOX10;
  908.     else
  909.       newSubmitType = CHECKBOXYN;
  910.   } else { // display type does not equal checkbox
  911.   
  912.     // if submit type is currently a checkbox type,
  913.     // then change it back to the most appropriate
  914.     // non-checkbox type
  915.     
  916.     if (submitType==CHECKBOXYN    || submitType==CHECKBOX10 ||
  917.         submitType==CHECKBOXNEG10 || submitType == CHECKBOXACCESS) {
  918.         if (colIsNumeric) {
  919.           newSubmitType = NUMERIC;
  920.         } else if (colIsDate) {
  921.           newSubmitType = DATE;
  922.         } else {
  923.           newSubmitType = TEXT;
  924.         }
  925.     }
  926.   }
  927.   
  928.   if (newSubmitType)
  929.     MENU_SUBMIT.pickValue(newSubmitType);
  930.  
  931. }
  932.  
  933.  
  934.  
  935. // function: toggleSubmitAsVisibility 
  936. // description: toggles the visibility of "Submit As: [menu]" that appears
  937. // on the UI.
  938. // This menu should be visible for all items except text
  939.  
  940. function toggleSubmitAsVisibility(displayAs){
  941.   var currentVal = MENU_SUBMIT.getValue();
  942.   if ( displayAs != TEXT && (currentVal == " " || !currentVal)) { // if any form field is chosen in displayAs menu
  943.       MENU_SUBMIT.enable();
  944.       MENU_SUBMIT.del();
  945.       var submitType = getSubmitTypeFromColumnType(ARR_COL_TYPES[GRID_COLS.getRowValue().column]);
  946.       MENU_SUBMIT.pickValue(submitType);
  947.   } else if (displayAs == TEXT)  { // if plain text was chosen in displayAs menu
  948.       MENU_SUBMIT.append(" ");
  949.       MENU_SUBMIT.disable();
  950.   }
  951. }
  952.  
  953.  
  954.  
  955. // function: toggleLabelVisibility
  956. // description: toggles the visibility of "Label: [textfield]" that appears
  957. // on the UI.
  958. // This textfield should be visible for all items except hidden fields
  959.  
  960. function toggleLabelVisibility(displayAs){
  961.   var labelFieldIsVisible = !( TF_LABEL.disabled == "true");
  962.   
  963.    if (displayAs != HIDDENFIELD && !labelFieldIsVisible) { // if non-hidden field & non-visible label field
  964.       TF_LABEL.removeAttribute("disabled")                     // then make label field visible
  965.       TF_LABEL.setAttribute("value",GRID_COLS.getRowValue().label); // and set value of it 
  966.       
  967.   } else if (displayAs == HIDDENFIELD && labelFieldIsVisible)  {  // if hidden field
  968.       TF_LABEL.setAttribute("value","");                          // then set value field to empty string
  969.       TF_LABEL.setAttribute("disabled","true");                   // and make it non-editable
  970.   }
  971. }
  972.  
  973.  
  974. function updateUIBasedOnDisplayAsMenuChange(){
  975.   showDifferentParams(true);
  976.   changeSubmitTypeBasedOnElementType();
  977.   updateGridRow('displayAs')
  978. }
  979.  
  980.  
  981.  
  982. function getElementNameFromColumnName(col){
  983.   var elemName = col;
  984.   var counter = 2;
  985.   var divider = STR_DIVIDER;
  986.   
  987.   // replace spaces with underscores
  988.   var regExp = / /g;
  989.   elemName = elemName.replace(regExp,"_");
  990.   // strip out all characters that are not alpha-numeric, or underscores
  991.   regExp = /[^a-zA-Z_0-9]/g;
  992.   elemName = elemName.replace(regExp,"");
  993.   // don't allow the first character to be numeric
  994.   while (parseInt(elemName.charAt(0)) &&
  995.          parseInt(elemName.charAt(0) ) == elemName.charAt(0) ){
  996.      elemName = elemName.substring(1);
  997.   }
  998.  
  999.   // in the unlikely case that no characters are left after the above,
  1000.   // then name element generically as "element"
  1001.   if (elemName.length == 0) {
  1002.     elemName = MM.LABEL_Element;
  1003.   }
  1004.  
  1005.   // ensure that name is not a dupe
  1006.   var tempName = elemName; 
  1007.   while (STR_ELEMENT_NAMES.indexOf(divider + elemName + divider) != -1){
  1008.     elemName = tempName + counter++;
  1009.   }
  1010.  
  1011.   // add name to global names list
  1012.   STR_ELEMENT_NAMES += elemName + divider;
  1013.   
  1014.   return elemName;
  1015. }
  1016.  
  1017.  
  1018.  
  1019. // function: displayDynamicDataDialog
  1020. // description: pops up the dialog allowing the user to choose dynamic data
  1021. function displayDynamicDataDialog(textFieldObj){
  1022.   var serverModel = dw.getDocumentDOM().serverModel.getServerName();
  1023.   var expression = dw.showDynamicDataDialog(textFieldObj.value);
  1024.   
  1025.    if (expression) {
  1026.      
  1027.      // NOTE: removed to fix bug 42279
  1028.      // if (serverModel == "Cold Fusion") {
  1029.      //   expression = stripCFOutput(expression);
  1030.      // }
  1031.      
  1032.      textFieldObj.value = expression;
  1033.    }
  1034. }
  1035.  
  1036.  
  1037. function createDynamicData(rs,col){
  1038.   var retVal = "";
  1039.   if (rs){
  1040.     var colArray = dwscripts.getFieldNames(rs);
  1041.     if (dwscripts.findInArray(colArray, col) != -1){
  1042.       var paramObj = new Object();
  1043.       paramObj.rsName = rs;
  1044.       paramObj.bindingName = col;
  1045.  
  1046.       retVal = GROUP_DYN_DATA.getInsertStrings(paramObj,"replaceSelection");
  1047.     }
  1048.   }
  1049.   return retVal;
  1050. }
  1051.  
  1052. // go through the default values, and replace references to the old
  1053. // recordset with the new recordset
  1054.  
  1055. function updateDefaultFormFieldValues(oldRS,newRS){
  1056.   var rowObjs = GRID_COLS.valueList;
  1057.   var nRows = rowObjs.length, i, fieldType, currRowObj, regExp;
  1058.   
  1059.   for (i=0;i<nRows;i++){
  1060.     currRowObj = rowObjs[i];
  1061.     regExp = new RegExp(oldRS,"g");
  1062.     currRowObj.defaultStr = currRowObj.defaultStr.toString().replace(regExp,newRS);
  1063.     currRowObj.passwordStr = currRowObj.passwordStr.toString().replace(regExp,newRS);
  1064.  
  1065.     // update the current display
  1066.     switch(currRowObj.displayAs.type){
  1067.       case "textField":
  1068.       case "textArea":
  1069.       case "hiddenField":
  1070.         currRowObj.displayAs.value = currRowObj.defaultStr;
  1071.         break;
  1072.       case "passwordField":
  1073.          currRowObj.passwordField.value = currRowObj.passwordStr;
  1074.          break;
  1075.       case "text":
  1076.         currRowObj.displayAs.text = currRowObj.defaultStr;
  1077.         break;
  1078.       case "radioGroup":
  1079.       case "dynamicRadioGroup":
  1080.         currRowObj.displayAs.defaultChecked = currRowObj.defaultStr;
  1081.         break;
  1082.       case "menu":
  1083.       case "dynamicMenu":
  1084.         currRowObj.displayAs.defaultSelected = currRowObj.defaultStr;
  1085.         break;
  1086.       case "dynamicCheckBox":
  1087.         currRowObj.displayAs.checkIf = currRowObj.defaultStr;
  1088.         break;
  1089.       case "default":
  1090.         break;  
  1091.     }
  1092.   } 
  1093.  
  1094. }
  1095.  
  1096.  
  1097. function killEndingWhiteSpace(textStr){
  1098.   var str = textStr;
  1099.   while (  str.length > 0 &&
  1100.            ( str.charAt( str.length - 1 ) == "\n" ||
  1101.              str.charAt( str.length - 1 ) == "\r" ||
  1102.              str.charAt( str.length - 1 ) == " " )) {    
  1103.        
  1104.                str = str.substring(0,str.length-1);  
  1105.   }
  1106.   
  1107.   return str;
  1108. }
  1109.  
  1110.  
  1111. // function: defineGlobalsBasedOnServerModel
  1112. // description: define global variables that depend on the server model
  1113. function defineGlobalsBasedOnServerModel(){
  1114.   PART_TEXT       =   new Participant(PREFIX + "text");   
  1115.   PART_TF         =   new Participant(PREFIX + "textField");
  1116.   PART_TA         =   new Participant(PREFIX + "textArea");
  1117.   PART_HF         =   new Participant(PREFIX + "hiddenField");         
  1118.   PART_PF         =   new Participant(PREFIX + "passwordField");
  1119.   PART_FF         =   new Participant(PREFIX + "fileField");
  1120.   PART_CB         =   new Participant(PREFIX + "checkBox");  
  1121.   PART_DYN_CB     =   new Participant(PREFIX + "dynamicCheckBox");
  1122.   PART_RG         =   new Participant(PREFIX + "radioGroup"); 
  1123.   PART_DYN_RG     =   new Participant(PREFIX + "dynamicRadioGroup"); 
  1124.   PART_SELECT     =   new Participant(PREFIX + "select");      
  1125.   PART_OPTION     =   new Participant(PREFIX + "option");    
  1126.   PART_DYN_OPTION =   new Participant("dynamicList_option");
  1127.   PART_DYN_OP_NOSEL = new Participant("dynamicListNoSel_option");
  1128.   PART_DYN_MENU   =   new Participant(PREFIX + "dynamicMenu"); 
  1129.   PART_TR         =   new Participant(PREFIX + "tableRow");  
  1130.   PART_TR_RG      =   new Participant(PREFIX + "radioGroupTableRow"); 
  1131.   PART_TR_RB      =   new Participant(PREFIX + "radioButtonTableRow"); 
  1132.   PART_TR_TA      =   new Participant(PREFIX + "textAreaTableRow"); 
  1133.   PART_TABLE      =   new Participant(PREFIX + "table");    
  1134.   PART_BEGIN_LOOP =   new Participant("dynamicList_begin");
  1135.   PART_END_LOOP   =   new Participant("dynamicList_end");
  1136.   PART_CHECKED_ATTR = new Participant("dynamicRadioButtons_attrib");
  1137.   PART_SELECTED_ATTR = new Participant("dynamicList_attrib");
  1138.  
  1139.   GROUP_DYN_DATA = new Group("dynamicData");
  1140.  
  1141. }
  1142.  
  1143.  
  1144.  
  1145.