commit 016231d088f72d1e7acd2a05c0f7cab2b468047c
Author: Stephen Beaver <sbeaver@netgate.com>
Date:   Thu Aug 20 11:26:40 2015 -0400

    Bug 4964 Fixed
    
    Most of the page and all of the Javascript revised.

diff --git a/usr/local/www/firewall_schedule.php b/usr/local/www/firewall_schedule.php
index 2e587c70cd..f3e20627a6 100644
--- a/usr/local/www/firewall_schedule.php
+++ b/usr/local/www/firewall_schedule.php
@@ -3,56 +3,56 @@
 	firewall_schedule.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>
+ *	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: 
+ *	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.
+ *	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. 
+ *	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/). 
+ *	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.
+ *	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.
+ *	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:
+ *	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 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.
+ *	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.
  *
- *  ====================================================================
+ *	====================================================================
  *
  */
 /*
@@ -101,7 +101,7 @@ if ($_GET['act'] == "del") {
 		}
 
 		if ($is_schedule_referenced == true) {
-			$savemsg = sprintf(gettext("Cannot delete Schedule.  Currently in use by %s"), $referenced_by);
+			$savemsg = sprintf(gettext("Cannot delete Schedule.	 Currently in use by %s"), $referenced_by);
 		} else {
 			unset($a_schedules[$_GET['id']]);
 			write_config();
@@ -255,7 +255,7 @@ foreach ($a_schedules as $schedule):
 					</td>
 
 					<td>
-						<a href="firewall_schedule_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit alias")?></a>
+						<a href="firewall_schedule_edit.php?id=<?=$i?>" class="btn btn-xs btn-info"><?=gettext("Edit")?></a>
 						<a href="firewall_schedule.php?act=del&amp;id=<?=$i?>" class="btn btn-xs btn-danger"><?=gettext("Delete")?></a>
 
 					</td>
diff --git a/usr/local/www/firewall_schedule_edit.php b/usr/local/www/firewall_schedule_edit.php
index 060f8de301..bec4029650 100644
--- a/usr/local/www/firewall_schedule_edit.php
+++ b/usr/local/www/firewall_schedule_edit.php
@@ -3,60 +3,60 @@
 	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>
+ *	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: 
+ *	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.
+ *	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. 
+ *	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/). 
+ *	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.
+ *	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.
+ *	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:
+ *	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 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.
+ *	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
@@ -98,6 +98,7 @@ $a_schedules = &$config['schedules']['schedule'];
 
 if (is_numericint($_GET['id']))
 	$id = $_GET['id'];
+
 if (isset($_POST['id']) && is_numericint($_POST['id']))
 	$id = $_POST['id'];
 
@@ -110,11 +111,13 @@ if (isset($id) && $a_schedules[$id]) {
 }
 
 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.");
 
@@ -125,7 +128,7 @@ if ($_POST) {
 		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))
@@ -136,26 +139,26 @@ if ($_POST) {
 			break;
 		}
 	}
-	
+
 	$schedule = array();
-	
+
 	$schedule['name'] = $_POST['name'];
-	$schedule['descr'] = htmlentities($_POST['descr'], ENT_QUOTES, 'UTF-8');	
-	
+	$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;
@@ -163,9 +166,9 @@ if ($_POST) {
 			$timehourstr = $_POST['starttime' . $x];
 			$timehourstr .= "-";
 			$timehourstr .= $_POST['stoptime' . $x];
-			$timedescrstr = htmlentities($_POST['timedescr' . $x], ENT_QUOTES, 'UTF-8'); 
+			$timedescrstr = htmlentities($_POST['timedescr' . $x], ENT_QUOTES, 'UTF-8');
 			$dashpos = strpos($timestr, '-');
-			
+
 			if ($dashpos === false)
 			{
 				$timeparts['position'] = $timestr;
@@ -182,32 +185,32 @@ if ($_POST) {
 						if ($firstprint)
 						{
 							$monthstr .= ",";
-							$daystr .= ",";						
+							$daystr .= ",";
 						}
 						$tempstr = "";
 						$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)
 		$input_errors[] = gettext("The schedule must have at least one time range configured.");
-		
-	if (!$input_errors) {		
-		
+
+	if (!$input_errors) {
+
 		if (!empty($pconfig['schedlabel']))
 			$schedule['schedlabel'] = $pconfig['schedlabel'];
 		else
@@ -219,15 +222,15 @@ if ($_POST) {
 		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
@@ -236,49 +239,49 @@ if ($_POST) {
 			$getSchedule = false;
 		else
 			$getSchedule = true;
-			
+
 		$pconfig['name'] = $schedule['name'];
 		$pconfig['descr'] = $schedule['descr'];
 		$pconfig['timerange'] = $schedule['timerange'];
-	}	
+	}
 
 }
-include("head.inc");
 
+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						
-										
+		$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 .= '" >';   
-		
-		$mostr .= 
-		   	'<table class="table table-condensed" border="1" cellspacing="1" cellpadding="1" id="calTable' . $monthcounter . $yearcounter . '" >
+
+		$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>
@@ -287,26 +290,26 @@ function build_date_table() {
 					<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(\'w1p6\');">' . gettext("Sat") . '</th>
 					<th class="text-center" style="cursor: pointer;" onclick="daytoggle(\'w1p7\');">' . gettext("Sun") . '</th>
 				</tr>
 				</thead>
 				<tbody>' . "\r\n";
 
-				$firstmonth = FALSE;		
+				$firstmonth = FALSE;
 
-				while ($daycounter<=$numberofdays) {					
-					$weekcounter =  date("W", mktime(0, 0, 0, date($monthcounter), date($daycounter), date($yearcounter)));
+				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";
-										
+						$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>";
@@ -320,7 +323,7 @@ function build_date_table() {
 					{
 						$mostr .= '<td class="text-center"></td>';
 					}
-					
+
 					if ($positioncounter == 7 || $daycounter > $numberofdays){
 						$positioncounter = 1;
 						$mostr .= "</tr>";
@@ -328,12 +331,13 @@ function build_date_table() {
 					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;
@@ -342,25 +346,25 @@ function build_date_table() {
 		else
 		{
 			$monthcounter++;
-		}		
-		
-	$tblstr .= $mostr;			
+		}
+
+	$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++;
@@ -368,15 +372,15 @@ function build_month_list() {
 		else
 		{
 			$monthcounter++;
-		}	
+		}
 	}
-	
+
 	return($list);
 }
 
 if ($input_errors)
 	print_input_errors($input_errors);
-	
+
 require('classes/Form.class.php');
 
 $form = new Form();
@@ -394,8 +398,8 @@ $input->setHelp((is_schedule_inuse($pconfig['name']) != true) ? 'The name of the
 																'This schedule is in use so the name may not be modified!');
 
 if(is_schedule_inuse($pconfig['name']) == true)
-	$input->setReadonly();																
-															
+	$input->setReadonly();
+
 $section->addInput($input);
 
 $section->addInput(new Form_Input(
@@ -415,7 +419,7 @@ $section->addInput(new Form_Select(
 $section->addInput(new Form_StaticText(
 	'Date',
 	 build_date_table()
-))->setHelp('Click individual date to select that date only. Click the appropriate weekday Header to select all occurrences of that weekday. ');
+));
 
 $group = new Form_Group('Time');
 
@@ -469,10 +473,8 @@ $group->add(new Form_Button(
 	'btnclrsel',
 	'Clear selection'
 ))->removeClass('btn-primary')->addClass('btn-default btn-sm');
-	
+
 $section->add($group);
-	
-$form->add($section);
 
 if (isset($id) && $a_schedules[$id]) {
 	$section->addInput(new Form_Input(
@@ -480,791 +482,743 @@ if (isset($id) && $a_schedules[$id]) {
 		null,
 		'hidden',
 		$id
-	));	
+	));
 }
-					  
-print($form);	
+
+$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() {
+	$('#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() {
+	});
+
+	// 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, "");
-				}				
-			}			
-		}	
+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);
 	}
-	
-	function daytoggle(id) {
-		var runrepeat, tempstr = "";
-		var bFoundValid = false;
-		
-		iddashpos = id.search("-");
-		
-		var tempstrdaypos = id.search("p");
-		var week = id.substring(1,tempstrdaypos);
-		
+
+	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);
-		
-		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);
-		}
-		
+		dashpos = tempstr.search("-");
+		daypos = tempstr.substring(tempstrdaypos+1, dashpos);
 		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;
+
+		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
 			{
-				//we found an invalid cell when column was clicked, move up to the next week
-				week++;
-				tempstr = "w" + week + "p" + daypos;
-				idmod = tempstr;			
+				daycell.style.backgroundColor = "#F08080";	// lightcoral
+			}
+
+			if (dayoriginalpos != "-1") {
+				dayoriginalend = daysSelected.indexOf(',', dayoriginalpos);
+				tempstr = daysSelected.substring(dayoriginalpos, dayoriginalend+1);
+				daysSelected = daysSelected.replace(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 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);
 	}
-	
-	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;
-		}
+	else
+	{
+		idmod = id.substring(0,iddashpos);
+		var daypos = id.substring(tempstrdaypos+1,iddashpos);
 	}
-	
-	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;
+
+	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, "");
 			}
-		}	
-			
-		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)
+			else if (rgb2hex(daycell.style.backgroundColor) == "#F08080")  // lightcoral
 			{
-				schCounter = u;
-				break;
+				daytogglerepeating(week,daypos,true);
 			}
-		}
-		
-		if (daysSelected != ""){
-			//get days selected
-			
-			for (i=0; i<tempdayarray.length; i++)
+			else //color is white cell
 			{
-				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;			
-					}
+				if (!runrepeat)
+				{
+					daycell.style.backgroundColor = "#FF0000";	// red
 				}
-			}			
-			
-			//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];
+				else
+				{
+					daycell.style.backgroundColor = "#F08080";	// lightcoral
+					daytogglerepeating(week,daypos,false);
 				}
-			} 
-			
-			 
-			//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);
+				daysSelected += id + ",";
 			}
-			
+			bFoundValid = true;
 		}
 		else
 		{
-			//no days were selected, alert user
-			alert ("You must select at least 1 day before adding time");
+			//we found an invalid cell when column was clicked, move up to the next week
+			week++;
+			tempstr = "w" + week + "p" + daypos;
+			idmod = tempstr;
 		}
 	}
-	
-	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 class='btn btn-xs btn-success' onclick='editRow(\"" + tempTime + "\",this); return false;' href='#'>Edit</\a>";
-			tr.appendChild(td);
-				
-			td = d.createElement("td");
-			td.innerHTML = "<a class='btn btn-xs btn-danger' onclick='removeRow(this); return false;' href='#'>Delete</\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 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 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 checkForRanges(){
+	if (daysSelected != "")
+	{
+		alert("You have not saved the specified time range. Please click 'Add Time' button to save the time range.");
+		return false;
 	}
-	
-	function clearTime(){
-		document.getElementById("starttimehour").value = "0";
-		document.getElementById("starttimemin").value = "00";
-		document.getElementById("stoptimehour").value = "23";
-		document.getElementById("stoptimemin").value = "59";
+	else
+	{
+		return true;
 	}
-	
-	function clearDescr(){
-		document.getElementById("timerangedescr").value = "";
+}
+
+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;
+
 	}
-	
-	function editRow(incTime, el) {
-		var check = checkForRanges();
-		
-		if (check){  
-			
-			//reset calendar and time
-			clearCalendar();
-			clearTime();
-			
-			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);
+	else if (starttimehour == stoptimehour)
+	{
+		if (starttimemin > stoptimemin){
+			errors = "Error: Start Minute cannot be greater than Stop Minute.";
+			passedValidiation = false;
 		}
 	}
-	
-	function removeRownoprompt(el) {
-		var cel;
-		while (el && el.nodeName.toLowerCase() != "tr")
-			el = el.parentNode;
-	
-		if (el && el.parentNode) {
-		cel = el.getElementsByTagName("td").item(0);
-		el.parentNode.removeChild(el);
-		}
+
+	if (passedValidiation){
+		addTimeRange();
 	}
-	
-	
-	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;
-		
-			if (el && el.parentNode) {
-			cel = el.getElementsByTagName("td").item(0);
-			el.parentNode.removeChild(el);
-			}
+	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;
 		}
 	}
 
-//]]>
-</script>
+	if (daysSelected != ""){
+		//get days selected
 
-<div class="panel panel-default">
-	<div class="panel-heading"><h2 class="panel-title">Configured Ranges</h2></div>
-	<div class="panel-body table-responsive">
-		<table class="table table-hover table-striped table-condensed" id="scheduletable">
-			<thead>
-				<tr>
-					<th><?=gettext("Day(s)")?></th>
-					<th><?=gettext("Start Time")?></th>
-					<th><?=gettext("Stop Time")?></th>
-					<th><?=gettext("Description")?></th>
-					<th><!-- Room for buttons --></th>
-				</tr>
-			</thead>
-			<tbody>
-															
-<?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)
+		for (i=0; i<tempdayarray.length; i++)
+		{
+			tempstr = tempdayarray[i];
+			if (tempstr != "")
 			{
-				$tempID .= ",";
+				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 + ",";
+				}
 			}
-			
-			$tempID .= "w" . $weeknumber . "p" . $daypos . "-m" .  $month . "d" . $day;
-			$firstPrint = true;
-			
-			if (!$firstDayFound)
-			{
-				$firstDay = $day;
-				$firstmonth = $month;
-				$firstDayFound = true;
+		}
+
+		//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;
+				}
 			}
-				
-			$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)
+		}
+
+		//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[$i];
-					$firstDayFound = true;
+					firstDay = tempFriendlyDayArray[k];
+					firstDay = parseInt(firstDay);
+					firstDayFound = true;
 				}
-				
-				$currentDay =$tempFriendlyDayArray[$i];
+
+				currentDay = tempFriendlyDayArray[k];
+				currentDay = parseInt(currentDay);
 				//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];
+				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
-						$tempFriendlyTime .= $dayArray[$firstDay-1];
-						
-					$firstDayFound = false;	
-					$firstprint = true;			
+						rtempFriendlyTime += day_array[firstDay-1];
+
+					firstDayFound = false;
+					firstprint = true;
 				}
-				$i++;
 			}
-		}		
-	}	
-																																																									
-?>
+		}
 
-				<tr>
-					<td>
-						<span class="vexpl"><?=$tempFriendlyTime; ?></span>
-					</td>
-					<td>
-					  	<input type='text' readonly='readonly' class='vexpl' name='starttime<?=$counter; ?>' id='starttime<?=$counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?=$starttime; ?>' />
-					</td>
-					<td>
-					  	<input type='text' readonly='readonly' class='vexpl' name='stoptime<?=$counter; ?>' id='stoptime<?=$counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?=$stoptime; ?>' /> 
-					</td>
-					<td>
-						<input type='text' readonly='readonly' class='vexpl' name='timedescr<?=$counter; ?>' id='timedescr<?=$counter; ?>' style=' word-wrap:break-word; width:100%; border:0px solid;' value='<?=$timedescr; ?>' />
-					</td>
-					<td>
-						<a class='btn btn-xs btn-success' onclick='editRow("<?=$tempTime; ?>",this); return false;' href='#'>Edit
-					<td>
-						<a class='btn btn-xs btn-danger' onclick='removeRow(this); return false;' href='#'>Delete</a>
-					</td>
-					<td>
-						<input type='hidden' id='schedule<?=$counter; ?>' name='schedule<?=$counter; ?>' value='<?=$tempID; ?>' />
-					</td>
-				</tr>
-<?php
-			$counter++;
-		}//end if						
-	} // end foreach	
-}//end if							
-?>
-			</tbody>	
-		</table>
-	</div>
-</div>
+		//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
 
