if(window.YAHOO === undefined)
  alert("Bitte Javascript auch fuer yahooapis.com zulassen, ansonsten funktioniert der FettRechner nicht. Vielen Dank.");

function levenshtein( str1, str2 ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
    // *     example 1: levenshtein('Kevin van Zonneveld', 'Kevin van Sommeveld');
    // *     returns 1: 3
 
    var s, l = (s = str1.split("")).length, t = (str2 = str2.split("")).length, i, j, m, n;
    if(!(l || t)) return Math.max(l, t);
    for(var a = [], i = l + 1; i; a[--i] = [i]);
    for(i = t + 1; a[0][--i] = i;);
    for(i = -1, m = s.length; ++i < m;){
        for(j = -1, n = str2.length; ++j < n;){
            a[(i *= 1) + 1][(j *= 1) + 1] = Math.min(a[i][j + 1] + 1, a[i + 1][j] + 1, a[i][j] + (s[i] != str2[j]));
        }
    }
    return a[l][t];
}
  
var allItems = {}, _gat = null, queryString = '&results=20&output=json', myDataTable = null;

/* Ganze Tabelle einmal einlesen */
function loadAllItems() {
  var fetchAllDS = new YAHOO.util.DataSource("/tools/index.php/fettrechner_process/");
  fetchAllDS.responseType = YAHOO.util.DataSource.TYPE_JSON;
  fetchAllDS.connXhrMode = "cancelStaleRequests";
  fetchAllDS.connMethodPost = true;
  fetchAllDS.responseSchema = {
      resultsList: "ResultSet.Result",
      fields: [
          { key: "product" },
          { key: "shortname" },
          { key: "amount" },
          { key: "fat", parser:YAHOO.util.DataSource.parseFloat }
      ]
  };
  
  fetchAllDS.sendRequest('q=4&query=', function(sRequest, oResponse, oPayload){
    allItems = oResponse;
  }, {});
}; 

var customInputEnable = function(submitBtn,inpField) {

  if(inpField != null) {
    //YAHOO.util.Dom.setStyle("dt_input_fat","background-color",(inpField ? "green" : "#AAA"));
    YAHOO.util.Dom.setStyle("fatContainer","display", (inpField ? "block" : "none"));
    YAHOO.util.Dom.get("dt_input_fat").disabled = !inpField;
    YAHOO.util.Dom.get("dt_input_amount").disabled = !inpField;
    if(inpField) {
      YAHOO.util.Dom.get("dt_input_fat").value = "";
      YAHOO.util.Dom.get("dt_input_amount").value = "";
      YAHOO.util.Dom.setStyle("tableContainer","visibility","visible");
    }
  }
  
  if(submitBtn != null) {
    YAHOO.util.Dom.setStyle("btnContainer","display",(submitBtn ? "block" : "none"));
    YAHOO.util.Dom.get("addbutton").disabled = !submitBtn;
  }
  
  if(YAHOO.util.Dom.get("dt_input_fat").disabled == true)
    YAHOO.util.Dom.get("btnContainerNr").innerHTML = "2.";
  else
    YAHOO.util.Dom.get("btnContainerNr").innerHTML = "3.";
  
  YAHOO.log("customInputEnable "+submitBtn+" "+inpField);
};

var deleteFromDT = function(record) {
  myDataTable.deleteRow(myDataTable.getRecord(record))
};

var inputFatHandler = function() {
  var f = YAHOO.util.Dom.get("dt_input_fat").value, a = YAHOO.util.Dom.get("dt_input_amount").value;
  
  if(f.length < 1 || a.length < 1)
    return;

  var btn = parseFloat(f.replace(/,/, "."),10) > -1 && a.match(/^\d+/) && a.match(/[a-zA-Z]+/);
  customInputEnable(btn,null);
};

YAHOO.widget.DS_JSFunction.myFetch = function(sQuery) {
    aResults = [];
    sQuery = decodeURI(sQuery);
    for(var i in allItems.results) {
      var item = allItems.results[i];
      YAHOO.log("sQuery:"+sQuery+" product:"+item.product);
      var rxp = new RegExp(sQuery);
      if(rxp.test(item.product) || (item.shortname && levenshtein(sQuery,item.shortname)<2)) {
        aResults.push([item.product,{"product":item.product, "fat":item.fat,"amount":item.amount}]);
      }
    }
    
    return aResults;
};

