function signFile(message,path,pwd,mode){
    
    // testy zadani dat
    var bRet = getApplet().loginSigningPKCS12(path, pwd);
    if (bRet == false) {
        alert(getApplet().getErrorMessage());
        getApplet().logout();
        return;
    }
	
    // set the specification or any other attributes now
    //getApplet().setSpecification("aa");

	if(mode == "PDF") {
    	// podepis data PDF
    	signMsg = getApplet().signDataBase64Pdf(message);
    } 
    else {
    	signMsg = getApplet().signDataBase64(message);
    }

    if (signMsg == "" || signMsg == null) {
       alert(getApplet().getErrorMessage());
       return "";
    }

    // uzavri Signing device
    ret = getApplet().logoutSigning();
    if (ret = false) {
       alert(getApplet().getErrorMessage());
       return "";
    }

    return signMsg;
}

function signCard(message,pwd,mode){
    var code=0;
    var signMsg="";

    // kontrola stavu karty - posledni pokus o zadani PINu, karta zablokovana,...
    ret=getApplet().getCardBlockedInfo_0();

    if (ret == null || ret == "") {
        alert(getApplet().getErrorMessage());
        getApplet().logout();
        return "CANCEL";
    }

    if (ret == 1) {
       if (!confirm(getApplet().getStringFromResource("applet.warn.pkcs11devicemgr.userFinalTry"))) {   //  "Zbyva Vam posleni pokus na zadani pinu! Pokracovat?")) {
          getApplet().logout();
          return "CANCEL";
       }
    }

    if (ret == 2)  { // karta je zablokovana
        alert(getApplet().getStringFromResource("applet.error.pkcs11devicemgr.cardBlocked"));
        getApplet().logout();
        return "";
    }

    var ret = getApplet().loginSigningPKCS11(pwd);
    if (ret == false) {

       //JIRA DCS-2407 Pri zadani tretiho pokusu spatne upozornit na zablokovnou kartu
       ret=getApplet().getCardBlockedInfo_0();
       if (ret == 2)  { // karta je zablokovana
        	alert(getApplet().getStringFromResource("applet.error.pkcs11devicemgr.cardBlocked"));
        	getApplet().logout();
        	return "";
       }

       alert(getApplet().getErrorMessage()); 
       
       getApplet().logout();
       return "";
    }

    if((typeof(mode)=="undefined") || mode == null || mode == "" || mode == "PKCS7") {
    	// podepis data PKCS7
    	signMsg = getApplet().signDataBase64(message);
    }
    else if(mode == "PDF") {
    	// podepis data PDF
    	signMsg = getApplet().signDataBase64Pdf(message);
    }

    if (signMsg == "" || signMsg == null) {
       alert(getApplet().getErrorMessage());
       return "";
    }

    // tady uzaviram jen signing device, PKCS11DeviceMgr session muze zustat kvuli rychlosti
    // natahovani prvni session
    ret = getApplet().logoutSigning();
    if (ret = false) {
       alert(getApplet().getErrorMessage());
       return "";
    }
    return signMsg;

}


function makeDigest(message){

    // set the specification or any other attributes now
    //getApplet().setSpecification("aa");

    // ziska se digest

    digestMsg = getApplet().digestDataBase64(message);

    if (digestMsg == "" || digestMsg == null) {
       alert(getApplet().getErrorMessage());
       return false;
    }

    return digestMsg;
}


function setSign(signMsg, elm){
elm.value=signMsg;
return true;
}


function getApplet()
{
    var applet = top.applet.document.getElementById('PKIApplet');
//    alert(applet);
    return applet;
}

/*
*********************************************************************************************************
Funkce, ktera zinicializuje applet a zjisti kolik je treba podepsat transakci a postupne je vsechny posle
cesta - cesta k certifikatu
heslo - heslo k certifikatu
multi - 0-ne    1-vicenasobne podepisovani, kdy jsou podepisovana data v jednom texfieldu (davky)
        2-stejne jako 0, ale jsou dve tlacitka k enablovani o1 a o2
form  - cislo formX, formulare, kde jsou userView textarey.....
**********************************************************************************************************
*/

