%PDF- %PDF-
Direktori : /backups/router/usr/local/www/ |
Current File : //backups/router/usr/local/www/firewall_schedule_edit.php |
<?php /* * Copyright (C) 2018 Fabian Franz * Copyright (C) 2014-2015 Deciso B.V. * Copyright (C) 2004 Scott Ullrich <sullrich@gmail.com> * 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. */ require_once("guiconfig.inc"); require_once("filter.inc"); /****f* legacy/is_schedule_inuse * NAME * checks to see if a schedule is currently in use by a rule * INPUTS * * RESULT * true or false * NOTES * ******/ function is_schedule_inuse($schedule) { global $config; if ($schedule == '') { return false; } /* loop through firewall rules looking for schedule in use */ if (isset($config['filter']['rule'])) { foreach ($config['filter']['rule'] as $rule) { if ($rule['sched'] == $schedule) { return true; } } } return false; } function schedule_sort() { global $config; if (!isset($config['schedules']['schedule'])) { return; } usort($config['schedules']['schedule'], function ($a, $b) { return strcmp($a['name'], $b['name']); }); } $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')); $a_schedules = &config_read_array('schedules', 'schedule'); if ($_SERVER['REQUEST_METHOD'] === 'GET') { // input record id, if valid if (!empty($_GET['name'])) { foreach ($a_schedules as $i => $sched) { if ($sched['name'] == $_GET['name']) { $id = $i; $configId = $id; break; } } } elseif (isset($_GET['dup']) && isset($a_schedules[$_GET['dup']])) { $configId = $_GET['dup']; } elseif (isset($_GET['id']) && isset($a_schedules[$_GET['id']])) { $id = $_GET['id']; $configId = $id; } $pconfig['name'] = $a_schedules[$configId]['name']; $pconfig['descr'] = $a_schedules[$configId]['descr']; $pconfig['timerange'] = isset($a_schedules[$configId]['timerange']) ? $a_schedules[$configId]['timerange'] : array(); } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { $input_errors = array(); if (isset($_POST['id']) && isset($a_schedules[$_POST['id']])) { $id = $_POST['id']; } $pconfig = $_POST; // validate if (strtolower($pconfig['name']) == 'lan') { $input_errors[] = gettext('Schedule may not be named LAN.'); } if (strtolower($pconfig['name']) == 'wan') { $input_errors[] = gettext('Schedule may not be named WAN.'); } if (empty($pconfig['name'])) { $input_errors[] = gettext('Schedule may not use a blank name.'); } if (!preg_match('/^[a-zA-Z0-9_\-]{1,32}$/', $pconfig['name'])) { $input_errors[] = sprintf(gettext('The schedule name must be less than 32 characters long and may only consist of the following characters: %s'), 'a-z, A-Z, 0-9, _'); } /* check for name conflicts */ foreach ($a_schedules as $schedId => $schedule) { if ((!isset($id) || $schedId != $id) && $schedule['name'] == $pconfig['name']) { $input_errors[] = gettext("A Schedule with this name already exists."); break; } } // parse time ranges $pconfig['timerange'] = array(); $timerangeFound = false; for ($x=0; $x<99; $x++){ if($pconfig['schedule' . $x]) { if (!preg_match('/^[0-9]+:[0-9]+$/', $pconfig['starttime' . $x])) { $input_errors[] = sprintf(gettext("Invalid start time - '%s'"), $pconfig['starttime' . $x]); continue; } if (!preg_match('/^[0-9]+:[0-9]+$/', $pconfig['stoptime' . $x])) { $input_errors[] = sprintf(gettext("Invalid stop time - '%s'"), $pconfig['stoptime' . $x]); continue; } $timerangeFound = true; $timeparts = array(); $firstprint = false; $timestr = $pconfig['schedule' . $x]; $timehourstr = $pconfig['starttime' . $x]; $timehourstr .= "-"; $timehourstr .= $pconfig['stoptime' . $x]; $timedescrstr = $pconfig['timedescr' . $x]; $dashpos = strpos($timestr, '-'); if ($dashpos === false) { $timeparts['position'] = $timestr; } else { $tempindarray = array(); $monthstr = ""; $daystr = ""; $tempindarray = explode(",", $timestr); foreach ($tempindarray as $currentselection) { if ($currentselection){ if ($firstprint) { $monthstr .= ","; $daystr .= ","; } $tempstr = ""; $monthpos = strpos($currentselection, "m"); $daypos = strpos($currentselection, "d"); $monthstr .= substr($currentselection, $monthpos+1, $daypos-$monthpos-1); $daystr .= substr($currentselection, $daypos+1); $firstprint = true; } } $timeparts['month'] = $monthstr; $timeparts['day'] = $daystr; } $timeparts['hour'] = $timehourstr; $timeparts['rangedescr'] = $timedescrstr; $pconfig['timerange'][$x] = $timeparts; } } if (count($pconfig['timerange']) == 0) { $input_errors[] = gettext("The schedule must have at least one time range configured."); } if (count($input_errors) == 0) { $schedule = array(); $schedule['name'] = $pconfig['name']; $schedule['descr'] = $pconfig['descr']; $schedule['timerange'] = $pconfig['timerange']; if (isset($id)) { $a_schedules[$id] = $schedule; } else { $a_schedules[] = $schedule; } schedule_sort(); write_config(); filter_configure(); header(url_safe('Location: /firewall_schedule.php')); exit; } } legacy_html_escape_form_data($pconfig); include("head.inc"); ?> <body> <script> //<![CDATA[ var daysSelected = ""; var month_array = <?= json_encode($monthArray) ?>; var day_array = <?= json_encode($dayArray) ?>; var schCounter = 0; function repeatExistingDays(){ var tempstr, tempstrdaypos, week, daypos, dayposdone = ""; var dayarray = daysSelected.split(","); for (let i=0; i<=dayarray.length; i++){ tempstr = dayarray[i]; tempstrdaypos = tempstr.search("p"); week = tempstr.substring(1,tempstrdaypos); week = parseInt(week); const dashpos = tempstr.search("-"); daypos = tempstr.substring(tempstrdaypos+1, dashpos); daypos = parseInt(daypos); const daydone = dayposdone.search(daypos); tempstr = 'w' + week + 'p' + daypos; const daycell = document.getElementById(tempstr); if (daydone == "-1"){ if (daycell.dataset['state'] == "lightcoral") daytogglerepeating(week,daypos,true); else daytogglerepeating(week,daypos,false); dayposdone += daypos + ","; } } } function daytogglerepeating(week,daypos,bExists){ var tempstr, daycell, dayoriginal = ""; for (let j=1; j<=53; j++) { tempstr = 'w' + j + 'p' + daypos; daycell = document.getElementById(tempstr); const 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.dataset['state'] = "white"; } else { daycell.dataset['state'] = "lightcoral"; } if (dayoriginalpos != "-1") { const dayoriginalend = daysSelected.indexOf(',', dayoriginalpos); tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1); daysSelected = daysSelected.replace(tempstr, ""); } } } } function daytoggle(id) { var runrepeat, tempstr = ""; var bFoundValid = false; const iddashpos = id.search("-"); var tempstrdaypos = id.search("p"); var week = id.substring(1,tempstrdaypos); week = parseInt(week); let idmod; if (iddashpos == "-1") { idmod = id; runrepeat = true; var daypos = id.substring(tempstrdaypos+1); } else { idmod = id.substring(0,iddashpos); var daypos = id.substring(tempstrdaypos+1,iddashpos); } daypos = parseInt(daypos); while (!bFoundValid){ var daycell = document.getElementById(idmod); if (daycell != null){ if (daycell.dataset['state'] == "red"){ // red daycell.dataset['state'] = "white"; let str = id + ","; daysSelected = daysSelected.replace(str, ""); } else if (daycell.dataset['state'] == "lightcoral") { daytogglerepeating(week,daypos,true); } else //color is white cell { if (!runrepeat) { daycell.dataset['state'] = "red"; // red } else { daycell.dataset['state'] = "lightcoral"; daytogglerepeating(week,daypos,false); } daysSelected += id + ","; } bFoundValid = true; } else { //we found an invalid cell when column was clicked, move up to the next week week++; tempstr = "w" + week + "p" + daypos; idmod = tempstr; } } } function update_month(){ var indexNum = document.iform.monthsel.selectedIndex; var selected = document.iform.monthsel.options[indexNum].text; for (let month = 0; month < 12; month++){ let option = document.iform.monthsel.options[month].text; document.popupMonthLayer = document.getElementById(option); if(selected == option) { document.popupMonthLayer.style.display="block"; } else document.popupMonthLayer.style.display="none"; } } function checkForRanges(){ if (daysSelected !== '') { alert("You have not saved the specified time range. Please click 'Add Time' button to save the time range."); return false; } return true; } function processEntries(){ var tempstr, starttimehour, starttimemin, stoptimehour, stoptimemin, errors = ""; var passedValidation = true; //get time specified starttimehour = parseInt(document.getElementById("starttimehour").value); starttimemin = parseInt(document.getElementById("starttimemin").value); stoptimehour = parseInt(document.getElementById("stoptimehour").value); stoptimemin = parseInt(document.getElementById("stoptimemin").value); //do time checks if (starttimehour > stoptimehour) { errors = "Error: Start Hour cannot be greater than Stop Hour."; passedValidation = false; } else if (starttimehour == stoptimehour) { if (starttimemin > stoptimemin){ errors = "Error: Start Minute cannot be greater than Stop Minute."; passedValidation = false; } } if (passedValidation){ addTimeRange(); } else { if (errors != "") alert(errors); } } function addTimeRange(){ var tempdayarray = daysSelected.split(","), tempstr, nrtempFriendlyTime = '', rtempFriendlyTime = '', nrtempID = '', rtempID = "", tempstrdaypos, week, daypos, day, month, dashpos, monthstr = '', daystr = "", rtempFriendlyDay = "", findCurrentCounter, nonrepeatingfound; tempdayarray.sort(); //check for existing entries for (var u=0; u<99; u++){ findCurrentCounter = document.getElementById("schedule" + u); if (!findCurrentCounter) { schCounter = u; break; } } if (daysSelected != ""){ //get days selected for (let i=0; i<tempdayarray.length; i++) { tempstr = tempdayarray[i]; if (tempstr != "") { tempstrdaypos = tempstr.search("p"); week = parseInt(tempstr.substring(1, tempstrdaypos)); dashpos = tempstr.search("-"); if (dashpos != "-1") { nonrepeatingfound = true; daypos = tempstr.substring(tempstrdaypos+1, dashpos); daypos = parseInt(daypos); let monthpos = tempstr.search("m"); tempstrdaypos = tempstr.search("d"); month = tempstr.substring(monthpos+1, tempstrdaypos); month = parseInt(month); day = tempstr.substring(tempstrdaypos+1); day = parseInt(day); monthstr += month + ","; daystr += day + ","; nrtempID += tempstr + ","; } else { var repeatingfound = true; daypos = tempstr.substring(tempstrdaypos+1); daypos = parseInt(daypos); rtempFriendlyDay += daypos + ","; rtempID += daypos + ","; } } } //code below spits out friendly look format for nonrepeating schedules var firstDayFound = false; var firstprint = false; var tempFriendlyMonthArray = monthstr.split(","); var tempFriendlyDayArray = daystr.split(","); var currentDay, firstDay, nextDay, firstMonth = 0; for (var k=0; k<tempFriendlyMonthArray.length; k++){ tempstr = tempFriendlyMonthArray[k]; if (tempstr != ""){ if (!firstDayFound) { firstDay = parseInt(tempFriendlyDayArray[k]); firstMonth = parseInt(tempFriendlyMonthArray[k]); firstDayFound = true; } currentDay = parseInt(tempFriendlyDayArray[k]); //get next day nextDay = parseInt(tempFriendlyDayArray[k+1]); //get next month currentDay++; if ((currentDay != nextDay) || (tempFriendlyMonthArray[k] != tempFriendlyMonthArray[k+1])){ if (firstprint) nrtempFriendlyTime += ", "; currentDay--; if (currentDay != firstDay) { nrtempFriendlyTime += month_array[firstMonth-1] + " " + firstDay + "-" + currentDay; } else { nrtempFriendlyTime += month_array[firstMonth-1] + " " + currentDay; } firstDayFound = false; firstprint = true; } } } //code below spits out friendly look format for repeating schedules firstDayFound = false; firstprint = false; tempFriendlyDayArray = rtempFriendlyDay.split(","); tempFriendlyDayArray.sort(); currentDay, firstDay, nextDay = ""; for (k=0; k<tempFriendlyDayArray.length; k++){ tempstr = tempFriendlyDayArray[k]; if (tempstr != ""){ if (!firstDayFound) { firstDay = parseInt(tempFriendlyDayArray[k]); firstDayFound = true; } currentDay = parseInt(tempFriendlyDayArray[k]); //get next day nextDay = parseInt(tempFriendlyDayArray[k+1]); currentDay++; if (currentDay != nextDay){ if (firstprint) { rtempFriendlyTime += ", "; } currentDay--; if (currentDay != firstDay) { rtempFriendlyTime += day_array[firstDay-1] + " - " + day_array[currentDay-1]; } else { rtempFriendlyTime += day_array[firstDay-1]; } firstDayFound = false; firstprint = true; } } } //sort the tempID var tempsortArray = rtempID.split(","); var isFirstdone = false; tempsortArray.sort(); //clear tempID rtempID = ""; for (let t=0; t<tempsortArray.length; t++) { if (tempsortArray[t] !== ''){ if (!isFirstdone){ rtempID += tempsortArray[t]; isFirstdone = true; } else rtempID += "," + tempsortArray[t]; } } //get time specified const starttimehour = $('#starttimehour').val(); const starttimemin = $('#starttimemin').val(); const stoptimehour = $('#stoptimehour').val(); const stoptimemin = $('#stoptimemin').val(); //get description for time range const time_description = $('#timerangedescr').val(); if (nonrepeatingfound){ insertElements( nrtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, time_description, nrtempID ); } if (repeatingfound){ insertElements( rtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, time_description, rtempID ); } } else { //no days were selected, alert user alert ("You must select at least 1 day before adding time"); } } function insertElements(label, start_hour, start_min, stop_hour, stop_min, description, days) { const css = 'word-wrap: break-word; width: 100%; border: 0;'; const tr = $('<tr></tr>'); tr.append(`<td><span>${label}</span></td>`); tr.append(`<td><input type="text" readonly="readonly" id="starttime${schCounter}" name="starttime${schCounter}" style="${css}" value="${start_hour}:${start_min}" /></td>`); tr.append(`<td><input type="text" readonly="readonly" id="stoptime${schCounter}" name="stoptime${schCounter}" style="${css}" value="${stop_hour}:${stop_min}" /></td>`); const range_desc = $(`<input type="text" readonly="readonly" id="timedescr${schCounter}" name="timedescr${schCounter}" style="${css}" />`); range_desc.val(description); $('<td></td>').append(range_desc).appendTo(tr); tr.append(`<td><a onclick="return editRow.bind(this)(${schCounter})" href="#" class="btn btn-default"><span class="fa fa-pencil fa-fw"></span></a></td>`); tr.append(`<td><a onclick="return removeRow.bind(this)()" href="#" class="btn btn-default"><span class="fa fa-trash fa-fw"></span></a></td>`); tr.append(`<td><input type="hidden" id="schedule${schCounter}" name="schedule${schCounter}" value="${days}" /></td>`); //add it to the schedule list $('#scheduletable tbody').append(tr); //reset calendar and time and descr clearCalendar(); clearTime(); clearDescr(); } function clearCalendar(){ var tempstr, daycell = ""; //clear days selected daysSelected = ""; //loop through all 53 weeks for (let week=1; week<=53; week++) { //loop through all 7 days for (let day = 1; day <= 7; day++){ tempstr = 'w' + week + 'p' + day; daycell = document.getElementById(tempstr); if (daycell != null){ daycell.dataset['state'] = "white"; } } } const month_sel = $('#monthsel'); month_sel.selectpicker('val', month_sel.prop('options')[0].value); update_month(); } function clearTime() { $('#starttimehour').selectpicker('val', '0'); $('#starttimemin').selectpicker('val', '00'); $('#stoptimehour').selectpicker('val', '23'); $('#stoptimemin').selectpicker('val', '59'); } function clearDescr(){ $('#timerangedescr').val(''); } function editRow(row_num) { if (!checkForRanges()) return false; //reset calendar and time clearCalendar(); clearTime(); let start_hour, start_min, stop_hour, stop_min; [start_hour, start_min] = $(`#starttime${row_num}`).val().split(':'); [stop_hour, stop_min] = $(`#stoptime${row_num}`).val().split(':'); $('#starttimehour').selectpicker('val', start_hour); $('#starttimemin').selectpicker('val', start_min); $('#stoptimehour').selectpicker('val', stop_hour); $('#stoptimemin').selectpicker('val', stop_min); $('#timerangedescr').val($(`#timedescr${row_num}`).val()); let days = $(`#schedule${row_num}`).val(); let first_selected_month = days.search('m'); if (first_selected_month !== -1) { first_selected_month = days.substring(first_selected_month); first_selected_month = first_selected_month.split('d')[0].slice(1); $('#monthsel').selectpicker('val', first_selected_month); update_month(); } days = days.split(','); //toggle the appropriate days days.forEach(function(day) { if (!day) return; if (day.search('-') === -1) { daytoggle(`w2p${day}`); return; } daytoggle(day); }); return removeRownoprompt.bind(this)(); } function removeRownoprompt() { $(this).closest('tr').remove(); return false; } function removeRow() { if (!confirm("Do you really want to delete this time range?")) return false; return removeRownoprompt.bind(this)(); } $(function() { // XXX Workaround: hook_stacked_form_tables breaks CSS query otherwise $('#iform td').css({ 'background-color' : '' }); }); //]]> </script> <?php include("fbegin.inc"); echo $jscriptstr; ?> <section class="page-content-main"> <div class="container-fluid"> <div class="row"> <?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?> <section class="col-xs-12"> <div class="content-box tab-content"> <form method="post" name="iform" id="iform"> <table class="table table-striped opnsense_standard_table_form"> <tbody> <tr> <td style="width:15%"><strong><?=gettext("Schedule information");?></strong></td> <td style="width:85%; text-align:right"> <small><?=gettext("full help"); ?> </small> <i class="fa fa-toggle-off text-danger" style="cursor: pointer;" id="show_all_help_page"></i> </td> </tr> <tr> <td><i class="fa fa-info-circle text-muted"></i> <?= gettext('Name') ?></td> <td> <?php if (is_schedule_inuse($pconfig['name']) && isset($id)): ?> <input name="name" type="hidden" id="name" value="<?=htmlspecialchars($pconfig['name']);?>" /> <?=$pconfig['name']; ?> <p> <?=gettext("This schedule is in use so the name may not be modified!");?> </p> <?php else: ?> <input name="name" type="text" id="name" value="<?=$pconfig['name'];?>" /> <?php endif; ?> </td> </tr> <tr> <td><a id="help_for_description" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Description");?></td> <td> <input name="descr" type="text" id="descr" value="<?=$pconfig['descr'];?>" /><br /> <div class="hidden" data-for="help_for_name"> <?=gettext("You may enter a description here for your reference (not parsed).");?> </div> </td> </tr> <tr> <td><a id="help_for_month" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Month");?></td> <td> <select name="monthsel" class="selectpicker" data-width="auto" data-live-search="true" id="monthsel" onchange="update_month();"> <?php $monthcounter = date("n"); $monthlimit = $monthcounter + 12; $yearcounter = date("Y"); for ($k=0; $k<12; $k++){?> <option value="<?= $monthcounter;?>"><?=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="<?=date("F_y",mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?>" style=" position:relative; display:<?= $firstmonth ? "block" : "none";?>"> <table id="calTable<?=$monthcounter . $yearcounter;?>" class="table table-condensed table-bordered"> <thead> <tr><td colspan="7" style="text-align:center"><?= date("F_Y", mktime(0, 0, 0, date($monthcounter), 1, date($yearcounter)));?></td></tr> <tr> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p1');"><u><?=gettext("Mon");?></u></td> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p2');"><u><?=gettext("Tue");?></u></td> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p3');"><u><?=gettext("Wed");?></u></td> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p4');"><u><?=gettext("Thu");?></u></td> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p5');"><u><?=gettext("Fri");?></u></td> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p6');"><u><?=gettext("Sat");?></u></td> <td style="text-align:center; cursor: pointer;" onclick="daytoggle('w1p7');"><u><?=gettext("Sun");?></u></td> </tr> </thead> <tbody> <?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 style="text-align:center; cursor: pointer;" 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 style="text-align:center; cursor: pointer;" id="w<?=$weekcounter;?>p<?=$positioncounter;?>" onclick="daytoggle('w<?=$weekcounter;?>p<?=$positioncounter;?>-m<?=$monthcounter;?>d<?=$daycounter;?>');"> <?php echo $daycounter; $daycounter++; echo "</td>"; } else { echo "<td style=\"text-align:center\"></td>"; } if ($positioncounter == 7 || $daycounter > $numberofdays) { $positioncounter = 1; echo "</tr>"; } else { $positioncounter++; } }//end while loop?> </tbody> </table> </div> <?php if ($monthcounter == 12) { $monthcounter = 1; $yearcounter++; } else { $monthcounter++; } } //end for loop ?> <div class="hidden" data-for="help_for_month"> <br /> <?=gettext("Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday.");?> </div> </td> </tr> <tr> <td><a id="help_for_time" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Time");?></td> <td> <table class="tabcont"> <tr> <td><?=gettext("Start Time");?></td> <td><?=gettext("Stop Time");?></td> </tr> <tr> <td> <div class="input-group"> <select name="starttimehour" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" id="starttimehour"> <?php for ($i=0; $i<24; $i++):?> <option value="<?=$i;?>"><?=$i;?> </option> <?php endfor; ?> </select> <select name="starttimemin" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" 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> </div> </td> <td> <div class="input-group"> <select name="stoptimehour" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" id="stoptimehour"> <?php for ($i=0; $i<24; $i++):?> <option value="<?=$i;?>"><?=$i;?> </option> <?php endfor; ?> </select> <select name="stoptimemin" class="selectpicker form-control" data-width="auto" data-size="5" data-live-search="true" 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> </div> </td> </tr> </table> <div class="hidden" data-for="help_for_time"> <br /> <?=gettext("Select the time range for the day(s) selected on the Month(s) above. A full day is 0:00-23:59.")?> </div> </td> </tr> <tr> <td><a id="help_for_timerange_desc" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Time Range Description")?></td> <td> <input name="timerangedescr" type="text" id="timerangedescr"/> <div class="hidden" data-for="help_for_timerange_desc"> <?=gettext("You may enter a description here for your reference (not parsed).")?> </div> </td> </tr> <tr> <td> </td> <td> <input type="button" value="<?= html_safe(gettext('Add Time')) ?>" class="btn btn-default" onclick="javascript:processEntries();" /> <input type="button" value="<?= html_safe(gettext('Clear Selection')) ?>" class="btn btn-default" onclick="javascript:clearCalendar(); clearTime(); clearDescr();" /> </td> </tr> <tr> <th colspan="2"><?= gettext('Schedule repeat') ?></th> </tr> <tr> <td><?=gettext("Configured Ranges");?></td> <td> <table id="scheduletable"> <tbody> <tr> <td style="width:35%"><?=gettext("Day(s)");?></td> <td style="width:12%"><?=gettext("Start Time");?></td> <td style="width:11%"><?=gettext("Stop Time");?></td> <td style="width:42%"><?=gettext("Description");?></td> </tr> <?php if (isset($pconfig['timerange'])){ $counter = 0; foreach($pconfig['timerange'] as $timerange) { $tempFriendlyTime = ""; $days = ""; 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 (!empty($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) { $days .= ","; } $days .= "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']; $days = $dayFriendly; } //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 (empty($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><?=$tempFriendlyTime; ?></span> </td> <td> <input type='text' readonly='readonly' name='starttime<?=$counter; ?>' id='starttime<?=$counter; ?>' style='word-wrap:break-word; width:100%; border:0;' value='<?=$starttime; ?>' /> </td> <td> <input type='text' readonly='readonly' name='stoptime<?=$counter; ?>' id='stoptime<?=$counter; ?>' style='word-wrap:break-word; width:100%; border:0;' value='<?=$stoptime; ?>' /> </td> <td> <input type='text' readonly='readonly' name='timedescr<?=$counter; ?>' id='timedescr<?=$counter; ?>' class="range-description" style='word-wrap:break-word; width:100%; border:0;' value='<?=$timedescr; ?>' /> </td> <td> <a onclick="return editRow.bind(this)(<?= $counter ?>)" href="#" class="btn btn-default"><span class="fa fa-pencil fa-fw"></span></a> </td> <td> <a onclick="return removeRow.bind(this)()" href="#" class="btn btn-default"><span class="fa fa-trash fa-fw"></span></a> </td> <td> <input type='hidden' id='schedule<?=$counter; ?>' name='schedule<?=$counter; ?>' value='<?=$days; ?>' /> </td> </tr> <?php $counter++; }//end if } // end foreach }//end if ?> </tbody> </table> </td> </tr> <tr> <td> </td> <td> <input id="submit" name="submit" type="submit" onclick="return checkForRanges();" class="btn btn-primary" value="<?=html_safe(gettext('Save')); ?>" /> <input type="button" class="btn btn-default" value="<?=html_safe(gettext('Cancel'));?>" onclick="window.location.href='/firewall_schedule.php'" /> <?php if (isset($id)): ?> <input name="id" type="hidden" value="<?=$id;?>" /> <?php endif; ?> </td> </tr> </tbody> </table> </form> </div> </section> </div> </div> </section> <?php include("foot.inc"); ?>