// knihovna JavaScript funkci pro podporu stranek s pruvodci

// funkce pro obsluhu zmen ve formulari pro stazeni PostSignum Tool
function frmDwnldPstool(pkg,frm,press) {
// pkg   ... udava aktualne nastaveny typ baliku ke stazeni (kompletni, usporny)
// frm   ... objekt s formularem
// press ... na ktery prvek bylo kliknuto
  for (i=0; i<frm.install.length; i++) { // zjisteni, ktery typ balicku je nyni nastaven
    if (frm.install[i].checked) curpkg = frm.install[i].value;
  }
  if ((curpkg != pkg)&&(press != "install")) { // v parametru pkg se predava, ktery typ balicku by mel byt nastaven; je-li nalezen rozpor, musi se korigovat
    if (pkg == "full") frm.full.checked = true;
    if (pkg == "min") frm.min.checked = true;
    curpkg = pkg;
  }
  chk = frm.filelist.checked; // je-li zvolena moznost zobrazeni pouze seznamu souboru, musi byt ostatni potlaceny
  with (frm) {
    win98.disabled = chk; win.disabled = chk; linux.disabled = chk; solaris.disabled = chk; mac.disabled = chk;
    full.disabled = chk; min.disabled = chk;
  }
  if (frm.mac.checked) { // v pripade zvoleni platformy Mac OS je k dispozici pouze usporny balicek
    frm.full.disabled = true; frm.min.disabled = true; frm.full.checked = false; frm.min.checked = true;
    retvalue = pkg; // timto se zajistuje zapamatovani puvodne zvoleneho typu balicku pred zvolenim platformy Mac OS
  } else retvalue = curpkg;
  return retvalue;  
}

// funkce pro overeni, zda se ve formulari pro stazeni PostSignum Tool zvolil operacni system
function checkDwnldPstool(frm) {
// frm ... objekt s formularem
  retval = false;
  for (i=0; i<frm.os.length; i++) { // zjisteni, ktery typ OS je nyni nastaven
    if (frm.os[i].checked) retval = true;
  }
  if (frm.filelist.checked) retval = true; // jeste muze byt zvoleno zobrazeni seznamu vsech souboru
  if (!retval) {
    window.alert("Vyberte operační systém, pod kterým\nchcete provozovat program PostSignum Tool.");
  }
  return retval;
}

// funkce pro vraceni "demo" hodnot do formulare pro generovani zadosti
function getDemoValue(customer,cert,id) {
// customer ... typ zakaznika (PO, OSVC, FO)
// cert     ... typ certifikatu (sign, mark)
  retvalue = "";
  if (customer == "PO") {
    switch (id) {
      case "o_name": retvalue = "První firma, a.s."; break;
      case "o_ic": retvalue = "12345678"; break;
      case "ou": retvalue = "účtárna"; break;
      case "cn": if (cert == "sign") retvalue = "Jan Novák";
                 if (cert == "mark") retvalue = "E-podatelna";
                 break;
      case "persnum": retvalue = "123"; break;
      case "perstitle": retvalue = "vedoucí účetní"; break;
      case "email": if (cert == "sign") retvalue = "novak@firma.cz";
                    if (cert == "mark") retvalue = "e-podatelna@firma.cz";
                    break;
      default: retvalue = "";
    }
  }
  if (customer == "OSVC") {
    switch (id) {
      case "o_name": retvalue = "Josef Novotný"; break;
      case "o_ic": retvalue = "12345678"; break;
      case "ou": retvalue = ""; break;
      case "cn": if (cert == "sign") retvalue = "Josef Novotný";
                 if (cert == "mark") retvalue = "Josef Novotný, auto-responder";
                 break;
      case "persnum": retvalue = "1"; break;
      case "perstitle": retvalue = ""; break;
      case "email": if (cert == "sign") retvalue = "josef@novotny.cz";
                    if (cert == "mark") retvalue = "autoresponder@novotny.cz";
                    break;
      default: retvalue = "";
    }
  }
  if (customer == "FO") {
    switch (id) {
      case "cn": if (cert == "sign") retvalue = "Kateřina Nováková";
                 if (cert == "mark") retvalue = "Automatické potvrzování příchozích zpráv";
                 break;
      case "email": retvalue = "novakova@seznam.cz"; break;
      case "l_street": retvalue = "Klikatá 23"; break;
      case "l_city": retvalue = "Praha"; break;
      default: retvalue = "";
    }
  }
  return retvalue;
}