YAHOO.util.Event.onDOMReady(function() {    
    var oACDS2 = new YAHOO.widget.DS_JSFunction(YAHOO.widget.DS_JSFunction.myFetch);
    oACDS2.maxCacheEntries = 0;
    
    oAutoComp2 = new YAHOO.widget.AutoComplete('dt_input_product','dt_ac_container', oACDS2);
    oAutoComp2.prehighlightClassName = "schmidt-ac-prehighlight";
    oAutoComp2.highlightClassName = "schmidt-ac-highlight";
    oAutoComp2.typeAhead = false;
    oAutoComp2.alwaysShowContainer = false; 
    oAutoComp2.queryDelay = 0.6;
    oAutoComp2.forceSelection = false; 
    oAutoComp2.minQueryLength = 3; 
    oAutoComp2.maxResultsDisplayed = 20; 
    oAutoComp2.useShadow = true;
    
    oAutoComp2.formatResult = function(oResultItem, sQuery) {
      if(oResultItem[1].fat != "") {
        var n = parseFloat(oResultItem[1].fat,10);
        return oResultItem[1].product + " (" + n.toString().replace(/\./, ",") + "g Fett)";
      } else {
        return oResultItem[1].product;
      } 
    };
    
    oAutoComp2.unmatchedItemSelectEvent.subscribe(function() {
      customInputEnable(false,true);
    }); 
    
    oAutoComp2.itemSelectEvent.subscribe(function(sType, aArgs) {
      YAHOO.util.Dom.setStyle("tableContainer","visibility","visible");
        
      var b = (aArgs[2][1].fat.toString().length != 0);
      var i = (aArgs[2][1].fat.toString().length == 0);
      
      
      if(YAHOO.util.Dom.get("dt_input_product").value.match(/^Keine Auswahl/)) {
        YAHOO.log("keine auswahl");
        YAHOO.util.Dom.get("dt_input_new").value = 1;
        customInputEnable(b,i);
        return;
      }

      YAHOO.util.Dom.get("dt_input_new").value = 0;
      YAHOO.util.Dom.get("dt_input_product").value = aArgs[2][1].product;
      YAHOO.util.Dom.get("dt_input_fat").value = aArgs[2][1].fat;
      YAHOO.util.Dom.get("dt_input_amount").value = aArgs[2][1].amount;
      YAHOO.util.Dom.get("addbutton").disabled = false; 

      YAHOO.log("laenge fatamount: "+aArgs[2][1].fat.toString().length);
        
      customInputEnable(b,i);
    }); 
    
    oAutoComp2.dataReturnEvent.subscribe(function(sType, aArgs) {
      customInputEnable(false,false);
      YAHOO.log("datareturn:"+YAHOO.lang.dump(aArgs[2][1]));
      YAHOO.util.Dom.setStyle("tableContainer","visibility","hidden");
      if(aArgs[2][1] == undefined) {
        customInputEnable(false,true);
        YAHOO.util.Dom.get("dt_input_new").value = 1;
      } else {
        customInputEnable(false,false);
        YAHOO.util.Dom.get("dt_input_new").value = 0;
      }
    }); 
    
    var fmtproduct = function(elCell, oRecord, oColumn, sData) {
    YAHOO.log(YAHOO.lang.dump(oRecord));
        if(oRecord.getData("product").length > 36)
          elCell.innerHTML = oRecord.getData("product").slice(0, 36)+"... ("+oRecord.getData("amount")+")";
        else
          elCell.innerHTML = oRecord.getData("product")+" ("+oRecord.getData("amount")+")";
    };
    var fmtfat = function(elCell, oRecord, oColumn, sData) {
        var n = parseFloat(oRecord.getData("fat"),10);
        elCell.innerHTML = n.toString().replace(/\./, ",")+"g";
    };
    var deleteButton = function(elCell, oRecord, oColumn, sData) {
        elCell.innerHTML = '<button onclick="deleteFromDT(\''+oRecord.getId()+'\');" style="color:red;"><img src="/tools/public/fettrechner/images/button_remove.png" alt="Entfernen" /></button>';
    };

    var myColumnDefs = [
        { key:"product", label: "Produkt", formatter: fmtproduct, sortable:true },
        { key:"fat", label: "Fettmenge", formatter: fmtfat, sortable:true },
        { key:"Delete", label:"Entfernen", formatter: deleteButton }
    ];

    var fetchDS = new YAHOO.util.DataSource("/tools/index.php/fettrechner_process/search/");
    fetchDS.responseType = YAHOO.util.DataSource.TYPE_JSON;
    fetchDS.connXhrMode = "queueRequests";
    fetchDS.connMethodPost = true;
    fetchDS.responseSchema = {
        resultsList: "ResultSet.Result",
        fields: [
            { key: "product" },
            { key: "shortname" },
            { key: "amount" },
            { key: "fat", parser:YAHOO.util.DataSource.parseFloat }
        ]
    };

    myDataTable = new YAHOO.widget.DataTable("json", myColumnDefs, fetchDS, {initialRequest: 'query=' + queryString });
    
    myDataTable.myOnDataReturnAppendRows = function (sRequest,oResponse,bError) {
      myDataTable.onDataReturnAppendRows(sRequest,oResponse,bError);
      myDataTable.updateEvent();
      loadAllItems();
      YAHOO.util.Dom.get("dt_input_product").value = oResponse.results[0].product;
    }

    myDataTable.myOnRowAddEvent = function(oArgs) {  
      myDataTable.updateEvent();
      var el = myDataTable.getTrEl(oArgs.record), bgcolor = YAHOO.util.Dom.getStyle(el, 'backgroundColor'), timeOut = 500;
      var atts = { backgroundColor: { from: '#CDEB8B', to: '#EEEEEE' } };
      
      var anim = new YAHOO.util.ColorAnim(el, atts, timeOut/1000);
      anim.onComplete.subscribe(function(){
        YAHOO.util.Dom.setStyle(el,"background-color","transparent");
      });
      anim.animate();
    }
    
    myDataTable.updateEvent = function() {
      var records = myDataTable.getRecordSet(), sum = 0.0;

      for(var i=0;i<records.getLength();i++) {
        var record = records.getRecord(i);
        sum = sum+parseFloat(record.getData("fat"),10);
      }
      
      sum = Math.round(sum*Math.pow(10,2))/Math.pow(10,2);
      sum = sum.toString().replace(/\./, ",");
      
      YAHOO.util.Dom.get("fatSum").innerHTML = sum+" Gramm";
      
      var el = YAHOO.util.Dom.get("fatSum"), timeOut = 1500;
      var atts = { color: { from: '#FF5D5D', to: '#9B5D5D' } };
      
      var anim = new YAHOO.util.ColorAnim(el, atts, timeOut/1000);
      anim.animate();
    };
    
    myDataTable.subscribe("rowAddEvent", myDataTable.myOnRowAddEvent);
    myDataTable.subscribe("rowDeleteEvent", myDataTable.updateEvent);
    YAHOO.widget.DataTable.MSG_EMPTY = "Keine Eintr&auml;ge bis jetzt";
});


