diff options
Diffstat (limited to 'src/usr/local/www/firewall_schedule_edit.php')
-rw-r--r-- | src/usr/local/www/firewall_schedule_edit.php | 1390 |
1 files changed, 732 insertions, 658 deletions
diff --git a/src/usr/local/www/firewall_schedule_edit.php b/src/usr/local/www/firewall_schedule_edit.php index e7c4bca..7be4f09 100644 --- a/src/usr/local/www/firewall_schedule_edit.php +++ b/src/usr/local/www/firewall_schedule_edit.php @@ -1,37 +1,62 @@ <?php /* firewall_schedule_edit.php - Copyright (C) 2004 Scott Ullrich - Copyright (C) 2013-2015 Electric Sheep Fencing, LP - All rights reserved. - - originally part of m0n0wall (http://m0n0.ch/wall) - Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. */ +/* ==================================================================== + * Copyright (c) 2004-2015 Electric Sheep Fencing, LLC. All rights reserved. + * Copyright (c) 2004 Scott Ullrich + * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net> + * Originally part of pfSense (https://www.pfsense.org) + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * "This product includes software developed by the pfSense Project + * for use in the pfSense software distribution. (http://www.pfsense.org/). + * + * 4. The names "pfSense" and "pfSense Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * coreteam@pfsense.org. + * + * 5. Products derived from this software may not be called "pfSense" + * nor may "pfSense" appear in their names without prior written + * permission of the Electric Sheep Fencing, LLC. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * + * "This product includes software developed by the pfSense Project + * for use in the pfSense software distribution (http://www.pfsense.org/). + * + * THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * ==================================================================== + * + */ /* - pfSense_MODULE: schedules + pfSense_MODULE: schedules */ ##|+PRIV @@ -48,9 +73,8 @@ function schedulecmp($a, $b) { function schedule_sort() { global $g, $config; - if (!is_array($config['schedules']['schedule'])) { + if (!is_array($config['schedules']['schedule'])) return; - } usort($config['schedules']['schedule'], "schedulecmp"); } @@ -62,27 +86,21 @@ require_once("shaper.inc"); $pgtitle = array(gettext("Firewall"), gettext("Schedules"), gettext("Edit")); -if (isset($_POST['referer'])) { - $referer = $_POST['referer']; -} else { - $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_schedule.php'); -} +$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/firewall_schedule.php'); $dayArray = array (gettext('Mon'), gettext('Tues'), gettext('Wed'), gettext('Thur'), gettext('Fri'), gettext('Sat'), gettext('Sun')); $monthArray = array (gettext('January'), gettext('February'), gettext('March'), gettext('April'), gettext('May'), gettext('June'), gettext('July'), gettext('August'), gettext('September'), gettext('October'), gettext('November'), gettext('December')); -if (!is_array($config['schedules']['schedule'])) { +if (!is_array($config['schedules']['schedule'])) $config['schedules']['schedule'] = array(); -} $a_schedules = &$config['schedules']['schedule']; -if (is_numericint($_GET['id'])) { +if (is_numericint($_GET['id'])) $id = $_GET['id']; -} -if (isset($_POST['id']) && is_numericint($_POST['id'])) { + +if (isset($_POST['id']) && is_numericint($_POST['id'])) $id = $_POST['id']; -} if (isset($id) && $a_schedules[$id]) { $pconfig['name'] = $a_schedules[$id]['name']; @@ -94,52 +112,53 @@ if (isset($id) && $a_schedules[$id]) { if ($_POST) { - if (strtolower($_POST['name']) == "lan") { + if (strtolower($_POST['name']) == "lan") $input_errors[] = gettext("Schedule may not be named LAN."); - } - if (strtolower($_POST['name']) == "wan") { + + if (strtolower($_POST['name']) == "wan") $input_errors[] = gettext("Schedule may not be named WAN."); - } - if (strtolower($_POST['name']) == "") { + + if (strtolower($_POST['name']) == "") $input_errors[] = gettext("Schedule name cannot be blank."); - } $x = is_validaliasname($_POST['name']); if (!isset($x)) { $input_errors[] = gettext("Reserved word used for schedule name."); } else { - if (is_validaliasname($_POST['name']) == false) { + if (is_validaliasname($_POST['name']) == false) $input_errors[] = gettext("The schedule name may only consist of the characters a-z, A-Z, 0-9"); - } } /* check for name conflicts */ foreach ($a_schedules as $schedule) { - if (isset($id) && ($a_schedules[$id]) && ($a_schedules[$id] === $schedule)) { + if (isset($id) && ($a_schedules[$id]) && ($a_schedules[$id] === $schedule)) continue; - } if ($schedule['name'] == $_POST['name']) { $input_errors[] = gettext("A Schedule with this name already exists."); break; } } + $schedule = array(); $schedule['name'] = $_POST['name']; $schedule['descr'] = htmlentities($_POST['descr'], ENT_QUOTES, 'UTF-8'); $timerangeFound = false; + for ($x = 0; $x < 99; $x++) { if ($_POST['schedule' . $x]) { if (!preg_match('/^[0-9]+:[0-9]+$/', $_POST['starttime' . $x])) { $input_errors[] = sprintf(gettext("Invalid start time - '%s'"), $_POST['starttime' . $x]); continue; } + if (!preg_match('/^[0-9]+:[0-9]+$/', $_POST['stoptime' . $x])) { $input_errors[] = sprintf(gettext("Invalid stop time - '%s'"), $_POST['stoptime' . $x]); continue; } + $timerangeFound = true; $timeparts = array(); $firstprint = false; @@ -149,16 +168,22 @@ if ($_POST) { $timehourstr .= $_POST['stoptime' . $x]; $timedescrstr = htmlentities($_POST['timedescr' . $x], ENT_QUOTES, 'UTF-8'); $dashpos = strpos($timestr, '-'); - if ($dashpos === false) { + + if ($dashpos === false) + { $timeparts['position'] = $timestr; - } else { + } + else + { $tempindarray = array(); $monthstr = ""; $daystr = ""; $tempindarray = explode(",", $timestr); - foreach ($tempindarray as $currentselection) { + foreach ($tempindarray as $currentselection) + { if ($currentselection) { - if ($firstprint) { + if ($firstprint) + { $monthstr .= ","; $daystr .= ","; } @@ -166,84 +191,554 @@ if ($_POST) { $monthpos = strpos($currentselection, "m"); $daypos = strpos($currentselection, "d"); $monthstr .= substr($currentselection, $monthpos+1, $daypos-$monthpos-1); - $daystr .= substr($currentselection, $daypos+1); + $daystr .= substr($currentselection, $daypos+1); $firstprint = true; } } + $timeparts['month'] = $monthstr; $timeparts['day'] = $daystr; } + $timeparts['hour'] = $timehourstr; $timeparts['rangedescr'] = $timedescrstr; $schedule['timerange'][$x] = $timeparts; } } - if (!$timerangeFound) { + if (!$timerangeFound) $input_errors[] = gettext("The schedule must have at least one time range configured."); - } if (!$input_errors) { - if (!empty($pconfig['schedlabel'])) { + if (!empty($pconfig['schedlabel'])) $schedule['schedlabel'] = $pconfig['schedlabel']; - } else { + else $schedule['schedlabel'] = uniqid(); - } if (isset($id) && $a_schedules[$id]) { $a_schedules[$id] = $schedule; - } else { + } + else { $a_schedules[] = $schedule; } + schedule_sort(); - if (write_config()) { + + if (write_config()) filter_configure(); - } header("Location: firewall_schedule.php"); exit; - } else { - //we received input errors, copy data to prevent retype - if (!$_POST['schedule0']) { + + } + //we received input errors, copy data to prevent retype + else + { + if (!$_POST['schedule0']) $getSchedule = false; - } else { + else $getSchedule = true; - } + $pconfig['name'] = $schedule['name']; $pconfig['descr'] = $schedule['descr']; $pconfig['timerange'] = $schedule['timerange']; } } + include("head.inc"); -/* put your custom HTML head content here */ -/* using some of the $pfSenseHead function calls */ -$jscriptstr = <<<EOD +// Returns a string containg the HTML to display a calendar table +function build_date_table() { + $tblstr = ""; + + $firstmonth = TRUE; + $monthcounter = date("n"); + $yearcounter = date("Y"); + + for ($k = 0; $k < 12; $k++) { + $firstdayofmonth = date("w", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))); + + if ($firstdayofmonth == 0) + $firstdayofmonth = 7; + + $daycounter = 1; + //number of day in month + $numberofdays = date("t", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))); + $firstdayprinted = FALSE; + $lasttr = FALSE; + $positioncounter = 1;//7 for Sun, 1 for Mon, 2 for Tues, etc + + $mostr = '<div id="' . date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))) ; + $mostr .= '" style="position:relative; display:'; + + if ($firstmonth) + $mostr .= "block"; + else + $mostr .= "none"; + + $mostr .= '" class="col-md-6">'; + + $mostr .= + '<table class="table table-condensed" border="1" cellspacing="1" cellpadding="1" id="calTable' . $monthcounter . $yearcounter . '" > + <thead><tr class="info"><td colspan="7" align="center" ><b>' . date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))) . '</b></td> + </tr> + <tr> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p1\');">' . gettext("Mon") . '</th> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p2\');">' . gettext("Tue") . '</th> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p3\');">' . gettext("Wed") . '</th> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p4\');">' . gettext("Thu") . '</th> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p5\');">' . gettext("Fri") . '</th> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p6\');">' . gettext("Sat") . '</th> + <th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p7\');">' . gettext("Sun") . '</th> + </tr> + </thead> + <tbody>' . "\r\n"; + + $firstmonth = FALSE; + + while ($daycounter<=$numberofdays) { + $weekcounter = date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter))); + $weekcounter = ltrim($weekcounter, "0"); + if ($positioncounter == 1) + { + $mostr .= "<tr>"; + } + + if ($firstdayofmonth == $positioncounter) { + + $mostr .= '<td class="text-center" style="cursor: pointer;" id="w' . $weekcounter . 'p' . $positioncounter . '" onclick="daytoggle(\'w' . $weekcounter . 'p' . $positioncounter . '-m' . $monthcounter . 'd' . $daycounter . '\');">' . $daycounter . "\r\n"; + + $daycounter++; + $firstdayprinted = TRUE; + $mostr .= "</td>"; + } + elseif ($firstdayprinted == TRUE && $daycounter <= $numberofdays) { + $mostr .= '<td class="text-center" style="cursor: pointer;" id="w' . $weekcounter . 'p' . $positioncounter . '" onclick="daytoggle(\'w' . $weekcounter . 'p' . $positioncounter . '-m' . $monthcounter . 'd' . $daycounter . '\');">' . $daycounter . "\r\n"; + $daycounter++; + $mostr .= "</td>"; + } + else + { + $mostr .= '<td class="text-center"></td>'; + } + + if ($positioncounter == 7 || $daycounter > $numberofdays) { + $positioncounter = 1; + $mostr .= "</tr>"; + } + else { + $positioncounter++; + } + + } + + $mostr .= '</tbody></table>'; + $mostr .= gettext('Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday. '); + $mostr .= '</div>'; + + if ($monthcounter == 12) + { + $monthcounter = 1; + $yearcounter++; + } + else + { + $monthcounter++; + } + + $tblstr .= $mostr; + } //end for loop + + return($tblstr); +} + +function build_month_list() { + + $list = array(); + + $monthcounter = date("n"); + $monthlimit = $monthcounter + 12; + $yearcounter = date("Y"); + + for ($k = 0; $k < 12; $k++) { + $list[$monthcounter] = date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))); + + if ($monthcounter == 12) { + $monthcounter = 1; + $yearcounter++; + } + else + { + $monthcounter++; + } + } + + return($list); +} + +if ($input_errors) + print_input_errors($input_errors); + +require_once('classes/Form.class.php'); + +$form = new Form(); + +$section = new Form_Section('Schedule information'); + +$input = new Form_Input( + 'name', + 'Schedule Name', + 'text', + $pconfig['name'] +); + +$input->setHelp((is_schedule_inuse($pconfig['name']) != true) ? 'The name of the alias may only consist of the characters a-z, A-Z and 0-9': + 'This schedule is in use so the name may not be modified!'); + +if (is_schedule_inuse($pconfig['name']) == true) + $input->setReadonly(); + +$section->addInput($input); + +$section->addInput(new Form_Input( + 'descr', + 'Description', + 'text', + $pconfig['descr'] +))->setHelp('You may enter a description here for your reference (not parsed). '); + +$section->addInput(new Form_Select( + 'monthsel', + 'Month', + null, + build_month_list() +)); + +$section->addInput(new Form_StaticText( + 'Date', + build_date_table() +)); + +$group = new Form_Group('Time'); + +$group->add(new Form_Select( + 'starttimehour', + null, + null, + array_combine(range(0, 23, 1), range(0, 23, 1)) +))->setHelp('Start Hrs'); + +$group->add(new Form_Select( + 'starttimemin', + null, + null, + array('00' => '00', '15' => '15', '30' => '30', '59' => '59') +))->setHelp('Start Mins'); + +$group->add(new Form_Select( + 'stoptimehour', + null, + '23', + array_combine(range(0, 23, 1), range(0, 23, 1)) +))->setHelp('Stop Hrs'); + +$group->add(new Form_Select( + 'stoptimemin', + null, + '59', + array('00' => '00', '15' => '15', '30' => '30', '59' => '59') +))->setHelp('Stop Mins'); + +$group->setHelp('Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.'); + +$section->add($group); + +$section->addInput(new Form_Input( + 'timerangedescr', + 'Time range description', + 'text', + $pconfig['timerangedescr'] +))->setHelp('You may enter a description here for your reference (not parsed). '); + +$group = new Form_Group(null); + +$group->add(new Form_Button( + 'btnaddtime', + 'Add Time' +))->removeClass('btn-primary')->addClass('btn-default btn-sm'); + +$group->add(new Form_Button( + 'btnclrsel', + 'Clear selection' +))->removeClass('btn-primary')->addClass('btn-default btn-sm'); + +$section->add($group); + +if (isset($id) && $a_schedules[$id]) { + $section->addInput(new Form_Input( + 'id', + null, + 'hidden', + $id + )); +} + +$form->add($section); + +$section = new Form_Section('Configured ranges'); +$counter = 0; + +if ($getSchedule) { + $maxrows = count($pconfig['timerange']) -1; + + foreach ($pconfig['timerange'] as $timerange) { + $tempFriendlyTime = ""; + $tempID = ""; + if ($timerange) { + $dayFriendly = ""; + $tempFriendlyTime = ""; + $timedescr = $timerange['rangedescr']; + + //get hours + $temptimerange = $timerange['hour']; + $temptimeseparator = strrpos($temptimerange, "-"); + + $starttime = substr ($temptimerange, 0, $temptimeseparator); + $stoptime = substr ($temptimerange, $temptimeseparator+1); + $currentDay = ""; + $firstDay = ""; + $nextDay = ""; + $foundEnd = false; + $firstDayFound = false; + $firstPrint = false; + $firstprint2 = false; + + if ($timerange['month']) { + $tempmontharray = explode(",", $timerange['month']); + $tempdayarray = explode(",", $timerange['day']); + $arraycounter = 0; + foreach ($tempmontharray as $monthtmp) { + $month = $tempmontharray[$arraycounter]; + $day = $tempdayarray[$arraycounter]; + $daypos = date("w", mktime(0, 0, 0, date($month), date($day), date("Y"))); + //if sunday, set position to 7 to get correct week number. This is due to php limitations on ISO-8601. When we move to php5.1 we can change this. + if ($daypos == 0) { + $daypos = 7; + } + + $weeknumber = date("W", mktime(0, 0, 0, date($month), date($day), date("Y"))); + $weeknumber = ltrim($weeknumber, "0"); + + if ($firstPrint) + { + $tempID .= ","; + } + + $tempID .= "w" . $weeknumber . "p" . $daypos . "-m" . $month . "d" . $day; + $firstPrint = true; + + if (!$firstDayFound) + { + $firstDay = $day; + $firstmonth = $month; + $firstDayFound = true; + } + + $currentDay = $day; + $nextDay = $tempdayarray[$arraycounter+1]; + $currentDay++; + if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) { + if ($firstprint2) + $tempFriendlyTime .= ", "; + + $currentDay--; + + if ($currentDay != $firstDay) + $tempFriendlyTime .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ; + else + $tempFriendlyTime .= $monthArray[$month-1] . " " . $day; + + $firstDayFound = false; + $firstprint2 = true; + } + $arraycounter++; + } + + } + else + { + $dayFriendly = $timerange['position']; + $tempID = $dayFriendly; + } + + $tempTime = $tempID . "||" . $starttime . "-" . $stoptime . "||" . $timedescr; + + //following code makes the days friendly appearing, IE instead of Mon, Tues, Wed it will show Mon - Wed + $foundEnd = false; + $firstDayFound = false; + $firstprint = false; + $tempFriendlyDayArray = explode(",", $dayFriendly); + $currentDay = ""; + $firstDay = ""; + $nextDay = ""; + $i = 0; + + if (!$timerange['month']) { + foreach ($tempFriendlyDayArray as $day) { + if ($day != "") { + if (!$firstDayFound) + { + $firstDay = $tempFriendlyDayArray[$i]; + $firstDayFound = true; + } + + $currentDay =$tempFriendlyDayArray[$i]; + //get next day + $nextDay = $tempFriendlyDayArray[$i+1]; + $currentDay++; + + if ($currentDay != $nextDay) { + if ($firstprint) + $tempFriendlyTime .= ", "; + + $currentDay--; + + if ($currentDay != $firstDay) + $tempFriendlyTime .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1]; + else + $tempFriendlyTime .= $dayArray[$firstDay-1]; + + $firstDayFound = false; + $firstprint = true; + } + $i++; + } + } + } + + $group = new Form_Group(''); + $group->add(new Form_Input( + 'tempFriendlyTime', + null, + 'readonly', + $tempFriendlyTime + ))->setWidth(2)->setHelp($counter == $maxrows ? 'Day(s)':''); + + $group->add(new Form_Input( + 'starttime' . $counter, + null, + 'readonly', + $starttime + ))->setWidth(2)->setHelp($counter == $maxrows ? 'Start time':''); + + $group->add(new Form_Input( + 'stoptime' . $counter, + null, + 'readonly', + $stoptime + ))->setWidth(2)->setHelp($counter == $maxrows ? 'Stop time':''); + + $group->add(new Form_Input( + 'timedescr' . $counter, + null, + 'readonly', + $timedescr + ))->setWidth(2)->setHelp($counter == $maxrows ? 'Description':''); + + $group->add(new Form_Button( + 'Delete' . $counter, + 'Delete' + ))->removeClass('btn-primary')->addClass('btn-xs btn-warning'); + + $group->add(new Form_Input( + 'schedule' . $counter, + null, + 'hidden', + $tempID + )); + + $group->addClass('schedulegrp' . $counter); + + $counter++; + $section->add($group); + } + } +} + +// This is just a marker that the javascript can use to insertBefore() when adding new rows +$section->addInput(new Form_Input( + 'marker', + null, + 'hidden' +))->addClass('noranges'); + +$form->add($section); + +print($form); +?> + +<script type="text/javascript"> +//<![CDATA[ +events.push(function(){ + + //Update the calendar when a new month is selected + $('#monthsel').on('change', function() { + update_month(); + }); + + // Make the ‘clear’ button a plain button, not a submit button + $('#btnclrsel').prop('type', 'button'); + + $('#btnclrsel').click(function() { + clearCalendar(); + clearTime(); + clearDescr(); + }); + + // Make the ‘Add time’ button a plain button, not a submit button + $('#btnaddtime').prop('type', 'button'); + + $('#btnaddtime').click(function() { + processEntries(); + }); + + $('[id^=Delete]').prop('type', 'button'); + + $('[id^=Delete]').click(function(event) { + delete_row(event.target.id.slice(6)); + }); +}); +//]]> +</script> + <script type="text/javascript"> //<![CDATA[ var daysSelected = ""; -var month_array = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; -var day_array = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']; +var month_array = ['January','February','March','April','May','June','July','August','September','October','November','December']; +var day_array = ['Mon','Tues','Wed','Thur','Fri','Sat','Sun']; var schCounter = 0; function rgb2hex(rgb) { var parts = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); - if (parts == null) { + + if (parts == null) return; - } + function hex(x) { return ("0" + parseInt(x).toString(16)).slice(-2); } + return ("#" + hex(parts[1]) + hex(parts[2]) + hex(parts[3])).toUpperCase(); } -function repeatExistingDays() { +function repeatExistingDays(){ var tempstr, tempstrdaypos, week, daypos, dayposdone = ""; var dayarray = daysSelected.split(","); - for (i = 0; i <= dayarray.length; i++) { + + for (i=0; i<=dayarray.length; i++) { tempstr = dayarray[i]; tempstrdaypos = tempstr.search("p"); week = tempstr.substring(1, tempstrdaypos); @@ -256,38 +751,40 @@ function repeatExistingDays() { tempstr = 'w' + week + 'p' + daypos; daycell = eval('document.getElementById(tempstr)'); if (daydone == "-1") { - if (rgb2hex(daycell.style.backgroundColor) == "#F08080") { // lightcoral - daytogglerepeating(week, daypos, true); - } else { - daytogglerepeating(week, daypos, false); - } + if (rgb2hex(daycell.style.backgroundColor) == "#F08080") // lightcoral + daytogglerepeating(week,daypos,true); + else + daytogglerepeating(week,daypos,false); + dayposdone += daypos + ","; } } } -function daytogglerepeating(week, daypos, bExists) { +function daytogglerepeating(week,daypos,bExists){ var tempstr, daycell, dayoriginal = ""; + for (j=1; j<=53; j++) { tempstr = 'w' + j + 'p' + daypos; daycell = eval('document.getElementById(tempstr)'); - dayoriginalpos = daysSelected.indexOf(tempstr); + dayoriginalpos = daysSelected.indexOf(tempstr); //if bExists set to true, means cell is already select it //unselect it and remove original day from daysSelected string if (daycell != null) { if (bExists) { - daycell.style.backgroundColor = "#FFFFFF"; // white - } else { - daycell.style.backgroundColor = "#F08080"; // lightcoral + daycell.style.backgroundColor = "#FFFFFF"; // white + } + else + { + daycell.style.backgroundColor = "#F08080"; // lightcoral } if (dayoriginalpos != "-1") { dayoriginalend = daysSelected.indexOf(',', dayoriginalpos); tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1); daysSelected = daysSelected.replace(tempstr, ""); - } } } @@ -298,15 +795,19 @@ function daytoggle(id) { var bFoundValid = false; iddashpos = id.search("-"); + var tempstrdaypos = id.search("p"); var week = id.substring(1, tempstrdaypos); + week = parseInt(week); if (iddashpos == "-1") { idmod = id; runrepeat = true; var daypos = id.substr(tempstrdaypos+1); - } else { + } + else + { idmod = id.substring(0, iddashpos); var daypos = id.substring(tempstrdaypos+1, iddashpos); } @@ -317,24 +818,32 @@ function daytoggle(id) { var daycell = document.getElementById(idmod); if (daycell != null) { - if (rgb2hex(daycell.style.backgroundColor) == "#FF0000") { // red - daycell.style.backgroundColor = "#FFFFFF"; // white + if (rgb2hex(daycell.style.backgroundColor) == "#FF0000") { // red + daycell.style.backgroundColor = "#FFFFFF"; // white str = id + ","; daysSelected = daysSelected.replace(str, ""); - } else if (rgb2hex(daycell.style.backgroundColor) == "#F08080") { // lightcoral - daytogglerepeating(week, daypos, true); - } else { - //color is white cell - if (!runrepeat) { - daycell.style.backgroundColor = "#FF0000"; // red - } else { - daycell.style.backgroundColor = "#F08080"; // lightcoral - daytogglerepeating(week, daypos, false); + } + else if (rgb2hex(daycell.style.backgroundColor) == "#F08080") // lightcoral + { + daytogglerepeating(week,daypos,true); + } + else //color is white cell + { + if (!runrepeat) + { + daycell.style.backgroundColor = "#FF0000"; // red + } + else + { + daycell.style.backgroundColor = "#F08080"; // lightcoral + daytogglerepeating(week,daypos,false); } daysSelected += id + ","; } bFoundValid = true; - } else { + } + else + { //we found an invalid cell when column was clicked, move up to the next week week++; tempstr = "w" + week + "p" + daypos; @@ -351,19 +860,21 @@ function update_month() { option = document.forms[0].monthsel.options[i].text; document.popupMonthLayer = eval('document.getElementById (option)'); - if (selected == option) { + if (selected == option) document.popupMonthLayer.style.display="block"; - } else { + else document.popupMonthLayer.style.display="none"; - } } } function checkForRanges() { - if (daysSelected != "") { + if (daysSelected != "") + { alert("You have not saved the specified time range. Please click 'Add Time' button to save the time range."); return false; - } else { + } + else + { return true; } } @@ -378,13 +889,15 @@ function processEntries() { stoptimehour = parseInt(document.getElementById("stoptimehour").value); stoptimemin = parseInt(document.getElementById("stoptimemin").value); - //do time checks - if (starttimehour > stoptimehour) { + if (starttimehour > stoptimehour) + { errors = "Error: Start Hour cannot be greater than Stop Hour."; passedValidiation = false; - } else if (starttimehour == stoptimehour) { + } + else if (starttimehour == stoptimehour) + { if (starttimemin > stoptimemin) { errors = "Error: Start Minute cannot be greater than Stop Minute."; passedValidiation = false; @@ -393,10 +906,10 @@ function processEntries() { if (passedValidiation) { addTimeRange(); - } else { - if (errors != "") { + } + else { + if (errors != "") alert(errors); - } } } @@ -417,9 +930,11 @@ function addTimeRange() { //check for existing entries var findCurrentCounter; + for (u = 0; u < 99; u++) { findCurrentCounter = document.getElementById("schedule" + u); - if (!findCurrentCounter) { + if (!findCurrentCounter) + { schCounter = u; break; } @@ -427,15 +942,19 @@ function addTimeRange() { if (daysSelected != "") { //get days selected - for (i = 0; i < tempdayarray.length; i++) { + + for (i = 0; i < tempdayarray.length; i++) + { tempstr = tempdayarray[i]; - if (tempstr != "") { + if (tempstr != "") + { tempstrdaypos = tempstr.search("p"); week = tempstr.substring(1, tempstrdaypos); week = parseInt(week); dashpos = tempstr.search("-"); - if (dashpos != "-1") { + if (dashpos != "-1") + { var nonrepeatingfound = true; daypos = tempstr.substring(tempstrdaypos+1, dashpos); daypos = parseInt(daypos); @@ -448,7 +967,9 @@ function addTimeRange() { monthstr += month + ","; daystr += day + ","; nrtempID += tempstr + ","; - } else { + } + else + { var repeatingfound = true; daypos = tempstr.substr(tempstrdaypos+1); daypos = parseInt(daypos); @@ -465,16 +986,19 @@ function addTimeRange() { var tempFriendlyMonthArray = monthstr.split(","); var tempFriendlyDayArray = daystr.split(","); var currentDay, firstDay, nextDay, currentMonth, nextMonth, firstDay, firstMonth = ""; + for (k = 0; k < tempFriendlyMonthArray.length; k++) { tempstr = tempFriendlyMonthArray[k]; if (tempstr != "") { - if (!firstDayFound) { + if (!firstDayFound) + { firstDay = tempFriendlyDayArray[k]; firstDay = parseInt(firstDay); firstMonth = tempFriendlyMonthArray[k]; firstMonth = parseInt(firstMonth); firstDayFound = true; } + currentDay = tempFriendlyDayArray[k]; currentDay = parseInt(currentDay); //get next day @@ -484,15 +1008,16 @@ function addTimeRange() { currentDay++; if ((currentDay != nextDay) || (tempFriendlyMonthArray[k] != tempFriendlyMonthArray[k+1])) { - if (firstprint) { + if (firstprint) nrtempFriendlyTime += ", "; - } + currentDay--; - if (currentDay != firstDay) { + + if (currentDay != firstDay) nrtempFriendlyTime += month_array[firstMonth-1] + " " + firstDay + "-" + currentDay; - } else { + else nrtempFriendlyTime += month_array[firstMonth-1] + " " + currentDay; - } + firstDayFound = false; firstprint = true; } @@ -506,30 +1031,35 @@ function addTimeRange() { tempFriendlyDayArray = rtempFriendlyDay.split(","); tempFriendlyDayArray.sort(); currentDay, firstDay, nextDay = ""; + for (k = 0; k < tempFriendlyDayArray.length; k++) { tempstr = tempFriendlyDayArray[k]; if (tempstr != "") { - if (!firstDayFound) { + if (!firstDayFound) + { firstDay = tempFriendlyDayArray[k]; firstDay = parseInt(firstDay); firstDayFound = true; } + currentDay = tempFriendlyDayArray[k]; currentDay = parseInt(currentDay); //get next day nextDay = tempFriendlyDayArray[k+1]; nextDay = parseInt(nextDay); currentDay++; + if (currentDay != nextDay) { - if (firstprint) { + if (firstprint) rtempFriendlyTime += ", "; - } + currentDay--; - if (currentDay != firstDay) { + + if (currentDay != firstDay) rtempFriendlyTime += day_array[firstDay-1] + " - " + day_array[currentDay-1]; - } else { + else rtempFriendlyTime += day_array[firstDay-1]; - } + firstDayFound = false; firstprint = true; } @@ -539,23 +1069,25 @@ function addTimeRange() { //sort the tempID var tempsortArray = rtempID.split(","); var isFirstdone = false; + tempsortArray.sort(); + //clear tempID rtempID = ""; - for (t = 0; t < tempsortArray.length; t++) { + for (t = 0; t < tempsortArray.length; t++) + { if (tempsortArray[t] != "") { if (!isFirstdone) { rtempID += tempsortArray[t]; isFirstdone = true; - } else { - rtempID += "," + tempsortArray[t]; } + else + rtempID += "," + tempsortArray[t]; } } - //get time specified - starttimehour = document.getElementById("starttimehour").value + starttimehour = document.getElementById("starttimehour").value starttimemin = document.getElementById("starttimemin").value; stoptimehour = document.getElementById("stoptimehour").value; stoptimemin = document.getElementById("stoptimemin").value; @@ -586,68 +1118,27 @@ function addTimeRange() { insertElements(rtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, rtempTime, rtempID); } - } else { + } + else + { //no days were selected, alert user alert ("You must select at least 1 day before adding time"); } } -function insertElements(tempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, tempTime, tempID) { - - //add it to the schedule list - d = document; - tbody = d.getElementById("scheduletable").getElementsByTagName("tbody").item(0); - tr = d.createElement("tr"); - td = d.createElement("td"); - td.innerHTML= "<span class='vexpl'>" + tempFriendlyTime + "<\/span>"; - tr.appendChild(td); - - td = d.createElement("td"); - td.innerHTML="<input type='text' readonly class='vexpl' name='starttime" + schCounter + "' id='starttime" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + starttimehour + ":" + starttimemin + "' />"; - tr.appendChild(td); - - td = d.createElement("td"); - td.innerHTML="<input type='text' readonly class='vexpl' name='stoptime" + schCounter + "' id='stoptime" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + stoptimehour + ":" + stoptimemin + "' />"; - tr.appendChild(td); - - td = d.createElement("td"); - td.innerHTML="<input type='text' readonly class='vexpl' name='timedescr" + schCounter + "' id='timedescr" + schCounter + "' style=' word-wrap:break-word; width:100%; border:0px solid;' value='" + tempdescr + "' />"; - tr.appendChild(td); - - td = d.createElement("td"); - td.innerHTML = "<a onclick='editRow(\"" + tempTime + "\",this); return false;' href='#'><img border='0' src='/themes/" + theme + "/images/icons/icon_e.gif' alt='edit' /></\a>"; - tr.appendChild(td); - - td = d.createElement("td"); - td.innerHTML = "<a onclick='removeRow(this); return false;' href='#'><img border='0' src='/themes/" + theme + "/images/icons/icon_x.gif' alt='remove' /></\a>"; - tr.appendChild(td); - - td = d.createElement("td"); - td.innerHTML="<input type='hidden' id='schedule" + schCounter + "' name='schedule" + schCounter + "' value='" + tempID + "' />"; - tr.appendChild(td); - tbody.appendChild(tr); - - schCounter++; - - //reset calendar and time and descr - clearCalendar(); - clearTime(); - clearDescr(); -} - - function clearCalendar() { var tempstr, daycell = ""; //clear days selected daysSelected = ""; //loop through all 52 weeks - for (j=1; j<=53; j++) { + for (j = 1; j <= 53; j++) + { //loop through all 7 days - for (k=1; k<8; k++) { + for (k = 1; k < 8; k++) { tempstr = 'w' + j + 'p' + k; daycell = eval('document.getElementById(tempstr)'); if (daycell != null) { - daycell.style.backgroundColor = "#FFFFFF"; // white + daycell.style.backgroundColor = "#FFFFFF"; // white } } } @@ -664,488 +1155,71 @@ function clearDescr() { document.getElementById("timerangedescr").value = ""; } -function editRow(incTime, el) { - var check = checkForRanges(); - - if (check) { - - //reset calendar and time - clearCalendar(); - clearTime(); +var counter = -1; - var starttimehour, descr, days, tempstr, starttimemin, hours, stoptimehour, stoptimemin = ""; - - tempArray = incTime.split ("||"); - - days = tempArray[0]; - hours = tempArray[1]; - descr = tempArray[2]; - - var tempdayArray = days.split(","); - var temphourArray = hours.split("-"); - tempstr = temphourArray[0]; - var temphourArray2 = tempstr.split(":"); - - document.getElementById("starttimehour").value = temphourArray2[0]; - document.getElementById("starttimemin").value = temphourArray2[1]; - - tempstr = temphourArray[1]; - temphourArray2 = tempstr.split(":"); - - document.getElementById("stoptimehour").value = temphourArray2[0]; - document.getElementById("stoptimemin").value = temphourArray2[1]; - - document.getElementById("timerangedescr").value = descr; - - //toggle the appropriate days - for (i = 0; i < tempdayArray.length; i++) { - if (tempdayArray[i]) { - var tempweekstr = tempdayArray[i]; - dashpos = tempweekstr.search("-"); - - if (dashpos == "-1") { - tempstr = "w2p" + tempdayArray[i]; - } else { - tempstr = tempdayArray[i]; - } - daytoggle(tempstr); - } - } - removeRownoprompt(el); - } -} +// Using an HTML template, build a time-range row and add it after the last row in the display +function insertElements(tempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, tempTime, tempID) { + var rowhtml; -function removeRownoprompt(el) { - var cel; - while (el && el.nodeName.toLowerCase() != "tr") { - el = el.parentNode; + if (counter < 0) { + counter = <?php if (!isset($counter)) echo '0'; else echo $counter ?>; + rows_displayed = counter; } - if (el && el.parentNode) { - cel = el.getElementsByTagName("td").item(0); - el.parentNode.removeChild(el); - } -} + // Template for the schedule deifinition. '@' will be replaced with the row number using .replace() + rowhtml = + '<div class="form-group schedulegrp' + counter + '">' + + '<label for="tempFriendlyTime" class="col-sm-2 control-label"></label>' + + '<div class="col-sm-2">' + + '<input class="form-control" name="tempFriendlyTime" id="tempFriendlyTime" type="readonly" value="' + tempFriendlyTime + '"/>' + + '<span class="help-block">Day(s)</span>' + + '</div>' + + '<div class="col-sm-2">' + + '<input class="form-control" name="starttime@" id="starttime@" type="readonly" value="' + starttimehour + ':' + starttimemin + '"/>' + + '<span class="help-block">Start time</span>' + + '</div>' + + '<div class="col-sm-2">' + + '<input class="form-control" name="stoptime@" id="stoptime@" type="readonly" value="' + stoptimehour + ':' + stoptimemin + '"/>' + + '<span class="help-block">Stop time</span>' + + '</div>' + + '<div class="col-sm-2">' + + '<input class="form-control" name="timedescr@" id="timedescr@" type="readonly" value="' + tempdescr + '"/>' + + '<span class="help-block">Description</span>' + + '</div>' + + '<div class="col-sm-2">' + + '<input class="form-control" name="schedule@" id="schedule@" type="hidden" value="' + tempID + '"/>' + + '</div>' + + '<div class="col-sm-2">' + + '<a class="btn btn-xs btn-warning" name="delete@" id="delete@" type="button" value="@">Delete</a>' + + '</div>' + + '</div>'; + + $('.help-block').hide(); + + var node = $('.noranges').parent().parent(); + $(rowhtml.replace(/@/g, counter)).insertBefore(node); + + $('[id^=delete]').click(function(event) { + delete_row(event.target.id.slice(6)); + }); + + counter++; + schCounter++; -function removeRow(el) { - var check = confirm ("Do you really want to delete this time range?"); - if (check) { - var cel; - while (el && el.nodeName.toLowerCase() != "tr") { - el = el.parentNode; - } + //reset calendar and time and descr + clearCalendar(); + clearTime(); + clearDescr(); +} - if (el && el.parentNode) { - cel = el.getElementsByTagName("td").item(0); - el.parentNode.removeChild(el); - } - } +// If only everything were this simple +function delete_row(row) { + $('.schedulegrp' + row).remove(); } //]]> </script> -EOD; -?> -<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>"> - - -<?php include("fbegin.inc"); echo $jscriptstr; ?> -<?php if ($input_errors) print_input_errors($input_errors); ?> -<div id="inputerrors"></div> - -<form action="firewall_schedule_edit.php" method="post" name="iform" id="iform"> - <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="firewall schedule"> - <tr> - <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedule information");?></td> - </tr> - <tr> - <td> - <table width="100%" border="0" cellpadding="6" cellspacing="0" summary="main area"> - <tr> - <td width="15%" valign="top" class="vncellreq"><?=gettext("Schedule Name");?></td> - <td width="85%" class="vtable"> - <?php if (is_schedule_inuse($pconfig['name']) == true): ?> - <input name="name" type="hidden" id="name" size="40" value="<?=htmlspecialchars($pconfig['name']);?>" /> - <?php echo $pconfig['name']; ?> - <p> - <span class="vexpl"><?=gettext("NOTE: This schedule is in use so the name may not be modified!");?></span> - </p> - <?php else: ?> - <input name="name" type="text" id="name" size="40" maxlength="40" class="formfld unknown" value="<?=htmlspecialchars($pconfig['name']);?>" /><br /> - <span class="vexpl"> - <?=gettext("The name of the alias may only consist of the characters a-z, A-Z and 0-9");?> - </span> - <?php endif; ?> - </td> - </tr> - <tr> - <td width="15%" valign="top" class="vncell"><?=gettext("Description");?></td> - <td width="85%" class="vtable"><input name="descr" type="text" id="descr" size="40" maxlength="40" class="formfld unknown" value="<?=htmlspecialchars($pconfig['descr']);?>" /><br /> - <span class="vexpl"> - <?=gettext("You may enter a description here for your reference (not parsed).");?> - </span> - </td> - </tr> - <!-- tr> - </tr --> - <tr> - <td width="15%" valign="top" class="vncellreq"><?=gettext("Month");?></td> - <td width="85%" class="vtable"> - <select name="monthsel" class="formselect" id="monthsel" onchange="update_month();"> - <?php - $monthcounter = date("n"); - $monthlimit = $monthcounter + 12; - $yearcounter = date("Y"); - for ($k = 0; $k < 12; $k++) {?> - <option value="<?php echo $monthcounter;?>"><?php echo date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></option> - <?php - if ($monthcounter == 12) { - $monthcounter = 1; - $yearcounter++; - } else { - $monthcounter++; - } - } ?> - </select> - <br /><br /> - <?php - $firstmonth = TRUE; - $monthcounter = date("n"); - $yearcounter = date("Y"); - for ($k = 0; $k < 12; $k++) { - $firstdayofmonth = date("w", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))); - if ($firstdayofmonth == 0) { - $firstdayofmonth = 7; - } - - $daycounter = 1; - //number of day in month - $numberofdays = date("t", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter))); - $firstdayprinted = FALSE; - $lasttr = FALSE; - $positioncounter = 1;//7 for Sun, 1 for Mon, 2 for Tues, etc - ?> - <div id="<?php echo date("F_y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?>" style=" position:relative; display:<?php if ($firstmonth)echo "block";else echo "none";?>"> - <table border="1" cellspacing="1" cellpadding="1" id="calTable<?=$monthcounter . $yearcounter;?>" class="tabcont" summary="month"> - <tr> - <td colspan="7" align="center" class="listbg"><b><?php echo date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></b></td> - </tr> - <tr> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p1');"><u><b><?=gettext("Mon");?></b></u></td> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p2');"><u><b><?=gettext("Tue");?></b></u></td> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p3');"><u><b><?=gettext("Wed");?></b></u></td> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p4');"><u><b><?=gettext("Thu");?></b></u></td> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p5');"><u><b><?=gettext("Fri");?></b></u></td> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p6');"><u><b><?=gettext("Sat");?></b></u></td> - <td align="center" class="listhdrr" style="cursor: pointer;" onclick="daytoggle('w1p7');"><u><b><?=gettext("Sun");?></b></u></td> - </tr> - <?php - $firstmonth = FALSE; - while ($daycounter<=$numberofdays) { - $weekcounter = date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter))); - $weekcounter = ltrim($weekcounter, "0"); - if ($positioncounter == 1) { - echo "<tr>"; - } - if ($firstdayofmonth == $positioncounter) { - ?> - <td align="center" style="cursor: pointer;" class="listr" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');"> - <?php - echo $daycounter; - $daycounter++; - $firstdayprinted = TRUE; - echo "</td>"; - } elseif ($firstdayprinted == TRUE && $daycounter <= $numberofdays) { - ?> - <td align="center" style="cursor: pointer;" class="listr" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');"> - <?php - echo $daycounter; - $daycounter++; - echo "</td>"; - } else { - echo "<td align=\"center\" class=\"listr\"></td>"; - } - - if ($positioncounter == 7 || $daycounter > $numberofdays) { - $positioncounter = 1; - echo "</tr>"; - } else { - $positioncounter++; - } - - } //end while loop - ?> - </table> - </div> - <?php - if ($monthcounter == 12) { - $monthcounter = 1; - $yearcounter++; - } else { - $monthcounter++; - } - } //end for loop - ?> - <br /> - <?=gettext("Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday.");?> - </td> - </tr> - <tr> - <td width="15%" valign="top" class="vncellreq"><?=gettext("Time");?></td> - <td width="85%" class="vtable"> - <table cellspacing="2" class="tabcont" summary="time"> - <tr> - <td class="listhdrr" align="center"><?=gettext("Start Time");?></td><td></td><td class="listhdrr" align="center"><?=gettext("Stop Time");?></td> - </tr> - <tr> - <td> - <select name="starttimehour" class="formselect" id="starttimehour"> - <?php - for ($i = 0; $i < 24; $i++) { - echo "<option value=\"$i\">"; - echo $i; - echo "</option>"; - } - ?> - </select> <?=gettext("Hr"); ?> - <select name="starttimemin" class="formselect" id="starttimemin"> - <option value="00">00</option> - <option value="15">15</option> - <option value="30">30</option> - <option value="45">45</option> - <option value="59">59</option> - </select> <?=gettext("Min"); ?> - </td> - <td></td> - <td> - <select name="stoptimehour" class="formselect" id="stoptimehour"> - <?php - for ($i = 0; $i < 24; $i++) { - if ($i == 23) { - $selected = "selected=\"selected\""; - } else { - $selected = ""; - } - - echo "<option value=\"$i\" $selected>"; - echo $i; - echo "</option>"; - } - ?> - </select> <?=gettext("Hr");?> - <select name="stoptimemin" class="formselect" id="stoptimemin"> - <option value="00">00</option> - <option value="15">15</option> - <option value="30">30</option> - <option value="45">45</option> - <option value="59" selected="selected">59</option> - </select> <?=gettext("Min");?> - </td> - </tr> - </table> - <br /> - <?=gettext("Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.")?> - </td> - </tr> - <tr> - <td width="15%" valign="top" class="vncell"><?=gettext("Time Range Description")?></td> - <td width="85%" class="vtable"><input name="timerangedescr" type="text" class="formfld unknown" id="timerangedescr" size="40" maxlength="40" /><br /> - <span class="vexpl"> - <?=gettext("You may enter a description here for your reference (not parsed).")?> - </span> - </td> - </tr> - <tr> - <td width="22%" valign="top"> </td> - <td width="78%"> - <input type="button" value="<?=gettext("Add Time");?>" class="formbtn" onclick="javascript:processEntries();" /> - <input type="button" value="<?=gettext("Clear Selection");?>" class="formbtn" onclick="javascript:clearCalendar(); clearTime(); clearDescr();" /> - </td> - </tr> - <tr> - <td width="15%" valign="top" class="vtable"></td> - <td width="85%" class="vtable"></td> - </tr> - <tr> - <td colspan="2" valign="top" class="listtopic"><?=gettext("Schedule repeat");?></td> - </tr> - <tr> - <td width="15%" valign="top" class="vncellreq"><?=gettext("Configured Ranges");?></td> - <td width="85%"> - <table id="scheduletable" summary="range"> - <tbody> - <tr> - <td align="center" class="listbg" width="35%"><?=gettext("Day(s)");?></td> - <td align="center" class="listbg" width="12%"><?=gettext("Start Time");?></td> - <td align="center" class="listbg" width="11%"><?=gettext("Stop Time");?></td> - <td align="center" class="listbg" width="42%"><?=gettext("Description");?></td> - </tr> - <?php - if ($getSchedule) { - $counter = 0; - - foreach ($pconfig['timerange'] as $timerange) { - $tempFriendlyTime = ""; - $tempID = ""; - if ($timerange) { - $dayFriendly = ""; - $tempFriendlyTime = ""; - $timedescr = $timerange['rangedescr']; - - //get hours - $temptimerange = $timerange['hour']; - $temptimeseparator = strrpos($temptimerange, "-"); - - $starttime = substr ($temptimerange, 0, $temptimeseparator); - $stoptime = substr ($temptimerange, $temptimeseparator+1); - $currentDay = ""; - $firstDay = ""; - $nextDay = ""; - $foundEnd = false; - $firstDayFound = false; - $firstPrint = false; - $firstprint2 = false; - - if ($timerange['month']) { - $tempmontharray = explode(",", $timerange['month']); - $tempdayarray = explode(",", $timerange['day']); - $arraycounter = 0; - foreach ($tempmontharray as $monthtmp) { - $month = $tempmontharray[$arraycounter]; - $day = $tempdayarray[$arraycounter]; - $daypos = date("w", mktime(0, 0, 0, date($month), date($day), date("Y"))); - //if sunday, set position to 7 to get correct week number. This is due to php limitations on ISO-8601. When we move to php5.1 we can change this. - if ($daypos == 0) { - $daypos = 7; - } - $weeknumber = date("W", mktime(0, 0, 0, date($month), date($day), date("Y"))); - $weeknumber = ltrim($weeknumber, "0"); - - if ($firstPrint) { - $tempID .= ","; - } - $tempID .= "w" . $weeknumber . "p" . $daypos . "-m" . $month . "d" . $day; - $firstPrint = true; - - if (!$firstDayFound) { - $firstDay = $day; - $firstmonth = $month; - $firstDayFound = true; - } - - $currentDay = $day; - $nextDay = $tempdayarray[$arraycounter+1]; - $currentDay++; - if (($currentDay != $nextDay) || ($tempmontharray[$arraycounter] != $tempmontharray[$arraycounter+1])) { - if ($firstprint2) { - $tempFriendlyTime .= ", "; - } - $currentDay--; - if ($currentDay != $firstDay) { - $tempFriendlyTime .= $monthArray[$firstmonth-1] . " " . $firstDay . " - " . $currentDay ; - } else { - $tempFriendlyTime .= $monthArray[$month-1] . " " . $day; - } - $firstDayFound = false; - $firstprint2 = true; - } - $arraycounter++; - } - } else { - $dayFriendly = $timerange['position']; - $tempID = $dayFriendly; - } - - $tempTime = $tempID . "||" . $starttime . "-" . $stoptime . "||" . $timedescr; - - //following code makes the days friendly appearing, IE instead of Mon, Tues, Wed it will show Mon - Wed - $foundEnd = false; - $firstDayFound = false; - $firstprint = false; - $tempFriendlyDayArray = explode(",", $dayFriendly); - $currentDay = ""; - $firstDay = ""; - $nextDay = ""; - $i = 0; - if (!$timerange['month']) { - foreach ($tempFriendlyDayArray as $day) { - if ($day != "") { - if (!$firstDayFound) { - $firstDay = $tempFriendlyDayArray[$i]; - $firstDayFound = true; - } - $currentDay =$tempFriendlyDayArray[$i]; - //get next day - $nextDay = $tempFriendlyDayArray[$i+1]; - $currentDay++; - if ($currentDay != $nextDay) { - if ($firstprint) { - $tempFriendlyTime .= ", "; - } - $currentDay--; - if ($currentDay != $firstDay) { - $tempFriendlyTime .= $dayArray[$firstDay-1] . " - " . $dayArray[$currentDay-1]; - } else { - $tempFriendlyTime .= $dayArray[$firstDay-1]; - } - $firstDayFound = false; - $firstprint = true; - } - $i++; - } - } - } - ?> - <tr> - <td> - <span class="vexpl"><?php echo $tempFriendlyTime; ?></span> - </td> - <td> - <input type='text' readonly='readonly' class='vexpl' name='starttime<?php echo $counter; ?>' id='starttime<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $starttime; ?>' /> - </td> - <td> - <input type='text' readonly='readonly' class='vexpl' name='stoptime<?php echo $counter; ?>' id='stoptime<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $stoptime; ?>' /> - </td> - <td> - <input type='text' readonly='readonly' class='vexpl' name='timedescr<?php echo $counter; ?>' id='timedescr<?php echo $counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?php echo $timedescr; ?>' /> - </td> - <td> - <a onclick='editRow("<?php echo $tempTime; ?>",this); return false;' href='#'><img border='0' src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_e.gif' alt='edit' /></a> - </td> - <td> - <a onclick='removeRow(this); return false;' href='#'><img border='0' src='/themes/<?php echo $g['theme']; ?>/images/icons/icon_x.gif' alt='remove' /></a> - </td> - <td> - <input type='hidden' id='schedule<?php echo $counter; ?>' name='schedule<?php echo $counter; ?>' value='<?php echo $tempID; ?>' /> - </td> - </tr> - <?php - $counter++; - }//end if - } // end foreach - }//end if - ?> - </tbody> - </table> - </td> - </tr> - <tr> - <td width="15%" valign="top"> </td> - <td width="85%"> - <input id="submit" name="submit" type="submit" onclick="return checkForRanges();" class="formbtn" value="<?=gettext("Save"); ?>" /> - <input type="button" class="formbtn" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" /> - <input name="referer" type="hidden" value="<?=$referer;?>" /> - <?php if (isset($id) && $a_schedules[$id]): ?> - <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" /> - <?php endif; ?> - </td> - </tr> - </table> - </td> - </tr> - </table> -</form> -<?php include("fend.inc"); ?> -</body> -</html> +<?php + +include("foot.inc");
\ No newline at end of file |