// funkce pro vyplneni poli formulare pro generovani klicu ukazkovymi hodnotami
function keygenDemoValues(frm,customer,cert) {
// frm      ... objekt s formularem
// customer ... typ zakaznika (PO, OSVC, FO)
// cert     ... typ certifikatu (sign, mark)
  if ((customer == "PO")||(customer == "OSVC")) {
    frm.o_name.value = getDemoValue(customer,cert,"o_name");
    frm.o_ic.value = getDemoValue(customer,cert,"o_ic");
    frm.ou.value = getDemoValue(customer,cert,"ou");
    frm.email.value = getDemoValue(customer,cert,"email");
    if (cert == "sign") {
      frm.cn_sign.value = getDemoValue(customer,cert,"cn");
      frm.persnum.value = getDemoValue(customer,cert,"persnum");
      frm.perstitle.value = getDemoValue(customer,cert,"perstitle");
    }
    if (cert == "mark") frm.cn_mark.value = getDemoValue(customer,cert,"cn");
  }
  if (customer == "FO") {
    if (cert == "sign") frm.cn_sign.value = getDemoValue(customer,cert,"cn");
    if (cert == "mark") frm.cn_mark.value = getDemoValue(customer,cert,"cn");
    frm.email.value = getDemoValue(customer,cert,"email");
    frm.l_street.value = getDemoValue(customer,cert,"l_street");
    frm.l_city.value = getDemoValue(customer,cert,"l_city");
  }
}

// funkce pro kontrolu, zda ve formulari pro generovani klicu nejsou nastaveny jen ukazkove hodnoty
function keygenOnlyDemoValues(frm,customer,cert) {
// frm      ... objekt s formularem
// customer ... typ zakaznika (PO, OSVC, FO)
// cert     ... typ certifikatu (sign, mark)
  retvalue =  true;
  if ((customer == "PO")||(customer == "OSVC")) {
    if (cert == "sign") retvalue = (frm.cn_sign.value == getDemoValue(customer,cert,"cn"))&&
                                   (frm.persnum.value == getDemoValue(customer,cert,"persnum"))&&
		                   (frm.perstitle.value == getDemoValue(customer,cert,"perstitle")); 
    if (cert == "mark") retvalue = (frm.cn_mark.value == getDemoValue(customer,cert,"cn")); 
    if (retvalue) retvalue = (frm.o_name.value == getDemoValue(customer,cert,"o_name"))&&
                             (frm.o_ic.value == getDemoValue(customer,cert,"o_ic"))&&
                             (frm.ou.value == getDemoValue(customer,cert,"ou"))&&
                             (frm.email.value == getDemoValue(customer,cert,"email"));
  }
  if (customer == "FO") {
    if (cert == "sign") retvalue = (frm.cn_sign.value == getDemoValue(customer,cert,"cn"));
    if (cert == "mark") retvalue = (frm.cn_mark.value == getDemoValue(customer,cert,"cn")); 
    if (retvalue) retvalue = (frm.email.value == getDemoValue(customer,cert,"email"))&&
                             (frm.l_street.value == getDemoValue(customer,cert,"l_street"))&&
                             (frm.l_city.value == getDemoValue(customer,cert,"l_city"));
  }
  return retvalue;
}

