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 / ServerObject-MD4.js < prev    next >
Encoding:
JavaScript  |  2003-09-05  |  41.6 KB  |  1,357 lines

  1. // Copyright 2001, 2002, 2003 Macromedia, Inc. All rights reserved.
  2.  
  3. //*************** GLOBALS  *****************
  4.  
  5. var m_Recordset = "";
  6. var m_ColumnsToShow = "";
  7. var m_AvailableColumns = "";
  8. var m_NumberOfRecords = 0;
  9. var m_CreateFile = false;
  10. var m_FileName = ""
  11. var m_LinkFromColumn = ""
  12. var m_UniqueKeyColumn = ""
  13. var m_urlPath;
  14. var m_RepeatRegionName = "";
  15. var detailPageObj;
  16. var m_colShowArray;
  17. var m_ServerLanguage;
  18. var m_ServerModel;
  19. var m_ServerExt;
  20. var m_enclosingToken;
  21. var m_documentTypeID = "";
  22. var CONST_where = "WHERE";
  23. var CONST_and = "AND";
  24. var CONST_orderBy = "ORDER BY";
  25. var CONST_groupBy = "GROUP BY";
  26. var defaultValue = "1";
  27.  
  28. var LIST_RS, LIST_COL_SHOW, LIST_KEY_COL, LIST_LINK_COL, LIST_DETAIL_COL;
  29. //var CHECK_CREATEFILE;
  30. var m_ColShowArray, m_ColAvlArray, m_DetailColShowArray, mDetailColAvlArray, m_typesArray, m_allColumnsArray; 
  31.  
  32. var MODEL_IS_CF;
  33. var TF_REPEAT_COUNT;
  34.  
  35. var helpDoc = MM.HELP_objMasterDetail;
  36.  
  37.  
  38. //******************* API **********************
  39.  
  40. function commandButtons()
  41. {
  42.    return new Array( MM.BTN_OK, "okClicked()",
  43.                      MM.BTN_Cancel, "cancelClicked()",
  44.                      MM.BTN_Help, "displayHelp()");
  45. }
  46.  
  47. //***************** LOCAL FUNCTIONS  ******************
  48. function canInsert()
  49. {
  50.  
  51.   var retVal = true;
  52.   var errMsgStr = "";
  53.   var filePath = dreamweaver.getDocumentPath("document");
  54.   m_ServerLanguage = dw.getDocumentDOM().serverModel.getServerLanguage();
  55.   m_ServerModel = dw.getDocumentDOM().serverModel.getServerName();
  56.   m_ServerExt = dw.getDocumentDOM().serverModel.getServerExtension().replace(/\./g, "");
  57.  
  58.   if (dwscripts.getRecordsetNames().length == 0)
  59.   { 
  60.     errMsgStr = dwscripts.sprintf(MM.MSG_NeedRecordsetForObject, dwscripts.getRecordsetDisplayName());
  61.   } else if (filePath == "") {
  62.     errMsgStr = MM.MSG_saveDocument;
  63.   }
  64.     
  65.   if (errMsgStr)
  66.   {
  67.     alert (errMsgStr);
  68.     retVal = false;
  69.   }
  70.   
  71.   return retVal;
  72.  
  73. }
  74.  
  75.  
  76.  
  77. function initializeUI() {
  78.  
  79.   var errMsg ="";
  80.  
  81.   //Build Recordset menu
  82.   LIST_RS           = new ListControl("Recordset");
  83.   LIST_COL_SHOW     = findObject("ColumnsToShow");
  84.   LIST_DETAIL_COL   = findObject("DetailColumnsToShow");
  85.   
  86.   //The two objects below will be used for all m anipulation of data.
  87.   LIST_LINK_COL   = new ListControl("LinkColumn");
  88.   LIST_KEY_COL    = new ListControl("KeyColumn");
  89.  
  90.   //These two objects are a copy of the two above but will be used only for 
  91.   //the enabling/disabling mechanism. All data related manipulation must be 
  92.   //done using the above two objects.
  93.   LIST_LINK_COL_OBJ = findObject("LinkColumn");
  94.   LIST_KEY_COL_OBJ  = findObject("KeyColumn");
  95.   
  96.   TF_REPEAT_COUNT   = findObject("RepeatCount");
  97.   RB_COUNT          = new RadioGroup("RecordCount");
  98.  
  99.   EDIT_FILENAME     = findObject("DetailFileName");
  100.  
  101.   m_ColShowArray = new Array();
  102.   m_ColAvlArray = new Array();
  103.   m_DetailColShowArray = new Array();
  104.   m_DetailColAvlArray = new Array();
  105.   m_allColumnsArray = new Array();
  106.   m_typesArray = new Array();
  107.   
  108.   MODEL_IS_CF = (dw.getDocumentDOM() != null && dw.getDocumentDOM().serverModel.getServerName() == "Cold Fusion");
  109.  
  110.   m_RepeatRegionName = createNewRepeatRegionName();
  111.  
  112.   m_documentTypeID = dw.getDocumentDOM().documentType;
  113.  
  114.   var rsNames = dwscripts.getRecordsetNames();
  115.  
  116.   //Fill the Recordset listbox with names of the Recordset objects available
  117.   //on the current page. 
  118.   LIST_RS.setAll(rsNames,rsNames);
  119.  
  120.   //Get the currently selected Recordset
  121.   m_Recordset = LIST_RS.get();
  122.  
  123.   findTheRecordsetColumns(m_Recordset);
  124.   updateColumnLists();
  125.   updateDetailColumnList();
  126.   updateColumnLinkList();
  127.  
  128.   //Populate the Unique Key Column List.
  129.   LIST_KEY_COL.setAll(m_ColShowArray, m_ColShowArray);
  130.  
  131.   elts = document.forms[0].elements;
  132.   if (elts && elts.length)
  133.     elts[0].focus();
  134. }
  135.  
  136. //This method is called when the recordset has changed and the 
  137. //columns need to be gotten from the Recordset. This method will update
  138. //the arrays that support the list boxes.
  139. function findTheRecordsetColumns(recordset)
  140. {
  141.   //Init vars
  142.   var newLength = 0;
  143.   var colTypesOk = true;
  144.  
  145.   var ssRecordset = findRecordset(recordset);
  146.     
  147.   //Empty m_ColShowArray first...
  148.   newLength = m_ColShowArray.length;
  149.   m_ColShowArray.splice(0, newLength);
  150.  
  151.     //Empty m_allColumnsArray
  152.   var allColumnsLength = m_allColumnsArray.length;
  153.   m_allColumnsArray.splice(0, allColumnsLength);
  154.  
  155.     // Empty m_typesArray
  156.   var typesLength = m_typesArray.length;
  157.   m_typesArray.splice(0, typesLength);
  158.  
  159.   //Empty m_ColAvlArray too...
  160.   var showAvlLength = m_ColAvlArray.length;
  161.   m_ColAvlArray.splice(0, showAvlLength);
  162.  
  163.   //Empty m_DetailAvlArray
  164.   var detailArrayLength = m_DetailColAvlArray.length;
  165.   m_DetailColAvlArray.splice(0, showAvlLength);
  166.  
  167.   //Empty m_DetailColShowArray first...
  168.   newLength = m_DetailColShowArray.length;
  169.   m_DetailColShowArray.splice(0, newLength);
  170.  
  171.   if (ssRecordset)
  172.   {
  173.     //Get all the column names for the Recordset
  174.     //and put them in the Show array.
  175.     
  176.     m_ColShowArray = dwscripts.getFieldNames(m_Recordset);
  177.       
  178.     //Get all the column names for the Recordset
  179.     //and put them in the Detail Show array.
  180.     m_DetailColShowArray = dwscripts.getFieldNames(m_Recordset);
  181.   
  182.     var colsAndTypes = getCachedColumnAndTypeArray(ssRecordset.rsName);
  183.     
  184.     if (String(colsAndTypes[0]).indexOf("MM_ERROR:") == -1)
  185.     {
  186.       var numCols = 0
  187.       for (var i = 0; i < colsAndTypes.length; i+=2)
  188.       {
  189.         m_allColumnsArray[numCols] = colsAndTypes[i]
  190.         m_typesArray[numCols] = colsAndTypes[i + 1]
  191.       
  192.         if(m_typesArray[numCols] == "")
  193.         {
  194.           if(colTypesOk)
  195.             colTypesOk = false;
  196.         }
  197.         numCols++
  198.       }
  199.     } else {
  200.       //Don't do anything here. If something is not right with the 
  201.       //recordset, we would have caught it earlier.
  202.     }
  203.     
  204.     //If the column types did not make it, we have another chance to get the info
  205.     //if the server model is Cold Fusion.
  206.     if(!colTypesOk)
  207.     {
  208.       //If the server model is Cold Fusion, let's try something else as well...
  209.       if(MODEL_IS_CF) {
  210.       var rsObj = ParseSimpleSQL(ssRecordset.source);
  211.       
  212.       if(rsObj) {
  213.         var numColsCF = 0
  214.           var colsAndTypesCF = MMDB.getColumnAndTypeOfTable(ssRecordset.connectionName, rsObj.table);
  215.   
  216.       for (var i = 1; i < colsAndTypesCF.length; i+=2)
  217.       {
  218.           m_typesArray[numColsCF] = colsAndTypesCF[i];
  219.         numColsCF++;
  220.       }
  221.       }
  222.     }
  223.     }
  224.   }
  225. }
  226.  
  227. function updateColumnLists()
  228. {
  229.  
  230.   var showArr = new Array();
  231.  
  232.   for (j=0; j < m_ColShowArray.length; j++) {
  233.      showArr.push("<option>" + escHTMLChars(m_ColShowArray[j]) + "</option>");
  234.   }
  235.   LIST_COL_SHOW.innerHTML = showArr.join("");
  236. }
  237.  
  238. function updateDetailColumnList()
  239. {
  240.  
  241.   var showArr = new Array();
  242.   for (var j=0; j < m_DetailColShowArray.length; j++) {
  243.      showArr.push("<option>" + escHTMLChars(m_DetailColShowArray[j]) + "</option>");
  244.   }
  245.   LIST_DETAIL_COL.innerHTML = showArr.join("");
  246.  
  247. }
  248.  
  249. function updateColumnLinkList()
  250. {
  251.   LIST_LINK_COL.setAll(m_ColShowArray, m_ColShowArray);
  252. }
  253.  
  254.  
  255. function escHTMLChars(theStr) {
  256.   theStr = String(theStr);
  257.   theStr = theStr.replace(/\&/g,"&");
  258.   theStr = theStr.replace(/\</g,"<");
  259.   theStr = theStr.replace(/\>/g,">");
  260.   return theStr;
  261. }
  262.  
  263. function okClicked() {
  264.   
  265.   var retval = getDataFromUI();
  266.   //findRecordset();
  267.   if (retval == "") {
  268.      if (applyMasterDetail())
  269.        window.close();
  270.   } else {
  271.   alert(retval);
  272.   }
  273. }
  274.  
  275. function cancelClicked()
  276. {
  277.   MM.commandReturnValue = false;
  278.   window.close();
  279. }
  280.  
  281. // function: createDetailPage
  282. function createDetailPage(detailPageObj)
  283. {
  284.  
  285.   m_ServerLanguage = dw.getDocumentDOM().serverModel.getServerLanguage();
  286.   m_ServerModel = dw.getDocumentDOM().serverModel.getServerName();
  287.   m_ServerExt = dw.getDocumentDOM().serverModel.getServerExtension().replace(/\./g, "");
  288.  
  289.   var rootPath = dreamweaver.getSiteRoot();
  290.  
  291.   if(DWfile.exists(detailPageObj.detailPageName))
  292.   {
  293.     var fileIsOpen = fileIsCurrentlyOpen(detailPageObj.detailPageName);
  294.     dreamweaver.openDocument(detailPageObj.detailPageName);
  295.  
  296.     if (fileIsOpen) {
  297.       fixUpInsertionPoint();
  298.     } else {
  299.       moveCursorToEndOfBody();
  300.     }
  301.  
  302.     } else {
  303.  
  304.       dreamweaver.createDocument(false, m_documentTypeID);
  305.       dreamweaver.saveDocument(dreamweaver.getDocumentDOM(), detailPageObj.detailPageName);
  306.     }
  307.  
  308.     populateDetailPage(detailPageObj);
  309.     dreamweaver.openDocument(detailPageObj.detailPageName);
  310.     createLiveDataSettings(detailPageObj);
  311. }
  312.  
  313.  
  314. function RecordsetChanged()
  315. {
  316.   m_Recordset = LIST_RS.get();
  317.   findTheRecordsetColumns(m_Recordset);
  318.   updateColumnLists();
  319.   updateDetailColumnList();
  320.   updateColumnLinkList();
  321.  
  322.   //Populate the Unique Key Column List.
  323.   LIST_KEY_COL.setAll(m_ColShowArray, m_ColShowArray);
  324. }
  325.  
  326.  
  327. function applyMasterDetail() {
  328.  
  329.  
  330.   var temp_width;
  331.   var repeatRegionPart1, repeatRegionPart2, repeatRegionPart3, repeatRegionPart4;
  332.  
  333.   MM.setBusyCursor();
  334.  
  335.   MODEL_IS_CF = (dw.getDocumentDOM() != null && dw.getDocumentDOM().serverModel.getServerName() == "Cold Fusion");
  336.  
  337.   //BEGIN: Code for the detail page
  338.  
  339.   var colIndex = -1;
  340.   var index = 0; 
  341.  
  342.   for (index=0; index < m_allColumnsArray.length; index++) 
  343.   {
  344.     if(m_UniqueKeyColumn == m_allColumnsArray[index])
  345.       colIndex = index; 
  346.   }
  347.  
  348.   var detailPageObj = new Object();
  349.   detailPageObj.columnList = m_DetailColShowArray;
  350.   detailPageObj.colId = m_UniqueKeyColumn;
  351.   
  352.   if(colIndex > -1) {
  353.     detailPageObj.columnType = m_typesArray[colIndex];
  354.   } else {
  355.     detailPageObj.columnType = "";
  356.   }
  357.  
  358.   detailPageObj.paramName = "MMColParam";
  359.   detailPageObj.detailPageName = buildUpFileName(EDIT_FILENAME.value);
  360.  
  361.   detailPageObj.ssRec = findRecordset(m_Recordset);
  362.  
  363.   MM.commandReturnValue = detailPageObj;
  364.  
  365.   var DEBUG = false;
  366.   if (DEBUG) var debugMsg="COMPOUND SB OBJECT TEST:\n";
  367.  
  368.   //fixUpSelection(dreamweaver.getDocumentDOM());
  369.  
  370.   var paramObj = new Object();
  371.   var sbObj = null;
  372.  
  373.   //create new, empty custom group
  374.   var customGroup = new Group();
  375.  
  376.   //Open the Go To Detail Page Group
  377.   var goToDetailPageGroup = new Group("goToDetailPage");
  378.  
  379.   //Open the 4 existing Move To group files we are borrowing from
  380.   var moveToFirstGroup = new Group("moveToFirstRecord");
  381.   var moveToPrevGroup = new Group("moveToPreviousRecord");
  382.   var moveToNextGroup = new Group("moveToNextRecord");
  383.   var moveToLastGroup = new Group("moveToLastRecord");
  384.  
  385.   //Open the rsStat group file we are borrowing from
  386.   var rsStatsGroup = new Group("Recordset Statistics");
  387.  
  388.   //For ColdFusion, the are two repeat region groups... one for all records and the 
  389.   //other for a fixed number of records.
  390.  
  391.   if(MODEL_IS_CF & m_NumberOfRecords == -1)
  392.   {
  393.     repeatRegionPart1 = new Participant("repeatedRegionAll_init");
  394.     repeatRegionPart3 = new Participant("repeatedRegionAll_begin");
  395.  
  396.   } else {
  397.  
  398.     //get the RepeatedRegion participants.
  399.     repeatRegionPart1 = new Participant("repeatedRegion_init2");
  400.     repeatRegionPart2 = new Participant("repeatedRegion_beginInit");
  401.     repeatRegionPart3 = new Participant("repeatedRegion_begin");
  402.     repeatRegionPart4 = new Participant("repeatedRegion_end2");
  403.   }
  404.   
  405.   //paramObj.loopName = m_Recordset + "RR";
  406.   paramObj.loopName = m_RepeatRegionName;
  407.   paramObj.rsName = m_Recordset;
  408.   
  409.   paramObj.numRows = m_NumberOfRecords;
  410.  
  411.   customGroup.addParticipants(Array(repeatRegionPart1));
  412.  
  413.   if(MODEL_IS_CF & m_NumberOfRecords == -1) 
  414.   {
  415.   //don't do anything.
  416.   }
  417.   else {
  418.     customGroup.addParticipants(Array(repeatRegionPart2));
  419.   }
  420.  
  421.   //get the "aboveHTML" participants from the Go To Detail Page group
  422.   customGroup.addParticipants(goToDetailPageGroup.getParticipants("aboveHTML"));
  423.  
  424.   //get "directive" participants from Move To groups and add to customGroup
  425.   customGroup.addParticipants(moveToFirstGroup.getParticipants("aboveHTML"));
  426.   customGroup.addParticipants(moveToPrevGroup.getParticipants("aboveHTML"));
  427.   customGroup.addParticipants(moveToNextGroup.getParticipants("aboveHTML"));
  428.   customGroup.addParticipants(moveToLastGroup.getParticipants("aboveHTML"));
  429.  
  430.   //get "directive" participants from stat group and add to customGroup
  431.   customGroup.addParticipants(rsStatsGroup.getParticipants("aboveHTML"));
  432.  
  433.   var customStatPart = new Participant("rsStats_display");
  434.  
  435.   var rowDataPart = new Participant("MasterDetail_TableData");
  436.  
  437.   var rowPart = new Participant("MasterDetail_TableRow");
  438.  
  439.   var tablePart = new Participant("MasterDetail_Table");
  440.  
  441.   var dynDataPart = new Participant("dynamicData_ref");
  442.  
  443.   if (DEBUG) debugMsg += "\nAdded all directive participants from Move To, a total of "+customGroup.participants.length;
  444.   
  445.   //BEGIN The stuff for the table and repeat region go here....
  446.   
  447.   var tableStr = "";
  448.   var tableStr2 = "";
  449.  
  450.   var tableObj = new Object();
  451.   var tableObj2 = new Object();
  452.   var dynObj = new Object();
  453.   var rrObj = new Object();
  454.  
  455.   //dynObj.rs = m_Recordset;
  456.   //dynObj.col = m_ColShowArray[i];
  457.  
  458.   tableObj.align = "left";
  459.   
  460.   var tableWidth = String(100/m_ColShowArray.length);
  461.   var decimalIndex = tableWidth.indexOf(".");
  462.   if ( decimalIndex > -1) {
  463.     tableObj.width = tableWidth.slice(0, decimalIndex);
  464.   } else {
  465.     tableObj.width = tableWidth;
  466.   }
  467.  
  468.   for (var i = 0; i < m_ColShowArray.length; i++) {
  469.  
  470.   tableObj.rowDataContent = m_ColShowArray[i];
  471.     tableStr += rowDataPart.getInsertString(tableObj, "afterSelection")
  472.   }
  473.  
  474.   tableObj.preRowData = "";
  475.   tableObj.tableRowContent = tableStr;
  476.   tableObj.postRowData = "";
  477.  
  478.   tableStr = rowPart.getInsertString(tableObj, "afterSelection");
  479.  
  480.  
  481.   for (var i = 0; i < m_ColShowArray.length; i++) {
  482.   
  483.   if (m_LinkFromColumn == m_ColShowArray[i]) {
  484.       var linkObj = new Object();
  485.     var hrefObj = new Object();
  486.     var goToDetailPart = new Participant("goToDetailPage_attr");
  487.  
  488.     var hrefPart = new Participant("Href");
  489.  
  490.     linkObj.rs = m_Recordset;
  491.     //linkObj.col = m_ColShowArray[i];
  492.     linkObj.col = m_UniqueKeyColumn;
  493.     linkObj.url = m_FileName;
  494.     linkObj.keepType = "Both";
  495.     
  496.     linkObj.paramName = m_UniqueKeyColumn;
  497.  
  498.     dynObj.rsName = m_Recordset;
  499.     dynObj.bindingName = m_ColShowArray[i];
  500.     
  501.     hrefObj.hrefParam = goToDetailPart.getInsertString(linkObj, "nodeAttribute");
  502.     
  503.     if (dw.getDocumentDOM() != null && dw.getDocumentDOM().serverModel.getServerName() == "JSP" &&
  504.         m_LinkFromColumn == m_UniqueKeyColumn) {
  505.       //Need to handle duplicate getObject calls for JSP 1.0
  506.       var dynDataJSP = new Participant("dynamicData_refJSP");
  507.       hrefObj.linkParam = dynDataJSP.getInsertString(dynObj, "replaceSelection");
  508.     } else {
  509.       hrefObj.linkParam = dynDataPart.getInsertString(dynObj, "replaceSelection");  
  510.     }
  511.     
  512.     tableObj.rowDataContent = hrefPart.getInsertString(hrefObj, "replaceSelection");
  513.     if(MODEL_IS_CF)
  514.       tableObj.rowDataContent = tableObj.rowDataContent.replace(/<[\/]?cfoutput>/gi, "");
  515.   } else {
  516.     dynObj.rsName = m_Recordset;
  517.     dynObj.bindingName = m_ColShowArray[i];
  518.     tableObj.rowDataContent = dynDataPart.getInsertString(dynObj, "replaceSelection");
  519.     if(MODEL_IS_CF)
  520.       tableObj.rowDataContent = tableObj.rowDataContent.replace(/<[\/]?cfoutput>/gi, "");
  521.   }
  522.     tableStr2 += rowDataPart.getInsertString(tableObj, "afterSelection")
  523.   }
  524.  
  525.   rrObj.loopName = m_RepeatRegionName;
  526.   rrObj.rsName = m_Recordset;
  527.  
  528.   tableObj2.preRowData = repeatRegionPart3.getInsertString(rrObj, "beforeSelection");
  529.  
  530.   if (MODEL_IS_CF & m_NumberOfRecords == -1)
  531.     tableObj2.postRowData = "";
  532.   else 
  533.     tableObj2.postRowData = repeatRegionPart4.getInsertString(rrObj, "afterSelection");
  534.  
  535.   if(MODEL_IS_CF)
  536.   {
  537.   tableObj2.postRowData += "</cfoutput>";
  538.   }
  539.   tableObj2.tableRowContent = tableStr2;
  540.  
  541.   tableStr2 = rowPart.getInsertString(tableObj2, "afterSelection");
  542.  
  543.   paramObj.tableContent = tableStr + tableStr2;
  544.   paramObj.tableAlign = "center";
  545.   paramObj.border = "1";
  546.   customGroup.addParticipants(Array(tablePart))
  547.  
  548.   // END The stuff for the table and repeat region go here....
  549.  
  550.   //We will be using tables, so
  551.   customPart = new Participant("rsNav_Table");
  552.   customGroup.addParticipants(Array(customPart));   
  553.   
  554.   //Add the Recordset Stats participant
  555.   customGroup.addParticipants(Array(customStatPart));   
  556.  
  557.   //Hide Links
  558.   //Get the groups handling the Show Regions for first and last record.
  559.   var showRegion_firstRecord = new Group("showRegion_notFirstRecord");
  560.   var showRegion_lastRecord = new Group("showRegion_notLastRecord");
  561.  
  562.   //get the show Region participants.
  563.   
  564.   var showRegion_first_participants = showRegion_firstRecord.getParticipants()
  565.   var showRegion_last_participants = showRegion_lastRecord.getParticipants();
  566.   
  567.   var emptyParamObject = new Object();
  568.  
  569.   //Set the showRegion parameters
  570.   paramObj.hideLinksFirstBegin = showRegion_first_participants[0].getInsertString(emptyParamObject, "beforeSelection");
  571.   paramObj.hideLinksFirstEnd = showRegion_first_participants[1].getInsertString(emptyParamObject, "afterSelection");
  572.   if(MODEL_IS_CF) {
  573.     paramObj.hideLinksFirstEnd += "</cfif>";
  574.   }
  575.   paramObj.hideLinksLastBegin = showRegion_last_participants[0].getInsertString(emptyParamObject, "beforeSelection");
  576.   paramObj.hideLinksLastEnd = showRegion_last_participants[1].getInsertString(emptyParamObject, "afterSelection");
  577.   if(MODEL_IS_CF) {
  578.     paramObj.hideLinksLastEnd += "</cfif>";
  579.   }
  580.  
  581.   //set parameter values for Move To stuff (from UI settings)
  582.   paramObj.rsName  = m_Recordset;
  583.   paramObj.rs      = m_Recordset;
  584.   paramObj.col     = "";
  585.   paramObj.paramName = "";
  586.  
  587.   var displayStats_participant = rsStatsGroup.getParticipants("replaceSelection");
  588.  
  589.   paramObj.bindingName = "first";
  590.   var firstDisplayStr = displayStats_participant[0].getInsertString(paramObj, "replaceSelection");
  591.   if(firstDisplayStr && firstDisplayStr.length)paramObj.firstStatistics = firstDisplayStr;
  592.     
  593.   paramObj.bindingName = "last";
  594.   var lastDisplayStr = displayStats_participant[0].getInsertString(paramObj, "replaceSelection");
  595.   if( lastDisplayStr && lastDisplayStr.length) paramObj.lastStatistics = lastDisplayStr;
  596.  
  597.   paramObj.bindingName = "total";
  598.   var totalDisplayStr = displayStats_participant[0].getInsertString(paramObj, "replaceSelection");
  599.   if(totalDisplayStr && totalDisplayStr.length) paramObj.totalStatistics = totalDisplayStr;
  600.  
  601.   //set parameter values for compound object from localizeable globals file.
  602.   if (dreamweaver.appVersion && ( (dreamweaver.appVersion.indexOf('ja') != -1) ||
  603.                                   (dreamweaver.appVersion.indexOf('ko') != -1) ||
  604.                                   (dreamweaver.appVersion.indexOf('zh') != -1) ) ) {
  605.     var charSet = dw.getDocumentDOM().getCharSet();
  606.     charSet = charSet.toLowerCase();
  607.     if (   ( (dreamweaver.appVersion.indexOf('ja') != -1) && 
  608.              (charSet == "shift_jis" || charSet == "x-sjis" || charSet == "euc-jp" || charSet == "iso-2022-jp") )
  609.         || ( (dreamweaver.appVersion.indexOf('ko') != -1) && 
  610.              (charSet == "euc-kr") )
  611.         || ( (dreamweaver.appVersion.indexOf('zh') != -1) && 
  612.              (charSet == "big5" || charSet == "gb2312") ) ) {
  613.       // Japanese, Korean and Chinese exceptions
  614.       paramObj.firstStr = MM.LABEL_NewMoveToFirstLinkLabel;
  615.       paramObj.prevStr  = MM.LABEL_NewMoveToPrevLinkLabel;
  616.       paramObj.nextStr = MM.LABEL_NewMoveToNextLinkLabel;
  617.       paramObj.lastStr  = MM.LABEL_NewMoveToLastLinkLabel;
  618.     } else {
  619.       // not a JA, KO, or Chinese document so we will use English to prevent corruption
  620.       paramObj.firstStr = MM.LABEL_EngNewMoveToFirstLinkLabel;  
  621.       paramObj.prevStr  = MM.LABEL_EngNewMoveToPrevLinkLabel;
  622.       paramObj.nextStr  = MM.LABEL_EngNewMoveToNextLinkLabel;
  623.       paramObj.lastStr  = MM.LABEL_EngNewMoveToLastLinkLabel;
  624.     }
  625.   }
  626.   else {
  627.         paramObj.firstStr = entityNameEncode(MM.LABEL_NewMoveToFirstLinkLabel);  //"First" in English
  628.       paramObj.prevStr  = entityNameEncode(MM.LABEL_NewMoveToPrevLinkLabel);
  629.       paramObj.nextStr  = entityNameEncode(MM.LABEL_NewMoveToNextLinkLabel);
  630.       paramObj.lastStr  = entityNameEncode(MM.LABEL_NewMoveToLastLinkLabel);
  631.   }
  632.  
  633.   //set parameter values extracted from Move To groups, in this case HREF strings
  634.   var hrefArray = moveToFirstGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  635.   if (hrefArray && hrefArray.length) paramObj.moveFirstHref = hrefArray[0];
  636.   var hrefArray = moveToPrevGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  637.   if (hrefArray && hrefArray.length) paramObj.movePrevHref = hrefArray[0];
  638.   var hrefArray = moveToNextGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  639.   if (hrefArray && hrefArray.length) paramObj.moveNextHref = hrefArray[0];
  640.   var hrefArray = moveToLastGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  641.   if (hrefArray && hrefArray.length) paramObj.moveLastHref = hrefArray[0];
  642.  
  643.   //Code for the Recordset Statistics
  644.   //Open the rsStats group files we are borrowing from
  645.   var rsStatsGroup = new Group("rsStats");
  646.   customGroup.addParticipants(rsStatsGroup.getParticipants(""));
  647.  
  648.   //Set the individual parameters for the rsStats group
  649.   if (dreamweaver.appVersion && dreamweaver.appVersion.indexOf('ja') != -1) {  // Japanese version?
  650.     var charSet = dw.getDocumentDOM().getCharSet();
  651.     charSet = charSet.toLowerCase();
  652.     if (charSet.toLowerCase() == "shift_jis" || charSet == "x-sjis" || charSet == "euc-jp" || charSet == "iso-2022-jp") 
  653.     {
  654.       paramObj.beforeFirst = MM.LABEL_RSNavBeforeFirst;
  655.       paramObj.beforeLast  = MM.LABEL_RSNavBeforeLast;
  656.       paramObj.beforeTotal = MM.LABEL_RSNavBeforeTotal;
  657.       paramObj.afterTotal  = MM.LABEL_RSNavAfterTotal;
  658.     } else {    // not a japanese document so we will use English to prevent corruption
  659.       paramObj.beforeFirst = MM.LABEL_EngRSNavBeforeFirst;
  660.       paramObj.beforeLast  = MM.LABEL_EngRSNavBeforeLast;
  661.       paramObj.beforeTotal = MM.LABEL_EngRSNavBeforeTotal;
  662.       paramObj.afterTotal  = MM.LABEL_EngRSNavAfterTotal;
  663.     }
  664.   } else { 
  665.         paramObj.beforeFirst = entityNameEncode(MM.LABEL_RSNavBeforeFirst);
  666.       paramObj.beforeLast  = entityNameEncode(MM.LABEL_RSNavBeforeLast);
  667.       paramObj.beforeTotal = entityNameEncode(MM.LABEL_RSNavBeforeTotal);
  668.       paramObj.afterTotal  = entityNameEncode(MM.LABEL_RSNavAfterTotal);
  669.   } 
  670.  
  671.   setMoveToParamsForJsp(paramObj);
  672.  
  673.   //Apply everything to the page
  674.   
  675.   fixUpInsertionPoint();
  676.  
  677.   customGroup.apply(paramObj,sbObj);
  678.   MM.clearBusyCursor();
  679.  
  680.   return true;
  681. }
  682.  
  683. function findRecordset(recordsetName)
  684. {
  685.    var ssRecords = dw.sbi.getServerBehaviors();
  686.    var ssRec = null;
  687.    
  688.    for (var i = 0; i < ssRecords.length; i++)
  689.    {  
  690.      if(ssRecords[i].type == "recordset")
  691.    {  
  692.       if(ssRecords[i].rsName == m_Recordset)
  693.     {
  694.       ssRec = ssRecords[i]
  695.       copyServerBehavior(ssRec)
  696.     } 
  697.    }
  698.    }
  699.  
  700.    return ssRec;
  701. }
  702.  
  703. function getDataFromUI()
  704. {
  705.   var retval = "";
  706.  
  707.   m_Recordset = LIST_RS.getValue();
  708.  
  709.   if(m_Recordset != "") 
  710.   {
  711.     // Check if the chosen recordset is returned from a stored procedure. The master
  712.     //   detail object is not built to work with a rs returned from a stored proc.
  713.     var allRSs = dwscripts.getRecordsetNames();
  714.     var allNonSPRSs = dwscripts.getRecordsetNames(true);
  715.     if (   dwscripts.findInArray(allNonSPRSs, m_Recordset) == -1 
  716.         && dwscripts.findInArray(allRSs, m_Recordset) != -1
  717.        )
  718.     {
  719.       retval = MM.MSG_NoRecordsetsFromSPs;
  720.     }
  721.   }
  722.   else 
  723.   {
  724.     retval = MM.MSG_invalidRS;
  725.   }
  726.   
  727.   if (!retval)
  728.   {
  729.     if (RB_COUNT.getSelectedIndex()== 0)
  730.     {
  731.        var rc =TF_REPEAT_COUNT.value;
  732.        if (!((parseInt(rc)== rc) && (rc>0)))
  733.        {
  734.         return MM.MSG_ValueGreaterThanZero;
  735.        } else {
  736.       m_NumberOfRecords = parseInt(rc);
  737.      } 
  738.     } else {
  739.     m_NumberOfRecords = -1;
  740.     }
  741.   
  742.     if(m_ColShowArray.length == 0)
  743.     retval = MM.MSG_columnsEmpty;
  744.    
  745.     m_CreateFile = true;
  746.     m_FileName = EDIT_FILENAME.value;
  747.     if ((!m_FileName) || (m_FileName.charAt(0) == " ") || (m_FileName.charAt(0) == " ") || (m_FileName.length == 0) ||
  748.       (m_FileName.indexOf("/") != -1) || (StripChars(" ", m_FileName) == ""))
  749.       retval = errMsg(MM.MSG_invalidDetailPageName, m_FileName); 
  750.   
  751.     if(LIST_LINK_COL.getLen() && LIST_LINK_COL_OBJ.selectedIndex >= 0)
  752.       m_LinkFromColumn = LIST_LINK_COL_OBJ.options[LIST_LINK_COL_OBJ.selectedIndex].text;
  753.     else 
  754.     retal = MM.MSG_invalidLinkFromColumn;
  755.       
  756.     if(LIST_KEY_COL.getLen() && LIST_KEY_COL_OBJ.selectedIndex >= 0)
  757.       m_UniqueKeyColumn = LIST_KEY_COL_OBJ.options[LIST_KEY_COL_OBJ.selectedIndex].text;
  758.     else
  759.       retval = MM.MSG_invalidUniqueKeyColumn;
  760.   }
  761.     
  762.   return retval;
  763. }
  764.  
  765.  
  766. //The "Move Up" button has been clicked
  767. function onMoveUpClicked()
  768. {
  769.   var index = LIST_COL_SHOW.selectedIndex
  770.   if(index > 0)
  771.   {
  772.     //Swap the text in the list control
  773.   var columnValue = LIST_COL_SHOW.options[index].text;
  774.   LIST_COL_SHOW.options[index].text = LIST_COL_SHOW.options[index - 1].text;
  775.   LIST_COL_SHOW.options[index - 1].text = columnValue;
  776.   
  777.   //Now updated the List Arrays..
  778.   columnValue = m_ColShowArray[index];
  779.   m_ColShowArray[index] = m_ColShowArray[index - 1];
  780.   m_ColShowArray[index - 1] = columnValue;
  781.  
  782.   //Set the new selection
  783.   LIST_COL_SHOW.options[index].selected = false;
  784.   LIST_COL_SHOW.options[index-1].selected = true;
  785.   }
  786. }
  787.  
  788. //The "Move Down" button has been clicked
  789. function onMoveDownClicked()
  790. {
  791.   var index = LIST_COL_SHOW.selectedIndex;
  792.   
  793.   if( (index >= 0) & (index < (LIST_COL_SHOW.options.length - 1)))
  794.   {
  795.     //Swap the text in the list control
  796.   var columnValue = LIST_COL_SHOW.options[index].text;
  797.   LIST_COL_SHOW.options[index].text = LIST_COL_SHOW.options[index + 1].text;
  798.   LIST_COL_SHOW.options[index + 1].text = columnValue;
  799.   
  800.   //Now updated the List Arrays..
  801.   columnValue = m_ColShowArray[index];
  802.   m_ColShowArray[index] = m_ColShowArray[index + 1];
  803.   m_ColShowArray[index + 1] = columnValue;
  804.  
  805.   //Set the new selection.
  806.   LIST_COL_SHOW.options[index].selected = false;
  807.   LIST_COL_SHOW.options[index+1].selected = true;
  808.   }
  809. }
  810.  
  811. //The "Detail Move Up" button has been clicked
  812. function onDetailMoveUpClicked()
  813. {
  814.   var index = LIST_DETAIL_COL.selectedIndex
  815.   if(index > 0)
  816.   {
  817.     //Swap the text in the list control
  818.   var columnValue = LIST_DETAIL_COL.options[index].text;
  819.   LIST_DETAIL_COL.options[index].text = LIST_DETAIL_COL.options[index - 1].text;
  820.   LIST_DETAIL_COL.options[index - 1].text = columnValue;
  821.   
  822.   //Now updated the List Arrays..
  823.   columnValue = m_DetailColShowArray[index];
  824.   m_DetailColShowArray[index] = m_DetailColShowArray[index - 1];
  825.   m_DetailColShowArray[index - 1] = columnValue;
  826.  
  827.   //Set the new selection
  828.   LIST_DETAIL_COL.options[index].selected = false;
  829.   LIST_DETAIL_COL.options[index-1].selected = true;
  830.   }
  831. }
  832.  
  833. //The "Detail Move Down" button has been clicked
  834. function onDetailMoveDownClicked()
  835. {
  836.   var index = LIST_DETAIL_COL.selectedIndex;
  837.   
  838.   if( (index >= 0) & (index < (LIST_DETAIL_COL.options.length - 1)))
  839.   {
  840.     //Swap the text in the list control
  841.   var columnValue = LIST_DETAIL_COL.options[index].text;
  842.   LIST_DETAIL_COL.options[index].text = LIST_DETAIL_COL.options[index + 1].text;
  843.   LIST_DETAIL_COL.options[index + 1].text = columnValue;
  844.   
  845.   //Now updated the List Arrays..
  846.   columnValue = m_DetailColShowArray[index];
  847.   m_DetailColShowArray[index] = m_DetailColShowArray[index + 1];
  848.   m_DetailColShowArray[index + 1] = columnValue;
  849.  
  850.   //Set the new selection.
  851.   LIST_DETAIL_COL.options[index].selected = false;
  852.   LIST_DETAIL_COL.options[index+1].selected = true;
  853.   }
  854. }
  855.  
  856.  
  857. //The "<" button has been clicked. Add a column to the Columns to Show list
  858. function onAddButtonClicked()
  859. {
  860.   // check to see if there are columns to add first
  861.   if (m_ColAvlArray.length == 0){
  862.     alert(MM.MSG_NoMoreColumnsToAdd);
  863.     return;
  864.   }
  865.  
  866.   var colsToAdd = callCommand('Add Column.htm', m_ColAvlArray);
  867.   if (!colsToAdd) return; // user clicked Cancel
  868.  
  869.   var nCols = colsToAdd.length,i;
  870.   var currSelection = LIST_COL_SHOW.selectedIndex;
  871.   if(currSelection == -1){
  872.   currSelection = LIST_COL_SHOW.options.length;
  873.   }
  874.  
  875.   for(i = 0; i < colsToAdd.length; i++)
  876.   {
  877.     m_ColShowArray.splice(currSelection, 0, colsToAdd[i]);
  878.     currSelection++;
  879.   for (var j=0; j < m_ColAvlArray.length; j++)
  880.   {
  881.        if(m_ColAvlArray[j] == colsToAdd[i])
  882.        m_ColAvlArray.splice(j, 1);
  883.   }
  884.   }
  885.   updateColumnLists();
  886.   updateColumnLinkList();
  887. }
  888.  
  889. //The ">" button has been clicked. Remove a column to the Columns to Show list
  890. function onRemoveButtonClicked()
  891. {
  892.   if(LIST_COL_SHOW.selectedIndex >= 0)
  893.   {
  894.     // First check if there will be any columns left in the list after the delete.
  895.     //   If not, warn the user that there must be at least one column in the 
  896.     //   list and return.
  897.     var deleteCount = 0;
  898.     var numItems = LIST_COL_SHOW.options.length;
  899.     for (var start_select_index = LIST_COL_SHOW.selectedIndex;
  900.          start_select_index < numItems; start_select_index++)
  901.     {
  902.       if(LIST_COL_SHOW.options[start_select_index].selected == true)
  903.       {
  904.         deleteCount++;
  905.       }
  906.     }
  907.  
  908.     if (numItems == 1 || numItems == deleteCount)
  909.     {
  910.       alert(MM.MSG_NeedOneColumnInList);
  911.       return;
  912.     }
  913.  
  914.     var deleteCount = 0;
  915.     for (var start_select_index = LIST_COL_SHOW.selectedIndex;
  916.      start_select_index < LIST_COL_SHOW.options.length; start_select_index++)
  917.   {
  918.     if(LIST_COL_SHOW.options[start_select_index].selected == true)
  919.       {
  920.       m_ColAvlArray.splice(m_ColAvlArray.length, 0, m_ColShowArray[start_select_index - deleteCount]);
  921.       m_ColShowArray.splice((start_select_index - deleteCount), 1);
  922.       deleteCount++;
  923.     }
  924.   }
  925.   updateColumnLists();
  926.   updateColumnLinkList();
  927.   }
  928. }
  929.  
  930. function onDetailAddButtonClicked()
  931. {
  932.   // check to see if there are columns to add first
  933.   if (m_DetailColAvlArray.length == 0){
  934.     alert(MM.MSG_NoMoreColumnsToAdd);
  935.     return;
  936.   }
  937.  
  938.   var colsToAdd = callCommand('Add Column.htm', m_DetailColAvlArray);
  939.   if (!colsToAdd) return; // user clicked Cancel
  940.  
  941.   var nCols = colsToAdd.length,i;
  942.   var currSelection = LIST_DETAIL_COL.selectedIndex;
  943.   if(currSelection == -1){
  944.   currSelection = LIST_DETAIL_COL.options.length;
  945.   }
  946.  
  947.   for(i = 0; i < colsToAdd.length; i++)
  948.   {
  949.     m_DetailColShowArray.splice(currSelection, 0, colsToAdd[i]);
  950.     currSelection++;
  951.   for (var j=0; j < m_DetailColAvlArray.length; j++)
  952.   {
  953.        if(m_DetailColAvlArray[j] == colsToAdd[i])
  954.        m_DetailColAvlArray.splice(j, 1);
  955.   }
  956.   }
  957.   updateDetailColumnList();
  958. }
  959.  
  960. //The ">" button has been clicked. Remove a column to the Columns to Show list
  961. function onDetailRemoveButtonClicked()
  962. {
  963.   if(LIST_DETAIL_COL.selectedIndex >= 0)
  964.   {
  965.     // First check if there will be any columns left in the list after the delete.
  966.     //   If not, warn the user that there must be at least one column in the 
  967.     //   list and return.
  968.     var deleteCount = 0;
  969.     var numItems = LIST_DETAIL_COL.options.length;
  970.     for (var start_select_index = LIST_DETAIL_COL.selectedIndex;
  971.          start_select_index < numItems; start_select_index++)
  972.     {
  973.       if(LIST_DETAIL_COL.options[start_select_index].selected == true)
  974.       {
  975.         deleteCount++;
  976.       }
  977.     }
  978.  
  979.     if (numItems == 1 || numItems == deleteCount)
  980.     {
  981.       alert(MM.MSG_NeedOneColumnInList);
  982.       return;
  983.     }
  984.  
  985.     deleteCount = 0;
  986.     for (var start_select_index = LIST_DETAIL_COL.selectedIndex;
  987.      start_select_index < numItems; start_select_index++)
  988.     {
  989.       if(LIST_DETAIL_COL.options[start_select_index].selected == true)
  990.       {
  991.         m_DetailColAvlArray.splice(m_DetailColAvlArray.length, 0, m_DetailColShowArray[start_select_index - deleteCount]);
  992.         m_DetailColShowArray.splice((start_select_index - deleteCount), 1);
  993.         deleteCount++;
  994.       }
  995.     }
  996.     updateDetailColumnList();
  997.   }
  998. }
  999.  
  1000.  
  1001. function setCount(element)
  1002. {
  1003.    if (element.value == "All"){
  1004.      TF_REPEAT_COUNT.setAttribute("disabled","true");
  1005.    } else {
  1006.      TF_REPEAT_COUNT.removeAttribute("disabled");
  1007.    }
  1008. }
  1009.  
  1010. function browseButtonClicked()
  1011. {
  1012.   var result = dw.browseForFileURL("select", MM.MSG_detailPageDialog, false, true);
  1013.   
  1014.   if (result) {
  1015.      EDIT_FILENAME.value = result;
  1016.   }
  1017. }
  1018.  
  1019. //Function: buildUpFileName
  1020. //Purpose: Accept the file name as a param. Do the following:
  1021. //  1. Add extension to name if it does not already exist.
  1022. //  2. Prepend the current document path to the file name.
  1023. //  This function assumes that the current document has been saved, since this
  1024. //  would have been checked when the object was called.
  1025. //
  1026. function buildUpFileName(baseName)
  1027. {
  1028.   //Initialize vars
  1029.   var retVal = "";
  1030.   var lastIndex = -1;
  1031.   var path = "";
  1032.   var newPath = "";
  1033.  
  1034.   var ext = dw.getDocumentDOM().serverModel.getServerExtension();
  1035.  
  1036.   //Attach the file extension to the baseName if it doesn't already exist.
  1037.   if(baseName.lastIndexOf(ext) == -1){
  1038.   baseName = baseName + ext;
  1039.   }
  1040.  
  1041.   //Set the m_FileName global var with the corrected (if necessary) file name.
  1042.   m_FileName = baseName;
  1043.  
  1044.   path = dreamweaver.getDocumentPath("document");
  1045.   
  1046.   lastIndex = path.lastIndexOf("/");
  1047.   newPath = path.slice(0, lastIndex + 1);
  1048.   retVal = newPath + baseName;
  1049.  
  1050.   return retVal;
  1051. }
  1052.  
  1053. function createNewRepeatRegionName()
  1054. {
  1055.   //search the ssRecs for other names
  1056.   var retVal = "";
  1057.   
  1058.   var ssRecs = dw.serverBehaviorInspector.getServerBehaviors();
  1059.   
  1060.   var num = 0;
  1061.   var rrName = "";
  1062.   
  1063.   while (!retVal) {
  1064.     num++;
  1065.     rrName = "Repeat" + num;
  1066.     for (var i=0; i < ssRecs.length; i++) { //search all ssRecs
  1067.       var ssRec = ssRecs[i];
  1068.       if (ssRec.parameters.loopName != null && 
  1069.           ssRec.parameters.loopName.toLowerCase() == rrName.toLowerCase()) {
  1070.         break;
  1071.       }
  1072.     }
  1073.     if (i >= ssRecs.length) {
  1074.       retVal = rrName;
  1075.     }
  1076.   }
  1077.   
  1078.   return retVal;
  1079. }
  1080.  
  1081. function createLiveDataSettings(detailPageObj)
  1082. {
  1083.   var defaultValue = 1;
  1084.   var str =  detailPageObj.colId + "=" + defaultValue;
  1085.   dw.setLiveDataParameters(str);
  1086. }
  1087.  
  1088. function populateDetailPage(detailPageObj)
  1089. {
  1090.   MM.setBusyCursor();
  1091.  
  1092.   var paramObj = new Object();
  1093.   var sbObj = null;
  1094.   var tableCol1Str, tableCol2Str, tableRowStr;
  1095.   var tableObj = new Object();
  1096.   var tableObj2 = new Object();
  1097.   var dynObj = new Object();
  1098.  
  1099.   tableObj.align = "left";
  1100.   tableObj.width = "50";
  1101.  
  1102.   //Get the selected columns from the detailPageObj.
  1103.   colShowArray = detailPageObj.columnList;
  1104.  
  1105.   //Since the columns will include the 3 Recordset stats objects,
  1106.   //remove them from the list before updating the dialog list boxes.
  1107.   //var newLength = (colShowArray.length) - 3;
  1108.   //colShowArray.splice(newLength, 3);
  1109.  
  1110.   dom = dw.getDocumentDOM();
  1111.  
  1112.   var rsName = detailPageObj.ssRec.rsName;
  1113.  
  1114.   //Check if the recordset name is unique on the detail page.
  1115.   if(IsDupeObjectName(detailPageObj.ssRec.rsName)) rsName = CreateNewName();
  1116.  
  1117.   //create new, empty custom group
  1118.   var customGroup = new Group();
  1119.  
  1120.   var recordsetGroup = new Group("recordset");
  1121.  
  1122.   customGroup.addParticipants(recordsetGroup.getParticipants("aboveHTML"));
  1123.   customGroup.addParticipants(recordsetGroup.getParticipants("belowHTML"));
  1124.  
  1125.   paramObj.rsName = rsName;
  1126.   paramObj.varName = detailPageObj.paramName;
  1127.   paramObj.defaultValue = "1";
  1128.   var obj = new Object();
  1129.   obj = GetParamObj(0, detailPageObj.colId);
  1130.   paramObj.runtimeValue =  obj.runtimeVal;
  1131.  
  1132.   paramObj.ext = m_ServerExt;
  1133.  
  1134.   paramObj.cname = detailPageObj.ssRec.connectionName;
  1135.  
  1136.   paramObj.relpath = getConnectionsPath(paramObj.cname);
  1137.  
  1138.   if (m_ServerModel == "ASP") {
  1139.  
  1140.       paramObj.cursorType     = 0; /*adOpenForwardOnly*/
  1141.       paramObj.lockType       = 3; /*adLockOptimistic*/
  1142.       paramObj.cursorLocation = 2; /*adUseServer*/
  1143.  
  1144.   } else if (m_ServerModel == "Cold Fusion") {
  1145.  
  1146.       //strip the # signs from the runtime values
  1147.     paramObj.runtimeValue = paramObj.runtimeValue.replace(/#(.*)#/, "$1");
  1148.       paramObj.maxRows = "";
  1149.   }
  1150.  
  1151.   m_enclosingToken = "";
  1152.  
  1153.   if(detailPageObj.columnType != "" && dwscripts.isStringDBColumnType(detailPageObj.columnType)) {
  1154.     m_enclosingToken = "'";
  1155.   }
  1156.  
  1157.   paramObj.encodedSQL = addFilterToSql(detailPageObj.ssRec.source, paramObj.varName, detailPageObj.colId, paramObj.rsName, m_enclosingToken);
  1158.  
  1159.   var rowDataPart = new Participant("MasterDetail_DetailTblData");
  1160.  
  1161.   var rowPart = new Participant("MasterDetail_DetailTableRow");
  1162.  
  1163.   var tablePart = new Participant("MasterDetail_DetailTable");
  1164.  
  1165.   var dynDataPart = new Participant("dynamicData_ref");
  1166.  
  1167.   tableCol1Str = "";
  1168.   tableCol2Str = "";
  1169.   tableRowStr = "";
  1170.   outStr = ""
  1171.  
  1172.   for (var i = 0; i < colShowArray.length; i++) {
  1173.  
  1174.     //Display the column name in the first column..
  1175.     tableObj.rowDataContent = colShowArray[i];
  1176.     tableCol1Str = rowDataPart.getInsertString(tableObj, "afterSelection");
  1177.  
  1178.     //Display the dynamic data in the second column..
  1179.     dynObj.rsName = paramObj.rsName;
  1180.     dynObj.bindingName = colShowArray[i];
  1181.     tableObj.rowDataContent = dynDataPart.getInsertString(dynObj, "replaceSelection")
  1182.     tableCol2Str = rowDataPart.getInsertString(tableObj, "afterSelection")
  1183.  
  1184.     //Build the HTML table row
  1185.     tableObj2.tableRowContent = tableCol1Str + tableCol2Str;
  1186.     tableObj2.preRowData = "";
  1187.     tableObj2.postRowData = "";
  1188.  
  1189.     tableRowStr = rowPart.getInsertString(tableObj2, "afterSelection");
  1190.  
  1191.     outStr += tableRowStr;
  1192.   }
  1193.  
  1194.   paramObj.tableContent = outStr;
  1195.   paramObj.tableAlign = "center";
  1196.   paramObj.border = "1";
  1197.   customGroup.addParticipants(Array(tablePart))
  1198.   customGroup.apply(paramObj,sbObj);
  1199.  
  1200.   MM.clearBusyCursor();
  1201. }
  1202.  
  1203. function GetParamObj(paramType, paramVal)
  1204. {
  1205.   var runtimeVal = "MM_Error: Could not create runtime value."
  1206.   var defaultVal = "0"
  1207.   
  1208.   switch(m_ServerLanguage)
  1209.   {
  1210.     case "JavaScript":
  1211.     case "VBScript":
  1212.       switch(paramType)
  1213.       {
  1214.         case 0:
  1215.           runtimeVal = "Request.QueryString(\"" + paramVal + "\")"
  1216.           break
  1217.         case 1:
  1218.           runtimeVal = "Request.Form(\"" + paramVal + "\")"
  1219.           break
  1220.         case 2:
  1221.           runtimeVal = "Request.Cookies(\"" + paramVal + "\")"
  1222.           break
  1223.         case 3:
  1224.           runtimeVal = "Session(\"" + paramVal + "\")"
  1225.           break
  1226.         case 4:
  1227.           runtimeVal = "Application(\"" + paramVal + "\")"
  1228.           break
  1229.         case 5:
  1230.           runtimeVal = "Request(\"MM_EmptyValue\")"
  1231.           defaultVal = paramVal
  1232.           break
  1233.       }
  1234.       break
  1235.  
  1236.     case "CFML":
  1237.  
  1238.       switch(paramType)
  1239.       {
  1240.         case 0:
  1241.           runtimeVal = "#URL." + paramVal + "#"
  1242.           break
  1243.         case 1:
  1244.           runtimeVal = "#FORM." + paramVal + "#"
  1245.           break
  1246.         case 2:
  1247.           runtimeVal = "#Cookie." + paramVal + "#"
  1248.           break
  1249.         case 3:
  1250.           runtimeVal = "#Session." + paramVal + "#"
  1251.           break
  1252.         case 4:
  1253.           runtimeVal = "#Application." + paramVal + "#"
  1254.           break
  1255.         case 5:
  1256.           runtimeVal = "#" + rsName + "_Literal#"
  1257.           defaultVal = paramVal
  1258.           break
  1259.       }
  1260.       break
  1261.  
  1262.     case "Java":
  1263.  
  1264.       switch(paramType)
  1265.       {
  1266.         case 0:
  1267.           runtimeVal = "request.getParameter(\"" + paramVal + "\")"
  1268.           break
  1269.         case 1:
  1270.           runtimeVal = "session.getValue(\"" + paramVal + "\")"
  1271.           break
  1272.         case 2:
  1273.           runtimeVal = "request.getParameter(\"MM_EmptyValue\")"
  1274.           defaultVal = paramVal
  1275.           break
  1276.       }
  1277.  
  1278.       break
  1279.   }
  1280.  
  1281.   var outObj = new Object()
  1282.  
  1283.   outObj.defaultVal = defaultVal
  1284.   outObj.runtimeVal = runtimeVal
  1285.  
  1286.   return outObj
  1287. }
  1288.  
  1289. function addFilterToSql(source, varName, colId, rsName, enclosingToken)
  1290. {
  1291.    
  1292.    var part = new Participant("recordset_sqlVar");
  1293.    var sourceStr = source;
  1294.    var filter = "";
  1295.    var newSource = "";
  1296.    
  1297.    var paramObj = new Object();
  1298.    paramObj.rsName = rsName;
  1299.    paramObj.varName = varName;
  1300.    
  1301.    filter = part.getInsertString(paramObj);
  1302.    
  1303.    filter = colId + " = " + enclosingToken + filter + enclosingToken;
  1304.  
  1305.    var re = new RegExp("\\bwhere\\b","gi");
  1306.  
  1307.    var index = sourceStr.search(re);
  1308.  
  1309.    if (index == -1) {
  1310.      //The where clause was not found in the sql
  1311.      
  1312.      var reOrderBy = new RegExp("\\border\\s+by\\b","gi");
  1313.      var reGroupBy = new RegExp("\\bgroup\\s+by\\b","gi");
  1314.      var orderIndex = sourceStr.search(reOrderBy);
  1315.      var groupIndex = sourceStr.search(reGroupBy);
  1316.      if(groupIndex == orderIndex)
  1317.      {
  1318.          //This can only mean that the group by and order by clause both don't exist (index returns -1).
  1319.          newSource = sourceStr + " " + CONST_where + " " + filter;
  1320.      } else {
  1321.  
  1322.          var groupBoolean = new Boolean(false);
  1323.  
  1324.          // Either group by or order by or both clauses exist in the sql.
  1325.        if((groupIndex > -1) && (orderIndex > -1)) {
  1326.            // both clause's exist. Check which one has the least index value and insert the filter before it.
  1327.          groupBoolean = (groupIndex < orderIndex);
  1328.        } else {
  1329.            //only one clause exists. Check which one has the greater index value and insert the filter before it.
  1330.              groupBoolean = (groupIndex > orderIndex);
  1331.        }
  1332.        if(groupBoolean)
  1333.           newSource = buildNewSQLSource(sourceStr, groupIndex, CONST_where, filter);
  1334.        else 
  1335.           newSource = buildNewSQLSource(sourceStr, orderIndex, CONST_where, filter);  
  1336.      }
  1337.    } 
  1338.    else 
  1339.    {
  1340.      //The sql contains a where clause. We need to find out where it is and insert our filter just after it. 
  1341.      newSource = sourceStr.substr(0, index + 6) + filter + " AND " + sourceStr.substr(index + 6);
  1342.    }
  1343.    
  1344.    return newSource;
  1345. }
  1346.  
  1347. function buildNewSQLSource(sourceStr, index, clause, filter)
  1348. {
  1349.     var newSource;
  1350.     
  1351.   newSource = sourceStr.substr(0, index - 1) + " " + clause + " " + filter + " " + sourceStr.substr(index, sourceStr.length - index);
  1352.     
  1353.   return newSource;
  1354.  
  1355. }
  1356.  
  1357.