british = false;
proteins=[
  {"name":"CANOLAMeal, mech. Extracted","DM":90.3,"CP":37.8,"PR":0.374},
  {"name":"CORN, YELLOWGluten meal, dried","DM":86.4,"CP":65.0,"PR":0.575},
  {"name":"SOYBEANMeal, solvent, 44% CP","DM":89.1,"CP":49.9,"PR":0.418},
  {"name":"SOYBEANMeal, solvent, 48% CP","DM":89.5,"CP":53.8,"PR":0.400},
  {"name":"SUNFLOWERMeal, solvent","DM":92.2,"CP":28.4,"PR":0.187}
];
energy_feeds=[
  {"name":"CORN, YELLOWGrain, cracked, dry","DM":88.1,"CP":9.4,"PR":0.150},
  {"name":"CORN, YELLOWGrain, ground, dry","DM":88.1,"CP":9.4,"PR":0.166},
  {"name":"CORN, YELLOWGrain, ground, high moisture","DM":71.8,"CP":9.2,"PR":0.110},
  {"name":"CORN, YELLOWShell, high moisture","DM":70.0,"CP":9.1,"PR":0.116},
  {"name":"CORN, YELLOWSilage, normal 32-38% DM","DM":35.1,"CP":8.8,"PR":0.044}
];
add_protein_source=function() {
  proteins.push({"name":"Enter Protein Feed Name","DM":90,"CP":50,"PR":0});
  refresh_protein_select();
  row = create_row(proteins.length-1,proteins,populate_proteins,delete_protein,
        refresh_protein_select,"#protein","#protein_pr");
  $("#protein_edit").append(row);
}
add_energy_feed=function() {
  energy_feeds.push({"name":"Enter Energy Feed Name","DM":90,"CP":10,"PR":0});
  refresh_energy_feed_select();
  row = create_row(energy_feeds.length-1,energy_feeds,populate_energy_feeds,delete_energy_feed,
        refresh_energy_feed_select,"#energy_feed","#energy_feed_pr");
  $("#energy_feed_edit").append(row);
}
update_protein=function(protein_name,dm,cp,pr){
  proteins[protein_name].DM = dm;
  proteins[protein_name].CP = cp;
  proteins[protein_name].PR = pr;
}
update_energy_feed=function(energy_feed_name,dm,cp,pr){
  energy_feeds[energy_feed_name].DM = dm;
  energy_feeds[energy_feed_name].CP = cp;
  energy_feeds[energy_feed_name].PR = pr;
}
delete_protein=function(i){ 
  proteins.splice(i,1);
}
delete_energy_feed=function(i){
  energy_feeds.splice(i,1);
}
solve=function(a,b,c,d,x,y){det=a*d-b*c;return new Array((d*x-b*y)/det,(a*y-c*x)/det);}
get=function(e){return $("#"+e).val()}
set=function(e,v){document.getElementById(e).value=Math.round(1000*v)/1000};
find_element=function(name,an_array){
  for(i=0;i<an_array.length;i++) {
    element = an_array[i];
    if(element.name==name) return element;
  }
  return 0;
}
find_protein=function(name) { return find_element(name,proteins); }
toggle_protein_list = function(link) {
  div = document.getElementById("protein_edit_div");
  if(div.style.display=='none') {div.style.display='';link.innerHTML='(Close)';}
  else {div.style.display='none';link.innerHTML='(Edit)';}
}
toggle_energy_feed_list = function(link) {
  div = document.getElementById("energy_feed_edit_div");
  if(div.style.display=='none') {div.style.display='';link.innerHTML='(Close)';}
  else {div.style.display='none';link.innerHTML='(Edit)';}
}

