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

  1. // Copyright 2001-2002 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 = "default";
  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) {  // Japanese version?
  603.       var charSet = dw.getDocumentDOM().getCharSet();
  604.     charSet = charSet.toLowerCase();
  605.     if (charSet == "shift_jis" || charSet == "x-sjis" || charSet == "euc-jp" || charSet == "iso-2022-jp") 
  606.     {
  607.       paramObj.firstStr = MM.LABEL_NewMoveToFirstLinkLabel;  
  608.       paramObj.prevStr  = MM.LABEL_NewMoveToPrevLinkLabel;
  609.       paramObj.nextStr  = MM.LABEL_NewMoveToNextLinkLabel;
  610.       paramObj.lastStr  = MM.LABEL_NewMoveToLastLinkLabel;
  611.     } else {
  612.       paramObj.firstStr = MM.LABEL_EngNewMoveToFirstLinkLabel;  
  613.       paramObj.prevStr  = MM.LABEL_EngNewMoveToPrevLinkLabel;
  614.       paramObj.nextStr  = MM.LABEL_EngNewMoveToNextLinkLabel;
  615.       paramObj.lastStr  = MM.LABEL_EngNewMoveToLastLinkLabel;
  616.     }
  617.   }
  618.   else {
  619.         paramObj.firstStr = entityNameEncode(MM.LABEL_NewMoveToFirstLinkLabel);  //"First" in English
  620.       paramObj.prevStr  = entityNameEncode(MM.LABEL_NewMoveToPrevLinkLabel);
  621.       paramObj.nextStr  = entityNameEncode(MM.LABEL_NewMoveToNextLinkLabel);
  622.       paramObj.lastStr  = entityNameEncode(MM.LABEL_NewMoveToLastLinkLabel);
  623.   }
  624.  
  625.   //set parameter values extracted from Move To groups, in this case HREF strings
  626.   var hrefArray = moveToFirstGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  627.   if (hrefArray && hrefArray.length) paramObj.moveFirstHref = hrefArray[0];
  628.   var hrefArray = moveToPrevGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  629.   if (hrefArray && hrefArray.length) paramObj.movePrevHref = hrefArray[0];
  630.   var hrefArray = moveToNextGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  631.   if (hrefArray && hrefArray.length) paramObj.moveNextHref = hrefArray[0];
  632.   var hrefArray = moveToLastGroup.getInsertStrings(paramObj,"nodeAttribute+HREF");
  633.   if (hrefArray && hrefArray.length) paramObj.moveLastHref = hrefArray[0];
  634.  
  635.   //Code for the Recordset Statistics
  636.   //Open the rsStats group files we are borrowing from
  637.   var rsStatsGroup = new Group("rsStats");
  638.   customGroup.addParticipants(rsStatsGroup.getParticipants(""));
  639.  
  640.   //Set the individual parameters for the rsStats group
  641.   if (dreamweaver.appVersion && dreamweaver.appVersion.indexOf('ja') != -1) {  // Japanese version?
  642.     var charSet = dw.getDocumentDOM().getCharSet();
  643.     charSet = charSet.toLowerCase();
  644.     if (charSet.toLowerCase() == "shift_jis" || charSet == "x-sjis" || charSet == "euc-jp" || charSet == "iso-2022-jp") 
  645.     {
  646.       paramObj.beforeFirst = MM.LABEL_RSNavBeforeFirst;
  647.       paramObj.beforeLast  = MM.LABEL_RSNavBeforeLast;
  648.       paramObj.beforeTotal = MM.LABEL_RSNavBeforeTotal;
  649.       paramObj.afterTotal  = MM.LABEL_RSNavAfterTotal;
  650.     } else {    // not a japanese document so we will use English to prevent corruption
  651.       paramObj.beforeFirst = MM.LABEL_EngRSNavBeforeFirst;
  652.       paramObj.beforeLast  = MM.LABEL_EngRSNavBeforeLast;
  653.       paramObj.beforeTotal = MM.LABEL_EngRSNavBeforeTotal;
  654.       paramObj.afterTotal  = MM.LABEL_EngRSNavAfterTotal;
  655.     }
  656.   } else { 
  657.         paramObj.beforeFirst = entityNameEncode(MM.LABEL_RSNavBeforeFirst);
  658.       paramObj.beforeLast  = entityNameEncode(MM.LABEL_RSNavBeforeLast);
  659.       paramObj.beforeTotal = entityNameEncode(MM.LABEL_RSNavBeforeTotal);
  660.       paramObj.afterTotal  = entityNameEncode(MM.LABEL_RSNavAfterTotal);
  661.   } 
  662.  
  663.   setMoveToParamsForJsp(paramObj);
  664.  
  665.   //Apply everything to the page
  666.   
  667.   fixUpInsertionPoint();
  668.  
  669.   customGroup.apply(paramObj,sbObj);
  670.   MM.clearBusyCursor();
  671.  
  672.   return true;
  673. }
  674.  
  675. function findRecordset(recordsetName)
  676. {
  677.    var ssRecords = dw.sbi.getServerBehaviors();
  678.    var ssRec = null;
  679.    
  680.    for (var i = 0; i < ssRecords.length; i++)
  681.    {  
  682.      if(ssRecords[i].type == "recordset")
  683.    {  
  684.       if(ssRecords[i].rsName == m_Recordset)
  685.     {
  686.       ssRec = ssRecords[i]
  687.       copyServerBehavior(ssRec)
  688.     } 
  689.    }
  690.    }
  691.  
  692.    return ssRec;
  693. }
  694.  
  695. function getDataFromUI()
  696. {
  697.   var retval = "";
  698.  
  699.   m_Recordset = LIST_RS.getValue();
  700.  
  701.   if(m_Recordset != "") 
  702.   {
  703.     // Check if the chosen recordset is returned from a stored procedure. The master
  704.     //   detail object is not built to work with a rs returned from a stored proc.
  705.     var allRSs = dwscripts.getRecordsetNames();
  706.     var allNonSPRSs = dwscripts.getRecordsetNames(true);
  707.     if (   dwscripts.findInArray(allNonSPRSs, m_Recordset) == -1 
  708.         && dwscripts.findInArray(allRSs, m_Recordset) != -1
  709.        )
  710.     {
  711.       retval = MM.MSG_NoRecordsetsFromSPs;
  712.     }
  713.   }
  714.   else 
  715.   {
  716.     retval = MM.MSG_invalidRS;
  717.   }
  718.   
  719.   if (!retval)
  720.   {
  721.     if (RB_COUNT.getSelectedIndex()== 0)
  722.     {
  723.        var rc =TF_REPEAT_COUNT.value;
  724.        if (!((parseInt(rc)== rc) && (rc>0)))
  725.        {
  726.         return MM.MSG_ValueGreaterThanZero;
  727.        } else {
  728.       m_NumberOfRecords = parseInt(rc);
  729.      } 
  730.     } else {
  731.     m_NumberOfRecords = -1;
  732.     }
  733.   
  734.     if(m_ColShowArray.length == 0)
  735.     retval = MM.MSG_columnsEmpty;
  736.    
  737.     m_CreateFile = true;
  738.     m_FileName = EDIT_FILENAME.value;
  739.     if ((!m_FileName) || (m_FileName.charAt(0) == " ") || (m_FileName.charAt(0) == " ") || (m_FileName.length == 0) ||
  740.       (m_FileName.indexOf("/") != -1) || (StripChars(" ", m_FileName) == ""))
  741.       retval = errMsg(MM.MSG_invalidDetailPageName, m_FileName); 
  742.   
  743.     if(LIST_LINK_COL.getLen() && LIST_LINK_COL_OBJ.selectedIndex >= 0)
  744.       m_LinkFromColumn = LIST_LINK_COL_OBJ.options[LIST_LINK_COL_OBJ.selectedIndex].text;
  745.     else 
  746.     retal = MM.MSG_invalidLinkFromColumn;
  747.       
  748.     if(LIST_KEY_COL.getLen() && LIST_KEY_COL_OBJ.selectedIndex >= 0)
  749.       m_UniqueKeyColumn = LIST_KEY_COL_OBJ.options[LIST_KEY_COL_OBJ.selectedIndex].text;
  750.     else
  751.       retval = MM.MSG_invalidUniqueKeyColumn;
  752.   }
  753.     
  754.   return retval;
  755. }
  756.  
  757.  
  758. //The "Move Up" button has been clicked
  759. function onMoveUpClicked()
  760. {
  761.   var index = LIST_COL_SHOW.selectedIndex
  762.   if(index > 0)
  763.   {
  764.     //Swap the text in the list control
  765.   var columnValue = LIST_COL_SHOW.options[index].text;
  766.   LIST_COL_SHOW.options[index].text = LIST_COL_SHOW.options[index - 1].text;
  767.   LIST_COL_SHOW.options[index - 1].text = columnValue;
  768.   
  769.   //Now updated the List Arrays..
  770.   columnValue = m_ColShowArray[index];
  771.   m_ColShowArray[index] = m_ColShowArray[index - 1];
  772.   m_ColShowArray[index - 1] = columnValue;
  773.  
  774.   //Set the new selection
  775.   LIST_COL_SHOW.options[index].selected = false;
  776.   LIST_COL_SHOW.options[index-1].selected = true;
  777.   }
  778. }
  779.  
  780. //The "Move Down" button has been clicked
  781. function onMoveDownClicked()
  782. {
  783.   var index = LIST_COL_SHOW.selectedIndex;
  784.   
  785.   if( (index >= 0) & (index < (LIST_COL_SHOW.options.length - 1)))
  786.   {
  787.     //Swap the text in the list control
  788.   var columnValue = LIST_COL_SHOW.options[index].text;
  789.   LIST_COL_SHOW.options[index].text = LIST_COL_SHOW.options[index + 1].text;
  790.   LIST_COL_SHOW.options[index + 1].text = columnValue;
  791.   
  792.   //Now updated the List Arrays..
  793.   columnValue = m_ColShowArray[index];
  794.   m_ColShowArray[index] = m_ColShowArray[index + 1];
  795.   m_ColShowArray[index + 1] = columnValue;
  796.  
  797.   //Set the new selection.
  798.   LIST_COL_SHOW.options[index].selected = false;
  799.   LIST_COL_SHOW.options[index+1].selected = true;
  800.   }
  801. }
  802.  
  803. //The "Detail Move Up" button has been clicked
  804. function onDetailMoveUpClicked()
  805. {
  806.   var index = LIST_DETAIL_COL.selectedIndex
  807.   if(index > 0)
  808.   {
  809.     //Swap the text in the list control
  810.   var columnValue = LIST_DETAIL_COL.options[index].text;
  811.   LIST_DETAIL_COL.options[index].text = LIST_DETAIL_COL.options[index - 1].text;
  812.   LIST_DETAIL_COL.options[index - 1].text = columnValue;
  813.   
  814.   //Now updated the List Arrays..
  815.   columnValue = m_DetailColShowArray[index];
  816.   m_DetailColShowArray[index] = m_DetailColShowArray[index - 1];
  817.   m_DetailColShowArray[index - 1] = columnValue;
  818.  
  819.   //Set the new selection
  820.   LIST_DETAIL_COL.options[index].selected = false;
  821.   LIST_DETAIL_COL.options[index-1].selected = true;
  822.   }
  823. }
  824.  
  825. //The "Detail Move Down" button has been clicked
  826. function onDetailMoveDownClicked()
  827. {
  828.   var index = LIST_DETAIL_COL.selectedIndex;
  829.   
  830.   if( (index >= 0) & (index < (LIST_DETAIL_COL.options.length - 1)))
  831.   {
  832.     //Swap the text in the list control
  833.   var columnValue = LIST_DETAIL_COL.options[index].text;
  834.   LIST_DETAIL_COL.options[index].text = LIST_DETAIL_COL.options[index + 1].text;
  835.   LIST_DETAIL_COL.options[index + 1].text = columnValue;
  836.   
  837.   //Now updated the List Arrays..
  838.   columnValue = m_DetailColShowArray[index];
  839.   m_DetailColShowArray[index] = m_DetailColShowArray[index + 1];
  840.   m_DetailColShowArray[index + 1] = columnValue;
  841.  
  842.   //Set the new selection.
  843.   LIST_DETAIL_COL.options[index].selected = false;
  844.   LIST_DETAIL_COL.options[index+1].selected = true;
  845.   }
  846. }
  847.  
  848.  
  849. //The "<" button has been clicked. Add a column to the Columns to Show list
  850. function onAddButtonClicked()
  851. {
  852.   // check to see if there are columns to add first
  853.   if (m_ColAvlArray.length == 0){
  854.     alert(MM.MSG_NoMoreColumnsToAdd);
  855.     return;
  856.   }
  857.  
  858.   var colsToAdd = callCommand('Add Column.htm', m_ColAvlArray);
  859.   if (!colsToAdd) return; // user clicked Cancel
  860.  
  861.   var nCols = colsToAdd.length,i;
  862.   var currSelection = LIST_COL_SHOW.selectedIndex;
  863.   if(currSelection == -1){
  864.   currSelection = LIST_COL_SHOW.options.length;
  865.   }
  866.  
  867.   for(i = 0; i < colsToAdd.length; i++)
  868.   {
  869.     m_ColShowArray.splice(currSelection, 0, colsToAdd[i]);
  870.     currSelection++;
  871.   for (var j=0; j < m_ColAvlArray.length; j++)
  872.   {
  873.        if(m_ColAvlArray[j] == colsToAdd[i])
  874.        m_ColAvlArray.splice(j, 1);
  875.   }
  876.   }
  877.   updateColumnLists();
  878.   updateColumnLinkList();
  879. }
  880.  
  881. //The ">" button has been clicked. Remove a column to the Columns to Show list
  882. function onRemoveButtonClicked()
  883. {
  884.   if(LIST_COL_SHOW.selectedIndex >= 0)
  885.   {
  886.     // First check if there will be any columns left in the list after the delete.
  887.     //   If not, warn the user that there must be at least one column in the 
  888.     //   list and return.
  889.     var deleteCount = 0;
  890.     var numItems = LIST_COL_SHOW.options.length;
  891.     for (var start_select_index = LIST_COL_SHOW.selectedIndex;
  892.          start_select_index < numItems; start_select_index++)
  893.     {
  894.       if(LIST_COL_SHOW.options[start_select_index].selected == true)
  895.       {
  896.         deleteCount++;
  897.       }
  898.     }
  899.  
  900.     if (numItems == 1 || numItems == deleteCount)
  901.     {
  902.       alert(MM.MSG_NeedOneColumnInList);
  903.       return;
  904.     }
  905.  
  906.     var deleteCount = 0;
  907.     for (var start_select_index = LIST_COL_SHOW.selectedIndex;
  908.      start_select_index < LIST_COL_SHOW.options.length; start_select_index++)
  909.   {
  910.     if(LIST_COL_SHOW.options[start_select_index].selected == true)
  911.       {
  912.       m_ColAvlArray.splice(m_ColAvlArray.length, 0, m_ColShowArray[start_select_index - deleteCount]);
  913.       m_ColShowArray.splice((start_select_index - deleteCount), 1);
  914.       deleteCount++;
  915.     }
  916.   }
  917.   updateColumnLists();
  918.   updateColumnLinkList();
  919.   }
  920. }
  921.  
  922. function onDetailAddButtonClicked()
  923. {
  924.   // check to see if there are columns to add first
  925.   if (m_DetailColAvlArray.length == 0){
  926.     alert(MM.MSG_NoMoreColumnsToAdd);
  927.     return;
  928.   }
  929.  
  930.   var colsToAdd = callCommand('Add Column.htm', m_DetailColAvlArray);
  931.   if (!colsToAdd) return; // user clicked Cancel
  932.  
  933.   var nCols = colsToAdd.length,i;
  934.   var currSelection = LIST_DETAIL_COL.selectedIndex;
  935.   if(currSelection == -1){
  936.   currSelection = LIST_DETAIL_COL.options.length;
  937.   }
  938.  
  939.   for(i = 0; i < colsToAdd.length; i++)
  940.   {
  941.     m_DetailColShowArray.splice(currSelection, 0, colsToAdd[i]);
  942.     currSelection++;
  943.   for (var j=0; j < m_DetailColAvlArray.length; j++)
  944.   {
  945.        if(m_DetailColAvlArray[j] == colsToAdd[i])
  946.        m_DetailColAvlArray.splice(j, 1);
  947.   }
  948.   }
  949.   updateDetailColumnList();
  950. }
  951.  
  952. //The ">" button has been clicked. Remove a column to the Columns to Show list
  953. function onDetailRemoveButtonClicked()
  954. {
  955.   if(LIST_DETAIL_COL.selectedIndex >= 0)
  956.   {
  957.     // First check if there will be any columns left in the list after the delete.
  958.     //   If not, warn the user that there must be at least one column in the 
  959.     //   list and return.
  960.     var deleteCount = 0;
  961.     var numItems = LIST_DETAIL_COL.options.length;
  962.     for (var start_select_index = LIST_DETAIL_COL.selectedIndex;
  963.          start_select_index < numItems; start_select_index++)
  964.     {
  965.       if(LIST_DETAIL_COL.options[start_select_index].selected == true)
  966.       {
  967.         deleteCount++;
  968.       }
  969.     }
  970.  
  971.     if (numItems == 1 || numItems == deleteCount)
  972.     {
  973.       alert(MM.MSG_NeedOneColumnInList);
  974.       return;
  975.     }
  976.  
  977.     deleteCount = 0;
  978.     for (var start_select_index = LIST_DETAIL_COL.selectedIndex;
  979.      start_select_index < numItems; start_select_index++)
  980.     {
  981.       if(LIST_DETAIL_COL.options[start_select_index].selected == true)
  982.       {
  983.         m_DetailColAvlArray.splice(m_DetailColAvlArray.length, 0, m_DetailColShowArray[start_select_index - deleteCount]);
  984.         m_DetailColShowArray.splice((start_select_index - deleteCount), 1);
  985.         deleteCount++;
  986.       }
  987.     }
  988.     updateDetailColumnList();
  989.   }
  990. }
  991.  
  992.  
  993. function setCount(element)
  994. {
  995.    if (element.value == "All"){
  996.      TF_REPEAT_COUNT.setAttribute("disabled","true");
  997.    } else {
  998.      TF_REPEAT_COUNT.removeAttribute("disabled");
  999.    }
  1000. }
  1001.  
  1002. function browseButtonClicked()
  1003. {
  1004.   var result = dw.browseForFileURL("select", MM.MSG_detailPageDialog, false, true);
  1005.   
  1006.   if (result) {
  1007.      EDIT_FILENAME.value = result;
  1008.   }
  1009. }
  1010.  
  1011. //Function: buildUpFileName
  1012. //Purpose: Accept the file name as a param. Do the following:
  1013. //  1. Add extension to name if it does not already exist.
  1014. //  2. Prepend the current document path to the file name.
  1015. //  This function assumes that the current document has been saved, since this
  1016. //  would have been checked when the object was called.
  1017. //
  1018. function buildUpFileName(baseName)
  1019. {
  1020.   //Initialize vars
  1021.   var retVal = "";
  1022.   var lastIndex = -1;
  1023.   var path = "";
  1024.   var newPath = "";
  1025.  
  1026.   var ext = dw.getDocumentDOM().serverModel.getServerExtension();
  1027.  
  1028.   //Attach the file extension to the baseName if it doesn't already exist.
  1029.   if(baseName.lastIndexOf(ext) == -1){
  1030.   baseName = baseName + ext;
  1031.   }
  1032.  
  1033.   //Set the m_FileName global var with the corrected (if necessary) file name.
  1034.   m_FileName = baseName;
  1035.  
  1036.   path = dreamweaver.getDocumentPath("document");
  1037.   
  1038.   lastIndex = path.lastIndexOf("/");
  1039.   newPath = path.slice(0, lastIndex + 1);
  1040.   retVal = newPath + baseName;
  1041.  
  1042.   return retVal;
  1043. }
  1044.  
  1045. function createNewRepeatRegionName()
  1046. {
  1047.   //search the ssRecs for other names
  1048.   var retVal = "";
  1049.   
  1050.   var ssRecs = dw.serverBehaviorInspector.getServerBehaviors();
  1051.   
  1052.   var num = 0;
  1053.   var rrName = "";
  1054.   
  1055.   while (!retVal) {
  1056.     num++;
  1057.     rrName = "Repeat" + num;
  1058.     for (var i=0; i < ssRecs.length; i++) { //search all ssRecs
  1059.       var ssRec = ssRecs[i];
  1060.       if (ssRec.parameters.loopName != null && 
  1061.           ssRec.parameters.loopName.toLowerCase() == rrName.toLowerCase()) {
  1062.         break;
  1063.       }
  1064.     }
  1065.     if (i >= ssRecs.length) {
  1066.       retVal = rrName;
  1067.     }
  1068.   }
  1069.   
  1070.   return retVal;
  1071. }
  1072.  
  1073. function createLiveDataSettings(detailPageObj)
  1074. {
  1075.   var defaultValue = 1;
  1076.   var str =  detailPageObj.colId + "=" + defaultValue;
  1077.   dw.setLiveDataParameters(str);
  1078. }
  1079.  
  1080. function populateDetailPage(detailPageObj)
  1081. {
  1082.   MM.setBusyCursor();
  1083.  
  1084.   var paramObj = new Object();
  1085.   var sbObj = null;
  1086.   var tableCol1Str, tableCol2Str, tableRowStr;
  1087.   var tableObj = new Object();
  1088.   var tableObj2 = new Object();
  1089.   var dynObj = new Object();
  1090.  
  1091.   tableObj.align = "default";
  1092.   tableObj.width = "50";
  1093.  
  1094.   //Get the selected columns from the detailPageObj.
  1095.   colShowArray = detailPageObj.columnList;
  1096.  
  1097.   //Since the columns will include the 3 Recordset stats objects,
  1098.   //remove them from the list before updating the dialog list boxes.
  1099.   //var newLength = (colShowArray.length) - 3;
  1100.   //colShowArray.splice(newLength, 3);
  1101.  
  1102.   dom = dw.getDocumentDOM();
  1103.  
  1104.   var rsName = detailPageObj.ssRec.rsName;
  1105.  
  1106.   //Check if the recordset name is unique on the detail page.
  1107.   if(IsDupeObjectName(detailPageObj.ssRec.rsName)) rsName = CreateNewName();
  1108.  
  1109.   //create new, empty custom group
  1110.   var customGroup = new Group();
  1111.  
  1112.   var recordsetGroup = new Group("recordset");
  1113.  
  1114.   customGroup.addParticipants(recordsetGroup.getParticipants("aboveHTML"));
  1115.   customGroup.addParticipants(recordsetGroup.getParticipants("belowHTML"));
  1116.  
  1117.   paramObj.rsName = rsName;
  1118.   paramObj.varName = detailPageObj.paramName;
  1119.   paramObj.defaultValue = "1";
  1120.   var obj = new Object();
  1121.   obj = GetParamObj(0, detailPageObj.colId);
  1122.   paramObj.runtimeValue =  obj.runtimeVal;
  1123.  
  1124.   paramObj.ext = m_ServerExt;
  1125.  
  1126.   paramObj.cname = detailPageObj.ssRec.connectionName;
  1127.  
  1128.   paramObj.relpath = getConnectionsPath(paramObj.cname);
  1129.  
  1130.   if (m_ServerModel == "ASP") {
  1131.  
  1132.       paramObj.cursorType     = 0; /*adOpenForwardOnly*/
  1133.       paramObj.lockType       = 3; /*adLockOptimistic*/
  1134.       paramObj.cursorLocation = 2; /*adUseServer*/
  1135.  
  1136.   } else if (m_ServerModel == "Cold Fusion") {
  1137.  
  1138.       //strip the # signs from the runtime values
  1139.     paramObj.runtimeValue = paramObj.runtimeValue.replace(/#(.*)#/, "$1");
  1140.       paramObj.maxRows = "";
  1141.   }
  1142.  
  1143.   m_enclosingToken = "";
  1144.  
  1145.   if(detailPageObj.columnType != "" && dwscripts.isStringDBColumnType(detailPageObj.columnType)) {
  1146.     m_enclosingToken = "'";
  1147.   }
  1148.  
  1149.   paramObj.encodedSQL = addFilterToSql(detailPageObj.ssRec.source, paramObj.varName, detailPageObj.colId, paramObj.rsName, m_enclosingToken);
  1150.  
  1151.   var rowDataPart = new Participant("MasterDetail_DetailTblData");
  1152.  
  1153.   var rowPart = new Participant("MasterDetail_DetailTableRow");
  1154.  
  1155.   var tablePart = new Participant("MasterDetail_DetailTable");
  1156.  
  1157.   var dynDataPart = new Participant("dynamicData_ref");
  1158.  
  1159.   tableCol1Str = "";
  1160.   tableCol2Str = "";
  1161.   tableRowStr = "";
  1162.   outStr = ""
  1163.  
  1164.   for (var i = 0; i < colShowArray.length; i++) {
  1165.  
  1166.     //Display the column name in the first column..
  1167.     tableObj.rowDataContent = colShowArray[i];
  1168.     tableCol1Str = rowDataPart.getInsertString(tableObj, "afterSelection");
  1169.  
  1170.     //Display the dynamic data in the second column..
  1171.     dynObj.rsName = paramObj.rsName;
  1172.     dynObj.bindingName = colShowArray[i];
  1173.     tableObj.rowDataContent = dynDataPart.getInsertString(dynObj, "replaceSelection")
  1174.     tableCol2Str = rowDataPart.getInsertString(tableObj, "afterSelection")
  1175.  
  1176.     //Build the HTML table row
  1177.     tableObj2.tableRowContent = tableCol1Str + tableCol2Str;
  1178.     tableObj2.preRowData = "";
  1179.     tableObj2.postRowData = "";
  1180.  
  1181.     tableRowStr = rowPart.getInsertString(tableObj2, "afterSelection");
  1182.  
  1183.     outStr += tableRowStr;
  1184.   }
  1185.  
  1186.   paramObj.tableContent = outStr;
  1187.   paramObj.tableAlign = "center";
  1188.   paramObj.border = "1";
  1189.   customGroup.addParticipants(Array(tablePart))
  1190.   customGroup.apply(paramObj,sbObj);
  1191.  
  1192.   MM.clearBusyCursor();
  1193. }
  1194.  
  1195. function GetParamObj(paramType, paramVal)
  1196. {
  1197.   var runtimeVal = "MM_Error: Could not create runtime value."
  1198.   var defaultVal = "0"
  1199.   
  1200.   switch(m_ServerLanguage)
  1201.   {
  1202.     case "JavaScript":
  1203.     case "VBScript":
  1204.       switch(paramType)
  1205.       {
  1206.         case 0:
  1207.           runtimeVal = "Request.QueryString(\"" + paramVal + "\")"
  1208.           break
  1209.         case 1:
  1210.           runtimeVal = "Request.Form(\"" + paramVal + "\")"
  1211.           break
  1212.         case 2:
  1213.           runtimeVal = "Request.Cookies(\"" + paramVal + "\")"
  1214.           break
  1215.         case 3:
  1216.           runtimeVal = "Session(\"" + paramVal + "\")"
  1217.           break
  1218.         case 4:
  1219.           runtimeVal = "Application(\"" + paramVal + "\")"
  1220.           break
  1221.         case 5:
  1222.           runtimeVal = "Request(\"MM_EmptyValue\")"
  1223.           defaultVal = paramVal
  1224.           break
  1225.       }
  1226.       break
  1227.  
  1228.     case "CFML":
  1229.  
  1230.       switch(paramType)
  1231.       {
  1232.         case 0:
  1233.           runtimeVal = "#URL." + paramVal + "#"
  1234.           break
  1235.         case 1:
  1236.           runtimeVal = "#FORM." + paramVal + "#"
  1237.           break
  1238.         case 2:
  1239.           runtimeVal = "#Cookie." + paramVal + "#"
  1240.           break
  1241.         case 3:
  1242.           runtimeVal = "#Session." + paramVal + "#"
  1243.           break
  1244.         case 4:
  1245.           runtimeVal = "#Application." + paramVal + "#"
  1246.           break
  1247.         case 5:
  1248.           runtimeVal = "#" + rsName + "_Literal#"
  1249.           defaultVal = paramVal
  1250.           break
  1251.       }
  1252.       break
  1253.  
  1254.     case "Java":
  1255.  
  1256.       switch(paramType)
  1257.       {
  1258.         case 0:
  1259.           runtimeVal = "request.getParameter(\"" + paramVal + "\")"
  1260.           break
  1261.         case 1:
  1262.           runtimeVal = "session.getValue(\"" + paramVal + "\")"
  1263.           break
  1264.         case 2:
  1265.           runtimeVal = "request.getParameter(\"MM_EmptyValue\")"
  1266.           defaultVal = paramVal
  1267.           break
  1268.       }
  1269.  
  1270.       break
  1271.   }
  1272.  
  1273.   var outObj = new Object()
  1274.  
  1275.   outObj.defaultVal = defaultVal
  1276.   outObj.runtimeVal = runtimeVal
  1277.  
  1278.   return outObj
  1279. }
  1280.  
  1281. function addFilterToSql(source, varName, colId, rsName, enclosingToken)
  1282. {
  1283.    
  1284.    var part = new Participant("recordset_sqlVar");
  1285.    var sourceStr = source;
  1286.    var filter = "";
  1287.    var newSource = "";
  1288.    
  1289.    var paramObj = new Object();
  1290.    paramObj.rsName = rsName;
  1291.    paramObj.varName = varName;
  1292.    
  1293.    filter = part.getInsertString(paramObj);
  1294.    
  1295.    filter = colId + " = " + enclosingToken + filter + enclosingToken;
  1296.  
  1297.    var re = new RegExp("\\bwhere\\b","gi");
  1298.  
  1299.    var index = sourceStr.search(re);
  1300.  
  1301.    if (index == -1) {
  1302.      //The where clause was not found in the sql
  1303.      
  1304.        var reOrderBy = new RegExp("\\border\\sby\\b","gi");
  1305.      var reGroupBy = new RegExp("\\bgroup\\sby\\b","gi");
  1306.      var orderIndex = sourceStr.search(reOrderBy);
  1307.      var groupIndex = sourceStr.search(reGroupBy);
  1308.      if(groupIndex == orderIndex)
  1309.      {
  1310.          //This can only mean that the group by and order by clause both don't exist (index returns -1).
  1311.          newSource = sourceStr + " " + CONST_where + " " + filter;
  1312.      } else {
  1313.  
  1314.          var groupBoolean = new Boolean(false);
  1315.  
  1316.          // Either group by or order by or both clauses exist in the sql.
  1317.        if((groupIndex > -1) && (orderIndex > -1)) {
  1318.            // both clause's exist. Check which one has the least index value and insert the filter before it.
  1319.          groupBoolean = (groupIndex < orderIndex);
  1320.        } else {
  1321.            //only one clause exists. Check which one has the greater index value and insert the filter before it.
  1322.              groupBoolean = (groupIndex > orderIndex);
  1323.        }
  1324.        if(groupBoolean)
  1325.           newSource = buildNewSQLSource(sourceStr, groupIndex, CONST_where, filter);
  1326.        else 
  1327.           newSource = buildNewSQLSource(sourceStr, orderIndex, CONST_where, filter);  
  1328.      }
  1329.    } else {
  1330.        //The sql contains a where clause. We need to find out where it is and insert our filter just after it. 
  1331.      //The clause generated here will be the only where clause that is used.
  1332.      newSource = sourceStr.substr(0, index) + " " + CONST_where + " " + filter;
  1333.    }
  1334.    
  1335.    return newSource;
  1336. }
  1337.  
  1338. function buildNewSQLSource(sourceStr, index, clause, filter)
  1339. {
  1340.     var newSource;
  1341.     
  1342.   newSource = sourceStr.substr(0, index - 1) + " " + clause + " " + filter + " " + sourceStr.substr(index, sourceStr.length - index);
  1343.     
  1344.   return newSource;
  1345.  
  1346. }
  1347.  
  1348.