/**
 * eventCreator
 * ver 2.0
 *
 * View, Create and Update iCal event in a HTML form and get output in a iCal file
 *
 * copyright (c) 2007 Kjell-Inge Gustafsson kigkonsult
 * www.kigkonsult.se/iCalcreator/eventCreator/index.php
 * ical@kigkonsult.se
 * updated 20070528
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * This script contains Javascript functions
 *
**/
/** grab the right (due to const. ECLANG) language texts for messages to users */
var url = 'eventCreator2.php';
            // check and fix url
 if (url.substring(0, 4) != 'http') {
  if (-1 < getFormIndex('ecurl'))
    var ecurl  = $F('ecurl');
  else
    var ecurl  = location.href;
  var xend     = ecurl.lastIndexOf("/") + 1;
  var base_url = ecurl.substring(0, xend);
  url          = base_url + url;
}
var langTexts = Array();
var ar = new Ajax.Request(
  url, {
    method:     'get',
  //  asynchronous: false,
  // default true, don't use false.. . ?? ;-(
  // ". ..usage is rather unsettling, and usually bad taste, you should avoid changing this. Seriously."
    parameters: 'key=all',
    onFailure:  function(request) { ajaxError(request.statusText); },
    onComplete: function(request) { ajaxSuccess(request.responseXML); }
   });
/**
 * displays the Ajax error text
 * @param text Ajax error request result
 * @return void
 */
function ajaxError(text) {
  alert("Error when fetching data:\n" + text);
}
/**
 * stores the result in array langTexts
 * @param text Ajax request result
 * @return void
 */
function ajaxSuccess(text) {
  var response = text.getElementsByTagName('displayText');
  for (var i=0; i < response.length; i++)
    langTexts[i] = response[i].firstChild.data;
}
/**
 * sets and selects all fields within and displays tag id DTENDcontainer
 * @return void
 */
function act() {
  var f    = document.eCform;
  var ix   = getFormIndex('chkb');
  var year = $F(f.elements[ix - 5]);
  var man  = $F(f.elements[ix - 4]);
  var day  = $F(f.elements[ix - 3]);
  var hour = parseInt($F(f.elements[ix - 2]));
  if ($('duration').present())
    hour  += parseInt($F('duration'));
  var min  = $F(f.elements[ix - 1]);
  var date = new Date( year, (man-1), day, hour, min, 0, 0);
  setval(f.elements[ix+1], date.getFullYear());
  f.elements[ix+1].disabled = false;
  setval(f.elements[ix+2], date.getMonth() + 1);
  f.elements[ix+2].disabled = false;
  setval(f.elements[ix+3], date.getDate());
  f.elements[ix+3].disabled = false;
  setval(f.elements[ix+4], date.getHours());
  f.elements[ix+4].disabled = false;
  setval(f.elements[ix+5], date.getMinutes());
  f.elements[ix+5].disabled = false;
  $("DTENDcontainer").style.display = 'table-row';
}
/**
 * add new COMMENT and/or ATTENDEE field
 * @param name COMMENT/ATTENDEE
 * @param type textarea/input
 * @param attr1 textarea cols/input size
 * @param attr2 textarea rows
 * @return void
 */
function addField(name, type, attr1, attr2) {
  var ix     = parseInt($F(name + 'cnt'));
  var fid    = name + ix;
  newSpan = document.createElement('span');
  newSpan.setAttribute('id', fid);
  if( 'ATTENDEE' == name ) {
    attendeeArr[ix] = name + 'f' + ix;
    newInput = document.createElement(type);
    newInput.setAttribute('type', 'text');
    newInput.setAttribute('size', attr1);
//    newInput.setAttribute('class', 'input');
  }
  else {
    newInput = document.createElement(type);
    newInput.setAttribute('cols', attr1);
    newInput.setAttribute('rows', attr2);
  }
  newInput.setAttribute('name', 'v[' + name + '][' + ix + ']');
  newInput.setAttribute('id', name + 'f' + ix);
  newInput.value = '';
  newSpan.appendChild(newInput);
  newA = document.createElement('a');
  newA.setAttribute('onClick', "remField('" + fid + "');");
  var delText = ('ATTENDEE' == name) ? '[100] ' + langTexts[0] : '[101] ' + langTexts[1];
  newA.setAttribute('title', delText);
  newImg = document.createElement('img');
  newImg.setAttribute('src', 'images/delete.png');
  newImg.setAttribute('alt', delText);
  newA.appendChild(newImg);
  newSpan.appendChild(newA);
  $(name + 'body').appendChild(newSpan);
  $(name + 'cnt').value = ix + 1;
}
/** an array that stores id for created attendee field (->emailcheck) */
var attendeeArr = new Array();
/**
 * update array attendeeArr
 * @return void
 */
