/*****************************************************************************
*                             PAGE DESCRIPTION
******************************************************************************
*
*      NAME:         scripts.js
*      LANGUAGE:     JavaScript
*      DATE:         2.12.2002
*      AUTHOR:       Kirsi Koponen, Jyväskylän yliopisto
*      DESCRIPTION:  Useful javascript functions
*
******************************************************************************
*                  COPYRIGHT (C) KORPPI-PROJEKTIRYHMÄ
*             Limited rights granted. Please refer to license
******************************************************************************
*                                  UPDATES
******************************************************************************
*
* 2.12.2002 KK
*    First version with functions
*      hideElement(id)
*      submitForm(form,id)
*      toggleElement(id)
*
*   Usage:    <input type="submit" id="add" name="addSubmit" value="Add these" />
*     submitForm(this.form, "add");
*
* 4.12.2002 / pjk
*   Added function  moveFocus(id)  which moves focus to element.
*
* 7.2.2003 / mn
*   Moved check_all from course/teacher/modifyGroup.jsp
*****************************************************************************/

/**
 * Hides wanted element.
 */
function hideElement(id) {
  if (document.getElementById) {
    obj=document.getElementById(id);
    if (obj==null) return;
    obj.style.visibility="hidden";
    obj.disabled=true;
  }
}

/**
 * Function to submit form where one additional parameter is needed to send with form.
 */
function submitForm(form,obj) {
  if (obj==null) {
    form.submit();
    return true;
  }
  form.action=form.action+"&"+obj.name+"="+obj.value;
  form.submit();
  return true;
}

function submitButton(id) {
  var obj = getObject(id);
  if ( obj ) obj.click();
}

/**
 * Returns object with id or null if not found
 */
function getObject(id) {
  if (document.getElementById) {
    obj=document.getElementById(id);
    return obj;
  }
  return null;
}

/**
 * Toggles element's disabled property.
 */
function toggleElement(id,onOff) {
  if (document.getElementById) {
    obj=document.getElementById(id);
    if (obj==null) return;
    obj.disabled=onOff;
  }
}

/**
 * Moves focus to element.
 */
function moveFocus(id) {
  if (document.getElementById) {
    obj=document.getElementById(id);
    if (obj==null) {
      //alert("moveFocus(): object is null");
      return;
    }
    obj.focus();
  }
}

/**
 * Returns keycode either from e (Mozilla) or form window.event (IE)
 */
function getKeyCode(e) {
  if (!e) var e = window.event;
  if (e.keyCode) return e.keyCode;
  if (e.which) return e.which;
  return 0;
}

/**
 * set button text
 */
function setButton(id,value) {
  var obj = getObject(id);
  if ( obj ) obj.value = value;
}

/**
 * set button name
 */
function setButtonName(id,value) {
  var obj = getObject(id);
  if ( obj ) obj.name = value;
}


/**
 * Selects (or un-selects) all checkboxes. Moved from course/teacher/modifyGroup.jsp
 */
function checkAll(f,elementName) {
  var numChecked = 0, numNotChecked = 0;

  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "checkbox" && f.elements[e].name.substring(0,elementName.length) == elementName )
      if ( f.elements[e].checked ) numChecked++; else numNotChecked++;

  var newState = null;

// If all checkboxes are checked/unchecked, reverse the check mark.
// Else all are unchecked if there are unchecked more than checked.
// Else all are checked.

  if ( numNotChecked == numChecked+numNotChecked ) newState = true;
  else
  if ( numChecked    == numChecked+numNotChecked ) newState = false;
  else
  if ( numChecked < numNotChecked ) newState = false;
  else
  newState = true;

  if ( newState != null ) {
    for (e=0; e<f.elements.length; e++)
      if ( f.elements[e].type == "checkbox" && f.elements[e].name.substring(0,elementName.length) == elementName )
        f.elements[e].checked = newState;
  }

}

/**
 * Selects (or un-selects) all checkboxes. Moved from course/teacher/modifyGroup.jsp
 */
function checkAllMatch(f,elementName) {
  var numChecked = 0, numNotChecked = 0;

  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "checkbox" && f.elements[e].name == elementName )
      if ( f.elements[e].checked ) numChecked++; else numNotChecked++;

  var newState = null;

// If all checkboxes are checked/unchecked, reverse the check mark.
// Else all are unchecked if there are unchecked more than checked.
// Else all are checked.

  if ( numNotChecked == numChecked+numNotChecked ) newState = true;
  else
  if ( numChecked    == numChecked+numNotChecked ) newState = false;
  else
  if ( numChecked < numNotChecked ) newState = false;
  else
  newState = true;

  if ( newState != null ) {
    for (e=0; e<f.elements.length; e++)
      if ( f.elements[e].type == "checkbox" && f.elements[e].name == elementName )
        f.elements[e].checked = newState;
  }

}

