PageRenderTime 504ms CodeModel.GetById 43ms RepoModel.GetById 17ms app.codeStats 0ms

/fuel/core/vendor/phpquickprofiler/display.php

https://bitbucket.org/sriedel/iccrm-wip
PHP | 666 lines | 520 code | 77 blank | 69 comment | 76 complexity | e33e6067c06f13138352358dad3e6ec8 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /* - - - - - - - - - - - - - - - - - - - - - - - - - - -
  3. Title : HTML Output for Php Quick Profiler
  4. Author : Created by Ryan Campbell
  5. URL : https://github.com/particletree ( http://www.particletree.com no longer works )
  6. Last Updated : August 19, 2012 by Peter Schmalfeldt <manifestinteractive@gmail.com>
  7. Description : This is a horribly ugly function used to output
  8. the PQP HTML. This is great because it will just work in your project,
  9. but it is hard to maintain and read. See the README file for how to use
  10. the Smarty file we provided with PQP.
  11. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  12. function displayPqp($output) {
  13. $css = str_replace("\n", "", <<<CSS
  14. .pQp{width:100%;z-index:9999;text-align:center;position:fixed;bottom:0;}
  15. * html .pQp{position:absolute;}
  16. .pQp *{margin:0 ;padding:0;border:none;background:#222;}
  17. #pQp{margin:0 auto;width:85%;min-width:960px;background-color:#222;border:12px solid #000;border-bottom:none;font-family:"Lucida Grande",Tahoma,Arial,sans-serif;-webkit-border-top-left-radius:15px;-webkit-border-top-right-radius:15px;-moz-border-radius-topleft:15px;-moz-border-radius-topright:15px;border-top-left-radius:15px;border-top-right-radius:15px;}
  18. #pQp tbody {background:transparent;}
  19. #pQp .pqp-box h3{font-weight:normal;line-height:200px;padding:0 15px;color:#fff;}
  20. .pQp,.pQp td{color:#444}
  21. #pqp-metrics{background:#000;width:100%}
  22. #pqp-console,#pqp-speed,#pqp-queries,#pqp-memory,#pqp-files,#pqp-config,#pqp-session,#pqp-get,#pqp-post{background-color:#000;border-top:1px solid #ccc;height:200px;overflow:auto}
  23. .pQp .green{color:#588e13!important}
  24. .pQp .blue{color:#3769a0!important}
  25. .pQp .purple{color:#953fa1!important}
  26. .pQp .orange{color:#d28c00!important}
  27. .pQp .red{color:#b72f09!important}
  28. .pQp .yellow{color:#CDCF3A!important}
  29. .pQp .cyan{color:#3EC4D3!important}
  30. .pQp .pink{color:#FF7CAD!important}
  31. .pQp .flesh{color:#FFA46E!important}
  32. #pQp,#pqp-console,#pqp-speed,#pqp-queries,#pqp-memory,#pqp-files,#pqp-config,#pqp-session,#pqp-get,#pqp-post{display:none}
  33. .pQp .console,.pQp .speed,.pQp .queries,.pQp .memory,.pQp .files,.pQp .config,.pQp .session,.pQp .get,.pQp .post{display:block!important}
  34. .pQp .console #pqp-console,.pQp .speed #pqp-speed,.pQp .queries #pqp-queries,.pQp .memory #pqp-memory,.pQp .files #pqp-files,.pQp .config #pqp-config,.pQp .session #pqp-session,.pQp .get #pqp-get,.pQp .post #pqp-post{display:block}
  35. .console td.green,.speed td.blue,.queries td.purple,.memory td.orange,.files td.red,.config td.yellow,.session td.cyan,.get td.pink,.post td.flesh{background:#222!important;border-bottom:6px solid #fff!important;cursor:default!important}
  36. .tallDetails #pQp .pqp-box{height:500px}
  37. .tallDetails #pQp .pqp-box h3{line-height:500px}
  38. .hideDetails #pQp .pqp-box{display:none!important}
  39. .hideDetails #pqp-footer{border-top:1px dotted #444}
  40. .hideDetails #pQp #pqp-metrics td{height:50px;background:#000!important;border-bottom:none!important;cursor:default!important}
  41. #pQp var{font-size:18px;margin:0 0 2px 0}
  42. #pQp h4{font-size:10px}
  43. .hideDetails .heightToggle{visibility:hidden}
  44. #pqp-metrics td{height:80px;width:11%;text-align:center;cursor:pointer;border:1px solid #000;border-bottom:6px solid #444;-webkit-border-top-left-radius:15px;-moz-border-radius-topleft:15px;-webkit-border-top-right-radius:15px;-moz-border-radius-topright:15px;border-top-left-radius:15px;border-top-right-radius:15px;}
  45. #pqp-metrics td:hover{background:#222;border-bottom:6px solid #777}
  46. #pqp-metrics .green{border-left:none}
  47. #pqp-metrics .red{border-right:none}
  48. #pqp-metrics h4{text-shadow:#000 1px 1px 1px}
  49. .pqp-side var{text-shadow:#444 1px 1px 1px;background-color:transparent;}
  50. .pQp var{font-size:23px;font-weight:bold;font-style:normal;margin:0 0 3px 0;display:block; margin-top: 16px !important;}
  51. .pQp h4{font-size:12px;color:#fff;margin:0 0 4px 0}
  52. .pQp .main{width:80%; float: left;}
  53. .pQp .main table{width:100%;}
  54. *+html .pQp .main{width:78%}
  55. * html .pQp .main{width:77%}
  56. .pQp .main td{padding:7px 15px;text-align:left;border-left:1px solid #333;border-right:1px solid #333;border-bottom:1px dotted #323232;color:#FFF;}
  57. .pQp .main td,.pQp .main pre{font-family:Monaco,"Consolas","Lucida Console","Courier New",monospace;font-size:11px; background: #222;}
  58. .pQp .main td.alt{background:#111}
  59. .pQp .main tr.alt td{background:#2e2e2e;border-top:1px dotted #4e4e4e}
  60. .pQp .main tr.alt td.alt{background:#333}
  61. .pQp .main td b{float:right;font-weight:normal;color:#e6f387}
  62. .pQp .main td:hover{background:#2e2e2e}
  63. .pQp .pqp-side{float:left;width:20%;background:#000;color:#fff;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px;text-align:center}
  64. .pQp .pqp-side td{padding:10px 0 5px 0;background-color: #000; text-align: center !important}
  65. .pQp .pqp-side var{color:#fff;font-size:15px}
  66. .pQp .pqp-side h4{font-weight:normal;color:#f4fcca;font-size:11px;background-color:transparent;}
  67. #pqp-console .pqp-side td{padding:12px 0; text-align: center !important}
  68. #pqp-console .pqp-side td.alt1{background:#588e13;width:51%}
  69. #pqp-console .pqp-side td.alt2{background-color:#b72f09}
  70. #pqp-console .pqp-side td.alt3{background:#d28c00;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  71. #pqp-console .pqp-side td.alt4{background-color:#3769a0;border-bottom:1px solid #274b74}
  72. #pqp-console .main table{width:100%}
  73. #pqp-console td div{width:100%;overflow:hidden;background-color:transparent;}
  74. #pqp-console td.type{font-family:"Lucida Grande",Tahoma,Arial,sans-serif;text-align:center;text-transform:uppercase;font-size:9px;padding-top:9px;color:#f4fcca;vertical-align:top;width:40px}
  75. .pQp .log-log td.type{background:#47740d!important}
  76. .pQp .log-error td.type{background:#9b2700!important}
  77. .pQp .log-memory td.type{background:#d28c00!important}
  78. .pQp .log-speed td.type{background:#2b5481!important}
  79. .pQp .log-log pre{color:#999;background-color:transparent;}
  80. .pQp .log-log td:hover pre{color:#fff}
  81. .pQp .log-memory em,.pQp .log-speed em{float:left;font-style:normal;display:block;color:#fff;background-color:transparent;}
  82. .pQp .log-memory pre,.pQp .log-speed pre{float:right;white-space:normal;display:block;color:#fffd70;background-color:transparent;}
  83. #pqp-speed .pqp-side td {padding:12px 0;border-left:1px solid #1e3c5c;border-bottom:1px solid #1e3c5c;border-right:1px solid #1e3c5c;}
  84. #pqp-speed .pqp-side td.alt{background-color:#2b5481;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  85. #pqp-queries .pqp-side td{border-bottom:1px solid #662a6e;border-left:1px solid #662a6e;border-right:1px solid #662a6e}
  86. #pqp-queries .pqp-side td.alt{background-color:#7b3384;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  87. #pqp-queries .main b{float:none;background-color:transparent;}
  88. #pqp-queries .main em{display:block;padding:2px 0 0 0;font-style:normal;color:#aaa;background-color:transparent;}
  89. #pqp-memory .pqp-side td {padding:12px 0;background-color:#c48200;border-bottom:1px solid #865900;border-left:1px solid #865900;border-right:1px solid #865900}
  90. #pqp-memory .pqp-side td.alt{background-color:#ac7200;border-bottom:bone;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  91. #pqp-files .pqp-side td{border-bottom:1px solid #7c1f00;border-left:1px solid #7c1f00;border-right:1px solid #7c1f00}
  92. #pqp-files .pqp-side td.alt{background-color:#9b2700;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  93. #pqp-config .pqp-side td{border-bottom:1px solid #CDCF3A;border-left:1px solid #CDCF3A;border-right:1px solid #CDCF3A}
  94. #pqp-config .pqp-side td.alt{background-color:#CDCF3A;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  95. #pqp-session .pqp-side td{border-bottom:1px solid #3EC4D3;border-left:1px solid #3EC4D3;border-right:1px solid #3EC4D3}
  96. #pqp-session .pqp-side td.alt{background-color:#3EC4D3;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  97. #pqp-get .pqp-side td{border-bottom:1px solid #FF7CAD;border-left:1px solid #FF7CAD;border-right:1px solid #FF7CAD}
  98. #pqp-get .pqp-side td.alt{background-color:#FF7CAD;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  99. #pqp-post .pqp-side td{border-bottom:1px solid #FFA46E;border-left:1px solid #FFA46E;border-right:1px solid #FFA46E}
  100. #pqp-post .pqp-side td.alt{background-color:#FFA46E;border-bottom:none;border-left:none;-webkit-border-bottom-left-radius:30px;-moz-border-radius-bottomleft:30px;border-bottom-left-radius:30px}
  101. #pqp-footer{width:100%;background:#000;font-size:11px;border-top:1px solid #ccc}
  102. #pqp-footer td{padding:0!important;border:none!important}
  103. #pqp-footer strong{color:#fff}
  104. #pqp-footer a{color:#999;padding:5px 10px;text-decoration:none}
  105. #pqp-footer .credit{width:20%;text-align:left}
  106. #pqp-footer .credit a{line-height: 30px}
  107. #pqp-footer .pqp-actions{width:80%;text-align:right}
  108. #pqp-footer .pqp-actions a{float:right;width:auto}
  109. #pqp-footer a:hover,#pqp-footer a:hover strong,#pqp-footer a:hover b{background:#fff;color:black!important;text-decoration:none}
  110. #pqp-footer a:active,#pqp-footer a:active strong,#pqp-footer a:active b{background:#ecf488;color:green!important}
  111. #openProfiler { position: fixed; bottom: 0; right: 20px; }
  112. #openProfiler a { height:32px;text-align:center;width:100px;background-color:#222;border:2px solid #000;border-bottom:none;font-size:12px;font-family:"Lucida Grande",Tahoma,Arial,sans-serif;-webkit-border-top-left-radius:4px;-webkit-border-top-right-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;;border-top-right-radius:4px;color:#999;line-height: 32px;display:block;}
  113. #openProfiler a:hover{color:white;text-decoration:none}
  114. CSS
  115. );
  116. $return_output = '';
  117. $return_output .=<<<JAVASCRIPT
  118. <!-- JavaScript -->
  119. <script type="text/javascript">
  120. var PQP_DETAILS = true;
  121. var PQP_HEIGHT = "tall";
  122. addEvent(window, 'load', loadCSS);
  123. function changeTab(tab) {
  124. var pQp = document.getElementById('pQp');
  125. hideAllTabs();
  126. addClassName(pQp, tab, true);
  127. }
  128. function hideAllTabs() {
  129. var pQp = document.getElementById('pQp');
  130. removeClassName(pQp, 'console');
  131. removeClassName(pQp, 'speed');
  132. removeClassName(pQp, 'queries');
  133. removeClassName(pQp, 'memory');
  134. removeClassName(pQp, 'files');
  135. removeClassName(pQp, 'config');
  136. removeClassName(pQp, 'session');
  137. removeClassName(pQp, 'get');
  138. removeClassName(pQp, 'post');
  139. }
  140. function toggleDetails(){
  141. var container = document.getElementById('pqp-container');
  142. if(PQP_DETAILS){
  143. addClassName(container, 'hideDetails', true);
  144. PQP_DETAILS = false;
  145. }
  146. else{
  147. removeClassName(container, 'hideDetails');
  148. PQP_DETAILS = true;
  149. }
  150. }
  151. function toggleHeight(){
  152. var container = document.getElementById('pqp-container');
  153. if(PQP_HEIGHT == "short"){
  154. addClassName(container, 'tallDetails', true);
  155. PQP_HEIGHT = "tall";
  156. }
  157. else{
  158. removeClassName(container, 'tallDetails');
  159. PQP_HEIGHT = "short";
  160. }
  161. }
  162. function toggleBottom(){
  163. var container = document.getElementById('pqp-container');
  164. if (container.style.position == "inherit")
  165. {
  166. container.style.position="";
  167. }
  168. else
  169. {
  170. container.style.position="inherit";
  171. }
  172. }
  173. function loadCSS() {
  174. var sheet = document.createElement("style");
  175. sheet.setAttribute("type", "text/css");
  176. sheet.innerHTML = '$css';
  177. document.getElementsByTagName("head")[0].appendChild(sheet);
  178. }
  179. //http://www.bigbold.com/snippets/posts/show/2630
  180. function addClassName(objElement, strClass, blnMayAlreadyExist){
  181. if ( objElement.className ){
  182. var arrList = objElement.className.split(' ');
  183. if ( blnMayAlreadyExist ){
  184. var strClassUpper = strClass.toUpperCase();
  185. for ( var i = 0; i < arrList.length; i++ ){
  186. if ( arrList[i].toUpperCase() == strClassUpper ){
  187. arrList.splice(i, 1);
  188. i--;
  189. }
  190. }
  191. }
  192. arrList[arrList.length] = strClass;
  193. objElement.className = arrList.join(' ');
  194. }
  195. else{
  196. objElement.className = strClass;
  197. }
  198. }
  199. //http://www.bigbold.com/snippets/posts/show/2630
  200. function removeClassName(objElement, strClass){
  201. if ( objElement.className ){
  202. var arrList = objElement.className.split(' ');
  203. var strClassUpper = strClass.toUpperCase();
  204. for ( var i = 0; i < arrList.length; i++ ){
  205. if ( arrList[i].toUpperCase() == strClassUpper ){
  206. arrList.splice(i, 1);
  207. i--;
  208. }
  209. }
  210. objElement.className = arrList.join(' ');
  211. }
  212. }
  213. //http://ejohn.org/projects/flexible-javascript-events/
  214. function addEvent( obj, type, fn ) {
  215. if ( obj.attachEvent ) {
  216. obj["e"+type+fn] = fn;
  217. obj[type+fn] = function() { obj["e"+type+fn]( window.event ) };
  218. obj.attachEvent( "on"+type, obj[type+fn] );
  219. }
  220. else{
  221. obj.addEventListener( type, fn, false );
  222. }
  223. }
  224. function openProfiler()
  225. {
  226. document.getElementById("pqp-container").style.display = "block";
  227. document.getElementById("openProfiler").style.display = "none";
  228. }
  229. function closeProfiler()
  230. {
  231. document.getElementById("pqp-container").style.display = "none";
  232. document.getElementById("openProfiler").style.display = "block";
  233. }
  234. function preventDefault(e) {
  235. e = e || window.event;
  236. if (e.preventDefault)
  237. e.preventDefault();
  238. e.returnValue = false;
  239. }
  240. window.onload = function(){
  241. document.getElementById('pqp-console').onmousewheel = function(e){
  242. document.getElementById('pqp-console').scrollTop -= e.wheelDeltaY;
  243. preventDefault(e);
  244. }
  245. document.getElementById('pqp-speed').onmousewheel = function(e){
  246. document.getElementById('pqp-speed').scrollTop -= e.wheelDeltaY;
  247. preventDefault(e);
  248. }
  249. document.getElementById('pqp-queries').onmousewheel = function(e){
  250. document.getElementById('pqp-queries').scrollTop -= e.wheelDeltaY;
  251. preventDefault(e);
  252. }
  253. document.getElementById('pqp-memory').onmousewheel = function(e){
  254. document.getElementById('pqp-memory').scrollTop -= e.wheelDeltaY;
  255. preventDefault(e);
  256. }
  257. document.getElementById('pqp-files').onmousewheel = function(e){
  258. document.getElementById('pqp-files').scrollTop -= e.wheelDeltaY;
  259. preventDefault(e);
  260. }
  261. document.getElementById('pqp-config').onmousewheel = function(e){
  262. document.getElementById('pqp-config').scrollTop -= e.wheelDeltaY;
  263. preventDefault(e);
  264. }
  265. document.getElementById('pqp-session').onmousewheel = function(e){
  266. document.getElementById('pqp-session').scrollTop -= e.wheelDeltaY;
  267. preventDefault(e);
  268. }
  269. document.getElementById('pqp-get').onmousewheel = function(e){
  270. document.getElementById('pqp-get').scrollTop -= e.wheelDeltaY;
  271. preventDefault(e);
  272. }
  273. document.getElementById('pqp-post').onmousewheel = function(e){
  274. document.getElementById('pqp-post').scrollTop -= e.wheelDeltaY;
  275. preventDefault(e);
  276. }
  277. toggleBottom();
  278. }
  279. </script>
  280. JAVASCRIPT;
  281. $return_output .='<div style="clear:both;"></div><div id="pqp-container" class="pQp tallDetails" style="display:none;position:inherit;">';
  282. $logCount = count($output['logs']['console']);
  283. $fileCount = count($output['files']);
  284. $memoryUsed = $output['memoryTotals']['used'];
  285. $queryCount = $output['queryTotals']['count'];
  286. $speedTotal = $output['speedTotals']['total'];
  287. $printarray = function($items, $depth, &$class, &$count) use(&$printarray)
  288. {
  289. $output = '';
  290. foreach($items as $item => $value) {
  291. $count++;
  292. $output .='<tr><td class="'.$class.'">';
  293. if (is_bool($value))
  294. {
  295. $output .= '<b>'.($value?'true':'false').'</b>';
  296. }
  297. elseif (is_null($value))
  298. {
  299. $output .= '<b>null</b>';
  300. }
  301. elseif( ! is_array($value) AND ! is_object($value))
  302. {
  303. $output .= '<b>'.\Security::htmlentities($value).'</b>';
  304. }
  305. $output .= str_repeat('&rsaquo;&nbsp;', $depth).$item.'</td></tr>';
  306. if($class == '') $class = 'alt'; else $class = '';
  307. is_array($value) and $output .= $printarray($value, $depth + 1, $class, $count);
  308. is_object($value) and $output .= $printarray($value, $depth + 1, $class, $count);
  309. }
  310. return $output;
  311. };
  312. $class = '';
  313. $configCount = 0;
  314. $output['configItems'] = $printarray(\Config::$items, 0, $class, $configCount);
  315. $class = '';
  316. $sessionCount = 0;
  317. $output['sessionItems'] = $printarray(\Session::get(null), 0, $class, $sessionCount);
  318. $class = '';
  319. $getCount = 0;
  320. $output['getItems'] = $printarray(\Input::get(), 0, $class, $getCount);
  321. $class = '';
  322. $postCount = 0;
  323. $output['postItems'] = $printarray(\Input::post(), 0, $class, $postCount);
  324. $return_output .=<<<PQPTABS
  325. <div id="pQp" class="console">
  326. <table id="pqp-metrics" cellspacing="0">
  327. <tr>
  328. <td class="green" onclick="changeTab('console');">
  329. <var>$logCount</var>
  330. <h4>Console</h4>
  331. </td>
  332. <td class="blue" onclick="changeTab('speed');">
  333. <var>$speedTotal</var>
  334. <h4>Load Time</h4>
  335. </td>
  336. <td class="purple" onclick="changeTab('queries');">
  337. <var>$queryCount Queries</var>
  338. <h4>Database</h4>
  339. </td>
  340. <td class="orange" onclick="changeTab('memory');">
  341. <var>$memoryUsed</var>
  342. <h4>Memory Used</h4>
  343. </td>
  344. <td class="red" onclick="changeTab('files');">
  345. <var>{$fileCount} Files</var>
  346. <h4>Included</h4>
  347. </td>
  348. <td class="yellow" onclick="changeTab('config');">
  349. <var>{$configCount} Config</var>
  350. <h4>items loaded</h4>
  351. </td>
  352. <td class="cyan" onclick="changeTab('session');">
  353. <var>{$sessionCount} Session</var>
  354. <h4>vars loaded</h4>
  355. </td>
  356. <td class="pink" onclick="changeTab('get');">
  357. <var>{$getCount} GET</var>
  358. <h4>vars loaded</h4>
  359. </td>
  360. <td class="flesh" onclick="changeTab('post');">
  361. <var>{$postCount} POST</var>
  362. <h4>vars loaded</h4>
  363. </td>
  364. </tr>
  365. </table>
  366. PQPTABS;
  367. $return_output .='<div id="pqp-console" class="pqp-box">';
  368. if($logCount == 0) {
  369. $return_output .='<h3>This panel has no log items.</h3>';
  370. }
  371. else {
  372. $return_output .='<table class="pqp-side" cellspacing="0">
  373. <tr>
  374. <td class="alt1"><var>'.$output['logs']['logCount'].'</var><h4>Logs</h4></td>
  375. <td class="alt2"><var>'.$output['logs']['errorCount'].'</var> <h4>Errors</h4></td>
  376. </tr>
  377. <tr>
  378. <td class="alt3"><var>'.$output['logs']['memoryCount'].'</var> <h4>Memory</h4></td>
  379. <td class="alt4"><var>'.$output['logs']['speedCount'].'</var> <h4>Speed</h4></td>
  380. </tr>
  381. </table>
  382. <div class="main"><table cellspacing="0">';
  383. $class = '';
  384. foreach($output['logs']['console'] as $log) {
  385. $return_output .='<tr class="log-'.$log['type'].'">
  386. <td class="type">'.$log['type'].'</td>
  387. <td class="'.$class.'">';
  388. if($log['type'] == 'log') {
  389. $return_output .='<div><pre>'.$log['data'].'</pre></div>';
  390. }
  391. elseif($log['type'] == 'memory') {
  392. $return_output .='<div><pre>'.$log['data'].'</pre> <em>'.$log['dataType'].'</em>: '.$log['name'].' </div>';
  393. }
  394. elseif($log['type'] == 'speed') {
  395. $return_output .='<div><pre>'.$log['data'].'</pre> <em>'.$log['name'].'</em></div>';
  396. }
  397. elseif($log['type'] == 'error') {
  398. $return_output .='<div><em>Line '.$log['line'].'</em> : '.$log['data'].' <pre>'.$log['file'].'</pre></div>';
  399. }
  400. $return_output .='</td></tr>';
  401. if($class == '') $class = 'alt';
  402. else $class = '';
  403. }
  404. $return_output .='</table></div>';
  405. }
  406. $return_output .='</div>';
  407. $return_output .='<div id="pqp-speed" class="pqp-box">';
  408. if($output['logs']['speedCount'] == 0) {
  409. $return_output .='<h3>This panel has no log items.</h3>';
  410. }
  411. else {
  412. $return_output .='<table class="pqp-side" cellspacing="0">
  413. <tr><td><var>'.$output['speedTotals']['total'].'</var><h4>Load Time</h4></td></tr>
  414. <tr><td class="alt"><var>'.$output['speedTotals']['allowed'].' s</var> <h4>Max Execution Time</h4></td></tr>
  415. </table>
  416. <div class="main"><table cellspacing="0">';
  417. $class = '';
  418. foreach($output['logs']['console'] as $log) {
  419. if($log['type'] == 'speed') {
  420. $return_output .='<tr class="log-'.$log['type'].'">
  421. <td class="'.$class.'">';
  422. $return_output .='<div><pre>'.$log['data'].'</pre> <em>'.$log['name'].'</em></div>';
  423. $return_output .='</td></tr>';
  424. if($class == '') $class = 'alt';
  425. else $class = '';
  426. }
  427. }
  428. $return_output .='</table></div>';
  429. }
  430. $return_output .='</div>';
  431. $return_output .='<div id="pqp-queries" class="pqp-box">';
  432. if($output['queryTotals']['count'] == 0) {
  433. $return_output .='<h3>This panel has no log items.</h3>';
  434. }
  435. else {
  436. $return_output .='<table class="pqp-side" cellspacing="0">
  437. <tr><td><var>'.$output['queryTotals']['count'].'</var><h4>Total Queries</h4></td></tr>
  438. <tr><td><var>'.$output['queryTotals']['time'].'</var> <h4>Total Time</h4></td></tr>
  439. <tr><td class="alt"><var>'.$output['queryTotals']['duplicates'].'</var> <h4>Duplicates</h4></td></tr>
  440. </table>
  441. <div class="main"><table cellspacing="0">';
  442. $class = '';
  443. foreach($output['queries'] as $query) {
  444. $return_output .='<tr>
  445. <td class="'.$class.'">'.$query['sql'];
  446. $return_output .='<em>';
  447. if(isset($query['explain'])) {
  448. isset($query['explain']['possible_keys']) and $return_output .='Possible keys: <b>'.$query['explain']['possible_keys'].'</b> &middot;';
  449. isset($query['explain']['key']) and $return_output .='Key Used: <b>'.$query['explain']['key'].'</b> &middot;';
  450. isset($query['explain']['type']) and $return_output .='Type: <b>'.$query['explain']['type'].'</b> &middot;';
  451. isset($query['explain']['type']) and $return_output .='Rows: <b>'.$query['explain']['rows'].'</b> &middot;';
  452. }
  453. $return_output .='Speed: <b>'.$query['time'].'</b>';
  454. $query['duplicate'] and $return_output .=' &middot; <b>DUPLICATE</b>';
  455. $return_output .='</em></td></tr>';
  456. if($class == '') $class = 'alt';
  457. else $class = '';
  458. }
  459. $return_output .='</table></div>';
  460. }
  461. $return_output .='</div>';
  462. $return_output .='<div id="pqp-memory" class="pqp-box">';
  463. if($output['logs']['memoryCount'] == 0) {
  464. $return_output .='<h3>This panel has no log items.</h3>';
  465. }
  466. else {
  467. $return_output .='<table class="pqp-side" cellspacing="0">
  468. <tr><td><var>'.$output['memoryTotals']['used'].'</var><h4>Used Memory</h4></td></tr>
  469. <tr><td class="alt"><var>'.$output['memoryTotals']['total'].'</var> <h4>Total Available</h4></td></tr>
  470. </table>
  471. <div class="main"><table cellspacing="0">';
  472. $class = '';
  473. foreach($output['logs']['console'] as $log) {
  474. if($log['type'] == 'memory') {
  475. $return_output .='<tr class="log-'.$log['type'].'">';
  476. $return_output .='<td class="'.$class.'"><b>'.$log['data'].'</b> <em>'.$log['dataType'].'</em>: '.$log['name'].'</td>';
  477. $return_output .='</tr>';
  478. if($class == '') $class = 'alt';
  479. else $class = '';
  480. }
  481. }
  482. $return_output .='</table></div>';
  483. }
  484. $return_output .='</div>';
  485. $return_output .='<div id="pqp-files" class="pqp-box">';
  486. if($output['fileTotals']['count'] + $output['pathTotals']['count'] == 0) {
  487. $return_output .='<h3>This panel has no log items.</h3>';
  488. }
  489. else {
  490. $return_output .='<table class="pqp-side" cellspacing="0">
  491. <tr><td><var>'.count($output['paths']).'</var><h4>Finder Paths</h4></td></tr>
  492. <tr><td><var>'.$output['fileTotals']['count'].'</var><h4>Total Files</h4></td></tr>
  493. <tr><td><var>'.$output['fileTotals']['size'].'</var> <h4>Total Size</h4></td></tr>
  494. <tr><td class="alt"><var>'.$output['fileTotals']['largest'].'</var> <h4>Largest</h4></td></tr>
  495. </table>
  496. <div class="main"><table cellspacing="0">';
  497. $class ='';
  498. $return_output .='<tr><td><strong style="font-size:120%;">Finder paths:</strong></td></tr>';
  499. foreach($output['paths'] as $path) {
  500. $return_output .='<tr><td class="'.$class.'">'.$path.'</td></tr>';
  501. if($class == '') $class = 'alt';
  502. else $class = '';
  503. }
  504. $return_output .='<tr><td><strong style="font-size:120%;">Loaded files:</strong></td></tr>';
  505. foreach($output['files'] as $file) {
  506. $return_output .='<tr><td class="'.$class.'"><b>'.$file['size'].'</b> '.$file['name'].'</td></tr>';
  507. if($class == '') $class = 'alt';
  508. else $class = '';
  509. }
  510. $return_output .='</table></div>';
  511. }
  512. $return_output .='</div>';
  513. $return_output .='<div id="pqp-config" class="pqp-box">';
  514. if($configCount == 0) {
  515. $return_output .='<h3>This panel has no config items.</h3>';
  516. }
  517. else {
  518. $return_output .='<table class="pqp-side" cellspacing="0">
  519. <tr><td class="alt"><var>'.$configCount.'</var> <h4>Configuration items</h4></td></tr>
  520. </table>
  521. <div class="main"><table cellspacing="0">';
  522. $return_output .= $output['configItems'];
  523. $return_output .='</table></div>';
  524. }
  525. $return_output .='</div>';
  526. $return_output .='<div id="pqp-session" class="pqp-box">';
  527. if($sessionCount == 0) {
  528. $return_output .='<h3>This panel has no session variables.</h3>';
  529. }
  530. else {
  531. $return_output .='<table class="pqp-side" cellspacing="0">
  532. <tr><td class="alt"><var>'.$sessionCount.'</var> <h4>Session variables</h4></td></tr>
  533. </table>
  534. <div class="main"><table cellspacing="0">';
  535. $return_output .= $output['sessionItems'];
  536. $return_output .='</table></div>';
  537. }
  538. $return_output .='</div>';
  539. $return_output .='<div id="pqp-get" class="pqp-box">';
  540. if($getCount == 0) {
  541. $return_output .='<h3>This panel has no GET variables.</h3>';
  542. }
  543. else {
  544. $return_output .='<table class="pqp-side" cellspacing="0">
  545. <tr><td class="alt"><var>'.$getCount.'</var> <h4>GET variables</h4></td></tr>
  546. </table>
  547. <div class="main"><table cellspacing="0">';
  548. $return_output .= $output['getItems'];
  549. $return_output .='</table></div>';
  550. }
  551. $return_output .='</div>';
  552. $return_output .='<div id="pqp-post" class="pqp-box">';
  553. if($postCount == 0) {
  554. $return_output .='<h3>This panel has no POST variables.</h3>';
  555. }
  556. else {
  557. $return_output .='<table class="pqp-side" cellspacing="0">
  558. <tr><td class="alt"><var>'.$postCount.'</var> <h4>POST variables</h4></td></tr>
  559. </table>
  560. <div class="main"><table cellspacing="0">';
  561. $return_output .= $output['postItems'];
  562. $return_output .='</table></div>';
  563. }
  564. $return_output .='</div>';
  565. $return_output .=<<<FOOTER
  566. <table id="pqp-footer" cellspacing="0">
  567. <tr>
  568. <td class="credit">
  569. <a href="https://github.com/particletree" target="_blank">
  570. Based on
  571. <strong>PHP</strong>
  572. <b class="green">Q</b><b class="blue">u</b><b class="purple">i</b><b class="orange">c</b><b class="red">k</b>
  573. Profiler</a></td>
  574. <td class="pqp-actions">
  575. <a class="closeProfiler" href="#" onclick="closeProfiler();return false" title="Close Code Profiler">Close</a>
  576. <a class="heightToggle" href="#" onclick="toggleHeight();return false" title="Toggle Height">Height</a>
  577. <a class="bottomToggle" href="#" onclick="toggleBottom();return false" title="Toggle Bottom">Bottom</a>
  578. </td>
  579. </tr>
  580. </table>
  581. FOOTER;
  582. $return_output .='</div></div><div id="openProfiler"><a href="#" onclick="openProfiler();return false" title="Open Code Profiler">Code Profiler</a></div>';
  583. return $return_output;
  584. }
  585. ?>