/** Lister IVF calculator **/

// initialise some object aliases
var Dom = YAHOO.util.Dom;
var Lang = YAHOO.lang;

// width a bar would be at 100%
// remember to adjust the css class .end as well
var barMaxWidth = 170;

// Under this, you get a warning
var resultLimit = 50;

// equal or above this you get a warning
var dropdownLimit = 3;

// How long to hover a link before displaying it (in millisecs)
var hoverMS = 750;

// is alert box currently showing?
var showAlert = true;

var timerhandler = [];

// are stats currently showing?
var statsShowing = false;

// true when app first loads
var firstLoad = true;

// save some CPU cycles by not animating help if we hover the same thing twice in a row
var currentHelpID;

// define dynamic (integer?) numeric fields - these must have a matching XML value
var numericFieldsToUpdate = ['PATS','CYCS','CYCEC','CYCTRANS','PREGLOSS',
  'CONGOING', 'SINGLETON', 'TWINS', 'TRIPLET', 'NDDSB', 'PREGLOSS_PC',
  'SINGLETON_PC', 'TWINS_PC', 'TRIPLET_PC', 'DLVEMBTRAN'];

// define dynamic percent sets
var percentFieldsToUpdate = ['POSCYCS','POSCYCEC', 'POSCYCTRAN', 'DLVCYCS', 'DLVCYCEC', 'DLVCYCTRAN'];

var oDS = new YAHOO.util.XHRDataSource("./datasource.php");
oDS.queryMatchContains = true;
oDS.connMethodPost = true;
oDS.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
oDS.useXPath = true;
oDS.responseSchema = {
  resultNode: "item",
  fields: ["field","value"]
};
oDS.maxCacheEntries = 5;

var oHDS = new YAHOO.util.XHRDataSource("./contexthelp.php");
oHDS.queryMatchContains = true;
oHDS.connMethodPost = true;
oHDS.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
oHDS.useXPath = true;
oHDS.responseSchema = {
  resultNode: "item",
  fields: ["field","value"]
};
oHDS.maxCacheEntries = 20;

var setBar = function(e, percent) {
  width = Math.round((percent/100)*barMaxWidth)+1;
  if (width > barMaxWidth) width = barMaxWidth;
  var myAnim = new YAHOO.util.Anim(e);
  myAnim.attributes.width = { to: width };
  myAnim.duration = 0.5;
  myAnim.method = YAHOO.util.Easing.easeBoth;
  myAnim.animate();
  // Dom.setStyle(e, 'width', width+'px');
  return;
}
// set centerpoint of percentage text and set text
var setPercent = function(e, percent) {
  width = Math.round(((percent/100)*barMaxWidth)/3)+1;
  if (width > barMaxWidth) width = barMaxWidth;
  //Dom.setStyle(e, 'left', width+'px');
  var myAnim = new YAHOO.util.Anim(e);
  setValue(e, percent+"%");
  myAnim.attributes.left = { to: width };
  myAnim.duration = 0.5;
  myAnim.method = YAHOO.util.Easing.easeBoth;
  myAnim.animate();
  return;
}
var setValue = function(e, value) {
  // globalise
  var e; var value;
  var myAnim = new YAHOO.util.Anim(e, { opacity: {from: 1, to: 0 } }, 0.25, YAHOO.util.Easing.easeIn);
  myAnim.onComplete.subscribe(
   function(action, animation) 
   {
    e.innerHTML = value;
    var myAnim2 = new YAHOO.util.Anim(e, { opacity: {from: 0, to: 1 } }, 0.25, YAHOO.util.Easing.easeIn);
    // hack for IE cleartype bug
    myAnim2.onComplete.subscribe(function(action, animation){ e.style.removeAttribute('filter'); });
    myAnim2.animate();
   }
  );
  myAnim.animate();
  return;
}
var setIcon = function(type, who, id) {
  switch(type) {
    case 'alert':
      Dom.get(who).innerHTML = '<img src="./c_images/icon_alert.gif" id="'+id+'" alt="Alert" align="left" />';
      break;
    case 'stats':
      Dom.get(who).innerHTML = '<img src="./c_images/icon_stats.gif" id="'+id+'" alt="Statistics" align="left" />';
      break;
    default:
      Dom.get(who).innerHTML = '<img src="./c_images/icon_info.gif" id="'+id+'" alt="Information" align="left" />';
      break;
  }
  return;
}

