/******************************************************************
  
  Funkce JavaScript pro aplikaci Lineární algebra: práce s maticemi
  
  Autor: (c) 2007, Michal Novák
  
*******************************************************************/


/******************************************************************
  
  Definice konstant pro nápovědu
  
*******************************************************************/

var NENI_RADEK = "Hodnota, kterou jste zadali do textového pole, není platným číslem řádku.\n\nZadejte ji, prosím, znovu."
var NENI_PLATNE_CISLO = "Hodnota, kterou jste zadali do textového pole, není platným číslem nebo není číslem, které je přípustné.\n\nZadejte, prosím, buď celé číslo nebo zlomek. Absolutní hodnota čísla v textovém poli musí být menší než 100."

/******************************************************************
  
  Funkce související s nahráním stránky
  
*******************************************************************/

/* funkce, která spouští potřebné věci při nahrání běžné stránky (bez tisku)
*/
function onloadBezne(jazyk,text){
  window.defaultStatus = text
  vynutRamce()
}

/* funkce, která spouští potřebné věci při nahrání DOPLNTI
*/
function onloadPomocne(jazyk,text){
  window.defaultStatus = text
  top.frames[2].document.predani_matice_prikazy.submit()
}

/* funkce, která spouští potřebné věci při nahrání DOPLNTI
*/
function onloadPoPrikazu(jazyk,text){
  window.defaultStatus = text
  top.frames[2].document.predani_matice.submit()
}

/* funkce, která spouští potřebné věci při nahrání úvodní stránky
*/
function uvod(){
  zjistitTop()
  maximalizovat()
}

/* funkce, která zjistí, jestli se náhodou slovník nezobrazuje v rámci nějaké cizí stránky
*/
function zjistitTop(){
  if(self != top){
    top.location.href = self.location.href
  }
}

/* funkce, která zajistí, že jednotlivé dílčí rámce nelze nahrát samostatně
*/
function vynutRamce(){
  if(self == top){
    top.location.href = "index.html"
  }
}

/* funkce, která zajistí, že je aplikace spuštěna v maximalizovaném okně
*/
function maximalizovat(){ 
  sirkaObrazovky = screen.width
  vyskaObrazovky = screen.height
  dostupnaSirka = screen.availWidth
  dostupnaVyska = screen.availHeight
  if (dostupnaSirka <= 1024){
    window.moveTo(-4,-3)
    window.resizeTo(dostupnaSirka+8,dostupnaVyska+8)
  }
}

/* funkce, která se spustí poté, co je opuštěna stránka - prozatím prázdné
*/
function onunloadBezne(){
  top.frames[1].document.generovani_matice.tlacitko_submit.disabled = true
  top.frames[1].document.generovani_matice.rad.style.borderColor = "gray"
  top.frames[1].document.generovani_matice.rad.value = ""
  top.frames[1].document.generovani_matice.sloupce.style.borderColor = "gray"
  top.frames[1].document.generovani_matice.sloupce.value = ""
  //top.pata.location = "pata.php"
}

/******************************************************************
  
  Funkce pro formuláře komunikace s autory
  
*******************************************************************/ 

/* funkce, která zajišťuje otevření okna s textem emailu pro ohlášení chyby
*/
function chyba_open(jazyk){
  if (jazyk == "cz"){
    okno_chyba = window.open("okna/chyba.php", "chyba", "left=494,top=0,height=450,width=520,directories=no,titlebar=no,location=no,menubar=no,scrollbars=yes,toolbar=no,resizable=yes,status=no") 
  } else {
    okno_chyba = window.open("okna/chyba_en.php", "chyba", "left=494,top=0,height=450,width=520,directories=no,titlebar=no,location=no,menubar=no,scrollbars=yes,toolbar=no,resizable=yes,status=no")
  }
}

/******************************************************************
  
  Funkce pro nápovědu aplikace
  
*******************************************************************/

/* funkce, která zajišťuje zobrazování nápovědy ve stavovém řádku prohlížeče
*/
function napoveda(text_napovedy){
  window.status = text_napovedy
  return true
}

