/* Philips Savvy Biocalendar Javascript app
   by magluby
   2010-03-16
*/

phone = null;
display = 'birth';
date_birth = 'dd/mm/yyyy';
date_today = 'dd/mm/yyyy';
score = {'chance': 0, 'love': 0, 'energy': 0, 'success': 0};

if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
  alert('This doesn\'t work in IE! Try Firefox or Chrome.');

function init() {
  phone = document.getElementById('phone');

  document.getElementById('img').style.left = phone.offsetLeft + 45;
  document.getElementById('img').style.top = phone.offsetTop + 232;
  setImage(display);


  document.getElementById('text1').style.left = phone.offsetLeft + 92;
  document.getElementById('text1').style.top = phone.offsetTop + 226;
  setText(1, 'Birth date:');

  document.getElementById('text2').style.left = phone.offsetLeft + 94;
  document.getElementById('text2').style.top = phone.offsetTop + 251;
  setText(2, 'dd/mm/yyyy');
}

function click(e) {
  var x = e.clientX - phone.offsetLeft + window.pageXOffset;
  var y = e.clientY - phone.offsetTop + window.pageYOffset;

  var key = getKeyPressed(x, y);
  if (!key) return;

  if (display == 'birth') {
    if (key == 'OK' && date_birth.charAt(date_birth.length - 1) != 'y') {
      display = 'date';
      setText(1, 'Date:');
      setText(2, 'dd/mm/yyyy');
      return;
    }
    date_birth = modifyDate(date_birth, key);
    setText(2, date_birth);
    return;
  }

  if (display == 'date') {
    if (key == 'OK' && date_today.charAt(date_today.length - 1) != 'y') {
      generateBio();
      showCategory('chance');
      return;
    }
    date_today = modifyDate(date_today, key);
    setText(2, date_today);
    return
  }

  if (key == '>') {
    if (display == 'chance') showCategory('love');
    else if (display == 'love') showCategory('energy');
    else if (display == 'energy') showCategory('success');
  }

  if (key == '<') {
    if (display == 'love') showCategory('chance');
    else if (display == 'energy') showCategory('love');
    else if (display == 'success') showCategory('energy');
  }

  // Start again.
  if (key == 'OK') {
    date_birth = 'dd/mm/yyyy';
    date_today = 'dd/mm/yyyy';
    showCategory('birth');
    setText(2, date_birth);
  }
}

function move(e) {
  var x = e.clientX - phone.offsetLeft + window.pageXOffset;
  var y = e.clientY - phone.offsetTop + window.pageYOffset;

  if (getKeyPressed(x, y))
    highlight(getKeyPressed(x, y));
  else
    document.getElementById('hover').style.display = 'none';
}

function getKeymap() {
  keymap = Array(
      {'key': '1', 'x1': 33, 'y1': 425, 'x2': 73, 'y2': 451},
      {'key': '2', 'x1': 94, 'y1': 425, 'x2': 137, 'y2': 451},
      {'key': '3', 'x1': 155, 'y1': 426, 'x2': 197, 'y2': 451},
      {'key': '4', 'x1': 33, 'y1': 467, 'x2': 73, 'y2': 498},
      {'key': '5', 'x1': 94, 'y1': 467, 'x2': 137, 'y2': 498},
      {'key': '6', 'x1': 155, 'y1': 468, 'x2': 197, 'y2': 498},
      {'key': '7', 'x1': 33, 'y1': 511, 'x2': 73, 'y2': 540},
      {'key': '8', 'x1': 94, 'y1': 511, 'x2': 137, 'y2': 540},
      {'key': '9', 'x1': 155, 'y1': 512, 'x2': 197, 'y2': 540},
      {'key': '0', 'x1': 94, 'y1': 553, 'x2': 137, 'y2': 584},
      {'key': 'OK', 'x1': 104, 'y1': 381, 'x2': 126, 'y2': 400},
      {'key': '<', 'x1': 87, 'y1': 364, 'x2': 105, 'y2': 382},
      {'key': '>', 'x1': 124, 'y1': 365, 'x2': 145, 'y2': 382});
  return keymap;
}