function oc(a)
{
  var o = {};
  for(var i=0;i<a.length;i++)
  {
    o[a[i]]='';
  }
  return o;
}

var helpCallback = {
  success: function(request, oParsedResponse, payload) {
    if (oParsedResponse.error) { return true; }
    // alert(dump(oParsedResponse.results));
    // alert (currentHelpID +'!='+ request)
    if (currentHelpID != undefined && statsShowing) {
      setIcon('info', 'icon', 'img_icon');
      var myAnim3 = new YAHOO.util.Anim('stats', { opacity: {from: 1, to: 0 } }, 0.75, YAHOO.util.Easing.easeOut);
      var myAnim4 = new YAHOO.util.Anim('infobox', { opacity: {from: 0, to: 1 } }, 0.75, YAHOO.util.Easing.easeOut);
      myAnim4.onComplete.subscribe(function(action, animation){ Dom.get('infobox').style.removeAttribute('filter'); });
      myAnim3.onComplete.subscribe(function(){
        el = new YAHOO.util.Element('stats');
        el.setStyle('display', 'none');
        el = new YAHOO.util.Element('infobox');
        el.setStyle('opacity', 1);
        el.setStyle('display', 'block');
        myAnim4.animate();
      });
      myAnim3.animate();
      statsShowing = false;
      
    }
    if (oParsedResponse.results[0] && currentHelpID != request) {
      currentHelpID = request;
      setValue(Dom.get('infobox'),oParsedResponse.results[0].value);
    }

    return;
  }
}

var alertCallback = {
  success: function(request, oParsedResponse, payload) {
    if (oParsedResponse.error) { return true; }
    setValue(Dom.get('ALERTTEXT'), oParsedResponse.results[0].value);
    return;
  }
}

var loadCallback = {
  success: function(request, oParsedResponse, payload) {
    if (oParsedResponse.error) { return true; }
    // alert(dump(oParsedResponse.results));
    updateScreen(oParsedResponse.results);
    loaded();
  }
}

var refresh = function(e) {
  var url = 'optage='+Dom.get('select_optage').value;
  url = url + '&optattmpt='+Dom.get('select_optattmpt').value;
  url = url + '&optfsh='+Dom.get('select_optfsh').value;
  url = url + '&optblasto='+Dom.get('select_optblasto').value;
  url = url + '&optamh='+Dom.get('select_optamh').value;
  if (e) { 
    // e is only true if called by a listener, so this doesnt fire on init
    showStats();
  }
  oDS.sendRequest(url, loadCallback);
}

var init = function(e) {
  // watch for dropdown box changes  
  YAHOO.util.Event.addListener('select_optage','change',refresh);
  YAHOO.util.Event.addListener('select_optattmpt','change',refresh);
  YAHOO.util.Event.addListener('select_optfsh','change',refresh);
  YAHOO.util.Event.addListener('select_optblasto','change',refresh);
  YAHOO.util.Event.addListener('select_optamh','change',refresh);
  // manually added help events
  YAHOO.util.Event.addListener('helpbutton','click',function() { oHDS.sendRequest('help=help', helpCallback);});
  // manually added stats event
  YAHOO.util.Event.addListener('statsbutton','click',showStats);
  // configure helpers
  var helpelements = Dom.getElementsByClassName('context-help', 'a', 'container', addhelp);
  oHDS.sendRequest('help=welcome', helpCallback,'init');
  oHDS.sendRequest('help=welcome-help', alertCallback);
  refresh();
}

// reset button image clicked
var resetButton = function() {
  document.form.reset();
  refresh();
  oHDS.sendRequest('help=welcome', helpCallback,'init');
  return false;
}

// this will fire upon page load
var loaded = function() {
  if (!Dom.get('loading')) return;
  var myAnim = new YAHOO.util.Anim('loading', { opacity: {from: 1, to: 0 } }, 2, YAHOO.util.Easing.easeOut);
  myAnim.onComplete.subscribe(function(){
    el = Dom.get('loading');
    el.parentNode.removeChild(el);
  });
  myAnim.animate();
}