function doSign(cesta, heslo, fileOrCard, otp)
  {
  mode="";
  // nastavit mode do requestu
  if(typeof(document.form1.mode)!="undefined" && document.form1.mode.value != "") {
	mode = document.form1.mode.value;
  	if(typeof(document.form.mode)!="undefined")
  		document.form.mode.value = mode;
  }

  if ((typeof(document.form.whattosign)!="undefined") && (typeof(document.form.whattosign.length)=="undefined")) // pouze jedna transakce
	{
        if (document.form.msgtosign.value!="") {
            var sign = "";

            if (fileOrCard=="D") sign = signFile(document.form.msgtosign.value,cesta,heslo,mode);
            if (fileOrCard=="C") sign = signCard(document.form.msgtosign.value,heslo,mode);

            if (typeof(sign)=="undefined" || sign==false || sign=="undefined" || sign=="" || sign=="CANCEL") return false;
            setSign(sign, document.form.sign);
        }
    setSign(otp, document.form.otp);
	return true;
	}
  else  // vice jak jedna transakce
	{
		i=0;
		setSign(otp, document.form.otp);
		
	    
	    var signs = new Array();
		var msgsToSignArray = new Array();				
		
		//Collect unsigned messages from FORM
		var _i=0;
		for (_i=0;_i<document.form.whattosign.length;_i++)
		{
			msgsToSignArray[msgsToSignArray.length] = document.form.msgtosign[_i].value;
		}
		
	    if (fileOrCard=="D") signs = signFileMultiple(msgsToSignArray, cesta, heslo, mode);
	    if (fileOrCard=="C") signs = signCardMultiple(msgsToSignArray, heslo, mode);		
		
		if(document.form.whattosign.length!=signs.length) return false;	                                       
        //Set signed messages to FORM	                                             
	    var _sign = "";                
	    var sign_index;
	    for(sign_index=0;sign_index<signs.length;sign_index++){
	       	if (typeof(signs[sign_index])=="undefined" || signs[sign_index]==false || signs[sign_index]=="undefined" || signs[sign_index]=="" || signs[sign_index]=="CANCEL") return false;
	        setSign(signs[sign_index], document.form.sign[sign_index]);
	    }
		
			
		return true;
	}
	
  return false;
  }

/*
*********************************************************************************************************
Funkce, ktera zinicializuje applet a zjisti kolik je treba podepsat transakci a postupne je vsechny posle
multi - 0-ne    1-vicenasobne podepisovani, kdy jsou podepisovana data v jednom texfieldu (davky)
        2-stejne jako 0, ale jsou dve tlacitka k enablovani o1 a o2
form  - cislo formX, formulare, kde jsou userView textarey.....
**********************************************************************************************************
*/



function doDigest()
  {
  if ((typeof(document.form.whattosign)!="undefined") && (typeof(document.form.whattosign.length)=="undefined")) // pouze jedna transakce
	{
	var digest = makeDigest(document.form.msgtosign.value);
	if (typeof(digest)=="undefined" || digest==false || digest=="undefined" || digest=="") return false;
	setSign(digest, document.form.sign);
	return true;
	}
  else                                                              // vice jak jedna transakce
	{
	i=0;
	while ((typeof(document.form.whattosign[i])!="undefined"))
		{
		var digest = makeDigest(document.form.msgtosign[i].value);
		if (typeof(digest)=="undefined" || digest==false || digest=="undefined" || digest=="") return false;
		setSign(digest, document.form.sign[i]);
		i++;
		}
	return true;
	}
  return false;
  }


function Podepis(multi, form)  // obe promenne popsane v doSign
  {
  var fileOrCard = document.form1.storage.value;
  pawd = document.form1.pass.value;

  var otp = "";
  if (document.form1.otp != null) {
      otp = document.form1.otp.value;
  }

  return doSign(document.form1.path.value, pawd, fileOrCard, otp);
  }

function PodepisDigest(multi, form)  // obe promenne popsane v doDigest
  {
  //alert('PodepisDigest');
  
  return doDigest();
  }