// funkce pro kontrolu vyplneneho formulare pro generovani klicu
function keygenCheckValues(frm,customer,cert) {
// frm      ... objekt s formularem
// customer ... typ zakaznika (PO, OSVC, FO)
// cert     ... typ certifikatu (sign, mark)
  var rxMailAddress = /^[a-z0-9_\-\.]+@[a-z0-9_\-]+(\.[a-z0-9_\-]+)+$/i;
  if (customer == "PO") {
    if (frm.o_name.value == "") {
      window.alert("Není zadáno jméno organizace."); frm.o_name.focus(); return false;
    } 
    if (frm.o_ic.value == "") {
      window.alert("Není zadáno IČ organizace."); frm.o_ic.focus(); return false;
    } 
    if ((cert == "sign")&&(frm.cn_sign.value == "")) {
      window.alert("Není zadáno vaše jméno a příjmení."); frm.cn_sign.focus(); return false;
    } 
    if ((cert == "sign")&&(frm.persnum.value == "")) {
      window.alert("Není zadáno číslo zaměstnance."); frm.persnum.focus(); return false;
    } 
    if ((cert == "mark")&&(frm.cn_mark.value == "")) {
      window.alert("Není zadáno jméno certifikátu."); frm.cn_mark.focus(); return false;
    }
    if (frm.email.value == "") { // varovani pri nezadane e-mailove adrese
      if (cert == "sign") {
        window.alert("Není zadána e-mailová adresa."); frm.email.focus(); return false;
      }
      if (cert == "mark") {
        retval = window.confirm("Pozor! Certifikát bez e-mailové adresy nelze použít v e-mailové komunikaci.\n\nJste si jisti, že chcete pokračovat bez zadané e-mailové adresy?");
        if (!retval) frm.email.focus();
        return retval; 
      }
    } else if (!rxMailAddress.exec(frm.email.value)) { // kontrola zadane e-mailove adresy
      window.alert("E-mailová adresa není zadána v korektním tvaru:\n     schranka@domena.cz"); frm.email.focus(); return false;
    } 
    if (keygenOnlyDemoValues(frm,customer,cert)) { // varovani pri ponechanych demo hodnotach
      retval = window.confirm("Všechna pole formuláře obsahují ukázkové hodnoty.\nDoporučujeme zadat do formuláře skutečná data.\n\nJste si jisti, že chcete pokračovat dále s ukázkovými hodnotami?");
      return retval; 
    }
    return true;
  } // konec kontrol pro "PO"
  if (customer == "OSVC") {
    if (frm.o_name.value == "") {
      window.alert("Není zadáno vaše obchodní jméno."); frm.o_name.focus(); return false;
    } 
    if (frm.o_ic.value == "") {
      window.alert("Není zadáno vaše IČ."); frm.o_ic.focus(); return false;
    } 
    if ((cert == "sign")&&(frm.cn_sign.value == "")) {
      window.alert("Není zadáno vaše jméno a příjmení."); frm.cn_sign.focus(); return false;
    } 
    if ((cert == "sign")&&(frm.persnum.value == "")) frm.persnum.value="1";
    if ((cert == "mark")&&(frm.cn_mark.value == "")) {
      window.alert("Není zadáno jméno certifikátu."); frm.cn_mark.focus(); return false;
    }
    if (frm.email.value == "") { // varovani pri nezadane e-mailove adrese
      if (cert == "sign") {
        window.alert("Není zadána e-mailová adresa."); frm.email.focus(); return false;
      }
      if (cert == "mark") {
        retval = window.confirm("Pozor! Certifikát bez e-mailové adresy nelze použít v e-mailové komunikaci.\n\nJste si jisti, že chcete pokračovat bez zadané e-mailové adresy?");
        if (!retval) frm.email.focus();
        return retval; 
      }
    } else if (!rxMailAddress.exec(frm.email.value)) { // kontrola zadane e-mailove adresy
      window.alert("E-mailová adresa není zadána v korektním tvaru:\n     schranka@domena.cz"); frm.email.focus(); return false;
    } 
    if (keygenOnlyDemoValues(frm,customer,cert)) { // varovani pri ponechanych demo hodnotach
      retval = window.confirm("Všechna pole formuláře obsahují ukázkové hodnoty.\nDoporučujeme zadat do formuláře skutečná data.\n\nJste si jisti, že chcete pokračovat dále s ukázkovými hodnotami?");
      return retval; 
    }
    return true;
  } // konec kontrol pro "OSVC"
  if (customer == "FO") {
    if ((cert == "sign")&&(frm.cn_sign.value == "")) {
      window.alert("Není zadáno vaše jméno a příjmení."); frm.cn_sign.focus(); return false;
    } 
    if ((cert == "mark")&&(frm.cn_mark.value == "")) {
      window.alert("Není zadáno jméno certifikátu."); frm.cn_mark.focus(); return false;
    }
    if (frm.email.value == "") { // varovani pri nezadane e-mailove adrese
      if (cert == "sign") {
        window.alert("Není zadána e-mailová adresa."); frm.email.focus(); return false;
      }
      if (cert == "mark") {
        retval = window.confirm("Pozor! Certifikát bez e-mailové adresy nelze použít v e-mailové komunikaci.\n\nJste si jisti, že chcete pokračovat bez zadané e-mailové adresy?");
        if (!retval) frm.email.focus();
        return retval; 
      }
    } else if (!rxMailAddress.exec(frm.email.value)) { // kontrola zadane e-mailove adresy
      window.alert("E-mailová adresa není zadána v korektním tvaru:\n     schranka@domena.cz"); frm.email.focus(); return false;
    } 
    if (keygenOnlyDemoValues(frm,customer,cert)) { // varovani pri ponechanych demo hodnotach
      retval = window.confirm("Všechna pole formuláře obsahují ukázkové hodnoty.\nDoporučujeme zadat do formuláře skutečná data.\n\nJste si jisti, že chcete pokračovat dále s ukázkovými hodnotami?");
      return retval; 
    }
    return true;
  } // konec kontrol pro "FO"
  return false;
}

