function moveTitles() {
  var options = $$('option');
  var n = options.length;
  for (var i = 0; i < n; i++)	if (options[i].title && options[i].title != '') options[i].innerHTML += '<span>' + options[i].title + '</span>'; 
}

function updateCourseSearchFieldVisibility(newvalue) {
  switch(newvalue) {
    case "all":
    case "current":
    case "former":
      $('searchyear').hide();
      $('searchyear').value = '';
      break;
    case "year":
      $('searchyear').show();
      break;
    }
}

function updateCourseReportFieldVisibility(newvalue, type) {
  switch(newvalue) {
    case "course_progress":
      $('aps_id').hide();
      $('student_id').hide();
      $('pr_sort_type').hide();
      $('sk_sort_type').hide();
      break;
    case "problem_set_progress":
      $('aps_id').show();
      $('student_id').hide();
      $('sk_sort_type').hide();
      $('pr_sort_type').show();
      $('pr_sort_type').options[0].update("Group by Student");
      break;
    case "problem_set_skills":
      $('aps_id').show();
      $('student_id').hide();
      $('pr_sort_type').hide();
      $('sk_sort_type').show();
      $('sk_sort_type').options[0].update("Group by Student");
      break;
    case "student_progress":
      $('aps_id').hide();
      if (type == "student") {$('student_id').hide();} else {$('student_id').show();}
      $('sk_sort_type').hide();
      $('pr_sort_type').show();
      $('pr_sort_type').options[0].update("Group by Problem Set");
      break;
    case "student_skills":
      $('aps_id').hide();
      if (type == "student") {$('student_id').hide();} else {$('student_id').show();}
      $('pr_sort_type').hide();
      $('sk_sort_type').show();
      $('sk_sort_type').options[0].update("Group by Problem Set");
      break;
    }
}

function updateCourseStudentSearchFieldVisibility(newvalue) {
  switch(newvalue) {
    case "all":
      $('rostersearchname').hide();
      $('rosternameclear').hide();
      break;
    case "name":
      $('rostersearchname').show();
      $('rosternameclear').show();
      break;
    }
}

function updateClassworkSearchFieldVisibility(newvalue) {
  switch(newvalue) {
    case "all":
    case "upcoming":
    case "past":
      $('searchname').hide();
      break;
    case "name":
      $('searchname').show();
      break;
    }
}

function updatePrintListLink() {
  updatePrintLink('printlistlink', 'searchform');
}

function updatePrintWorkLink() {
  updatePrintLink('printworklink', 'worksearchform');
}

function updatePrintRosterLink() {
  updatePrintLink('printrosterlink', 'rostersearchform');
}

function updatePrintReportLink() {
  updatePrintLink('printreportlink', 'report_controls');
}

function updatePrintCoursesLink() {
  updatePrintLink('printcourseslink', 'coursesearchform');
}

function updatePrintProblemSetsLink() {
  updatePrintLink('printproblemsetslink', 'problemsetsearchform');
}

function updatePrintLink(linkName, formName) {
  if (formName == '') return;
  $(linkName).href = $(linkName).href.split('?')[0] + '?' + Form.serializeElements($(formName).getElements());
}

function encodeElements(elements, object) {
  object = typeof(object) == 'undefined' ? '' : object + '_';
  return elements.map(function(element) {return element + '=' + encodeURIComponent($(object + element).value)}).join('&');
}

function filterTable(filter, table) {
  var terms = $(filter).value.toLowerCase().split(" ");
  var rows = $(table).select('tr');
  for (var row = 0; row < rows.length; row++) {
    var display = '';
    for (var term = 0; term < terms.length; term++) {
      var td = rows[row].select('td.filter')[0];
      var item = td.select('a')[0] || td;
      if (item.innerHTML.toLowerCase().indexOf(terms[term]) < 0) display = 'none';
    }
    rows[row].style.display = display;
  }
  reshadeRows(table);
}

function toggleRows(table, id, open) {
  table = $(table);
  var link = $('link_image_' + id);
  var rows = table.select('[subject=\"row_' + id + '\"]');
  var openRows = $('open_rows');
  if (typeof open == 'undefined' || open == 'toggle') open = link.title == "Open";
  if (open) {
    for (var i = 0; i < rows.length; i++) Effect.BlindDown(rows[i].id, {duration: 0.5});
    link.src = '/images/icons/triangle_open.png';
    link.alt = "Open";
    link.title = "Close";
    if (openRows) openRows.value += id + '_';
  } else {
    for (var i = 0; i < rows.length; i++) Effect.BlindUp(rows[i].id, {duration: 0.5});
    link.src = '/images/icons/triangle_closed.png';
    link.alt = "Closed";
    link.title = "Open";      
    if (openRows) openRows.value = openRows.value.split(id + '_').join('');
  }
//  reshadeRows.delay(0.5, table);
}