function getKeyPressed(x, y) {
  keymap = getKeymap();

  for (k in keymap) {
    if (x > keymap[k]['x1'] && x < keymap[k]['x2'] && y > keymap[k]['y1'] && y < keymap[k]['y2'])
      return keymap[k]['key'];
  }
  return '';
}

function highlight(key) {
  var hover = document.getElementById('hover');
  var x = phone.offsetLeft;
  var y = phone.offsetTop;
  keymap = getKeymap();

  for (k in keymap) {
    if (key == keymap[k]['key']) {
      x += keymap[k]['x1'];
      y += keymap[k]['y1'];
    }
  }

  if (key == '<' || key == 'OK' || key == '>')
    hover.style.backgroundImage = 'url(hover-circle.png)';
  else
    hover.style.backgroundImage = 'url(hover-oval.png)';

  hover.style.left = x;
  hover.style.top = y;
  hover.style.display = 'block';
}

function setImage(name) {
  var img = document.getElementById('img');

  if (name) {
    img.style.backgroundImage = 'url(icon-' + name + '.png)';
    img.style.display = 'block';
  } else {
    img.style.display = 'none';
  }
}

function setText(line, s) {
  var div = document.getElementById('text' + line);
  div.innerHTML = s + ' ';
}

function modifyDate(date, key) {
  var blank = 'dd/mm/yyyy';

  // Backspace.
  if (key == '<') {
    for (i = date.length - 1; i >= 0; i--) {
      if (date.charAt(i) != blank.charAt(i)) {
        date = date.substring(0, i) + blank.substring(i);
        return date;
      }
    }
  }

  // Digit.
  if (key >= '0' && key <= '9') {
    for (i = 0; i < date.length; i++) {
      if (date.charAt(i) == blank.charAt(i) && date.charAt(i) != '/') {
        date = date.substring(0, i) + key + date.substring(i + 1);
        return date;
      }
    }
  }

  return date;
}

// Capitalize category name and pad with arrows.
function catName(s) {
  if (s == 'chance') return '|&nbsp; Chance &#9658;';
  if (s == 'love') return '&#9668;&nbsp;&nbsp; Love &nbsp;&#9658;';
  if (s == 'energy') return '&#9668;&nbsp; Energy &#9658;';
  if (s == 'success') return '&#9668; Success |';
  return 'Birth date:';
}

function generateBio() {
  /* energy/physical:      sin(2pi*t / 23),
     love/emotional:       sin(2pi*t / 28),
     success/intellectual: sin(2pi*t / 33),
     chance/intuitive:     sin(2pi*t / 38),
  */
  var date1 = parseDate(date_birth);
  var date2 = parseDate(date_today);
  var t = days_between(date1, date2);

  var bio = Math.sin((2 * Math.PI * t) / 23);
  bio = Math.round(5 * ((bio / 2) + .5));
  score['energy'] = bio;

  bio = Math.sin((2 * Math.PI * t) / 28);
  bio = Math.round(5 * ((bio / 2) + .5));
  score['love'] = bio;

  bio = Math.sin((2 * Math.PI * t) / 33);
  bio = Math.round(5 * ((bio / 2) + .5));
  score['success'] = bio;

  bio = Math.sin((2 * Math.PI * t) / 38);
  bio = Math.round(5 * ((bio / 2) + .5));
  score['chance'] = bio;
}

function parseDate(s) {
  var date = new Date();
  d = parseInt(s.substring(0, 2));
  m = parseInt(s.substring(3, 5)) - 1;
  y = parseInt(s.substring(6));
  date.setFullYear(y, m, d);
  return date;
}

function days_between(date1, date2) {
  // The number of milliseconds in one day
  var ONE_DAY = 1000 * 60 * 60 * 24

  // Convert both dates to milliseconds
  var date1_ms = date1.getTime()
  var date2_ms = date2.getTime()

  // Calculate the difference in milliseconds
  var difference_ms = Math.abs(date1_ms - date2_ms)
    
  // Convert back to days and return
  return Math.round(difference_ms/ONE_DAY)
}

function showCategory(name) {
  display = name;
  setImage(name);
  setText(1, catName(name));

  dots = '';
  for (i = 0; i < score[name]; i++)
    dots += ' &#9632';
  for (i = score[name]; i < 5; i++)
    dots += ' &#9633';
  setText(2, dots);
}