/* funkce, která zajistí zobrazení stránky s nápovědou v patě stránky
*/
function napoveda_v_pate(duvod){
  switch (duvod){
    case "puvodni" :
    presmerovani = "pata.php"
    break
    case "krok_zpet" :
    presmerovani = "napoveda_krok_zpet.php"
    break
  }
  top.frames[4].location = presmerovani
}

/* funkce, která zajišťuje otevření okna nápovědy
*/
function napoveda_open(jazyk){
  if (jazyk == "cz"){
    okno_napovedy = window.open("napoveda/help_frameset.php", "help", "left=328,top=0,height=428,width=686,directories=no,titlebar=no,location=no,menubar=no,scrollbars=yes,toolbar=no,resizable=yes,status=no") 
  } else {
    okno_napovedy = window.open("napoveda/help_frameset_en.php", "help", "left=328,top=0,height=428,width=686,directories=no,titlebar=no,location=no,menubar=no,scrollbars=yes,toolbar=no,resizable=yes,status=no")
  }
}

/******************************************************************
  
  Funkce pro okno o aplikaci
  
*******************************************************************/ 

/* funkce, která otevře okno s informacemi o programu: O aplikaci
*/
function okno_about(jazyk){
  if (jazyk == "cz"){
    o_Aplikaci = window.open("about_frameset.php", "about", "left=385,top=209,height=320,width=254,directories=no,titlebar=no,location=no,menubar=no,scrollbars=yes,toolbar=no")
  } else {
    o_Aplikaci = window.open("about_frameset_en.php", "about", "left=385,top=209,height=320,width=254,directories=no,titlebar=no,location=no,menubar=no,scrollbars=yes,toolbar=no")
  }
}

/* funkce, která zajistí rolování textu
*/
function rolovani(){
  interval = window.setInterval("roluj()", 125)
}
function roluj(){
  window.scrollBy(0,1)
}

/******************************************************************
  
  Funkce pro kontrolu formulářových polí a pro vlastní práci aplikace
  
*******************************************************************/ 

/* funkce, která se spustí poté, co je potvrzeno vygenerování matice
*/
function maticeVygenerovana(){
  if (document.generovani_matice.tlacitko_submit.disabled == false){
    top.frames[3].location = "prazdna_stranka.php"
    switch (document.generovani_matice.typ.value){
      case "soustava" :
      document.generovani_matice.sloupce.value = parseInt(document.generovani_matice.sloupce.value) + 1
      break
      default :
      break
    }
    document.generovani_matice.submit()
  }  
}

/* funkce, která se spustí poté, co je potvrzeno vygenerování matice
*/
function maticeVygenerovana_inverzni(){
  if (document.generovani_matice.tlacitko_submit.disabled == false){
    top.frames[3].location = "prazdna_stranka.php"
    document.generovani_matice.sloupce.value = parseInt(document.generovani_matice.rad.value) * 2
    document.generovani_matice.submit()
  }  
}

/* funkce, která zkontroluje, jestli byla do textového pole "řád matice" zadána smysluplná hodnota
*/
function kontrola_radu(pole){
  var povolene_hodnoty = new Array(2,3,4,5,6,7,8)
  pocet_hodnot = povolene_hodnoty.length
  ok = "nic"
  for (i = 0; i < pocet_hodnot; i++){
    if (povolene_hodnoty[i] == parseInt(pole.value)){
      ok = i
    }
  }
  if (ok == "nic" || pole.value.length != 1){ 
    pole.style.borderColor = "red"
    document.generovani_matice.rad.value = ""
    document.generovani_matice.tlacitko_submit.disabled = true
    window.alert ("Do textového pole lze zadat celé číslo v rozsahu 2..8.\n\nZadejte, prosím, hodnotu znovu.")
    return false
  }
}

