summaryrefslogtreecommitdiffstats
path: root/src/usr/local/www/firewall_schedule_edit.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/local/www/firewall_schedule_edit.php')
-rw-r--r--src/usr/local/www/firewall_schedule_edit.php1225
1 files changed, 1225 insertions, 0 deletions
diff --git a/src/usr/local/www/firewall_schedule_edit.php b/src/usr/local/www/firewall_schedule_edit.php
new file mode 100644
index 0000000..bec4029
--- /dev/null
+++ b/src/usr/local/www/firewall_schedule_edit.php
@@ -0,0 +1,1225 @@
+<?php
+/*
+ firewall_schedule_edit.php
+*/
+/* ====================================================================
+ * 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
+*/
+
+##|+PRIV
+##|*IDENT=page-firewall-schedules-edit
+##|*NAME=Firewall: Schedules: Edit page
+##|*DESCR=Allow access to the 'Firewall: Schedules: Edit' page.
+##|*MATCH=firewall_schedule_edit.php*
+##|-PRIV
+
+function schedulecmp($a, $b) {
+ return strcmp($a['name'], $b['name']);
+}
+
+function schedule_sort(){
+ global $g, $config;
+
+ if (!is_array($config['schedules']['schedule']))
+ return;
+
+ usort($config['schedules']['schedule'], "schedulecmp");
+}
+
+require("guiconfig.inc");
+require_once("functions.inc");
+require_once("filter.inc");
+require_once("shaper.inc");
+
+$pgtitle = array(gettext("Firewall"),gettext("Schedules"),gettext("Edit"));
+
+$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']))
+ $config['schedules']['schedule'] = array();
+
+$a_schedules = &$config['schedules']['schedule'];
+
+if (is_numericint($_GET['id']))
+ $id = $_GET['id'];
+
+if (isset($_POST['id']) && is_numericint($_POST['id']))
+ $id = $_POST['id'];
+
+if (isset($id) && $a_schedules[$id]) {
+ $pconfig['name'] = $a_schedules[$id]['name'];
+ $pconfig['descr'] = html_entity_decode($a_schedules[$id]['descr']);
+ $pconfig['timerange'] = $a_schedules[$id]['timerange'];
+ $pconfig['schedlabel'] = $a_schedules[$id]['schedlabel'];
+ $getSchedule = true;
+}
+
+if ($_POST) {
+
+ if(strtolower($_POST['name']) == "lan")
+ $input_errors[] = gettext("Schedule may not be named LAN.");
+
+ if(strtolower($_POST['name']) == "wan")
+ $input_errors[] = gettext("Schedule may not be named WAN.");
+
+ 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)
+ $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))
+ 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;
+ $timestr = $_POST['schedule' . $x];
+ $timehourstr = $_POST['starttime' . $x];
+ $timehourstr .= "-";
+ $timehourstr .= $_POST['stoptime' . $x];
+ $timedescrstr = htmlentities($_POST['timedescr' . $x], ENT_QUOTES, 'UTF-8');
+ $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;
+ $schedule['timerange'][$x] = $timeparts;
+ }
+ }
+
+ if (!$timerangeFound)
+ $input_errors[] = gettext("The schedule must have at least one time range configured.");
+
+ if (!$input_errors) {
+
+ if (!empty($pconfig['schedlabel']))
+ $schedule['schedlabel'] = $pconfig['schedlabel'];
+ else
+ $schedule['schedlabel'] = uniqid();
+
+ if (isset($id) && $a_schedules[$id]){
+ $a_schedules[$id] = $schedule;
+ }
+ else{
+ $a_schedules[] = $schedule;
+ }
+
+ schedule_sort();
+
+ if (write_config())
+ filter_configure();
+
+ header("Location: firewall_schedule.php");
+ exit;
+
+ }
+ //we received input errors, copy data to prevent retype
+ else
+ {
+ if (!$_POST['schedule0'])
+ $getSchedule = false;
+ else
+ $getSchedule = true;
+
+ $pconfig['name'] = $schedule['name'];
+ $pconfig['descr'] = $schedule['descr'];
+ $pconfig['timerange'] = $schedule['timerange'];
+ }
+
+}
+
+include("head.inc");
+
+// 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('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 schCounter = 0;
+
+function rgb2hex(rgb) {
+ var parts = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
+
+ 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(){
+ var tempstr, tempstrdaypos, week, daypos, dayposdone = "";
+
+ var dayarray = daysSelected.split(",");
+
+ for (i=0; i<=dayarray.length; i++){
+ tempstr = dayarray[i];
+ tempstrdaypos = tempstr.search("p");
+ week = tempstr.substring(1,tempstrdaypos);
+ week = parseInt(week);
+ dashpos = tempstr.search("-");
+ daypos = tempstr.substring(tempstrdaypos+1, dashpos);
+ daypos = parseInt(daypos);
+
+ daydone = dayposdone.search(daypos);
+ 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);
+
+ dayposdone += daypos + ",";
+ }
+ }
+}
+
+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);
+
+ //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
+ }
+
+ if (dayoriginalpos != "-1") {
+ dayoriginalend = daysSelected.indexOf(',', dayoriginalpos);
+ tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1);
+ daysSelected = daysSelected.replace(tempstr, "");
+ }
+ }
+ }
+}
+
+function daytoggle(id) {
+ var runrepeat, tempstr = "";
+ 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
+ {
+ 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 (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);
+ }
+ 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.forms[0].monthsel.selectedIndex;
+ var selected = document.forms[0].monthsel.options[indexNum].text;
+
+ for (i=0; i<=11; i++){
+ option = document.forms[0].monthsel.options[i].text;
+ document.popupMonthLayer = eval('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;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+function processEntries(){
+ var tempstr, starttimehour, starttimemin, stoptimehour, stoptimemin, errors = "";
+ var passedValidiation = 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.";
+ passedValidiation = false;
+
+ }
+ else if (starttimehour == stoptimehour)
+ {
+ if (starttimemin > stoptimemin){
+ errors = "Error: Start Minute cannot be greater than Stop Minute.";
+ passedValidiation = false;
+ }
+ }
+
+ if (passedValidiation){
+ addTimeRange();
+ }
+ else {
+ if (errors != "")
+ alert(errors);
+ }
+}
+
+function addTimeRange(){
+ var tempdayarray = daysSelected.split(",");
+ var tempstr, tempFriendlyDay, starttimehour, starttimemin, stoptimehour, nrtempFriendlyTime, rtempFriendlyTime, nrtempID, rtempID = "";
+ var stoptimemin, timeRange, tempstrdaypos, week, daypos, day, month, dashpos, nrtempTime, rtempTime, monthstr, daystr = "";
+ rtempFriendlyTime = "";
+ nrtempFriendlyTime = "";
+ nrtempID = "";
+ rtempID = "";
+ nrtempTime = "";
+ rtempTime = "";
+ tempdayarray.sort();
+ rtempFriendlyDay = "";
+ monthstr = "";
+ daystr = "";
+
+ //check for existing entries
+ var findCurrentCounter;
+
+ for (u=0; u<99; u++){
+ findCurrentCounter = document.getElementById("schedule" + u);
+ if (!findCurrentCounter)
+ {
+ schCounter = u;
+ break;
+ }
+ }
+
+ if (daysSelected != ""){
+ //get days selected
+
+ for (i=0; i<tempdayarray.length; i++)
+ {
+ tempstr = tempdayarray[i];
+ if (tempstr != "")
+ {
+ tempstrdaypos = tempstr.search("p");
+ week = tempstr.substring(1,tempstrdaypos);
+ week = parseInt(week);
+ dashpos = tempstr.search("-");
+
+ if (dashpos != "-1")
+ {
+ var nonrepeatingfound = true;
+ daypos = tempstr.substring(tempstrdaypos+1, dashpos);
+ daypos = parseInt(daypos);
+ 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.substr(tempstrdaypos+1);
+ daypos = parseInt(daypos);
+ rtempFriendlyDay += daypos + ",";
+ rtempID += daypos + ",";
+ }
+ }
+ }
+
+ //code below spits out friendly look format for nonrepeating schedules
+ var foundEnd = false;
+ var firstDayFound = false;
+ var firstprint = false;
+ 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)
+ {
+ firstDay = tempFriendlyDayArray[k];
+ firstDay = parseInt(firstDay);
+ firstMonth = tempFriendlyMonthArray[k];
+ firstMonth = parseInt(firstMonth);
+ firstDayFound = true;
+ }
+
+ currentDay = tempFriendlyDayArray[k];
+ currentDay = parseInt(currentDay);
+ //get next day
+ nextDay = tempFriendlyDayArray[k+1];
+ nextDay = parseInt(nextDay);
+ //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
+ foundEnd = false;
+ 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 = 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)
+ 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 (t=0; t<tempsortArray.length; t++)
+ {
+ if (tempsortArray[t] != ""){
+ if (!isFirstdone){
+ rtempID += tempsortArray[t];
+ isFirstdone = true;
+ }
+ else
+ rtempID += "," + tempsortArray[t];
+ }
+ }
+
+ //get time specified
+ starttimehour = document.getElementById("starttimehour").value
+ starttimemin = document.getElementById("starttimemin").value;
+ stoptimehour = document.getElementById("stoptimehour").value;
+ stoptimemin = document.getElementById("stoptimemin").value;
+
+ timeRange = "||" + starttimehour + ":";
+ timeRange += starttimemin + "-";
+ timeRange += stoptimehour + ":";
+ timeRange += stoptimemin;
+
+ //get description for time range
+ var tempdescr = document.getElementById("timerangedescr").value
+
+ if (nonrepeatingfound){
+ nrtempTime += nrtempID;
+ //add time ranges
+ nrtempTime += timeRange;
+ //add description
+ nrtempTime += "||" + tempdescr;
+ insertElements(nrtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, nrtempTime, nrtempID);
+ }
+
+ if (repeatingfound){
+ rtempTime += rtempID;
+ //add time ranges
+ rtempTime += timeRange;
+ //add description
+ rtempTime += "||" + tempdescr;
+ insertElements(rtempFriendlyTime, starttimehour, starttimemin, stoptimehour, stoptimemin, tempdescr, rtempTime, rtempID);
+ }
+
+ }
+ else
+ {
+ //no days were selected, alert user
+ alert ("You must select at least 1 day before adding time");
+ }
+}
+
+function clearCalendar(){
+ var tempstr, daycell = "";
+ //clear days selected
+ daysSelected = "";
+ //loop through all 52 weeks
+ for (j=1; j<=53; j++)
+ {
+ //loop through all 7 days
+ for (k=1; k<8; k++){
+ tempstr = 'w' + j + 'p' + k;
+ daycell = eval('document.getElementById(tempstr)');
+ if (daycell != null){
+ daycell.style.backgroundColor = "#FFFFFF"; // white
+ }
+ }
+ }
+}
+
+function clearTime(){
+ document.getElementById("starttimehour").value = "0";
+ document.getElementById("starttimemin").value = "00";
+ document.getElementById("stoptimehour").value = "23";
+ document.getElementById("stoptimemin").value = "59";
+}
+
+function clearDescr(){
+ document.getElementById("timerangedescr").value = "";
+}
+
+var counter = -1;
+
+// 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;
+
+ if(counter < 0) {
+ counter = <?php if(!isset($counter)) echo '0'; else echo $counter ?>;
+ rows_displayed = counter;
+ }
+
+ // 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++;
+
+ //reset calendar and time and descr
+ clearCalendar();
+ clearTime();
+ clearDescr();
+}
+
+// If only everything were this simple
+function delete_row(row) {
+ $('.schedulegrp' + row).remove();
+}
+//]]>
+</script>
+
+<?php
+
+include("foot.inc"); \ No newline at end of file
OpenPOWER on IntegriCloud