/**
  * @brief HTML output
  * @param $Master
  * @param $uploadtree_pk1
  * @param $uploadtree_pk2
  * @param $in_uploadtree_pk1
  * @param $in_uploadtree_pk2
  * @param $filter
  * @param $TreeInfo1
  * @param $TreeInfo2
  * @param $BucketDefArray
  * @return HTML as string.
  */
 function HTMLout($Master, $uploadtree_pk1, $uploadtree_pk2, $in_uploadtree_pk1, $in_uploadtree_pk2, $filter, $TreeInfo1, $TreeInfo2, $BucketDefArray)
 {
     /* Initialize */
     $FreezeText = _("Freeze Path");
     $FrozenText = _("Frozen, Click to unfreeze");
     $OutBuf = '';
     /******* javascript functions ********/
     $OutBuf .= "\n<script language='javascript'>\n";
     /* function to replace this page specifying a new filter parameter */
     $OutBuf .= "function ChangeFilter(selectObj, utpk1, utpk2){";
     $OutBuf .= "  var selectidx = selectObj.selectedIndex;";
     $OutBuf .= "  var filter = selectObj.options[selectidx].value;";
     $OutBuf .= '  window.location.assign("?mod=' . $this->Name . '&item1="+utpk1+"&item2="+utpk2+"&filter=" + filter); ';
     $OutBuf .= "}\n";
     /* Freeze function (path list in banner)
         FreezeColNo is the ID of the column to freeze: 1 or 2
        Toggle Freeze button label: Freeze Path <-> Unfreeze Path
        Toggle Freeze button background color: white to light blue
        Toggle which paths are frozen: if path1 freezes, then unfreeze path2.
        Rewrite urls: eg &item1 ->  &Fitem1
        */
     $OutBuf .= "function Freeze(FreezeColNo) {";
     $OutBuf .= "var FreezeElt1 = document.getElementById('Freeze1');";
     $OutBuf .= "var FreezeElt2 = document.getElementById('Freeze2');";
     $OutBuf .= "var AddFreezeArg = 1; ";
     //1 to add &freeze=, 0 to remove &freeze= from url
     $OutBuf .= "var old_uploadtree_pk;\n";
     /* change the freeze labels to denote their new status */
     $OutBuf .= "if (FreezeColNo == '1')";
     $OutBuf .= "{";
     $OutBuf .= "if (FreezeElt1.innerHTML == '{$FrozenText}') ";
     $OutBuf .= "{";
     $OutBuf .= "FreezeElt1.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt1.style.backgroundColor = 'white'; ";
     $OutBuf .= "AddFreezeArg = 0;";
     $OutBuf .= "}";
     $OutBuf .= "else { ";
     $OutBuf .= "FreezeElt1.innerHTML = '{$FrozenText}'; ";
     $OutBuf .= "FreezeElt1.style.backgroundColor = '#EAF7FB'; ";
     $OutBuf .= "FreezeElt2.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt2.style.backgroundColor = 'white';";
     $OutBuf .= "old_uploadtree_pk = {$in_uploadtree_pk1};";
     $OutBuf .= "}";
     $OutBuf .= "}";
     $OutBuf .= "else {";
     $OutBuf .= "if (FreezeElt2.innerHTML == '{$FrozenText}') ";
     $OutBuf .= "{";
     $OutBuf .= "FreezeElt2.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt2.style.backgroundColor = 'white';";
     $OutBuf .= "AddFreezeArg = 0;";
     $OutBuf .= "}";
     $OutBuf .= "else {";
     $OutBuf .= "FreezeElt1.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt1.style.backgroundColor = 'white';";
     $OutBuf .= "FreezeElt2.innerHTML = '{$FrozenText}';";
     $OutBuf .= "FreezeElt2.style.backgroundColor = '#EAF7FB';";
     $OutBuf .= "old_uploadtree_pk = {$in_uploadtree_pk2};";
     $OutBuf .= "}";
     $OutBuf .= "}";
     /* Alter the url to add or remove freeze={column number}  */
     $OutBuf .= "var i=0;\n";
     $OutBuf .= "var linkid;\n";
     $OutBuf .= "var linkelt;\n";
     $OutBuf .= "var FreezeIdx;\n";
     $OutBuf .= "var BaseURL;\n";
     $OutBuf .= "var numlinks = document.links.length;\n";
     $OutBuf .= "for (i=0; i < numlinks; i++)\n";
     $OutBuf .= "{";
     $OutBuf .= "linkelt = document.links[i];\n";
     // freeze is the last url arg, so trim it off if it exists
     $OutBuf .= "FreezeIdx = linkelt.href.indexOf('&freeze');\n";
     $OutBuf .= "if (FreezeIdx > 0) \n";
     $OutBuf .= "BaseURL = linkelt.href.substr(0,FreezeIdx); \n";
     $OutBuf .= "else ";
     $OutBuf .= "BaseURL = linkelt.href; \n";
     $OutBuf .= "if (AddFreezeArg == 1) \n ";
     $OutBuf .= "linkelt.href = BaseURL + '&freeze=' + FreezeColNo + '&itemf=' + old_uploadtree_pk;";
     $OutBuf .= "else \n";
     $OutBuf .= "linkelt.href = BaseURL;";
     $OutBuf .= "}\n";
     $OutBuf .= "}\n";
     $OutBuf .= "</script>\n";
     /******* END javascript functions  ********/
     /* Select list for filters */
     $SelectFilter = "<select name='diff_filter' id='diff_filter' onchange='ChangeFilter(this,{$uploadtree_pk1}, {$uploadtree_pk2})'>";
     $Selected = $filter == 'none' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='none'>Remove nothing";
     $Selected = $filter == 'samebucketlist' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='samebucketlist'>Remove unchanged bucket lists";
     $SelectFilter .= "</select>";
     $StyleRt = "style='float:right'";
     $OutBuf .= "<a name='flist' href='#histo' {$StyleRt} > Jump to histogram </a><br>";
     /* Switch to license diff view */
     $text = _("Switch to license view");
     $switchURL = Traceback_uri();
     $switchURL .= "?mod=nomosdiff&item1={$uploadtree_pk1}&item2={$uploadtree_pk2}";
     $OutBuf .= "<a href='{$switchURL}' {$StyleRt} > {$text} </a> ";
     //    $TableStyle = "style='border-style:collapse;border:1px solid black'";
     $TableStyle = "";
     $OutBuf .= "<table border=0 id='dirlist' {$TableStyle}>";
     /* Select filter pulldown */
     $OutBuf .= "<tr><td colspan=5 align='center'>Filter: {$SelectFilter}<br>&nbsp;</td></tr>";
     /* File path */
     $OutBuf .= "<tr>";
     $Path1 = Dir2Path($uploadtree_pk1);
     $Path2 = Dir2Path($uploadtree_pk2);
     $OutBuf .= "<td colspan=2>";
     $OutBuf .= Dir2BrowseDiff($Path1, $Path2, $filter, 1, $this);
     $OutBuf .= "</td>";
     $OutBuf .= "<td {$this->ColumnSeparatorStyleL} colspan=3>";
     $OutBuf .= Dir2BrowseDiff($Path1, $Path2, $filter, 2, $this);
     $OutBuf .= "</td></tr>";
     /* File comparison table */
     $OutBuf .= $this->ItemComparisonRows($Master, $TreeInfo1['agent_pk'], $TreeInfo2['agent_pk'], $BucketDefArray);
     /*  Separator row */
     $ColumnSeparatorStyleTop = "style='border:solid 0 #006600; border-top-width:2px; border-bottom-width:2px;'";
     $OutBuf .= "<tr>";
     $OutBuf .= "<td colspan=5 {$ColumnSeparatorStyleTop}>";
     $OutBuf .= "<a name='histo' href='#flist' style='float:right'> Jump to top </a>";
     $OutBuf .= "</a>";
     $OutBuf .= "</tr>";
     /* License histogram */
     $OutBuf .= "<tr>";
     $Tree1Hist = $this->UploadHist($uploadtree_pk1, $TreeInfo1, $BucketDefArray);
     $OutBuf .= "<td colspan=2 valign='top' align='center'>{$Tree1Hist}</td>";
     $OutBuf .= "<td {$this->ColumnSeparatorStyleL}>&nbsp;</td>";
     $Tree2Hist = $this->UploadHist($uploadtree_pk2, $TreeInfo2, $BucketDefArray);
     $OutBuf .= "<td colspan=2 valign='top' align='center'>{$Tree2Hist}</td>";
     $OutBuf .= "</tr></table>\n";
     $OutBuf .= "<a href='#flist' style='float:right'> Jump to top </a><p>";
     return $OutBuf;
 }
 /**
  * \brief HTML output, returns HTML as string.
  */
 function HTMLout($Master, $uploadtree_pk1, $uploadtree_pk2, $in_uploadtree_pk1, $in_uploadtree_pk2, $filter, $TreeInfo1, $TreeInfo2)
 {
     /* Initialize */
     $FreezeText = _("Freeze Path");
     $unFreezeText = _("Frozen, Click to unfreeze");
     $OutBuf = '';
     /******* javascript functions ********/
     $OutBuf .= "\n<script language='javascript'>\n";
     /* function to replace this page specifying a new filter parameter */
     $OutBuf .= "function ChangeFilter(selectObj, utpk1, utpk2){";
     $OutBuf .= "  var selectidx = selectObj.selectedIndex;";
     $OutBuf .= "  var filter = selectObj.options[selectidx].value;";
     $OutBuf .= '  window.location.assign("?mod=' . $this->Name . '&item1="+utpk1+"&item2="+utpk2+"&filter=" + filter); ';
     $OutBuf .= "}";
     /* Freeze function (path list in banner)
         FreezeColNo is the ID of the column to freeze: 1 or 2
        Toggle Freeze button label: Freeze Path <-> Unfreeze Path
        Toggle Freeze button background color: white to light blue
        Toggle which paths are frozen: if path1 freezes, then unfreeze path2.
        Rewrite urls: eg &item1 ->  &Fitem1
        */
     $OutBuf .= "function Freeze(FreezeColNo) {";
     $OutBuf .= "var FreezeElt1 = document.getElementById('Freeze1');";
     $OutBuf .= "var FreezeElt2 = document.getElementById('Freeze2');";
     /* change the freeze labels to denote their new status */
     $OutBuf .= "if (FreezeColNo == '1')";
     $OutBuf .= "{";
     $OutBuf .= "if (FreezeElt1.innerHTML == '{$unFreezeText}') ";
     $OutBuf .= "{";
     $OutBuf .= "FreezeElt1.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt1.style.backgroundColor = 'white';";
     $OutBuf .= "}";
     $OutBuf .= "else {";
     $OutBuf .= "FreezeElt1.innerHTML = '{$unFreezeText}';";
     $OutBuf .= "FreezeElt1.style.backgroundColor = '#EAF7FB';";
     $OutBuf .= "FreezeElt2.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt2.style.backgroundColor = 'white';";
     $OutBuf .= "}";
     $OutBuf .= "}";
     $OutBuf .= "else {";
     $OutBuf .= "if (FreezeElt2.innerHTML == '{$unFreezeText}') ";
     $OutBuf .= "{";
     $OutBuf .= "FreezeElt2.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt2.style.backgroundColor = 'white';";
     $OutBuf .= "}";
     $OutBuf .= "else {";
     $OutBuf .= "FreezeElt1.innerHTML = '{$FreezeText}';";
     $OutBuf .= "FreezeElt1.style.backgroundColor = 'white';";
     $OutBuf .= "FreezeElt2.innerHTML = '{$unFreezeText}';";
     $OutBuf .= "FreezeElt2.style.backgroundColor = '#EAF7FB';";
     $OutBuf .= "}";
     $OutBuf .= "}";
     /* Alter the url to add freeze={column number}  */
     $OutBuf .= "var i=0;";
     $OutBuf .= "var linkid;";
     $OutBuf .= "var linkelt;";
     $OutBuf .= "var UpdateCol;";
     $OutBuf .= "if (FreezeColNo == 1) UpdateCol=2;else UpdateCol=1;";
     $OutBuf .= "var numlinks = document.links.length;";
     $OutBuf .= "for (i=0; i < numlinks; i++)";
     $OutBuf .= "{";
     $OutBuf .= "linkelt = document.links[i];";
     $OutBuf .= "if (linkelt.href.indexOf('col='+UpdateCol) >= 0)";
     $OutBuf .= "{";
     $OutBuf .= "linkelt.href = linkelt.href + '&freeze=' + FreezeColNo;";
     $OutBuf .= "}";
     $OutBuf .= "}";
     $OutBuf .= "}";
     $OutBuf .= "</script>\n";
     /******* END javascript functions  ********/
     /* Select list for filters */
     $SelectFilter = "<select name='diff_filter' id='diff_filter' onchange='ChangeFilter(this,{$uploadtree_pk1}, {$uploadtree_pk2})'>";
     $Selected = $filter == 'none' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='none'>0. Remove nothing";
     $Selected = $filter == 'samehash' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='samehash'>1. Remove duplicate (same hash) files";
     $Selected = $filter == 'samelic' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='samelic'>2. Remove duplicate files (different hash) with unchanged licenses";
     $Selected = $filter == 'samelicfuzzy' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='samelicfuzzy'>2b. Same as 2 but fuzzy match file names";
     $Selected = $filter == 'nolics' ? "selected" : "";
     $SelectFilter .= "<option {$Selected} value='nolics'>3. Same as 2b. but also remove files with no license";
     $SelectFilter .= "</select>";
     $StyleRt = "style='float:right'";
     $OutBuf .= "<a name='flist' href='#histo' {$StyleRt} > Jump to histogram </a><br>";
     /* Switch to bucket diff view */
     $text = _("Switch to bucket view");
     $BucketURL = Traceback_uri();
     $BucketURL .= "?mod=bucketsdiff&item1={$uploadtree_pk1}&item2={$uploadtree_pk2}";
     $OutBuf .= "<a href='{$BucketURL}' {$StyleRt} > {$text} </a> ";
     //    $TableStyle = "style='border-style:collapse;border:1px solid black'";
     $TableStyle = "";
     $OutBuf .= "<table border=0 id='dirlist' {$TableStyle}>";
     /* Select filter pulldown */
     $OutBuf .= "<tr><td colspan=5 align='center'>Filter: {$SelectFilter}<br>&nbsp;</td></tr>";
     /* File path */
     $OutBuf .= "<tr>";
     $Path1 = Dir2Path($uploadtree_pk1, $TreeInfo1['uploadtree_tablename']);
     $Path2 = Dir2Path($uploadtree_pk2, $TreeInfo2['uploadtree_tablename']);
     $OutBuf .= "<td colspan=2>";
     $OutBuf .= Dir2BrowseDiff($Path1, $Path2, $filter, 1, $this);
     $OutBuf .= "</td>";
     $OutBuf .= "<td {$this->ColumnSeparatorStyleL} colspan=3>";
     $OutBuf .= Dir2BrowseDiff($Path1, $Path2, $filter, 2, $this);
     $OutBuf .= "</td></tr>";
     /* File comparison table */
     $OutBuf .= $this->ItemComparisonRows($Master, $TreeInfo1['agent_pk'], $TreeInfo2['agent_pk']);
     /*  Separator row */
     $ColumnSeparatorStyleTop = "style='border:solid 0 #006600; border-top-width:2px; border-bottom-width:2px;'";
     $OutBuf .= "<tr>";
     $OutBuf .= "<td colspan=5 {$ColumnSeparatorStyleTop}>";
     $OutBuf .= "<a name='histo' href='#flist' style='float:right'> Jump to top </a>";
     $OutBuf .= "</a>";
     $OutBuf .= "</tr>";
     /* License histogram */
     $OutBuf .= "<tr>";
     $Tree1Hist = $this->UploadHist($uploadtree_pk1, $TreeInfo1);
     $OutBuf .= "<td colspan=2 valign='top' align='center'>{$Tree1Hist}</td>";
     $OutBuf .= "<td {$this->ColumnSeparatorStyleL}>&nbsp;</td>";
     $Tree2Hist = $this->UploadHist($uploadtree_pk2, $TreeInfo2);
     $OutBuf .= "<td colspan=2 valign='top' align='center'>{$Tree2Hist}</td>";
     $OutBuf .= "</tr></table>\n";
     $OutBuf .= "<a href='#flist' style='float:right'> Jump to top </a><p>";
     return $OutBuf;
 }