Odyssey
txtbanklog.prg
1 <?php
2  /* **
3  Purpose: This script will read in the cellalert.log file.. It will then parse the
4  file and spit the contents out back to the web...
5 
6 
7  ** */
8 
9  $monLibrary= dirname(__FILE__) . "/../library";
10  $sharedLibrary= dirname(__FILE__) . "/../../shared/library";
11  require_once("$monLibrary/cu_top.i");
12  require_once("$monLibrary/ck_hticket.i");
13  require_once("$sharedLibrary/cu_flagconst.i");
14 
15 
16  if (!CheckPerm($link, $Hu, basename($_SERVER['SCRIPT_NAME']), $_SERVER['REMOTE_ADDR'])) {
17  // ** Permissions failed
18  // ** redirect to new page
19  header("Location: /hcuadm/hcu_noperm.prg");
20  exit;
21  }
22 
23 $dms_ok=array('txtSearch' => 'array', 'selSearch'=>'array','selSearch'=>'array','txtSort'=>'digits','nbrPrevWks'=>'array');
24 
25 dms_import($dms_ok);
26 
27 $txtSort = isset($txtSort) ? $txtSort : '';
28 
29  // ** SETUP THE COLUMN CONSTANTS
30 
31  $COL_DATE = 0;
32  $COL_CUCODE = 1;
33  $COL_FROM_CELL_PHONE = 2;
34  $COL_CU_EMAIL = 3;
35  $COL_CELL_CMD = 4;
36  $COL_RESPONSE = 5;
37  $COL_RESPONSE_ERROR = 6;
38  $COL_MEMBER_NBR = 7;
39  $COL_PIN = 8;
40  $COL_MAIN_ACCT_SMS = 9;
41  $COL_MAIN_ACCT_NBR = 10;
42  $COL_MAIN_ACCT_SFX = 11;
43  $COL_2ND_ACCT_SMS = 12;
44  $COL_2ND_ACCT_NBR = 13;
45  $COL_2ND_ACCT_SFX = 14;
46  $COL_CELL_NBR = 15;
47  $COL_CUCODE_DB = 16;
48  $COL_TRANS_CODE = 17;
49  $COL_CHK_NBR_SEARCH = 18;
50  $COL_NEW_PIN = 19;
51  $COL_HELP_CODE = 20;
52  $COL_CELL_PROVIDER = 21;
53  $COL_MSG_SUBJ = 22;
54  $COL_MSG_TO = 23;
55  $COL_MSG_FROM = 24;
56  $COL_HIST_LIMIT = 25;
57  $COL_SORT_DATE = 26;
58 
59  $col_sort = 0;
60 
61  $log_list = Array();
62 
63 
64  $LOGFILE = "cellalert.log"; // ** This is the base filename for TxtBanking logs... There may be subsequent .1, .2 .3....files
65  $LOGFILEDIR = "/var/log/smslog/"; // ** THIS IS THE Log File Directory for the Home Banking TxtBanking Log -- Must end with /
66 
67 // if (is_readable($LOGFILE)) {
68 //
69 // $log_hndl = fopen($LOGFILE, "r");
70 // } else {
71 // // ** STOP HERE
72 // }
73 
74  $log_input = "";
75  // *** ONLY LOAD THE data and perform the search.... IF.. the user has already pressed 'search'
76  //if (isset($_POST['btnSearch'])) {
77  // ** Test the existance of selSearch, because the button only gets a value if it was used to submit
78  // the form.. Which didn't work if the user used the sort order links
79  if (isset($_POST['selSearch'])) {
80  // LOOP THROUGH THE FILE reading each row, and parse the information
81 
82  // *** LOAD LIMIT
83  $load_limit = 500;
84 
85 
86  // ** Current Week File Number {0,13}
87  $LoadPrevWeekFileNumber = 0;
88  $EOFonLastFileToLoad = false;
89  $LoadNextFile = true;
90 
91 
92  while (!$EOFonLastFileToLoad) {
93  // ** NOW TRY AND GO TO NEXT FILE
94  // ** Try and open the next in sequence
95  while ($LoadNextFile) {
96  if ($LoadPrevWeekFileNumber <= intval($_POST['nbrPrevWks'])) {
97  // ** We have not reached the end yet... try and load the next
98  $FileNameToLoad = $LOGFILEDIR . $LOGFILE . ($LoadPrevWeekFileNumber > 0 ? ".{$LoadPrevWeekFileNumber}" : "");
99  if (is_readable($FileNameToLoad)) {
100  // ** OPEN THE NEW FILE
101  $log_hndl = fopen($FileNameToLoad, "r");
102  $LoadNextFile = false;
103  }
104 
105  } else {
106  $EOFonLastFileToLoad = true;
107  $LoadNextFile = false;
108  }
109  $LoadPrevWeekFileNumber++;
110  }
111 
112  if (!$EOFonLastFileToLoad) {
113  if ($log_hndl) {
114  $temp_list = Array();
115  // $load_limit--; // ** Uncomment for limited loading -- for debugging and testing
116  $log_input = fgets($log_hndl, 4096);
117 
118  // ** Now parse the line and put it in the log_list array
119 
120  //$log_list[] = explode(",", $log_input);
121  // $log_list[] = explode("','", $log_input);
122  $temp_list = explode("','", $log_input);
123  // ** Remove the ' from the beginning of date
124  $temp_list[$COL_DATE] = substr($temp_list[$COL_DATE], 1);
125  // ** Make a sort order friendly date -- the current field works great for matching years, but not so much for others
126  $temp_list[$COL_SORT_DATE] = substr($temp_list[$COL_DATE], 6, 4) .
127  substr($temp_list[$COL_DATE], 0, 2) .
128  substr($temp_list[$COL_DATE], 3, 2) .
129  substr($temp_list[$COL_DATE], 10);
130 
131 
132  if ($log_input != "") {
133  // ** now determine if the user is searching for something....
134  if (
135  (isset($_POST['selSearch'][0]) && $_POST['selSearch'][0] != '')
136  || (isset($_POST['selSearch'][1]) && $_POST['selSearch'][1] != '')
137  || (isset($_POST['selSearch'][2]) && $_POST['selSearch'][2] != '')
138  ) {
139 
140  // ** Now do the search
141  $txt_match = Array(true, true, true);
142 
143  // ** Check Match --LOOP {0 to 2} --
144  for ($SearchIDX = 0; $SearchIDX <=2; $SearchIDX++) {
145  if (isset($_POST['selSearch'][$SearchIDX]) && $_POST['selSearch'][$SearchIDX] != '') {
146  // ** Check the value -- If BLANK -- Auto False
147  if (trim($_POST['txtSearch'][$SearchIDX]) == "") {
148  $txt_match[$SearchIDX] = false;
149  } else {
150  // Now check the value exists for this record
151  $txt_match[$SearchIDX] = ($_POST['selSearch'][$SearchIDX] == '' || strpos(strtolower($temp_list[intval($_POST['selSearch'][$SearchIDX])]), strtolower($_POST['txtSearch'][$SearchIDX])) !== False);
152  }
153  }
154  }
155 
156  if ( $txt_match[0] && $txt_match[1] && $txt_match[2]) {
157  // ** FOUND IT ---
158  $log_list[] = $temp_list;
159  }
160  } else {
161  // ** No searching -- Auto add
162  $log_list[] = $temp_list;
163  }
164  }
165  // ** HERE I want to check to see where i am at.. Am I at the LAST EOF for the Last file to load... If so then STOP
166  // * Otherwise continue.. If we are on the
167 
168  if (feof($log_hndl)) {
169  /// ** READ ALL OF THE CURRENT FILE
170  // ** CLOSE THE CURRENT FILE
171  fclose($log_hndl);
172 
173  if ($LoadPrevWeekFileNumber <= intval($_POST['nbrPrevWks'])) {
174  $LoadNextFile = true;
175  } else {
176  $LoadNextFile = true;
177  $EOFonLoadFileToLoad = true;
178  }
179 
180  }
181  }
182  }
183 
184  }
185  if (isset($log_hndl)) {
186  // * NOT SURE.... fclose ($log_hndl);
187  }
188  }
189 
190  // ** NOW see if it should be sorted --
191  if (isset($txtSort) && $txtSort != '') {
192  $col_sort = intval($txtSort);
193  } else {
194  // ** DEFAULT SORT is by DATE
195  $col_sort = 26;
196  }
197 
198 
199 
200  /*
201  * Orginally written to use uksort, however, the way I was accessing the original array from the user defined function
202  * caused a php warning each time. So I decided to use a custom function for sorting, following a shell sort algorithm
203  */
204  $log_list = shellSort($log_list, $col_sort);
205 
206  cu_header('View SMS Activity');
207 
208  $preFill = Array();
209 
210  if (isset($selSearch)) {
211  if (HCU_array_key_value(0, $selSearch) != '') {
212  $preFill['sel'][0][intval($selSearch[0])] = "SELECTED";
213  $preFill['txt'][0] = $txtSearch[0];
214  }
215  if (HCU_array_key_value(1, $selSearch) != '') {
216  $preFill['sel'][1][intval($selSearch[1])] = "SELECTED";
217  $preFill['txt'][1] = $txtSearch[1];
218  }
219  if (HCU_array_key_value(2, $selSearch) != '') {
220  $preFill['sel'][2][intval($selSearch[2])] = "SELECTED";
221  $preFill['txt'][2] = $txtSearch[2];
222  }
223  $preFill['PrevWks'][intval($_POST['nbrPrevWks'])] = "SELECTED";
224  }
225 
226  print <<< print_html
227  <form name='cellview' action='{$_SERVER['PHP_SELF']}' method='post'>
228  <table class='' border=0 width=800 cellpadding=0 cellspacing=0>
229  <tr>
230  <td CLASS='ulc'>
231  <DIV CLASS='empty'><br></DIV>
232  </td>
233  <td CLASS='matcenter'>
234  <DIV CLASS='bartitle'>View SMS Activity</DIV>
235  </td>
236  <td CLASS='urc'>
237  <DIV CLASS='empty'><br></DIV>
238  </td>
239  </tr>
240  <tr>
241  <td CLASS='matleft'>
242  <DIV CLASS='empty'><br></DIV>
243  </td>
244  <td class='matcenter'>
245  <table width='100%' border=0 cellspacing=0 cellpadding=1>
246  <tr>
247  <td valign='top' class='dtl' colspan='7'>
248  This report will help you view the contents of the SMS log file.<br>
249  You may query the log file based on the parameters below.<br>
250  <br>
251  </td>
252  </tr>
253  <tr>
254  <td valign='top' class='dtl' colspan='1'>
255  Search for
256  </td>
257  <td class='dtl' colspan='3'>
258 print_html;
259  print "<nobr>
260  <select name='selSearch[]'>
261  <option value=''>No Search</option>
262  <option value='0' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(0, $preFill['sel'][0]) ? $preFill['sel'][0][0] : '') .">Date</option>
263  <option value='1' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(1, $preFill['sel'][0]) ? $preFill['sel'][0][1] : '') .">CU Code</option>
264  <option value='7' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(7, $preFill['sel'][0]) ? $preFill['sel'][0][7] : '') .">Member</option>
265  <option value='2' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(2, $preFill['sel'][0]) ? $preFill['sel'][0][2] : '') .">Cell Phone</option>
266  <option value='17' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(17, $preFill['sel'][0]) ? $preFill['sel'][0][17] : '') .">Trans Code</option>
267  <option value='4' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(4, $preFill['sel'][0]) ? $preFill['sel'][0][4] : '') .">Request</option>
268  <option value='5' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(5, $preFill['sel'][0]) ? $preFill['sel'][0][5] : '') .">Response</option>
269  <option value='6' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(0, $preFill['sel']) && HCU_array_key_value(6, $preFill['sel'][0]) ? $preFill['sel'][0][6] : '') .">Response Error</option>
270  </select>
271  matching
272  <input type='text' name='txtSearch[]' value='". (HCU_array_key_value('txt', $preFill) ? (HCU_array_key_value(0, $preFill['txt']) ? $preFill['txt'][0] : '') : '') ."' maxlength=30 size=20>
273  </nobr>
274  <br>
275  <nobr>
276  <select name='selSearch[]'>
277  <option value=''>No Search</option>
278  <option value='0' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(0, $preFill['sel'][1]) ? $preFill['sel'][1][0] : '') .">Date</option>
279  <option value='1' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(1, $preFill['sel'][1]) ? $preFill['sel'][1][1] : '') .">CU Code</option>
280  <option value='7' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(7, $preFill['sel'][1]) ? $preFill['sel'][1][7] : '') .">Member</option>
281  <option value='2' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(2, $preFill['sel'][1]) ? $preFill['sel'][1][2] : '') .">Cell Phone</option>
282  <option value='17' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(17, $preFill['sel'][1]) ? $preFill['sel'][1][17] : '') .">Trans Code</option>
283  <option value='4' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(4, $preFill['sel'][1]) ? $preFill['sel'][1][4] : '') .">Request</option>
284  <option value='5' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(5, $preFill['sel'][1]) ? $preFill['sel'][1][5] : '') .">Response</option>
285  <option value='6' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(1, $preFill['sel']) && HCU_array_key_value(6, $preFill['sel'][1]) ? $preFill['sel'][1][6] : '') .">Response Error</option>
286  </select>
287  matching
288  <input type='text' name='txtSearch[]' value='". (HCU_array_key_value('txt', $preFill) ? (HCU_array_key_value(1, $preFill['txt']) ? $preFill['txt'][1] : '') : '') ."' maxlength=30 size=20>
289  </nobr>
290  <br>
291  <nobr>
292  <select name='selSearch[]'>
293  <option value=''>No Search</option>
294  <option value='0' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(0, $preFill['sel'][2]) ? $preFill['sel'][2][0] : '') .">Date</option>
295  <option value='1' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(1, $preFill['sel'][2]) ? $preFill['sel'][2][1] : '') .">CU Code</option>
296  <option value='7' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(7, $preFill['sel'][2]) ? $preFill['sel'][2][7] : '') .">Member</option>
297  <option value='2' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(2, $preFill['sel'][2]) ? $preFill['sel'][2][2] : '') .">Cell Phone</option>
298  <option value='17' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(17, $preFill['sel'][2]) ? $preFill['sel'][2][17] : '') .">Trans Code</option>
299  <option value='4' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(4, $preFill['sel'][2]) ? $preFill['sel'][2][4] : '') .">Request</option>
300  <option value='5' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(5, $preFill['sel'][2]) ? $preFill['sel'][2][5] : '') .">Response</option>
301  <option value='6' ". (HCU_array_key_value('sel', $preFill) && HCU_array_key_value(2, $preFill['sel']) && HCU_array_key_value(6, $preFill['sel'][2]) ? $preFill['sel'][2][6] : '') .">Response Error</option>
302  </select>
303  matching
304  <input type='text' name='txtSearch[]' value='". (HCU_array_key_value('txt', $preFill) ? (HCU_array_key_value(2, $preFill['txt']) ? $preFill['txt'][2] : '') : '') ."' maxlength=30 size=20>
305  </nobr>
306  </td>
307  <td valign='bottom' class='dtl' colspan='3'>
308  &nbsp;
309  </td>
310  </tr>
311  <tr>
312  <td valign='' class='dtlr' colspan='2'>
313  # of Prev Weeks
314  </td>
315  <td class='dtl' colspan='2'>
316  <select name=\"nbrPrevWks\">
317  <option value='0' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(0, $preFill['PrevWks']) ? $preFill['PrevWks'][0] : '') : '') .">Current Week</option>
318  <option value='1' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(1, $preFill['PrevWks']) ? $preFill['PrevWks'][1] : '') : '') .">Current +1 Previous Week</option>
319  <option value='2' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(2, $preFill['PrevWks']) ? $preFill['PrevWks'][2] : '') : '') .">Current +2 Previous Weeks</option
320  <option value='3' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(3, $preFill['PrevWks']) ? $preFill['PrevWks'][3] : '') : '') .">Current +3 Previous Weeks</option>
321  <option value='4' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(4, $preFill['PrevWks']) ? $preFill['PrevWks'][4] : '') : '') .">Current +4 Previous Weeks</option>
322  <option value='5' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(5, $preFill['PrevWks']) ? $preFill['PrevWks'][5] : '') : '') .">Current +5 Previous Weeks</option>
323  <option value='6' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(6, $preFill['PrevWks']) ? $preFill['PrevWks'][6] : '') : '') .">Current +6 Previous Weeks</option>
324  <option value='7' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(7, $preFill['PrevWks']) ? $preFill['PrevWks'][7] : '') : '') .">Current +7 Previous Weeks</option>
325  <option value='8' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(8, $preFill['PrevWks']) ? $preFill['PrevWks'][8] : '') : '') ."Current +8 Previous Weeks</option>
326  <option value='9' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(9, $preFill['PrevWks']) ? $preFill['PrevWks'][9] : '') : '') .">Current +9 Previous Weeks</option>
327  <option value='10' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(10, $preFill['PrevWks']) ? $preFill['PrevWks'][10] : '') : '') .">Current +10 Previous Weeks</option>
328  <option value='11' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(11, $preFill['PrevWks']) ? $preFill['PrevWks'][11] : '') : '') .">Current +11 Previous Weeks</option>
329  <option value='12' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(12, $preFill['PrevWks']) ? $preFill['PrevWks'][12] : '') : '') .">Current +12 Previous Weeks</option>
330  <option value='13' ". (HCU_array_key_value('PrevWks', $preFill) ? (HCU_array_key_value(13, $preFill['PrevWks']) ? $preFill['PrevWks'][13] : '') : '') .">Current +13 Previous Weeks</option>
331  </select>
332  </td>
333  <td valign='bottom' class='dtl' colspan='3'>
334  <input type='submit' name='btnSearch' value='Search'>
335  </td>
336  </tr>
337  <tr>
338  <td class='hdr' valign='top'><a href='javascript:sort_order(\"26\");'>Date</a></td>
339  <td class='hdr' valign='top'><nobr><a href='javascript:sort_order(\"1\");'>CU Code</a></nobr></td>
340  <td class='hdr' valign='top'><a href='javascript:sort_order(\"7\");'>Member</a></td>
341  <td class='hdr' valign='top'><a href='javascript:sort_order(\"2\");'>Cell Phone</a></td>
342  <td class='hdr' valign='top'><a href='javascript:sort_order(\"17\");'>Trans Code</a></td>
343  <td class='hdr' valign='top'><a href='javascript:sort_order(\"4\");'>Request</a></td>
344  <td class='hdr' valign='top'><a href='javascript:sort_order(\"5\");'>Response</a></td>
345  <td class='hdr' valign='top'><nobr><a href='javascript:sort_order(\"6\");'>Response Error</a></nobr></td>
346  </tr>
347 ";
348 
349 reset ($log_list);
350 
351 foreach ($log_list as $list_row) {
352 
353  // * Print the information for each row
354  $odd_even = ($odd_even == "odd_small" ? "even_small" : "odd_small");
355  array_walk($list_row, 'apply_htmlspecialchars');
356  print <<< print_row
357  <tr class='$odd_even'>
358  <td class='$odd_even' valign='top'>{$list_row[$COL_DATE]}</td>
359  <td class='$odd_even' valign='top'>{$list_row[$COL_CUCODE]}</td>
360  <td class='$odd_even' valign='top'>{$list_row[$COL_MEMBER_NBR]}</td>
361  <td class='$odd_even' valign='top'>{$list_row[$COL_FROM_CELL_PHONE]}</td>
362  <td class='$odd_even' valign='top'>{$list_row[$COL_TRANS_CODE]}</td>
363  <td class='$odd_even' valign='top'>{$list_row[$COL_CELL_CMD]}</td>
364  <td class='$odd_even' valign='top'>{$list_row[$COL_RESPONSE]}</td>
365  <td class='$odd_even' valign='top'>{$list_row[$COL_RESPONSE_ERROR]}</td>
366  </tr>
367 print_row;
368 }
369 
370 
371 
372 
373 print "
374  </table>
375  </td>
376  <TD CLASS='matright'><DIV CLASS='empty'><br></DIV></td>
377  </tr>
378  <tr>
379  <TD CLASS='llc'>
380  <DIV CLASS='empty'><br></DIV>
381  </td>
382  <td CLASS='matcenter'>
383  <DIV CLASS='empty'><br></DIV>
384  </td>
385  <TD CLASS='lrc'>
386  <DIV CLASS='empty'><br></DIV>
387  </td>
388  </tr>
389  </TABLE>
390  <br>
391  <input type='hidden' name='txtSort' value='{$txtSort}'>
392  <input type='hidden' name='SubmitSort' value=''>
393  <script language='javascript'>
394  <!--
395  function sort_order (col_order) {
396  document.cellview.txtSort.value = col_order;
397 // document.cellview.SubmitSort.value = '1';
398  document.cellview.submit();
399  }
400  // -->
401  </script>
402  </form>
403  </body>
404  </html>
405  ";
406 
407 function shellSort($array, $col_sort) {
408  if (!$length = count($array)) {
409  return $array;
410  }
411  $k = 0;
412  $gap[0] = (int)($length/2);
413  while($gap[$k]>1){
414  $k++;
415  $gap[$k] = (int)($gap[$k-1]/2);
416  }
417 
418  for ($i = 0; $i <= $k; $i++) {
419  $step = $gap[$i];
420  for ($j = $step; $j < $length; $j++) {
421  $temp = $array[$j];
422  $p = $j - $step;
423  while ($p >= 0 && strcasecmp($temp[$col_sort], $array[$p][$col_sort]) < 0) {
424  $array[$p + $step] = $array[$p];
425  $p = $p-$step;
426  }
427  $array[$p + $step] = $temp;
428  }
429  }
430  return $array;
431 }
432 
433 function apply_htmlspecialchars(&$itemValue, $itemKey) {
434  $itemValue = htmlspecialchars($itemValue);
435 }