refresh_protein_select = function() {
  $("#protein").replaceWith("<select id='protein' style='width:300px'></select>");
  for(i=0;i<proteins.length;i++) {
    $("#protein").append("<option>"+proteins[i].name+"</option>");
  }
  $("select#protein").change(change_protein);
}
refresh_energy_feed_select = function() {
  $("#energy_feed").replaceWith("<select id='energy_feed' style='width:300px'></select>");
  for(i=0;i<energy_feeds.length;i++) {
    $("#energy_feed").append("<option>"+energy_feeds[i].name+"</option>");
  }
  $("select#energy_feed").change(change_energy_feed);
}
create_row = function(index,feed_list,pop_func,del_func,refresh_func,feed_select,feed_pr) {
    myitem = feed_list[index]
    row  = document.createElement("tr");
    del_link = document.createElement("td");
    iname = document.createElement("td");
    dm   = document.createElement("td");
    cp   = document.createElement("td");
    pr   = document.createElement("td");

    $(del_link).attr('item_id',index);
    $(del_link).append("<button>x</button>").click(function() {
      del_func($(this).attr('item_id'));
      refresh_func();
      $(this).parent().remove();
      pop_func();
    });

    name_inp = document.createElement("input");
    name_inp.setAttribute("type","text");
    name_inp.setAttribute("class","name");
    name_inp.setAttribute("value",myitem.name);
    name_inp.setAttribute("item_id",index);
    $(name_inp).change(function() {
      feed_list[$(this).attr('item_id')].name = $(this).val();
      $(this).parent().prev().attr('item_name',$(this).val());
      refresh_func();
      update_values();
      $(this).parent().parent().effect("highlight",2000,function(){}); 
    });
    $(iname).append($(name_inp));

    dm_inp = document.createElement("input");
    dm_inp.setAttribute("type","text");
    dm_inp.setAttribute("value",myitem.DM);
    dm_inp.setAttribute("item_id",index);
    $(dm_inp).change(function() {
      feed_list[$(this).attr('item_id')].DM = $(this).val();
      update_values();
      $(this).parent().parent().effect("highlight",2000,function(){}); 
    });
    $(dm).append($(dm_inp));

    cp_inp = document.createElement("input");
    cp_inp.setAttribute("type","text");
    cp_inp.setAttribute("value",myitem.CP);
    cp_inp.setAttribute("item_id",index);
    $(cp).append($(cp_inp));
    $(cp_inp).change(function() {
      feed_list[$(this).attr('item_id')].CP = $(this).val();
      update_values();
      $(this).parent().parent().effect("highlight",2000,function(){}); 
    });

    pr_inp = document.createElement("input");
    pr_inp.setAttribute("type","text");
    pr_inp.setAttribute("value",myitem.PR);
    pr_inp.setAttribute("item_id",index);
    $(pr).append($(pr_inp));
    $(pr_inp).change(function() {
      feed_list[$(this).attr('item_id')].PR = $(this).val();
      if(feed_list[$(this).attr('item_id')].name==$(feed_select).val()) {
        $(feed_pr).val($(this).val());
      }
      update_values();
      $(this).parent().parent().effect("highlight",2000,function(){}); 
    });

    $(row).append($(del_link));
    $(row).append($(iname));
    $(row).append($(dm));
    $(row).append($(cp));
    $(row).append($(pr));
    return $(row);
}
populate_proteins = function() {
  edit = document.getElementById("protein_edit");
  $("#protein_edit tr:gt(0)").remove();
  for(i=0;i<proteins.length;i++) {
    row = create_row(i,proteins,populate_proteins,delete_protein,
        refresh_protein_select,"#protein","#protein_pr");
    $(edit).append(row);
  }
}
populate_energy_feeds = function() {
  edit = document.getElementById("energy_feed_edit");
  // Edit is a table. We want to leave the first
  // row (units) intact
  $("#energy_feed_edit tr:gt(0)").remove();
  for(i=0;i<energy_feeds.length;i++) {
    row = create_row(i,energy_feeds,populate_energy_feeds,delete_energy_feed,
        refresh_energy_feed_select,"#energy_feed","#energy_feed_pr");
    $(edit).append(row);
  }
}
update_slider = function() {
  if(british) {
    $("#milk_price_slider").slider('option','min',8);
    $("#milk_price_slider").slider('option','max',30);
    $("#milk_price_slider").slider('option','step',0.1);
    $("#milk_price_slider").slider('option','value',get('milk_pr'));
    $("#milk_use_slider").slider('option','min',0.6);
    $("#milk_use_slider").slider('option','max',1.5);
    $("#milk_use_slider").slider('option','step',0.01);
    $("#milk_use_slider").slider('option','value',get('milk_inc'));
  } else {
    $("#milk_price_slider").slider('option','min',0.15);
    $("#milk_price_slider").slider('option','max',0.70);
    $("#milk_price_slider").slider('option','step',0.01);
    $("#milk_price_slider").slider('option','value',get('milk_pr'));
    $("#milk_use_slider").slider('option','min',0.3);
    $("#milk_use_slider").slider('option','max',0.7);
    $("#milk_use_slider").slider('option','step',0.01);
    $("#milk_use_slider").slider('option','value',get('milk_inc'));
  }
}
$(document).ready(function() {
  $("#energy_feed_edit_div").dialog({
    bgiframe: true,
    autoOpen: false,
    width:550,
    modal: true,
    buttons: {
     'Close': function(){$(this).dialog('close');},
     'Add Energy Feed' : add_energy_feed
    }});
  $("#protein_edit_div").dialog({
    bgiframe: true,
    autoOpen: false,
    width:550,
    modal: true,
    buttons: {
     'Close': function(){$(this).dialog('close');},
     'Add Protein': add_protein_source
    }});

  $("input[name='units']").click(function() {
    british = $("input[value=british]").is(":checked");
    if(british) {
      // Convert all inputs to British
      v_optigen_fed     =get("optigen_fed");
      v_optigen_pr      =get("optigen_pr");
      v_milk_inc        =get("milk_inc");
      v_milk_pr         =get("milk_pr");
      v_protein_pr      =get("protein_pr");
      v_energy_feed_pr  =get("energy_feed_pr");
      set("optigen_fed", v_optigen_fed/0.454);
      set("optigen_pr", v_optigen_pr*0.454);
      set("milk_inc", v_milk_inc/0.454);
      set("milk_pr", v_milk_pr*45.4);
      set("protein_pr", v_protein_pr*0.454);
      set("energy_feed_pr", v_energy_feed_pr*0.454);
      $("span[class='kglb']").text("lb");
      $("span[class='kgcwt']").text("cwt");
      for(i=0;i<proteins.length;i++) {
        proteins[i].PR=proteins[i].PR*0.454;
      }
      for(i=0;i<energy_feeds.length;i++) {
        energy_feeds[i].PR=energy_feeds[i].PR*0.454;
      }
    } else {
      // Convert all inputs to Metric
      v_optigen_fed     =get("optigen_fed");
      v_optigen_pr      =get("optigen_pr");
      v_milk_inc        =get("milk_inc");
      v_milk_pr         =get("milk_pr");
      v_protein_pr      =get("protein_pr");
      v_energy_feed_pr  =get("energy_feed_pr");
      set("optigen_fed", v_optigen_fed*0.454);
      set("optigen_pr", v_optigen_pr/0.454);
      set("milk_inc", v_milk_inc*0.454);
      set("milk_pr", v_milk_pr/45.4);
      set("protein_pr", v_protein_pr/0.454);
      set("energy_feed_pr", v_energy_feed_pr/0.454);
      $("span[class='kglb']").text("kg");
      $("span[class='kgcwt']").text("kg");
      for(i=0;i<proteins.length;i++) {
        proteins[i].PR=proteins[i].PR/0.454;
      }
      for(i=0;i<energy_feeds.length;i++) {
        energy_feeds[i].PR=energy_feeds[i].PR/0.454;
      }
    }
    update_slider();
    populate_proteins();
    populate_energy_feeds();
    update_values(); // Recalculate outputs
  });
  update_slider();
  if(british) {
    $("#milk_price_slider").slider(
      {min:8,
       max:30,
       step:0.5,
       value:12,
       slide:function(e,u){$("#milk_pr").val(u.value); update_values();}});
    $("#milk_use_slider").slider(
      {min:0.6,
       max:1.5,
       step:0.01,
       value:1,
       slide: function(e,u){$("#milk_inc").val(u.value); update_values()}});
  } else {
    $("#milk_price_slider").slider(
        {min:0.15,
         max:0.70,
         step:0.01,
         value:0.25,
         slide:function(e,u){$("#milk_pr").val(u.value); update_values();}});
    $("#milk_use_slider").slider(
        {min:0.3,
         max:0.7,
         step:0.01,
         value:0.5,
         slide: function(e,u){$("#milk_inc").val(u.value); update_values()}});
  }

  populate_energy_feeds();
  populate_proteins();

  $("input[type=text]").keyup(update_values);
  $("select#protein").change(change_protein);
  $("select#energy_feed").change(change_energy_feed);
  refresh_protein_select();
  refresh_energy_feed_select();
  $("#protein option:contains(SOYBEANMeal, solvent, 44% CP)").attr('selected','selected');
  $("#energy_feed option:contains(CORN, YELLOWSilage, normal 32-38% DM)").attr('selected','selected');
  if(british) {
    $("#optigen_fed").val(0.114/0.454);
    //$("#optigen_pr").val(1.630*0.454);
    $("#protein_pr").val(find_protein($("#protein").val()).PR);
    $("#energy_feed_pr").val(find_energy_feed($("#energy_feed").val()).PR);
    $("#milk_inc").val(1);
    $("#milk_pr").val(8);
  }
  update_values();
});
find_energy_feed=function(name) { return find_element(name,energy_feeds); }
change_protein=function(){
  protein_name    =get("protein");
  v_protein = find_protein(protein_name);
  v_protein_pr=v_protein.PR;
  set("protein_pr",v_protein_pr);
  update_values();
}
change_energy_feed=function(){
  energy_feed_name=get("energy_feed");
  v_energy_feed = find_energy_feed(energy_feed_name);
  v_energy_feed_pr=v_energy_feed.PR;
  set("energy_feed_pr",v_energy_feed_pr);
  update_values();
}
update_values=function(){
  // Get Inputs
  v_optigen_fed     =get("optigen_fed");
  v_optigen_pr      =get("optigen_pr");
  v_milk_inc        =get("milk_inc");
  v_milk_pr         =get("milk_pr");
  v_protein_name    =get("protein");
  v_energy_feed_name=get("energy_feed");
  //Lookup Protein
  v_protein = find_protein(v_protein_name);
  v_protein_dm=v_protein.DM/100;
  v_protein_cp=v_protein.CP/100;
  v_protein_pr=get("protein_pr");
  v_energy_feed = find_energy_feed(v_energy_feed_name);
  v_energy_feed_dm=v_energy_feed.DM/100;
  v_energy_feed_cp=v_energy_feed.CP/100;
  v_energy_feed_pr=get("energy_feed_pr");
  //Set Optigen Values
  v_optigen_dm=99;v_optigen_cp=256;
  if(british) {
    v_optigen_fed    = v_optigen_fed*0.454;
    v_optigen_pr     = v_optigen_pr/0.454;
    v_milk_inc       = v_milk_inc*0.454;
    v_milk_pr        = v_milk_pr/45.4; // $/cwt
    v_protein_pr     = v_protein_pr/0.454;
    v_energy_feed_pr = v_energy_feed_pr/0.454;
  }
  v_optigen_kg_dm=v_optigen_fed*v_optigen_dm/100;
  v_optigen_kg_cp=v_optigen_kg_dm*v_optigen_cp/100;
  // Solve
  x=solve(v_protein_dm,v_energy_feed_dm,v_protein_cp*v_protein_dm,v_energy_feed_cp*v_energy_feed_dm,v_optigen_kg_dm,v_optigen_kg_cp);
  protein_kg_out=x[0];energy_feed_kg_in=x[1];
  // Calculate Value and KG_DM
  v_protein_kg_dm=protein_kg_out*v_protein_dm/100;
  v_energy_feed_kg_dm=energy_feed_kg_in*v_energy_feed_dm/100;
  v_protein_val=protein_kg_out*v_protein_pr;
  v_energy_feed_val=energy_feed_kg_in*v_energy_feed_pr;
  v_milk_val=v_milk_inc*v_milk_pr;
  //milk_val=milk_inc*milk_pr/45.4;
  v_optigen_val=-v_optigen_fed*v_optigen_pr;
  v_optigen_profit=v_optigen_val+v_protein_val+v_energy_feed_val+v_milk_val;
  //Outputs
  if(british) {
    v_optigen_kg_dm = v_optigen_kg_dm/0.454;
    v_protein_kg_dm = v_protein_kg_dm/0.454;
    v_energy_feed_kg_dm = v_energy_feed_kg_dm/0.454;
  }
  set("optigen_kg_dm",v_optigen_kg_dm);
  set("protein_kg_dm",-v_protein_kg_dm*100);
  set("energy_feed_kg_dm",-v_energy_feed_kg_dm*100);
  set("optigen_val",v_optigen_val);
  set("protein_val",v_protein_val);
  set("energy_feed_val",v_energy_feed_val);
  set("milk_val",v_milk_val);
  set("optigen_profit",v_optigen_profit);
  v_optigen_profit = Math.round(v_optigen_profit*1000)/1000;
  if(v_optigen_profit>0) {
    $("#optigen_profit").css('color', 'green');
  } else if(v_optigen_profit<0) {
    $("#optigen_profit").css('color', 'red');
  } else {
    $("#optigen_profit").css('color', 'orange');
  }

}