// start hover timer for help function
var helpme = function(e, over) {
  var id = e.srcElement?e.srcElement.id:e.target.id;
  // hack for embedded PATS number in help-patients
  if (id == 'PATS') { id = 'patients-help'; }
  timerhandler[id] = Lang.later( hoverMS, this, function(id) { oHDS.sendRequest('help='+id, helpCallback) }, id );
}

// cancel hover timer (open mouseout)
var helpme_cancel = function(e, over) {
  var id = e.srcElement?e.srcElement.id:e.target.id;
  if (timerhandler[id]) {
    timerhandler[id].cancel();
  }
}

// add something to listen for a help request
var addhelp = function(e) {
  YAHOO.util.Event.addListener(e,'mouseover',helpme);
  YAHOO.util.Event.addListener(e,'mouseout',helpme_cancel);
}

var updateScreen = function(results) {
  // check how many checkboxes are non-default
  var nonDefaultIndex = 0;
  if (Dom.get('select_optage').selectedIndex != 0) { nonDefaultIndex++; }
  if (Dom.get('select_optattmpt').selectedIndex != 0) { nonDefaultIndex++; }
  if (Dom.get('select_optfsh').selectedIndex != 0) { nonDefaultIndex++; }
  if (Dom.get('select_optblasto').selectedIndex != 0) { nonDefaultIndex++; }
  if (Dom.get('select_optamh').selectedIndex != 0) { nonDefaultIndex++; }

  for (var i in results) {
    // update integer numbers
    if (results[i]['field'] in oc(numericFieldsToUpdate)) {
      setValue(Dom.get(results[i]['field']), results[i]['value']);
      // uncomment this to alert user by number of drop-downs selected
      // if (nonDefaultIndex >= dropdownLimit || (results[i]['field']=='PATS' && results[i]['value'] <= resultLimit))
      if (results[i]['field']=='PATS' && results[i]['value'] <= resultLimit)
      {
        showAlert = true;
        el = new YAHOO.util.Element('alertbox');
        setIcon('alert', 'alertbox_icon', 'img_alert');
        oHDS.sendRequest('help=selectors-help', alertCallback);
        el.setStyle('display', 'block');
      } else if (firstLoad !== true && results[i]['field']=='PATS' && results[i]['value'] > resultLimit) {
        showAlert = false;
        /*el = new YAHOO.util.Element('alertbox');
        el.setStyle('display', 'none');*/
        setIcon('info', 'alertbox_icon', 'img_alert');
        oHDS.sendRequest('help=date-help', alertCallback);
      }
    }
    // update percentages
    if (results[i]['field'] in oc(percentFieldsToUpdate)) {
      setPercent(Dom.get(results[i]['field']), results[i]['value']);
      setBar(Dom.get(results[i]['field']+"_BAR"), results[i]['value']);
    }
  }
  
  // initialisation finished
  firstLoad = false;
}

var showStats = function() {
  if (!Dom.get('stats')) return;

  setIcon('stats', 'icon', 'img_icon');
  statsShowing = true;
  var el = new YAHOO.util.Element('stats');
  el.setStyle('opacity', 0);
  el.setStyle('display', 'block');
  var myAnim = new YAHOO.util.Anim('stats', { opacity: {from: 0, to: 1 } }, 0.25, YAHOO.util.Easing.easeOut);
  myAnim.onComplete.subscribe(function(action, animation){ Dom.get('stats').style.removeAttribute('filter'); });

  var myAnim2 = new YAHOO.util.Anim('infobox', { opacity: {from: 1, to: 0 } }, 0.75, YAHOO.util.Easing.easeOut);
  myAnim2.onComplete.subscribe(function(action, animation){ e.style.removeAttribute('filter'); });
  myAnim2.onComplete.subscribe(function(){
    el = new YAHOO.util.Element('infobox');
    el.setStyle('display', 'none');
    myAnim.animate();
  });
  myAnim2.animate();
}
