Changeset - 0741fde6e765
[Not reviewed]
default
0 3 0
Nathan Brink (binki) - 15 years ago 2010-10-16 23:52:06
ohnobinki@ohnopublishing.net
When restoring a saved schedule, use JS instead of PHP to generate the form data. This way, we avoid duplicating the same table/form generation code in both PHP and JS.
3 files changed with 120 insertions and 71 deletions:
0 comments (0 inline, 0 general)
inc/class.page.php
Show inline comments
 
@@ -386,4 +386,25 @@ class page
 
  {
 
    return $this->school;
 
  }
 

	
 
  /**
 
   * \brief
 
   *   Format a chunk of javascript suitable for adding to headcode.
 
   *
 
   * Takes into account whether or not the code should be wrapped in
 
   * CDATA or not.
 
   *
 
   * \param $js
 
   *   The javascript to wrap up.
 
   * \param $type
 
   *   The type="" attribute of the <script/> element
 
   */
 
  public function script_wrap($js, $type = 'text/javascript')
 
  {
 
    return '<script type="' . $type . '">
 
' . ($this->xhtml ? '<![CDATA[' : '') . '
 
' . $js . '
 
' . ($this->xhtml ? ']]>' : '') . '
 
// </script>';
 
  }
 
}
input.php
Show inline comments
 
@@ -21,22 +21,35 @@ if (isset($_REQUEST['s']))
 
if ($sch)
 