function attendeeArrUpd() {
  var cnt = $F('ATTENDEEcnt');
  if (0 < cnt) {
    for (var i=0; i < cnt; i++) {
      attendeeArr[i] = 'ATTENDEEf' + i;
      // alert('ATTENDEEf' + i + ' = ' +  attendeeArr[i]); // test ###
    }
  }
}
/**
 * enables/disables DTEND + chkb fields
 * @return void
 */
function checkdate() {
  //  alert('checkdate start=' + $F('startts') + ' end=' + $F('endts')); // test ###
  if ('' >= $F('endts') || ($F('endts') == $F('startts'))) {
    $('chkb').cheched = true;
    deact();
  }
  else
    $('chkb').cheched = false;

}
/**
 * Change display mode
 * @param string fid tag identifier
 * @return void
 */
function chgdsp(fid) {
  if ($(fid).style.display == "block")
    $(fid).style.display = "";
  else
    $(fid).style.display = "block";
}
/**
 * unselects and disables all fields within and undisplays tag id DTENDcontainer
 * @return void
 */
function deact() {
  var f  = document.eCform;
  var ix = getFormIndex('chkb');
  for (var ix2=ix + 1; ix2 < ix + 6; ix2++)
    deselect(f.elements[ix2]);
  $('DTENDcontainer').style.display = 'none';
}
/**
 * unselects all options within object and disables object
 * @param  obj object
 * @return void
 */
function deselect(obj) {
  var srcLen = obj.length;
  for (var i=0; i < srcLen; i++) {
    if (obj.options[i].selected)
      obj.options[i].selected = null;
  }
  obj.disabled = true;
}
/**
 * validates email fields
 * @param obj object
 * @return bool
 */