function reshadeRows(table) {
  var rows = $(table).select('tr').select(function(row) {return row.visible()});
  for (var i = 0; i < rows.length; i++)
    if (i % 2 == 0) {
      if (rows[i].classNames().include('row_even')) {
        rows[i].removeClassName('row_even');
			  rows[i].addClassName('row_odd');
      }
    } else {
      if (rows[i].classNames().include('row_odd')) {
        rows[i].removeClassName('row_odd');
			  rows[i].addClassName('row_even');
      }
    }
}

function toggleAllRows(table, open) {
  var links = $$('img[id^="link_image_"]');
  for (var i = 0; i < links.length; i++) toggleRows(table, links[i].id.substring(11), open);
}

function toggleVisibility(elementID) {
  elementObject = document.getElementById(elementID);
  elementObject.style.visibility = elementObject.style.visibility != 'visible' ? 'visible' : 'hidden';
}

function toggleElementFromCheckbox(el_name, cb) {
  el = document.getElementById(el_name);
  if (el == null || cb == null) return;
  el.style.display = cb.checked ? "none" : "block";
}

function toggleDisabledFromCheckbox(el_name, cb) {
  el = document.getElementById(el_name);
  if (el == null || cb == null) return;
  el.disabled = cb.checked ? true : false;
}

/*
function checkedProblemSetString () {
  var cbs = document.getElementsByName("problem_set");
  var cbstring = "";
  for (var i = 0; i < cbs.length; i++) {
    if (cbs[i].checked) {
      if (cbstring.length > 0) cbstring = cbstring + "_";
      cbstring = cbstring + cbs[i].value
    }
  }
  $('checked_problem_set_ids').value = cbstring;
  return cbstring;
}

function studentCheck () {
  var cbs = document.getElementsByName("assigned_student_ids[]");
  for (var i = 0; i < cbs.length; i++) if (cbs[i].checked) return true;
  alert("Please select at least 1 student");
  return false;
}

function problemSetCheck () {
  var cbs = document.getElementsByName("problem_set");
  for (var i = 0; i < cbs.length; i++) if (cbs[i].checked) return true;
  alert("Please select at least 1 problem set");
  return false;
}
*/

function changeStudentCheckboxes(show) {
  var cbs = document.getElementsByName("assigned_student_ids[]");
  for (var i = 0; i < cbs.length; i++) cbs[i].checked = show;
}

/*
function changeProblemSetCheckboxes(show) {
  var cbs = document.getElementsByName("problem_set");
  for (var i = 0; i < cbs.length; i++) cbs[i].checked = show;
}
*/

function addAvailableProblemSet(name, id) {
  if (checkForPs(id)) {
    alert('Problem Set has already been selected.');
    return;
  }
  var list = $('assignments');
  var idstr = 'ps_' + id;
  var li = new Element('li', {"id": idstr});
  li.addClassName('ps');
  li.addClassName('sortable');
  var outerdiv = new Element('div');
  outerdiv.addClassName('item');
  outerdiv.addClassName('brightblue_bg');
  var nobr = new Element('nobr');
  var icondiv = new Element('div').update("");
  icondiv.addClassName('left');
  icondiv.addClassName('column_icon');
  var namediv = new Element('div').update(name);
  namediv.addClassName('left');
  namediv.addClassName('column_problemSet_narrow');
  var clearerdiv = new Element('div');
  clearerdiv.addClassName('clearer')
  var removelink = new Element('a').update("<img src=\"/images/icons/delete.png\" alt=\"Remove\" title=\"Remove Problem Set\" />");
  removelink.href="javascript:removeAvailableProblemSet(\'ps_" + id + "\');"
  icondiv.appendChild(removelink);
  nobr.appendChild(icondiv);
  nobr.appendChild(namediv);
  nobr.appendChild(clearerdiv);
  outerdiv.appendChild(nobr);
  li.appendChild(outerdiv);
  list.appendChild(li);
  Sortable.create('assignments', {onUpdate:function() {sortedProblemSetString();}});
  sortedProblemSetString();
}