// funkce pro kontrolu, zda zadany string "input" obsahuje zakazane znaky definovane v "prohibite"
function prohibitedChars(input,prohibite) {
// input ..... string se vstupni hodnotou
// allowed ... string se seznamem zakazanych znaku
  retval=false;
  for (i=0;i<input.length;i+=1)
    if (prohibite.indexOf(input.charAt(i))!=-1) {
      retval=true; break;
    }
  return retval;
}

// funkce, ktera za kazdy znak ve stringu "input" prida mezeru
function spaced(input) {
// input ..... string se vstupni hodnotou
  retval="";
  for (i=0;i<input.length;i+=1) retval += input.charAt(i)+" ";
  retval.length--; // odstraneni posledni mezery
  return retval;
}

// funkce pro kontrolu jmena zadaneho souboru pro ulozeni zadosti o certifikat
function keygenCheckFilename(element) {
// element ... objekt s prvkem formulare, ktery se ma zkontrolovat
  // upozorneni na prazdne jmeno souboru
  if (element.value=="") {
    return window.confirm("Název souboru není vyplněn!\n\nObsah žádosti o certifikát bude zobrazen\nv novém okně prohlížeče. Obsah okna je\npoté možné zkopírovat do souboru.\n\nChcete pokračovat?\n(Doporučeno jen pro pokročilé uživatele.)");
  }
  // upozorneni na ukladani na disketu
  if (element.value.toLowerCase().indexOf("a:\\")==0) {
    return window.confirm("Je nastaveno uložení žádosti o certifikát na disketu.\n\nVzhledem k relativní chybovosti disket doporučujeme\nuložit žádost nejprve na pevný disk.\n\nChcete pokračovat v generování klíčů?");
  }
  // kontrola zakazanych znaku
  prohibit = '/*?"<>';
  if (prohibitedChars(element.value,prohibit)) {
    window.alert("Název souboru obsahuje jeden\nnebo více nepovolených znaků:\n          "+spaced(prohibit));
    element.focus();
    return false;
  }
  return true;
}

// funkce pro varovani pred zakazanim exportu klicu
function noExportWarn(element) {
  if (!element.checked) return (window.confirm("Opravdu chcete zakázat zálohu soukromého klíče?\n\nZakážete-li zálohu soukromého klíče, budete si muset\nv případě technických problémů či reinstalace počítače\nvygenerovat nové klíče a nechat vydat nový certifikát!"));
  else return true; 
}