function ShowOrHideSign(n)
  {
  alert('ShowOrHideSign');
  
  signOf="sign"+n;

  if (document.getElementById(signOf).style.display == 'block')
    {
    document.getElementById(signOf).style.display = 'none';
    }
  else
    {
    document.getElementById(signOf).style.display = 'block';
    }
  }

//Analogical like signCard, but messages are passed as Array(&signed messages are returned as array too)
function signCardMultiple(messages,pwd,mode){
    var code=0;
    var signMsgs = new Array();

    // kontrola stavu karty - posledni pokus o zadani PINu, karta zablokovana,...
    ret=getApplet().getCardBlockedInfo_0();

    if (ret == null || ret == "") {
        alert(getApplet().getErrorMessage());
        getApplet().logout();
        return "CANCEL";
    }

    if (ret == 1) {
       if (!confirm(getApplet().getStringFromResource("applet.warn.pkcs11devicemgr.userFinalTry"))) {   //  "Zbyva Vam posleni pokus na zadani pinu! Pokracovat?")) {
          getApplet().logout();
          return "CANCEL";
       }
    }

    if (ret == 2)  { // karta je zablokovana
        alert(getApplet().getStringFromResource("applet.error.pkcs11devicemgr.cardBlocked"));
        getApplet().logout();
        return "";
    }

    var ret = getApplet().loginSigningPKCS11(pwd);
    if (ret == false) {
       alert(getApplet().getErrorMessage());
       
       //JIRA DCS-2407 Pri zadani tretiho pokusu spatne upozornit na zablokovnou kartu
       ret=getApplet().getCardBlockedInfo_0();
       if (ret == 2)  { // karta je zablokovana
        	alert(getApplet().getStringFromResource("applet.error.pkcs11devicemgr.cardBlocked"));
        	getApplet().logout();
        	return "";
       }
       
       getApplet().logout();
       return "";
    }

   var m_index;
   for(m_index=0;m_index<messages.length;m_index++){
 
   		var _signMsg = ""	
 		
	    if((typeof(mode)=="undefined") || mode == null || mode == "" || mode == "PKCS7") {
	    	// podepis data PKCS7
	    	_signMsg = getApplet().signDataBase64(messages[m_index]);
	    }
	    else if(mode == "PDF") {
	    	// podepis data PDF
	    	_signMsg = getApplet().signDataBase64Pdf(messages[m_index]);
	    }
	
	    if (_signMsg == "" || _signMsg == null) {
	       alert(getApplet().getErrorMessage());
	       return "";
	    }
	    	
    	signMsgs[signMsgs.length] = _signMsg;
    }
    
   	// tady uzaviram jen signing device, PKCS11DeviceMgr session muze zustat kvuli rychlosti
    // natahovani prvni session
    ret = getApplet().logoutSigning();
    if (ret = false) {
       alert(getApplet().getErrorMessage());
       return "";
    }
    
    
    return signMsgs;
}

//Analogical like signFile, but messages are passed as Array(&signed messages are returned as array too)
function signFileMultiple(messages,path,pwd,mode){
    
    // testy zadani dat
    var bRet = getApplet().loginSigningPKCS12(path, pwd);
    if (bRet == false) {
        alert(getApplet().getErrorMessage());
        getApplet().logout();
        return;
    }
	
   var signMsgs = new Array();   
   var mess_index;
   for(mess_index=0;mess_index<messages.length;mess_index++){
	
	    // set the specification or any other attributes now
	    //getApplet().setSpecification("aa");
	
		if(mode == "PDF") {
	    	// podepis data PDF
	    	_signMsg = getApplet().signDataBase64Pdf(messages[mess_index]);
	    } 
	    else {
	    	_signMsg = getApplet().signDataBase64(messages[mess_index]);
	    }
	
	    if (_signMsg == "" || _signMsg == null) {
	       alert(getApplet().getErrorMessage());
	       return "";
	    }
	    	
    	signMsgs[signMsgs.length] = _signMsg;
    }
    
    // uzavri Signing device
    ret = getApplet().logoutSigning();
    if (ret = false) {
       alert(getApplet().getErrorMessage());
       return "";
    }
    
    return signMsgs;
}
  