{
 
  $nclasses = $sch->nclasses_get();
 
  $my_hc = '<script type="text/javascript">
 
var classNum = ' . $nclasses . ';
 
/* holds number of sections for each class */
 
var sectionsOfClass = new Array();
 
  $my_hc = 'jQuery(document).ready(
 
  function()
 
  {
 
    var class_last = 0;
 

	
 
';
 
  for ($class_key = 0; $class_key < $nclasses; $class_key ++)
 
    $my_hc .= 'sectionsOfClass[' . $class_key . '] = ' . $sch->class_get($class_key)->getnsections() . ";\n";
 
  $my_hc .= '// </script>';
 
  $inputPage->headcode_add('scheduleInput', $my_hc, TRUE);
 
    {
 
      $class = $sch->class_get($class_key);
 
      $my_hc .= '    class_last = add_class_n(\'' . htmlentities($class->getName()) . "');\n";
 

	
 
      $nsections = $class->getnsections();
 
      for ($section_key = 0; $section_key < $nsections; $section_key ++)
 
	{
 
	  $section = $class->getSection($section_key);
 
	  $my_hc .= '    add_section_n(class_last, \'' . htmlentities($section->getLetter()) . '\', \''
 
	    . htmlentities($section->getSynonym()) . '\', \''
 
	    . $section->getStartTime() . '\', \''
 
	    . $section->getEndTime() . '\', '
 
	    . json_encode(array('m' => $section->getM(), 't' => $section->getTu(), 'w' => $section->getW(), 'h' => $section->getTh(), 'f' => $section->getF())) . ', \''
 
	    . htmlentities($section->getProf()) . "');\n";
 
	}
 
    }
 
  $my_hc .= '  });
 
';
 
  $inputPage->headcode_add('scheduleInput', $inputPage->script_wrap($my_hc), TRUE);
 
}
 
else
 
  $inputPage->headcode_add('schduleInput', '<script type="text/javascript">
 
var classNum = 0;
 
/* holds number of sections for each class */
 
var sectionsOfClass = Array();
 
// </script>', TRUE);
 
  $inputPage->headcode_add('schduleInput', $inputPage->script_wrap('jQuery(document).ready( function() { add_class(); } );'), TRUE);
 

	
 
$inputPage->head();
 

	
 
@@ -99,7 +112,6 @@ if (!empty($_REQUEST['selectschool'])
 
		<td class="center"></td>
 
		<td class="center"></td>
 
	</tr>
 
	<?php if ($sch) echo $sch->input_form_render(); ?>
 
    </table>
 
  </td>
 
  </tr>
scripts/scheduleInput.js
Show inline comments
 

	
 
    //--------------------------------------------------
 
    // General Notes
 
    //--------------------------------------------------
 

	
 
	/* classNum is declared in the <head/> to enable loading of saved classes */
 
	/* sectionsOfClass is declared in the <head/> to enable loading of saved sections */
 
var classNum = 0;
 
var sectionsOfClass = new Array();
 

	
 

	
 
    //--------------------------------------------------
 
@@ -69,79 +68,103 @@
 
	//--------------------------------------------------
 
	// Returns the common inputs for each new section.
 
	//--------------------------------------------------
 
        function genSectionHtml(cnum){
 
		genSectionHtml(cnum,'','','','','','');
 
        function genSectionHtml(cnum)
 
	{
 
		genSectionHtml_n(cnum,'','','','','','');
 
	}
 

	
 
	/* @TODO: This should select & set items based on args, if the args != '' */
 
	function genSectionHtml(cnum,name,synonym,stime,etime,days,prof) {
 
	function genSectionHtml_n(cnum,name,synonym,stime,etime,days,prof)
 
	{
 
		var snum = sectionsOfClass[cnum];
 

	
 
		var result = '<tr class="section class' + cnum + '"><td class="none"></td>';
 
	        result = result + '<td class="sectionIdentifier center"><input type="text" size="1" class="required" name="postData[' + cnum + '][' + snum + '][letter]" /></td>';
 
	        result = result + '<td class="sectionIdentifier center"><input type="text" size="1" class="required" name="postData[' + cnum + '][' + snum + '][letter]" value="' + name + '" /></td>';
 

	
 
		result = result + '<td><select class="selectRequired" name="postData[' + cnum + '][' + snum + '][start]"><option value="none"></option>\
 
				<option value="700">7:00 am</option><option value="730">7:30 am</option>\
 
				<option value="800">8:00 am</option><option value="830">8:30 am</option>\
 
				<option value="900">9:00 am</option><option value="930">9:30 am</option>\
 
				<option value="1000">10:00 am</option><option value="1030">10:30 am</option>\
 
				<option value="1100">11:00 am</option><option value="1130">11:30 am</option>\
 
				<option value="1200">12:00 pm</option><option value="1230">12:30 pm</option>\
 
				<option value="1300">1:00 pm</option><option value="1330">1:30 pm</option>\
 
				<option value="1400">2:00 pm</option><option value="1430">2:30 pm</option>\
 
				<option value="1500">3:00 pm</option><option value="1530">3:30 pm</option>\
 
				<option value="1600">4:00 pm</option><option value="1630">4:30 pm</option>\
 
				<option value="1700">5:00 pm</option><option value="1730">5:30 pm</option>\
 
				<option value="1800">6:00 pm</option><option value="1830">6:30 pm</option>\
 
				<option value="1900">7:00 pm</option><option value="1930">7:30 pm</option>\
 
				<option value="2000">8:00 pm</option><option value="2030">8:30 pm</option>\
 
				<option value="2100">9:00 pm</option></select></td>\
 
			<td><select class="selectRequired" name="postData[' + cnum + '][' + snum + '][end]"><option value="none"></option>\
 
				<option value="720">7:20 am</option><option value="750">7:50 am</option>\
 
				<option value="820">8:20 am</option><option value="850">8:50 am</option>\
 
				<option value="920">9:20 am</option><option value="950">9:50 am</option>\
 
				<option value="1020">10:20 am</option><option value="1050">10:50 am</option>\
 
				<option value="1120">11:20 am</option><option value="1150">11:50 am</option>\
 
				<option value="1220">12:20 pm</option><option value="1250">12:50 pm</option>\
 
				<option value="1320">1:20 pm</option><option value="1350">1:50 pm</option>\
 
				<option value="1420">2:20 pm</option><option value="1450">2:50 pm</option>\
 
				<option value="1520">3:20 pm</option><option value="1550">3:50 pm</option>\
 
				<option value="1620">4:20 pm</option><option value="1650">4:50 pm</option>\
 
				<option value="1720">5:20 pm</option><option value="1750">5:50 pm</option>\
 
				<option value="1820">6:20 pm</option><option value="1850">6:50 pm</option>\
 
				<option value="1920">7:20 pm</option><option value="1950">7:50 pm</option>\
 
				<option value="2020">8:20 pm</option><option value="2050">8:50 pm</option>\
 
				<option value="2120">9:20 pm</option></select></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][0]" value="1" /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][1]" value="1" /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][2]" value="1" /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][3]" value="1" /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][4]" value="1" /></td>';
 
		result = result + '<td><select class="selectRequired" name="postData[' + cnum + '][' + snum + '][start]"><option value="none"></option>'
 
				 + genOptionHtml("700", "7:00 am", stime) + genOptionHtml("730", "7:30 am", stime)
 
				 + genOptionHtml("800", "8:00 am", stime) + genOptionHtml("830", "8:30 am", stime)
 
				 + genOptionHtml("900", "9:00 am", stime) + genOptionHtml("930", "9:30 am", stime)
 
				 + genOptionHtml("1000", "10:00 am", stime) + genOptionHtml("1030", "10:30 am", stime)
 
				 + genOptionHtml("1100", "11:00 am", stime) + genOptionHtml("1130", "11:30 am", stime)
 
				 + genOptionHtml("1200", "12:00 pm", stime) + genOptionHtml("1230", "12:30 pm", stime)
 
				 + genOptionHtml("1300", "1:00 pm", stime) + genOptionHtml("1330", "1:30 pm", stime)
 
				 + genOptionHtml("1400", "2:00 pm", stime) + genOptionHtml("1430", "2:30 pm", stime)
 
				 + genOptionHtml("1500", "3:00 pm", stime) + genOptionHtml("1530", "3:30 pm", stime)
 
				 + genOptionHtml("1600", "4:00 pm", stime) + genOptionHtml("1630", "4:30 pm", stime)
 
				 + genOptionHtml("1700", "5:00 pm", stime) + genOptionHtml("1730", "5:30 pm", stime)
 
				 + genOptionHtml("1800", "6:00 pm", stime) + genOptionHtml("1830", "6:30 pm", stime)
 
				 + genOptionHtml("1900", "7:00 pm", stime) + genOptionHtml("1930", "7:30 pm", stime)
 
				 + genOptionHtml("2000", "8:00 pm", stime) + genOptionHtml("2030", "8:30 pm", stime)
 
				 + genOptionHtml("2100", "9:00 pm", stime) + '</select></td>\
 
			<td><select class="selectRequired" name="postData[' + cnum + '][' + snum + '][end]"><option value="none"></option>'
 
				 + genOptionHtml("720", "7:20 am", etime) + genOptionHtml("750", "7:50 am", etime)
 
				 + genOptionHtml("820", "8:20 am", etime) + genOptionHtml("850", "8:50 am", etime)
 
				 + genOptionHtml("920", "9:20 am", etime) + genOptionHtml("950", "9:50 am", etime)
 
				 + genOptionHtml("1020", "10:20 am", etime) + genOptionHtml("1050", "10:50 am", etime)
 
				 + genOptionHtml("1120", "11:20 am", etime) + genOptionHtml("1150", "11:50 am", etime)
 
				 + genOptionHtml("1220", "12:20 pm", etime) + genOptionHtml("1250", "12:50 pm", etime)
 
				 + genOptionHtml("1320", "1:20 pm", etime) + genOptionHtml("1350", "1:50 pm", etime)
 
				 + genOptionHtml("1420", "2:20 pm", etime) + genOptionHtml("1450", "2:50 pm", etime)
 
				 + genOptionHtml("1520", "3:20 pm", etime) + genOptionHtml("1550", "3:50 pm", etime)
 
				 + genOptionHtml("1620", "4:20 pm", etime) + genOptionHtml("1650", "4:50 pm", etime)
 
				 + genOptionHtml("1720", "5:20 pm", etime) + genOptionHtml("1750", "5:50 pm", etime)
 
				 + genOptionHtml("1820", "6:20 pm", etime) + genOptionHtml("1850", "6:50 pm", etime)
 
				 + genOptionHtml("1920", "7:20 pm", etime) + genOptionHtml("1950", "7:50 pm", etime)
 
				 + genOptionHtml("2020", "8:20 pm", etime) + genOptionHtml("2050", "8:50 pm", etime)
 
				 + genOptionHtml("2120", "9:20 pm", etime) + '</select></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][0]" value="1" ' + (days.m ? 'checked="checked"' : '') + ' /></td> \
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][1]" value="1" ' + (days.t ? 'checked="checked"' : '') + ' /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][2]" value="1" ' + (days.w ? 'checked="checked"' : '') + ' /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][3]" value="1" ' + (days.h ? 'checked="checked"' : '') + ' /></td>\
 
			<td class="cbrow"><input type="checkbox" class="daysRequired" name="postData[' + cnum + '][' + snum + '][days][4]" value="1" ' + (days.f ? 'checked="checked"' : '') + ' /></td>';
 
		result = result + '<td><div class="deleteSection"><input type="button" value="x" class="gray" /></div></td><td></td></tr>';
 
		return result;
 
	}
 

	
 
/**
 
 * Outputs an <option/> element. It will inlcude selected="selected"
 
 * if the value param equals the test_value param.
 
 */
 
function genOptionHtml(value, content, test_value)
 
{
 
    var selected = ' selected="selected"';
 
    if (value != test_value)
 
	selected = '';
 
    return '<option value="' + value + '"' + selected + '>' + content + "</option>\n";
 
}
 

	
 
        //--------------------------------------------------
 
        // Add a section to a class
 
        //--------------------------------------------------
 
        function add_section(cnum) {
 
		jQuery('.pclass'+cnum).after(genSectionHtml(cnum));
 
	function add_section_n(cnum,name,synonym,stime,etime,days,prof)
 
	{
 
		 jQuery('.pclass'+cnum).after(genSectionHtml_n(cnum,name,synonym,stime,etime,days,prof));
 
		 sectionsOfClass[cnum] ++;
 
	}
 
        function add_section(cnum)
 
	{
 
	    return add_section_n(cnum, '', '', '', '', {'m':false, 't':false, 'w':false, 'h':false, 'f':false}, '');
 
        }
 
	function add_section(cnum,name,synonym,stime,etime,days,prof) {
 
		 jQuery('.pclass'+cnum).after(genSectionHtml(cnum,name,synonym,stime,etime,days,prof));
 
	}
 

	
 
	//--------------------------------------------------
 
	// Adds a new class to the input.
 
	//--------------------------------------------------
 
	function add_class(){
 
	function add_class_n(name)
 
	{
 
		sectionsOfClass[classNum] = 0; // Initialize at 0
 
		jQuery('#jsrows').append('<tr title="' + classNum + '" class="class class' + classNum + ' pclass' + classNum + '"><td><input type="text" class="className required defText className'+classNum+'" title="Class Name" name="postData[' + classNum + '][name]" /></td><td colspan="8"></td><td class="tdInput"><div class="addSection"><input type="button" value="Add section" class="gray" /></div></td><td class="tdInput"><div class="deleteClass"><input type="button" value="Remove" class="gray" /></div></td></tr>');
 
		jQuery('#jsrows').append('<tr title="' + classNum + '" class="class class' + classNum + ' pclass' + classNum + '"><td><input type="text" class="className required defText className'+classNum+'" title="Class Name" name="postData[' + classNum + '][name]" value="' + name + '" /></td><td colspan="8"></td><td class="tdInput"><div class="addSection"><input type="button" value="Add section" class="gray" /></div></td><td class="tdInput"><div class="deleteClass"><input type="button" value="Remove" class="gray" /></div></td></tr>');
 
		jQuery('.className' + classNum).autocomplete({
 
			source: "auto.php"
 
		});
 
		classNum++;
 

	
 
		return (classNum - 1);
 
	};
 
function add_class()
 
{
 
    return add_class_n('');
 
}
 

	
 

	
 
    //--------------------------------------------------
 
@@ -185,7 +208,6 @@
 
	//--------------------------------------------------
 
	jQuery('.addSection').live('click', function() {
 
		add_section(jQuery(this).parent().parent().attr("title"), sectionsOfClass[jQuery(this).parent().parent().attr("title")]);
 
		sectionsOfClass[jQuery(this).parent().parent().attr("title")]++; // Increases sectionsOfClass[classNum]
 
	});
 

	
 
	//--------------------------------------------------
 
@@ -217,10 +239,4 @@
 
		jQuery('#showadvanced').hide();
 
		jQuery('.advanced').slideToggle();
 
	});
 

	
 
        //--------------------------------------------------
 
        // Add initial class
 
        //--------------------------------------------------
 
	add_class();
 

	
 
});
0 comments (0 inline, 0 general)