// funkce pro oznameni o uspesne ci neuspesne inicializaci komponenty Cenroll
function cenrollStatus(cstatus,guide) {
// cstatus ... jaky byl status komponenty Cenroll; true=podarila se inicializace, false=nepodarila se
// guide ... udava, zda inicializace probihala v ramci generovani klicu ("keygen") nebo instalace vydaneho certifikatu ("crtinst")
  if (cstatus) {
    msg = "Úspěšně se podařilo inicializovat komponentu Cenroll.";
    if (guide == "keygen") msg += "\n\nVáš prohlížeč by měl být schopen vygenerovat klíče\na žádost o certifikát."
    if (guide == "crtinst") msg += "\n\nVáš prohlížeč by měl být schopen nainstalovat vydané certifikáty."
  } else {
    msg = "Nezdařila se inicializace komponenty Cenroll.";
    if (guide == "keygen") msg += "\n\nKlíče a žádost o certifikát nelze vygenerovat."
    if (guide == "crtinst") msg += "\n\nVydané certifikáty není možné tímto způsobem nainstalovat."
  }
  window.alert(msg);
}

// funkce pro smazani predanych prvku formulare
function formResetValues() {
  if (window.confirm("Opravdu chcete smazat vyplněné hodnoty?")) {
    for (var i=0; i<formResetValues.arguments.length; i++)
      formResetValues.arguments[i].value = "";
  }
}

// funkce pro kontrolu jmena zadaneho souboru s vydanym certifikatem
function crtinstCheckFilename(element) {
// element ... objekt s prvkem formulare, ktery se ma zkontrolovat
  // upozorneni na prazdne jmeno souboru
  if (element.value=="") {
    window.alert("Název souboru není vyplněn!\n\nJe potřeba zadat soubor s certifikátem.");
    element.focus();
    return false;
  }
  // kontrola spravnosti souboru podle pripony
  fext = element.value.substring(element.value.lastIndexOf(".")); if (fext == element.value) fext = "";
  if (!(fext == ".crt" || fext == ".cer" || fext == ".der")) {
    msg = "Soubory s certifikáty mají obvykle přípony '.crt', '.cer' nebo '.der'.\n";
    if (fext == "") msg += "Zadali jste soubor bez přípony."; else msg += "Zadali jste soubor s příponou '"+fext+"'.";
    msg += "\n\nJste si jisti, že se jedná o správný soubor?";
    return window.confirm(msg);    
  }
  // kontrola na zadane certifikaty autorit
  if (element.value.indexOf("postsignum_qca_root") != -1 || element.value.indexOf("postsignum_qca_sub") != -1 || element.value.indexOf("postsignum_vca_sub") != -1) {
    msg = "Bylo zjištěno, že jste zřejmě zadali soubor s názvem:\n  * postsignum_qca_root,\n  * postsignum_qca_sub,\n  * postsignum_vca_sub\n";
    msg += "V tomto souboru bývá většinou uložen certifikát autority,\nkterý se instaluje jiným způsobem.";
    msg += "\n\nJste si jisti, že se jedná o správný soubor?";
    return window.confirm(msg);    
  } 
  // kontrola zakazanych znaku
  prohibit = '/*?"<>';
  if (prohibitedChars(element.value,prohibit)) {
    window.alert("Název souboru obsahuje jeden\nnebo více nepovolených znaků:\n          "+spaced(prohibit)+"\n\nTakový soubor nemůže existovat.")
    element.focus();
    return false;
  }
  return true;
}

