Lama / Obědy

// ==UserScript==
// @name        Obědy
// @namespace   Lama
// @description Zvyrazneni obedu
// @include     *ama.cz/www/*
// @version     1.01
// @grant       GM_registerMenuCommand
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==
  

var weekDays = ["Pondě", "Úterý", "Střed", "Čtvrt", "Pátek"];

function searchFood() {
  // ulozeni GM promennych v pameti
  var foodList = JSON.parse(GM_getValue ("foodList", []));
  
  // !!!! Vyhledavani seznamu jidel v dokumentu
  //      Vzhledem k nepritomnosti id nebo jmen je to velice sproste
  //      a zavisle na strukture dokumentu - pri jeho zmene prestane fungovat !!!!
  var menuFrame = document.getElementsByTagName("center")[1];
  var menuTdList = menuFrame.getElementsByTagName("td");      
  var menuNodes = menuTdList[menuTdList.length - 1].childNodes;    //posledni TD obsahuje seznam jidel
  
  var day = 0;
  var option = 0;
  // Pro kazdy prvek z daneho elementu
  for(var i = 0; i < menuNodes.length; i++) {
    var node = menuNodes[i];
    // Pokud se jedna o textovy prvek (tj ne tag) a je tam rozumny text
    if(node.nodeType == Node.TEXT_NODE && node.nodeValue.length > 3) {
      var today = weekDays.indexOf(node.nodeValue.substring(1,6));
      if(today >= 0) { // retezec byl nalezen
        day = today;
        option = 0;
      }
      var found = false;
      // Prohledej vsechny zakazene slova
      foodList.forEach(function(food) {
        var search = node.nodeValue.match(new RegExp(food));
        // Pokud naleznes zakazene slovo v elementu, pridej k nemu span se styly
        if(search !== null && found == false) {
          replaceNode(node);
          if(option >= 2 && option < 6) {
            console.log(day+", "+option);
            changeInputColor(day, option-2);
            found = true;
          }
        }
      });
      option += 1;
    }
  }
}
searchFood();

// -----------------------------------------------------------------------------
function changeInputColor(day, option) {
  var menuFrame = document.getElementsByTagName("center")[1];
  var table = menuFrame.getElementsByTagName("table")[day+1];
  var td = table.getElementsByTagName("tr")[1].getElementsByTagName("td")[option].childNodes;
  replaceNode(td[0]); // text s cislem jidla
}

function replaceNode(node) {
  var oldText = node.nodeValue;
  var parent  = node.parentNode;
  var wrapSpan    = document.createElement ("span");
  wrapSpan.textContent = oldText;
  //wrapSpan.style.color = 'red';
  wrapSpan.style.backgroundColor = 'yellow';

  parent.insertBefore (wrapSpan, node);
  parent.removeChild (node);
}

// -----------------------------------------------------------------------------
// Přidání dialogu do GM menu k uložení nového nechtěného jídla
GM_registerMenuCommand ("Obědy: přidat potravinu", addFood);
GM_registerMenuCommand ("Obědy: odebrat potravinu", removeFood);

// Funkce vyvolá dialog k přidání jídla a uloží jej k seznamu nechtěných jídel
function addFood() {
  var newFoodList = JSON.parse(GM_getValue ("foodList", []));
  food = prompt("Přidat jídlo k zvýraznění:\n(Stačí zadat kořen slova)\n\n"+newFoodList);
  
  if(food.length > 0) {
    newFoodList.push(food);
    
    GM_setValue("foodList", JSON.stringify(newFoodList));
    searchFood();
  }
}

function removeFood() {
  var oldFoodList = JSON.parse(GM_getValue ("foodList", []));
  selected = prompt("Jídlo k odebrání:\n(Nutno použít Ctrl-C, Ctrl-V)\n\n"+oldFoodList);
  
  if(selected.length > 0) {
    var newFoodList = [];
    console.log("test");
    oldFoodList.forEach(function(food) {
      if(food != selected) {
        newFoodList.push(food);
      }
    });
    
    GM_setValue("foodList", JSON.stringify(newFoodList));
    searchFood();
  }
}