var feet = 0.3048;
var inch = 0.0254;
var lbs = 1./2.20462234;
var DIM = [550, 300];
var MARGIN = [35, 45, 35, 50];
var WEIGHT_RANGE = [40., 160.];
var LENGTH_RANGE = [1.4, 2.1];
var CURSOR_HANDLE = [12,35];

var dragging = false;
var dragHandle = [0,0];



function bmiGetWeightKg() {
  var u = $("#weight_unit").attr("value");
  var v = dsx.util.parseAmount($("#weight").attr("value"));
  if (u != "kg") {
    v = v * lbs;
  }
  return v;
}
function bmiSetWeightKg(w) {
  var u = $("#weight_unit").attr("value");
  if (u != "kg") {
      w = w / lbs;
  }
  $("#weight").attr("value", w.toFixed(0));
}

function bmiSetHeightM(h) {
  var u = $("#height_unit").attr("value");
  if (u != "m") {
    var f = Math.floor(h / feet);
    var i = Math.round((h - feet*f)/inch)
    $("#height").attr("value", f);
    $("#height_inch").attr("value", i);
  }
  else {
      $("#height").attr("value", h.toFixed(2));
  }
}

function bmiHeightM() {
  var hu = $("#height_unit").attr("value");
  var m = dsx.util.parseAmount($("#height").attr("value"));
  if (hu == "f") {
    var i = dsx.util.parseAmount($("#height_inch").attr("value"));
    m = m * feet + i * inch;
  }
  return m;
}

function bmiEvaluate() {
  bmiDoEvaluate(true);
}

function bmiDoEvaluate(repos) {
  var w = bmiGetWeightKg();
  var h = bmiHeightM();
  var v = w / (h*h);
  var i = 0;
  var l = 'Error';
  var c = '#ccc';
  if (! isNaN(v)) {
    while (v > bmiLevels[i] && i < bmiLevels.length) { i++; }
    l = bmiLabels[i]; c = bmiColors[i];
    v = v.toFixed(1);
  }
  else {
    v = '?';
  }
  if (repos) bmiChartSetPos(w, h);
  $("#bmivalue").html(v);
  $("#bmilabel").html(l);
  $("#bmivalue").parent().css("background-color", c);
}
function bmiWeight() {
  var lbs = 1./2.20462234;
  var u = $(this).attr("value");
  var v = dsx.util.parseAmount($("#weight").attr("value"));
  if (u == "kg") {
    v = v * lbs;
  } else {
    v = v / lbs;
  }
  $("#weight").attr("value", v.toFixed(0));
}
function bmiHeightUnit() {
  var u = $(this).attr("value");
  if (u == "f") {
    var m = dsx.util.parseAmount($("#height").attr("value"));
    var f = Math.floor(m / feet);
    var i = Math.round((m - feet*f)/inch)
    $("#height").attr("value", f);
    $("#height_inch").attr("value", i);
    $("#height_inch_label").show();
    $("#height_inch").show();
  } else {
    var f = dsx.util.parseAmount($("#height").attr("value"));
    var i = dsx.util.parseAmount($("#height_inch").attr("value"));
    var m = f*feet+i*inch;
    $("#height").attr("value", m.toFixed(2));
    $("#height_inch_label").hide();
    $("#height_inch").hide();
  }
}

function bmiChartSetCursor(x, y) {
    var cur = $("#chartpos");
    cur.css("left", x - CURSOR_HANDLE[0]);
    cur.css("top", y - CURSOR_HANDLE[1]);;
    cur.show();
}

function bmiChartSetPos(w, l) {
    var gw = DIM[0] - MARGIN[1] - MARGIN[3];
    var gh = DIM[1] - MARGIN[0] - MARGIN[2];
    var cur = $("#chartpos");
    if (w >= WEIGHT_RANGE[0] && w < WEIGHT_RANGE[1]
        && l >= LENGTH_RANGE[0] && l < LENGTH_RANGE[1]) {
        var cx = MARGIN[3]+(w - WEIGHT_RANGE[0]) * gw / (WEIGHT_RANGE[1] - WEIGHT_RANGE[0]);
        var cy = DIM[1] - MARGIN[2] - (l - LENGTH_RANGE[0]) * gh / (LENGTH_RANGE[1] - LENGTH_RANGE[0]);
        bmiChartSetCursor(cx, cy);
    }
    else {
        cur.hide();
    }
}

function bmiChartCursorMouseDown(e) {
    var chart = $("#chartpos");
    var off = chart.offset();
    var x = e.pageX-off.left;
    var y= e.pageY-off.top;
    dragHandle[0] =  x-CURSOR_HANDLE[0];
    dragHandle[1] =  y-CURSOR_HANDLE[1];
    dragging = true;
    return false;
}

function bmiChartMouseDown(e) {
    dragging = true;
    dragHandle[0] = dragHandle[1] = 0;
    return false;
}
function bmiChartMouseUp(e) {
    dragging = false;
    return false;
}
function bmiChartMouseMove(e) {
    if (dragging) bmiChartClick(e);
    return false;
}


function bmiChartClick(e) {
    var chart = $("#chart");
    var off = chart.offset();
    var x = e.pageX-off.left - dragHandle[0];
    var y= e.pageY-off.top - dragHandle[1];
    if (x >= MARGIN[3] && x < DIM[0]-MARGIN[1]
        && y >= MARGIN[0] && y < DIM[1]-MARGIN[2]) {
        var w = WEIGHT_RANGE[0]+ (x - MARGIN[3]) * (WEIGHT_RANGE[1]-WEIGHT_RANGE[0])/(DIM[0]-MARGIN[1]-MARGIN[3]);
        var l = LENGTH_RANGE[1] + (y - MARGIN[0]) * (LENGTH_RANGE[0]-LENGTH_RANGE[1])/(DIM[1]-MARGIN[0]-MARGIN[2]);
        bmiChartSetCursor(x,y);
        bmiSetHeightM(l);
        bmiSetWeightKg(w);
        bmiDoEvaluate(false);
    }
    return false;
}

function bmiInit() {
  bmiEvaluate();                                 
  $("#weight_unit").change(bmiWeight);
  $("#height_unit").change(bmiHeightUnit);
  $("#height").keyup(bmiEvaluate);
  $("#height").change(bmiEvaluate);
  $("#height_inch").keyup(bmiEvaluate);
  $("#height_inch").change(bmiEvaluate);
  $("#weight").keyup(bmiEvaluate);
  $("#weight").change(bmiEvaluate);
  $("#chart").mousedown(function(e){ return bmiChartMouseDown(e)});
  $("#chartpos").mousedown(function(e){ return bmiChartCursorMouseDown(e)});
  var cids = ["#chart", "#chartpos"];
  for (i in cids) {
    var cid = cids[i];
    $(cid).mouseup(function(e){ return bmiChartMouseUp(e)});
    $(cid).mousemove(function(e){ return bmiChartMouseMove(e)});
    $(cid).click(function(e){ return bmiChartClick(e)});
  }

  $.ifixpng.pixel = "/media/img/_.gif";
        $('#chartpos').ifixpng(); 
}