// funkce pro reagovani na chybove stavy vracene komponentou CEnroll
function solveException(e,proc) {
// e    ... objekt s exception
// proc ... pri jake cinnosti doslo k chybe ("keygen-common" = bezne generovani, "keygen-email" = vkladani emailu do zadosti, "keygen-title" = vkladani funkce do zadosti, "crtinst" = instalace certifikatu)
  errhexnumber = (e.number) ? i32_to_hex(e.number) : "N/A";
  retval = "Došlo k neočekávané chybě.\nTechnické informace: procedura="+proc+", kód chyby="+errhexnumber;
  if (proc == "keygen-email") { // chyba pri vkladani emailu do zadosti 
    retval = "Při generování žádosti o certifikát došlo k chybě!\n\nNepodařilo se přidat údaj 'e-mailová adresa'.\nTechnické informace: "+errhexnumber;
  }
  if (proc == "keygen-title") { // chyba pri vkladani emailu do zadosti 
    retval = "Při generování žádosti o certifikát došlo k chybě!\n\nNepodařilo se přidat údaj 'funkce zaměstnance'.\nTechnické informace: "+errhexnumber;
  }
  if (proc == "keygen-common") { // chyby pri vlastnim generovani klicu
    retval = "Při generování žádosti o certifikát došlo k chybě!\nTechnické informace: "+errhexnumber;   
    switch (errhexnumber) {
      case "0x80074c7": retval += "\n\nGenerování klíčů bylo přerušeno uživatelem."; break;
      case "0x800a46": retval += "\n\nNepodařilo se uložit žádost o certifikát do souboru."; break;
      default: retval += "\n\n(Tato chyba nebyla dosud detekována.)";
    }
  }
  if (proc == "crtinst") { // chyby pri instalaci certifikatu
    retval = "Při instalaci certifikátu došlo k chybě!\nTechnické informace: "+errhexnumber;   
    switch (errhexnumber) {
      case "0x80074c7": retval += "\n\nInstalace certifikátu byla přerušena uživatelem."; break;
      case "0x80092004": retval += "\n\nV systému nebyly nalezeny klíče, které by\nodpovídaly vydanému certifikátu."; break;
      case "0x80092009": retval += "\n\nByl zadán soubor, který neobsahuje vydaný certifikát."; break;
      case "0x800a46": retval += "\n\nNepodařilo se načíst obsah souboru s certifikátem."; break;
      default: retval += "\n\n(Tato chyba nebyla dosud detekována.)";
    }
    if (errhexnumber=="0x80092004") document.getElementById("crtinst-error").className = "visible";
  }
  return retval;
}

// funkce pro kontrolu formulare s vyberem objednavky
function checkDwnldContract(frm) {
// frm ... objekt s formularem
  retval = false;
  for (i=0; i<frm.region.length; i++) { // zjisteni, zda byl vybran region
    if (frm.region[i].checked) retval = true;
  }
  if (!retval) {
    window.alert("Vyberte region, kde chcete uzavřít smlouvu,\nnebo zvolte zobrazení všech dostupných souborů.");
  }
  return retval;
}

// funkce pro kontrolu formulare s vyberem dodatku ke smlouve
function checkDwnldClause(frm) {
// frm ... objekt s formularem
  retval = (frm.change.checked)||(frm.general.checked);
  if (!retval) {
      window.alert("Je potřeba zvolit alespoň jeden typ dodatku ke smlouvě.");
  }
  return retval;
}

// funkce pro obsluhu zmen ve formulari pro stazeni seznamu zadatelu (krok 1)
function frmApplist(stepnum) {
// stepnum ... kolik kroku bude pruvodce mit
  document.getElementById("steps-2").className = "hidden"; document.getElementById("steps-3").className = "hidden";
  document.getElementById("steps-"+stepnum).className = "visible";
}

// funkce pro kontrolu formulare pro stazeni formularu seznamu zadatelu
function checkDwnldApplist(frm) {
// frm ... objekt s formularem
  retval = ((frm.crtsign.checked)||(frm.crtmark.checked));
  for (i=0; i<frm.formtype.length; i++) { // pri nastaveni zobrazeni vsech souboru potlacit kontrolu zaskrtnuti checkboxu
    if (frm.formtype[i].checked) curfrmtype = frm.formtype[i].value;
  }
  if (curfrmtype == "all") retval = true;
  if (!retval) { // zjisteni, zda byl zaskrtnut alespon jeden typ certifikatu
    window.alert("Je potřeba zaškrtnout alespoň jednu položku u typu certifikátu.");
  }
  return retval;
}

// funkce pro kontrolu formulare pro prihlaseni/odhlaseni odberu aktualit PostSignum e-mailem
function checkNewspick(frm) {
// frm ... objekt s formularem
  var rxMailAddress = /^[a-z0-9_\-\.]+@[a-z0-9_\-]+(\.[a-z0-9_\-]+)+$/i;
  if (!rxMailAddress.exec(frm.email.value)) { // kontrola zadane e-mailove adresy
      window.alert("E-mailová adresa nebyla zadána v korektním tvaru.\nPříklad: schranka@domena.cz"); frm.email.focus(); return false;
  }
}