/**
 * Fills an array where blank or not blank. Moved from course/teacher/modifyGroup.jsp
 */
function fillBlankWeeks(f, fillArray, elementStart, elementEnd) {
  if ( elementStart < elementEnd )
    addition = +1;
  else
  if ( elementStart > elementEnd )
    addition = -1;
  else return;

  var filledWeek = -1;
  var filledYear = -1;

  for (w=elementStart; w!=elementEnd+addition; w += addition) {
    if ( fillArray[1][w] != "" ) {
      filledWeek = parseInt(fillArray[1][w]);
      var slashPos = fillArray[1][w].indexOf("/");
      if ( slashPos > 0 ) {
        filledYear = parseInt(fillArray[1][w].substring(slashPos+1));
      }
    }
    if ( fillArray[1][w] == "" && filledWeek > 0 ) {
      oldFilledWeek = filledWeek;
      filledWeek += addition;
      if ( filledWeek > 52 ) {  // If forwards to next year.
        filledWeek = 1;
        filledYear++;   // -= addition;
      }
      else
      if ( filledWeek <= 0 ) {  // If backwards to previous year.
        filledWeek = 52;
        filledYear--;   // += addition;
      }
      tmp = filledWeek;
      if ( filledYear > 0 ) tmp += "/"+filledYear;
      fillArray[1][w] = tmp;
      f.elements[fillArray[0][w]].value = tmp;
    }
  }

  return fillArray;
}

/**
 * Fills blank weeks. Moved from course/teacher/modifyGroup.jsp
 */
function fillWeeks(f,elementName) {
  var fillArray = new Array(2);
  fillArray[0] = new Array();   // element number
  fillArray[1] = new Array();   // element value

  str = "";
  var elements = 0;
  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "text" && f.elements[e].name.substring(0,elementName.length) == elementName ) {
      fillArray[0][elements] = e;
      if ( f.elements[e].value != "" ) {
        s = f.elements[e].value;
        s = checkWeek(s);
        f.elements[e].value = s;
        fillArray[1][elements] = f.elements[e].value;
      }
      else
        fillArray[1][elements] = "";
      elements++;
    }

// First forwards.
  if ( elements > 0 ) {
    fillArray = fillBlankWeeks(f, fillArray, 0, elements-1);
  }

// Then backwards.
  var elements = 0;
  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "text" && f.elements[e].name.substring(0,elementName.length) == elementName ) {
      fillArray[0][elements] = e;
      if ( f.elements[e].value != "" )
        fillArray[1][elements] = f.elements[e].value;
      else
        fillArray[1][elements] = "";
      elements++;
    }

  if ( elements > 0 ) {
    fillArray = fillBlankWeeks(f, fillArray, elements-1, 0);
  }
}

/**
 * Function checks if s is fromat dd.mm.yy or dd.mm and in that case returns
 * a week representing that, otherwise return just s
 * vesal 23.1.2005
 */
function checkWeek(s) {
  d = s.split(".");
  if ( d.length < 2 ) return s;  // not format dd.mm
  dd = d[0];
  mm = d[1];
  thisyear = (new Date()).getYear() + 1900;
  if ( d.length < 3 ) yy = thisyear;
  else yy = 1*d[2];
  if ( yy < 1900 ) yy += 2000;
  sy = ""; if ( yy != thisyear ) sy = "/"+(yy-2000);
  return YMDarrToYWDarr([yy,mm,dd])+sy;
}


/**
 * Function returns week number from string like 12.2.2004
 * vesal 23.1.2005
 */
function YMDarrToYWDarr(S) {
    with (new Date(S[0], S[1] - 1, S[2])) {
        var DoW = getDay();
        setDate(getDate() - (DoW + 6) % 7 + 3);
        var ms = valueOf();
        setMonth(0);
        setDate(4);
        var WN = Math.round((ms - valueOf()) / (604800000)) + 1;
        if (DoW == 0) {
            DoW = 7;
        }
        return WN;
    }
}

/**
 * Function is used on course/teacher/extraInfo.jsp page to renumber ordernums
 * of fields.
 * Pauli Kujala 14.4.2003
 */
function renumberOrdernums(f, elementName) {
  var i=1;
  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "text" && f.elements[e].name.substring(0,elementName.length) == elementName ) {
      f.elements[e].value = i;
      i++;
    }
}

function getProperties(obj, obj_name) {
  var i;
  var result = ""
  for (i in obj)
    result += obj_name + "." + i + " = " + obj[i] + "\n"
  alert(result);
}


/**
 * Function is used on course/teacher/timeGrid.jsp page to replace all occurrences of text.
 * Minna Hillebrand 13.5.2003
 */