/* funkce pro aktivování tlačítka vygenerovat
*/
function aktivuj_submit_vygenerovat(typ){
  if (typ == "inverzni"){
    if (document.generovani_matice.rad.value != ""){
      document.generovani_matice.tlacitko_submit.disabled = false
    } else {
      document.generovani_matice.tlacitko_submit.disabled = true
    }
  } else {
    if (document.generovani_matice.rad.value != "" && document.generovani_matice.sloupce.value != ""){
      document.generovani_matice.tlacitko_submit.disabled = false
    } else {
      document.generovani_matice.tlacitko_submit.disabled = true
    }
  }
}

/* tato funkce se vyvolá, pokud je v textovém poli stisknuto enter
*/
function kontrola_enter(udalost){
  if (udalost.keyCode == 13){
    if (document.generovani_matice.rad.value == "" || document.generovani_matice.sloupce.value == ""){
      return false
    } else {
      maticeVygenerovana()
      return true
    }
  } 
}

/* tato funkce se vyvolá, pokud je v textovém poli stisknuto enter - inverzní matice
*/
function kontrola_enter_inverzni(udalost){
  if (udalost.keyCode == 13){
    kontrola_radu(document.generovani_matice.rad)
    if (document.generovani_matice.rad.value == ""){
      return false
    } else {
      document.generovani_matice.sloupce.value = "2"
      maticeVygenerovana()
      return true
    }
  } 
}

/* funkce, která zjistí, zda je v políčku zadána hodnota odpovídající číslu řádku - spustit při onchange
*/
function je_cislo_radku(pole){
  rad_matice = document.zpet.rad.value
  // kontrola, zda je v poli číslo
  var regexp = /\D/
  var matches = regexp.exec(pole.value)
  if (matches){
    je_cislo = "ne"
  } else {
    je_cislo = "ano"
  }
  if ((je_cislo == "ne" || pole.value < 1 || pole.value > rad_matice) && pole.value != ""){
    pole.style.borderColor = "red"
    alert (NENI_RADEK)
    return false
  } else {
    pole.style.borderColor = "gray"
  }
}

/* funkce, která zkontroluje, zda nebylo stisknuto enter v situaci, kdy by se odeslaly neplatné hodnoty
*/
function kontrola_enter_prikazy(tlacitko_submit,udalost){
  if (udalost.keyCode == 13){
    if (tlacitko_submit.disabled == true){
      return false
    } else {
      return true
    }
  }
}

/* kontrola, zda je možno formulář odeslat. Stačí kontrolovat jen to, jestli jsou v polích zadány nějaké hodnoty, protože jejich kontrola už proběhla.
*/
function mozno_odeslat(pole1,pole2,pole3,tlacitko_submit){
  if (pole1.value != "" && pole2.value != "" && pole3.value != ""){
    tlacitko_submit.disabled = false
  } else {
    tlacitko_submit.disabled = true
  }
}

/* funkce, která zajistí zešednutí okraje pole, do něhož byla vepsána neplatná hodnota, poté, co nastane na tomto poli událost onblur
*/
function vratit_okraj(pole,tlacitko_submit){
  if (tlacitko_submit.disabled == true){
    pole.style.borderColor = "gray"
  }
  
}