/**
function addAvailableProblemSet(name, id) {
  if (checkForPs(id)) {
    alert('Problem Set has already been selected.');
    return;
  }
  var list = $('assignments');
  var liHTML = "<li class=ps id=ps_"+id+"><div class='item brightblue_bg'><nobr>"+
    "<div class='left column_icon'>&uarr;&darr;</div>"+
    "<div class='left column_ps_name'>"+name+"</div>"+
    "<div class='right column_actions1'><a href=\"javascript:removeAvailableProblemSet('ps_"+id+"')\">Remove</a></div>"+
    "<div class='clearer'></div></nobr></div></li>";
  list.innerHTML = list.innerHTML+liHTML;
  alert("list.innerHTML = " + list.innerHTML);
  Sortable.create('assignments', {onUpdate:function() {sortedProblemSetString();}});
  sortedProblemSetString();
}
**/

function removeAvailableProblemSet(id) {
  var li = $(id);
  var list = li.parentNode;
  list.removeChild(li);
  Sortable.create('assignments', {onUpdate:function() {sortedProblemSetString();}});
  sortedProblemSetString();
}

function checkForPs(id) {
  var idstr = 'ps_' + id;
  var pss = $$('li.ps');
  for (var i = 0; i < pss.length; i++) if (pss[i].id == idstr) return true;
  return false;
}

function sortedProblemSetString () {
  var pss = $$('li.ps');
  var psstring = "";
  for (var i = 0; i < pss.length; i++) {
    if (psstring.length > 0) psstring = psstring + "_";
    psstring = psstring + pss[i].id.substring(3);
  }
  $('checked_problem_set_ids').value = psstring;
  return psstring;
}

function showMessagesInSidebar() {
  var err = $('flasherrorbox')
  if (err) {
    var text = err.innerHTML.strip();
    if (text.length > 0) Effect.BlindDown("flasherror");
  }
  var note = $('flashnoticebox')
  if (note) {
    var text = note.innerHTML.strip();
    if (text.length > 0) Effect.BlindDown("flashnotice");
  }
  var warn = $('flashwarnbox')
  if (warn) {
    var text = warn.innerHTML.strip();
    if (text.length > 0) Effect.BlindDown("flashwarn");
  }
  var ann = $('announcementbox')
  if (ann) {
    var text = ann.innerHTML.strip();
    if (text.length > 0) Effect.BlindDown("announcement", {duration: 0.25});
  }
}

var oldonload2 = window.onload;
if (typeof(oldonload2) == 'function') window.onload = function() {oldonload2(); showMessagesInSidebar()};
else window.onload = function() {showMessagesInSidebar()};

// define settings for NiftyCornersCube

NiftyLoad = function() {
  Nifty("div.rounded_tr","tr big");
  Nifty("div.rounded_br","br big");
  Nifty("div.rounded_bl","bl big");
  Nifty("div.rounded_tl","tl big");
}

// define settings for Highslide JS

if (typeof hs != "undefined") {
  hs.showCredits = false;
  hs.graphicsDir = '/images/highslide/';
  hs.align = 'center';
  hs.transitions = ['fade'];
  hs.lang.loadingText = '';
  hs.lang.closeText = '';
  hs.lang.closeTitle = 'Close';
  hs.lang.moveText = '';
  hs.lang.moveTitle = 'Move';
  hs.wrapperClassName = 'controls-in-heading';
  hs.outlineType = 'rounded-blue-2';
  hs.outlineWhileAnimating = true; 
  hs.fadeInOut = false;
  hs.dimmingOpacity = 0.66;
  hs.minHeight = 480;
  hs.minWidth = 640;
  hs.allowHeightReduction = false;
  hs.allowWidthReduction = false;
  hs.preserveContent = false;
  hs.objectLoadTime = 'after';
  hs.objectType = 'iframe';
  hs.useControls = true;
}

// patch to scriptaculous for problem involving a
// sortable inside a scrollable div 

Droppables.isAffected = function(point, element, drop) {
  return ((drop.element != element) &&
          ((!drop._containers) || this.isContained(element, drop)) &&
          ((!drop.accept) || (Element.classNames(element).detect(function(v) {return drop.accept.include(v)}))) &&
          Position.withinIncludingScrolloffsets(drop.element, point[0], point[1]));
}
 
Droppables.show = function(point, element) {
  if (!this.drops.length) return;
  var drop, affected = [];
  this.drops.each(function(drop) {if (Droppables.isAffected(point, element, drop)) affected.push(drop);});
  if (affected.length>0) drop = Droppables.findDeepestChild(affected);
  if (this.last_active && this.last_active != drop) this.deactivate(this.last_active);
  if (drop) {
    Position.withinIncludingScrolloffsets(drop.element, point[0], point[1]);
    if (drop.onHover) drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
    if (drop != this.last_active) Droppables.activate(drop);
  }
}