function emailcheck(obj) {
  if (!obj.present())
    return true;
  else
    obj.value = obj.value.replace( /^\s+/g, "" ); // strip leading
    obj.value = obj.value.replace( /\s+$/g, "" ); // strip trailing
    if (obj.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
      return true;
  else {
    alert('[106] ' + langTexts[6] + ' : ' + obj.value);
    return false;
  }
}
/**
 * validates required input fields before submit
 * @uses fieldcheck2
 * @param outputformat empty/'rssCal'
 * @return bool
 */
function fieldcheck(outputFormat) {
  if (!fieldcheck2('summary', '[111] ' + langTexts[11]))
    return false;
  var f    = document.eCform;
  var ix   = getFormIndex('chkb');
  if (!isDate(ix-5, ix-4, ix-3)) {
    alert('[110] ' + langTexts[10] + ' : ' + $F(f.elements[ix-5]) + '-' + $F(f.elements[ix-4]) + '-' + $F(f.elements[ix-3]));
    $(f.elements[ix-5]).focus();
    return false;
  }
  if (true != $(f.elements[ix+1]).disabled) {
    if (!isDate(ix+1, ix+2, ix+3)) {
      alert('[107] ' + langTexts[7] + ' : ' + $F(f.elements[ix+1]) + '-' + $F(f.elements[ix+2]) + '-' + $F(f.elements[ix+3]));
      $(f.elements[ix+1]).focus();
      return false;
    }
  }
  if (!fieldcheck2('location', '[108] ' + langTexts[8]))
    return false;
  if (!fieldcheck2('organizer', '[109] ' + langTexts[9]))
    return false;
  if (!fieldcheck2('description', '[105] ' + langTexts[5]))
    return false;
  if (outputFormat == 'rssCal') {
    o = $('class');
    if (o.selectedIndex <= 0) {
      alert('[104] ' + langTexts[4]);
      o.options[1].selected = true;
      o.focus();
      return false;
    }
    var strrep = false;
    if ($('url').value.substring(0, 7).toLowerCase == 'http://') {
      $('url').value = $('url').value.substring(7);
      strrep = true;
    }
    var res = fieldcheck2('url', '[113] ' + langTexts[13]);
    if (true === strrep)
      $('url').value = 'http://' + $('url').value;
    if (!res)
      return false;
  }
  else {
    attendeesExists = false;
    var o;
    var cnt = parseInt($F('ATTENDEEcnt'));
     // alert('ATTENDEEcnt=' + cnt); // test ###
    for (var i=0; i < cnt; i++) {
       //   alert('ATTENDEE nr=' + i + ' value=' + $F(attendeeArr[i])); // test ###
      if (0 > getFormIndex(attendeeArr[i]))
        continue;
      o = $(attendeeArr[i]);
      if (!o.present())
        continue;
      if (!emailcheck(o)) {
        o.activate();
        return false;
      }
      else
        attendeesExists = true;
    }
    if (0 < $F('TRIGGERemail') && !attendeesExists) {
      alert('[112] ' + langTexts[12]);
      if (0 < cnt)
        $(attendeeArr.last()).focus();
      else
        $('TRIGGERemail').activate();
      return false;
    }
  }
  return true;
}
/**
 * validates input field
 * @param id, element identifier
 * @param displayText, text to display when error occurs
 * @return bool
 */
function fieldcheck2(id, displayText) {
  if (!$(id).present()) {
    alert(displayText);
    $(id).activate();
    return false;
  }
  return true;
}
/**
 * get element form index
 * @param obj object or name
 * @return index
 */
function getFormIndex(fid, formname) {
  if (typeof(formname) == 'String')
    var f = eval('document.' + formname);
  else
    var f = document.eCform;
  var found = false;
  for (var i = 0; i < f.elements.length; i++) {
    if ((found = f.elements[i].id == fid))
      break;
  }
  return found ? i : -1;
}
/**
 * Check valid date
 * @param year field form element index
 * @param month field form element index
 * @param day field form element index
 * @return bool
 */
function isDate(yearix, monthix, dayix) {
  var f    = document.eCform;
  var year = $F(f.elements[yearix]);
  var man  = String($F(f.elements[monthix]));
  if (2 > man.length)
    man = '0' + man;
  var day  = String($F(f.elements[dayix]));
  if (2 > day.length)
    day = '0' + day;
  var d = new Date(man + "/" + day + "/" + year);
//   alert('isDate 2 yearix='+yearix+' monthix='+monthix+' dayix='+dayix +
//         '\n date='+year+':'+man+':'+day+'\ntestdate='+d+'\nres='+res);
  if (d.getMonth() + 1 == man && d.getDate() == day && d.getFullYear() == year)
    return true;
  else
    return false;
}
/**
 * remove field from document (and ev. ATTENDEE value from attendeeArr)
 * @param id, element identifier
 * @return void
 */
function remField(fid) {
  var o = $(fid);
  o.parentNode.removeChild(o);
  if( 'ATTENDEE' != fid.substring(0, 8))
    return;
  if( 0 < parseInt($F('ATTENDEEcnt'))) {
    fid = fid.substring(0, 8) + 'f' + fid.substring(8);
    attendeeArr = attendeeArr.without(fid);
    $('ATTENDEEcnt').value -= 1;
  }
}
/**
 * set selected in object option list
 * @param obj object
 * @param value value
 * @return void
 */
function setval(obj, value) {
  var srcLen = obj.length;
  for (var i=srcLen-1; i > -1; i--) {
    obj.options[i].selected = false;
    if (obj.options[i].value == value)
      obj.options[i].selected = true;
  }
}
/**
 * submit form
 * @param task submitcommand
 * @return void
 */
function submitForm(task, ordno) {
  if ('loadEvent'        == task) {
    $('uid').value        = '';
    $('ordno').value      = '';
    $('eventordno').value = ordno;
  }
  else if ('newEvent'    == task) {
    $('uid').value        = '';
    $('ordno').value      = '';
    $('eventordno').value = '';
  }
  else if ('saveEvent'   == task) {
  // alert('saveEvent nr='+$F('ordno')+' ev-onr='+$F('eventordno')+'\nuid='+$F('uid'));
  }
  else if ('deleteEvent' == task) {
    if (!confirm(langTexts[2]))
      return false;
  }
  else if ('deleteFile'  == task) {
    if (!confirm(langTexts[3]))
      return false;
  }
  else if ('selectFile1' == task) {
    $('uid').value        = '';
    $('ordno').value      = '';
    $('eventordno').value = '';
    if (-1 < getFormIndex('selectFile2'))
      deselect($('selectFile2'));
    $('filename').value   = '';
    task = 'selectFile';
  }
  else if ('selectFile2' == task) {
    $('uid').value        = '';
    $('ordno').value      = '';
    $('eventordno').value = '';
    deselect($('selectFile1'));
    $('filename').value   = '';
    task = 'selectFile';
  }
            // check and fix form action url
  if (-1 < getFormIndex('ecurl'))
    var ecurl   = $F('ecurl');
  else
    var ecurl   = location.href;
  var xend      = ecurl.lastIndexOf("/") + 1;
  var base_url  = ecurl.substring(0, xend);
  var f = document.eCform;
  if (task      == 'iCal')
    f.action    = base_url + 'eventCreator3.php';
  else if (task == 'xCal')
    f.action    = base_url + 'eventCreator3.php';
  else if (task == 'rssCal')
    f.action    = base_url + 'eventCreator3.php';
  else if (task == 'rss2Cal')
    f.action    = base_url + 'eventCreator3.php';
  else
    f.action    = ecurl;
  $('task').value = task;
  f.submit();
}