YAHOO.util.Event.addListener("addbutton", "click", function() {
  YAHOO.log("addbutton clicked");
  if(myDataTable.getRecordSet().getLength() > 20) {
    YAHOO.log("liste voll");

      var el = YAHOO.util.Dom.get("tableContainer"), bgcolor = YAHOO.util.Dom.getStyle(el, 'backgroundColor'), timeOut = 500;
      var atts = { backgroundColor: { from: '#9B5D5D', to: '#EEEEEE' } };
      
      var anim = new YAHOO.util.ColorAnim(el, atts, timeOut/1000);
      anim.animate();
    
    return;
  }
  
  YAHOO.util.Dom.get("dt_input_fat").value = YAHOO.util.Dom.get("dt_input_fat").value.replace(/,/, ".");
  var f = parseFloat(YAHOO.util.Dom.get("dt_input_fat").value,10);
  var a = YAHOO.util.Dom.get("dt_input_amount").value.slice(0,16);
    
  if(YAHOO.util.Dom.get("dt_input_product").value == "" || YAHOO.util.Dom.get("dt_input_fat").value == "") {
    YAHOO.log("ein eingabfeld ist leer");
    return;
  }

  var l = myDataTable.getRecordSet().getLength();

  if(YAHOO.util.Dom.get("dt_input_new").value == 1) {
    YAHOO.util.Dom.get("dt_input_new").value = 0;
    var saveDS = new YAHOO.util.DataSource("/fR2/index.php/fettrechner/store/");
    saveDS.responseType = YAHOO.util.DataSource.TYPE_JSON;
    saveDS.connXhrMode = "queueRequests";
    saveDS.connMethodPost = true;
    saveDS.responseSchema = {
        resultsList: "ResultSet.Result",
        fields: [
            { key: "product" },
            { key: "shortname" },
            { key: "amount" },
            { key: "fat", parser:YAHOO.util.DataSource.parseFloat }
        ]
    };
  
    var query = "amount="+YAHOO.util.Dom.get("dt_input_amount").value+"&query="+YAHOO.util.Dom.get("dt_input_product").value+"&fat="+parseFloat(YAHOO.util.Dom.get("dt_input_fat").value,10);
    YAHOO.log("1:adding row");
    saveDS.sendRequest('q=2&new=1&'+query, myDataTable.myOnDataReturnAppendRows, myDataTable);
  } else {
    YAHOO.log("2:adding row");
    myDataTable.addRow({"product":YAHOO.util.Dom.get("dt_input_product").value,"fat":f,"amount":a},l);
  }
}); 

YAHOO.util.Event.addListener("dt_input_product", "keyup", inputFatHandler); 
YAHOO.util.Event.addListener("dt_input_fat", "keyup", inputFatHandler); 
YAHOO.util.Event.addListener("dt_input_fat", "change", inputFatHandler); 
YAHOO.util.Event.addListener("dt_input_amount", "keyup", inputFatHandler); 
YAHOO.util.Event.addListener("dt_input_amount", "change", inputFatHandler); 

YAHOO.util.Event.addListener(window, "load", function() {
  customInputEnable(false,false);
 
  YAHOO.util.Dom.get("dt_input_product").value = "";
  YAHOO.util.Dom.get("dt_input_fat").value = "";
  YAHOO.util.Dom.get("dt_input_amount").value = "";
  
  if(_gat != null) {
    var pageTracker = _gat._getTracker("UA-4288922-1");
    pageTracker._initData();
    pageTracker._trackPageview();
  }

}); 

YAHOO.util.Event.addListener(window, "load", loadAllItems); 