/* funkce, která zjistí, zda bylo zadáno platné číslo - číslo nebo zlomek
*/
function je_platne_cislo(pole){
  var regexp = /[^\-0123456789\/\.\,\+]+/
  var matches = regexp.exec(pole.value)
  if (matches){
    je_platne = "ne"
  } else {
    je_platne = "ano"
  }
  // odstranění počátečních a koncových mezer - není nutné kvůli podmínce výše
  var regexp = /^\s+/
  pole.value = pole.value.replace(regexp, "")
  // převedení desetinné čárky na desetinnou tečku
  var regexp = /\,/g
  pole.value = pole.value.replace(regexp, ".")
  // odstranění počátečního plus
  if (pole.value.charAt(0) == "+"){
    pole.value = pole.value.slice(1,pole.value.length)
  }
  // odstranění případů, které ještě nebyly vyloučeny
  // pokud se vícekrát vyskytuje mínus a není jako první znak
  if (pole.value.indexOf("-") != pole.value.lastIndexOf("-")){
    je_platne = "ne"
  }
  if (pole.value.indexOf("-") > 0){
    je_platne = "ne"
  }
  // poté, co bylo odstraněno "+", se stále "+" v řetězci vyskytuje
  if (pole.value.indexOf("+") > -1){
    je_platne = "ne"
  }  
  // číslo je rovno řetězci "-" nebo "."
  if (pole.value == "-" || pole.value == "."){
    je_platne = "ne"
  }
  // číslo obsahuje více než jedno lomítko
  if (pole.value.indexOf("/") != pole.value.lastIndexOf("/")){
    je_platne = "ne"
  }
  // číslo začíná nebo končí lomítkem
  if (pole.value.charAt(0) == "/" || pole.value.charAt(pole.value.length-1) == "/"){
     je_platne = "ne" 
  }
  // číslo končí nebo začíná tečkou - doplnění nuly, odstranění tečky
  if (pole.value.charAt(0) == "."){
    pole.value = "0" + pole.value
  }
  if (pole.value.charAt(pole.value.length-1) == "."){
    pole.value = pole.value.slice(0,pole.value.length-1)
  }
  // číslo obsahuje více než jednu tečku nebo stále končí na tečku
  if (pole.value.indexOf(".") != pole.value.lastIndexOf(".") || pole.value.charAt(pole.value.length-1) == "."){
    je_platne = "ne"
  }
  // číslo obsahuje tečku a zároveň lomítko
  if (pole.value.indexOf(".") != -1 && pole.value.indexOf("/") != -1){
    je_platne = "ne"
  }
  /* pokud je číslo platné a obsahuje lomítko, kontroluje se jeho absolutní hodnota, která musí být menší než 100*/
  if (je_platne != "ne" && pole.value.indexOf("/") == pole.value.lastIndexOf("/") && pole.value.indexOf("/") != -1 && pole.value != ""){
    citatel = pole.value.substr(0,pole.value.indexOf("/"))
    jmenovatel = pole.value.substr(pole.value.indexOf("/") + 1,pole.value.length - citatel.length - 1)
    citatel = parseInt(citatel)
    jmenovatel = parseInt(jmenovatel)
    podil = citatel / jmenovatel
    if (podil < -100 || podil > 100){
      je_platne = "ne"
    }
  }
  // totéž pro desetinné číslo
  if (je_platne != "ne" && pole.value.indexOf(".") == pole.value.lastIndexOf(".") && pole.value.indexOf(".") != -1 && pole.value != ""){
    cela_cast = pole.value.substr(0,pole.value.indexOf("."))
    cela_cast = parseInt(cela_cast)
    if (cela_cast < -100 || cela_cast > 100){
      je_platne = "ne"
    }
  }
  // rozhodnutí, zda zobrazit chybové hlášení nebo ne
  if ((je_platne == "ne" || pole.value < -100 || pole.value > 100) && pole.value != ""){
    pole.style.borderColor = "red"
    alert (NENI_PLATNE_CISLO)
    pole.value = ""
    return false
  } else {
    pole.style.borderColor = "gray"
  }
}

/* funkce, která vybere, jaká uloha se má zobrazit
*/
function kontrola_vyberu_ulohy(pole){
  switch (pole.value){
    case "schodovity_tvar" :
    top.location.href = "index_schodovity_tvar.php"
    break
    case "soustava_rovnic" :
    top.location.href = "index_soustava_rovnic.php"
    break
    case "inverzni_matice" :
    top.location.href = "index_inverzni_matice.php"
    break
  }
}

/* funkce, která aktivuje tlačítko výběr úlohy
*/
function aktivuj_vyber_ulohy(pole){
  if (document.vyber.vyber_ulohy.value=""){
    document.vyber.vybrat.disabled = true
  } else {
    document.vyber.vybrat.disabled = false
  }
  document.vyber.hidden_typ.value = pole
}