function replaceTextInFields(d, elementName, replaceWhat, replaceWith, dontReplaceNames) {
  if (replaceWhat == "" && replaceWith == "") { alert('Määrittele muutettavat arvot!'); return; }
  for (i = 0; i < d.forms.length; i++) {
    for (e=0; e<d.forms[i].elements.length; e++) {
      if ( (d.forms[i].elements[e].type == "text" || d.forms[i].elements[e].type == "textarea" ) &&
            d.forms[i].elements[e].name.substring(0,elementName.length) == elementName) {
        var match = false;
        for (j=0; j < dontReplaceNames.length; j++) {
          match = match || dontReplaceNames[j] == d.forms[i].elements[e].name.substring(0, dontReplaceNames[j].length);
        }
        if (!match) d.forms[i].elements[e].value = String(d.forms[i].elements[e].value).replace(new RegExp(replaceWhat, 'g'), replaceWith);
      } //if
    } //for e
  }  //for i
}

/*
function replaceTextInFields(f, elementName, replaceWhat, replaceWith, dontReplaceNames) {
  if (replaceWhat == "" || replaceWith == "") { alert('Määrittele muutettavat arvot!'); return; }
  for (e=0; e<f.elements.length; e++) {
    if ( f.elements[e].type == "text" && f.elements[e].name.substring(0,elementName.length) == elementName) {
       var match = false;
       for (j=0; j < dontReplaceNames.length; j++) {
         match = match || dontReplaceNames[j] == f.elements[e].name.substring(0, dontReplaceNames[j].length);
       }
      if (!match) f.elements[e].value = String(f.elements[e].value).replace(new RegExp(replaceWhat, 'g'), replaceWith);
    }
  }
}
*/


function doWhenExiting(d) {
  //alert('About to clear the screen...');
  //d.open();
  d.write('<p>Please wait...</p>');
}

var topwindow;

function help(osoite,target) {
//  window1 = window.open (osoite,target,"")
//  topwindow = Window;
  window1 = window.open(osoite, target , 'toolbar=1,scrollbars=1,location=1,statusbar=1,menubar=1,resizable=1,width=800,height=600,left = 100,top = 100');
//  window1 = window.open(osoite, target , 'toolbar=1,menubar=0,scrollbars=1,location=0,statusbar=1,resizable=1,width=800,height=600,left = 100,top = 100');
  if ( window1 ) window1.focus();
  else document.location.href = osoite;
}



/**
 * Following variables and functions are for checking all radios in
 * show "partial free spaces".
 */
var prevClicked = null;

/**
 * Selects all radioboxes witha a value val
 * Do not select those where id=r (request)
 */
function selectAll(f,elementName,val) {
  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "radio" && f.elements[e].name.substring(0,elementName.length) == elementName && f.elements[e].value == val && f.elements[e].id != 'r')
      f.elements[e].checked = true;
  if ( prevClicked != null ) prevClicked.value = '->';
}

/**
 * Selects all radioboxes with a value val if val still free.
 * If clicked other time, selects anyway all in row.
 * Do not select those where id=r (request)
 */
function selectAllTest(but,f,elementName,val) {
  if ( but != null ) {
    if ( but.value == '=>' ) { prevClicked = but; selectAll(f,elementName,val); return; }
    if ( but.value == '->' ) {
      but.value = '=>';
      if ( prevClicked != null ) prevClicked.value = '->';
      prevClicked = but;
    }
  }

  var doNotSelect = new Array();
  var n = 0;
  var valChecked = 0;

  for (e=0; e<f.elements.length; e++)
    if ( f.elements[e].type == "radio" && f.elements[e].name.substring(0,elementName.length) == elementName )
      if ( f.elements[e].value == '0')
        if ( !f.elements[e].checked )  { doNotSelect.push(f.elements[e].name); n++ }
      else if ( f.elements[e].value == val && f.elements[e].checked ) valChecked++;

  var newState = true;

  if ( val == '0' || valChecked > 0 ) n = 0;

  if ( newState != null ) {
    for (e=0; e<f.elements.length; e++)
      if ( f.elements[e].type == "radio" && f.elements[e].name.substring(0,elementName.length) == elementName && f.elements[e].value == val && f.elements[e].id != 'r') {
        var doNot = false;
        for (i=0; i<n; i++) if ( f.elements[e].name == doNotSelect[i] ) { doNot = true; break; }
        if ( !doNot ) f.elements[e].checked = newState;
      }
  }

}


function writeSelAllButton(name,val) {
  document.write('<input type="button" name="selectall" id="selectall" value="=>" onClick="selectAll(this.form,\''+name+'\','+val+')" class="notPrinted" title="Valitse kaikki" Height="10px"/>');
}

function writeSelAllTestButton(name,val) {
  document.write('<input type="button" name="selectall" id="selectall" value="->" onClick="selectAllTest(this,this.form,\''+name+'\','+val+')" class="notPrinted" title="Valitse kaikki" Height="10px"/>');
}