﻿/** $Header : /P2Web/WebObjects/jobUtils.js 31    18.07.01 16:24 Fg $
 * ---------------------------------------------------------------
 * Copyright by AP AG 2000-2004
 * ---------------------------------------------------------------
 * 15.12.2000 MH  Version 3.2
 * 03.01.2002 MH deutsche Umlaute in QueryStrings encoden
 * 16.10.2002 MHE WebObjects, Jobs
 * 25.09.2002 MHE Seriendruck, IS Einbindung
 * 20.11.2002 MPI WebService Anbindung.
 * 16.12.2002 MHR kein PopUp, wenn nur eine Druckmöglichkeit besteht.
 * 11.06.2003 EHO startJob akzeptiert jetzt bis zu 9 Parameter, ansonsten Fehlermeldung
 * 11.06.2003 ASI neuen Parameter (toPrintOptions) fuer Seriendruck hinzugefügt
 * 24.07.2003 MHE Konfiguration von Jobs
 * 05.09.2003 MHE PrintServer for Word extensions
 * 11.09.2003 MHE _cleanUpCancelObj added.
 * 19.11.2003 MHE Soap Job calls fixed when more than 9 parameters.
 * 16.01.2004 MHE Bestimmung der korrekten Sprache für Seriendruck
 */

P2Service.use("nav", "/./WebObjects/NavBar.asmx");

var jobReturnValue;

var toPrintIDs;
var toPrintOptions = null;
var serialPrintWnd = null;

var massTable;
var massJobTyp;
var massErrors;
var massID;

/** Client Funktion zum starten eines Jobs
 * @param url adresse der Job seite mit parametern
 * @param typ 4 zeiliger String zum angeben des Typs (zB: PRNT f&uuml;r drucken )
 * @param config bool: soll das config Dialog angezeigt werden
 * @param autoclose bool: soll das fenster beim fehlerfreies ende schliessen
 */
function startNewJob(url , typ , config , autoclose , bez )
{
  var encodedurl;
  var encodedbez;
  var auto = ((autoclose == true ) ? "1" : "0");
    
  encodedurl = codeQS(url);
  encodedbez = codeQS(bez);

  if (config == true) {
    window.open("../webObjects/jobConfig.aspx?typ=" + typ + "&url=" + encodedurl + "&autoclose=" + auto + "&bez=" + encodedbez ,"","titlebar = no, toolbar=no, menubar=no, location=no, directories=no,resizable=no");
  } else {
    encodedurl = "../WebObjects/jobProgress.aspx?typ=" + typ + "&url=" + encodedurl + "&autoclose=" + auto + "&bez=" + encodedbez + "&prio=0";
    window.open (encodedurl, "", "width=460,height=204,left=200,top=120,titlebar = no, toolbar=no, menubar=no, location=no, directories=no,resizable=no");
  }
} // startNewJob


/** Client Funktion zum starten eines Jobs &uuml;ber SOAP
 * @param url adresse der Job seite mit parametern
 * @param typ 4 zeiliger String zum angeben des Typs (zB: PRNT f&uuml;r drucken )
 * @param config bool: soll das config Dialog angezeigt werden
 * @param autoclose bool: soll das fenster beim fehlerfreies ende schliessen
 * @deprecated
 */
function startNewSOAPJob(callsSeite, func, param , bez)
{
  var jobId;
  jobReturnValue = null;
  jobId = P2Service.nav.createSOAPJob(bez);
  if (param == null )
    _P2AsyncSoapCall (callsSeite , func , jobRetFunc , jobId);
  else
    _P2AsyncSoapCall (callsSeite , func , jobRetFunc , jobId , param);
  _P2AsyncSoapCancelResult();
  return openDialog ("~/WebObjects/jobProgress.aspx?jobId=" + jobId + "&autoclose=1");
}


/** Client Funktion zum starten eines Jobs und einer zugehörigen Fortschrittsanzeige.
 * @param ServiceUrl url auf den WebService
 * @param JobText Hinweistext zum Jobs in der Jobverwaltung
 * @param func Name der Methode
 * @param p1 erster Parameter (optional).
 */
function startJob(ServiceUrl, JobText, func, p1)
{
  var jobId;
  jobReturnValue = null;
  var n, a;
  
  try {
    jobId = P2Service.nav.createSOAPJob(JobText);
    a = new Array(arguments.length-2); // will hold jobId + job parametes
    a[0] = jobId;
    for (n = 1; n < arguments.length-2; n++)
      a[n] = arguments[n+2];
    P2SoapImpl(ServiceUrl, func, a);
  } catch (e) {}

  return openDialog ("~/WebObjects/jobProgress.aspx?jobId=" + jobId + "&autoclose=1");
}


/** Client Funktion zum Starten eines Batch Jobs nach einem Konfigurations-Dialog.
 * @param ServiceUrl url auf den WebService
 * @param JobName benennung des Jobs in der Jobverwaltung
 * @param func Name der Methode
 * @param p1 erster Parameter (optional), weitere dürfen folgen.
 */
function StartBatchJob(ServiceUrl, JobName, func, p1)
{
  var url = GetWebMethodUrl(ServiceUrl, func);
  var n, p, pat;
  var s;

  // jobId will be added on the server
  url = url.replace(/jobId=\\0&?/, "");
  
  // substitude string - Parameters
  for (n = 1; (n+2) < arguments.length; n++) {
    pat = "\\" + n;
    p = url.indexOf(pat);
    if (p >= 0) {
      if (arguments[n+2] == null)
        s = "";
      else
        s = codeQS(arguments[n+2]);
      url = url.substr(0, p) + s + url.substr(p + pat.length);
    }    
  } // for

  pat = "\\" + n;
  p = url.indexOf(pat);
  while (p >= 0) {
    url = url.substr(0, p) + url.substr(p + pat.length);
    n++;
    pat = "\\" + n;
    p = url.indexOf(pat);
  }


  openDialog ("~/WebObjects/jobConfig.aspx?bez=" + codeQS(JobName) + "&url=" + codeQS(url));
}

function jobRetFunc (retVal )
{
  jobReturnValue = retVal;
}

/** Holt den Status vom Server wo der Job l&auml;uft
 * @param jobId
 */
function getState(jobId)
{
  var s; 
  try {
    s = P2Service.nav.getState(jobId);
  } catch (e) {
    s = "ERROR;" + e.description;
  }
  return s;
}


/** Holt die Ergebniss Adresse
 * @param jobId
 */
function getResultURL(jobId)
{
  return P2Service.nav.getResultURL(jobId);
}


/** Holt das Ergebniss String
 * @param jobId
 */
function getResultString(jobId)
{
  var ret;
  ret = P2Service.nav.getResultURL(jobId);
  if (ret.indexOf ("retstring://") == 0 )
    return ret.substr (12);
  return "";
}


/** Bricht den job ab
 * @param jobId
 */
function jobKill(jobId)
{
  return P2Service.nav.jobKill(jobId);
}


/** Entfernt alle alte eintraege aus der Datenbank f&uuml;r den user
 * bei user=admin: alle user
 * @param user name des Users
 */
function jobClear(user )
{
  return P2Service.nav.jobClear(user);
}


/** Nachfrage nach dem zu druckenden Dokument in Abhängigkeit von der Tabelle.
 * @param aTable Name der Tabelle zu der passend Druckjobs angeboten werden sollen.
 * @param aValue Schl&uuml;sselwert des Dokumentes (z.B. Rechnungsnummer).
 * @param aLang Default-Sprache des Dokumentes.
 * @deprecated
*/
function selectPrintJob(aTable, aValue, aLang)
{
  selectPrintJob2(aTable, 0, aValue, aLang);
} // selectPrintJob



  /** Nachfrage nach dem zu druckenden Dokument in Anh&auml;ngigkeit von der Tabelle.
   * @param aTable Name der Tabelle zu der passend Druckjobs angeboten werden sollen.
   * @param id id des zu druckenden Dokumentes
   * @param aValue Schl&uuml;sselwert des Dokumentes (z.B. Rechnungsnummer).
   * @param aLang Default-Sprache des Dokumentes.
  */
  function selectPrintJob2(aTable, id, aValue, aLang)
  {
    var defFile;
    var jobTyp;
    var paramStr ="";
    var jobUrl;
    var s;
    var n;
    var where = "";

    try {
      jobTyp = P2Service.nav.getPrintJobNames(aTable, id);
      if (jobTyp.indexOf(',') >= 0)
        jobTyp = popUpMenu(jobTyp);
      else
        jobTyp = jobTyp.split(':')[0];
    
      if (jobTyp == 0) {
        // cancel
      } else if (jobTyp.substr(0, 5) == "mass-") {
        if ((P2MENU == null) || (P2MENU.IdList == null)) {
          nlsInfo("E:S_SERIALPRINTNOSELECT");

        } else if  (toPrintIDs != null) {
          nlsInfo("E:S_ALLREADYPRINTING");

        } else {
          massJobTyp = jobTyp.substr(5);
          massTable = aTable;
          massErrors = "";
          massID = 0;
          toPrintIDs = P2MENU.IdList.slice(0);

          // start interactive mass job.
          document.attachEvent("onstop", stopJob);
          nextPrintStep();
        } // if

      } else {
        jobUrl = P2Service.nav.getMassPrintJob(jobTyp, id, aTable, aLang).split('?');
        paramStr = jobUrl[1];

      
        jobUrl = jobUrl[0];

        if (P2Service.server.getEMail != null) {
          s = P2Service.server.getEMail(aValue);
          if ((s != null) && (s != ""))
            paramStr += "&mail=" + codeQS(s);
        } // if
        if (P2Service.server.getTelefax != null) {
          s = P2Service.server.getTelefax(aValue);
          if ((s != null) && (s != ""))
            paramStr += "&fax=" + codeQS(s);
        } // if

        // give the user a chance to change parameters
        if (paramStr.indexOf("&autoclose=true") < 0)
          paramStr = openDialog ("../WebObjects/PrintDocDlg.aspx?" + paramStr);

        if ((paramStr != null) && (paramStr != "")) {
          // extract language from url and retrieve the dot-file-name
          n = paramStr.indexOf("&docLang=");
          if (n >= 0)
            aLang = paramStr.substr(n+9).split('&')[0];
        
          if (paramStr.indexOf("&docDotFile=") < 0)
            paramStr += "&docDotFile=" + P2Service.nav.getDotFile(jobTyp, id, aTable, aLang);

          if (jobUrl.substr(0,3) == "is:") {
            window.open("../WebObjects/p2plusIS.aspx?" + paramStr);

          } else if (paramStr.indexOf("&batch=true") >= 0) {
            if (paramStr.indexOf("&task=rs") >= 0) {
              if (paramStr.indexOf("&task=rslist") >= 0) {
                where = "&where=" + codeQS(P2MENU.selectUrlParam);
              } //if
              paramStr =  P2Service.nav.getMassPrintAsReport(paramStr);
              paramStr += where;
              P2Service.nav.StoreBatchReportJob(jobTyp, jobUrl + paramStr, 2);
            } else {
              P2Service.nav.StoreBatchWordJob(jobTyp, rel2absPath (document.location.href, jobUrl) + "?" + paramStr, 2);
            } //if
        
          } else if (paramStr.indexOf("&task=rs") >= 0) {
            if (paramStr.indexOf("&task=rslist") >= 0) {
              paramStr += "&where=" + codeQS(P2MENU.selectUrlParam);
            } //if
            window.open("../WebObjects/p2plusRS.aspx?" + paramStr)

          } else {
            startNewJob(rel2absPath (document.location.href, jobUrl) + "?" + paramStr , "PRNT" , false , true, jobTyp);
          } // if        
          P2Service.nav.SetGedruckt(aTable, id);
          if (P2MENU.reload != null) P2MENU.reload();
        } // if
      } // if
    } catch (e) {
      askException(e);
    }
  } // selectPrintJob2
  
  
  /** Nachfrage nach dem zu druckenden Dokument in Anh&auml;ngigkeit von der Tabelle.
   * Verwendung für Out-Seiten.
   * @param jobTyp Bezeichnunbg des Jobes in der doctypes.xml.
   * @param aTable Name der Tabelle zu der passend Druckjobs angeboten werden sollen.
   * @param id id des zu druckenden Dokumentes
   * @param aValue Schl&uuml;sselwert des Dokumentes (z.B. Rechnungsnummer).
   * @param aLang Default-Sprache des Dokumentes.
  */
  function selectPrintJobOut(jobTyp, aTable, id, aValue, aLang)
  {
    var defFile;
    var jobTyp;
    var paramStr ="";
    var jobUrl;
    var s;
    var n;
    var where = "";

    try {
        jobUrl = P2Service.nav.getMassPrintJob(jobTyp, id, aTable, aLang).split('?');
        paramStr = jobUrl[1];
      
        jobUrl = jobUrl[0];

        if (P2Service.server.getEMail != null) {
          s = P2Service.server.getEMail(aValue);
          if ((s != null) && (s != ""))
            paramStr += "&mail=" + codeQS(s);
        } // if
        if (P2Service.server.getTelefax != null) {
          s = P2Service.server.getTelefax(aValue);
          if ((s != null) && (s != ""))
            paramStr += "&fax=" + codeQS(s);
        } // if

        // give the user a chance to change parameters
        if (paramStr.indexOf("&autoclose=true") < 0)
          paramStr = openDialog ("../WebObjects/PrintDocDlg.aspx?" + paramStr);

        if ((paramStr != null) && (paramStr != "")) {
          // extract language from url and retrieve the dot-file-name
          n = paramStr.indexOf("&docLang=");
          if (n >= 0)
            aLang = paramStr.substr(n+9).split('&')[0];
        
          if (paramStr.indexOf("&docDotFile=") < 0)
            paramStr += "&docDotFile=" + P2Service.nav.getDotFile(jobTyp, id, aTable, aLang);

          if (paramStr.indexOf("&batch=true") >= 0) {
            if (paramStr.indexOf("&task=rs") >= 0) {
              if (paramStr.indexOf("&task=rslist") >= 0) {
                where = "&where=" + codeQS(P2MENU.selectUrlParam);
              } //if
              paramStr =  P2Service.nav.getMassPrintAsReport(paramStr);
              paramStr += where;
              P2Service.nav.StoreBatchReportJob(jobTyp, jobUrl + paramStr, 2);
            } else {
              P2Service.nav.StoreBatchWordJob(jobTyp, rel2absPath (document.location.href, jobUrl) + "?" + paramStr, 2);
            } //if
        
          } else if (paramStr.indexOf("&task=rs") >= 0) {
            if (paramStr.indexOf("&task=rslist") >= 0) {
              paramStr += "&where=" + codeQS(P2MENU.selectUrlParam);
            } //if
            window.open("../WebObjects/p2plusRS.aspx?" + paramStr)

          } else {
            startNewJob(rel2absPath (document.location.href, jobUrl) + "?" + paramStr , "PRNT" , false , true, jobTyp);
          } // if        
        } // if
        
    } catch (e) {
      askException(e);
    }
  } // selectPrintJobOut



/// Diese Funktion wird an das Stop-Event des Browsers gebunden
/// um einen laufenden Seriendruck abbrechen zu können.
function stopJob()
{
  if (toPrintIDs != null) {
    var ret = nlsInfo ("?:S_ABORTSERIALPRINT");
    if (ret == "YES") {
      toPrintIDs = null;
      window.status = "Aborded";
    }
  }
} // stopJob


//Methode um einen Seriendruck anzustoßen ohne die Query der Rec-Seite zu benutzen
function printSerie (idList, typ, table, idParam)
{
  if (toPrintIDs != null) {
     nlsInfo("E:S_ALLREADYPRINTING");

  } else if (idList != null) {
    if (typeof(idList) == "string") {
      toPrintIDs = new Array(0);
      toPrintIDs[0] = idList;
    } else {
      toPrintIDs = idList;
    } // if
    massJobTyp = typ;
    massTable = table;
    toPrintOptions = idParam;
    massID = 0;
    massErrors = "";
    nextPrintStep ();
  }   
} // printSerie


/// nechster Druckschritt... &Uuml;berpr&uuml;fen ob window zu ist,
/// wenn ja, nechter Job starten.
function nextPrintStep ()
{
  var encodedurl;
  var jobUrl;
  var url;
  var obj;

  if (toPrintIDs != null) {
    if ((serialPrintWnd == null) || (serialPrintWnd.closed == true)) {
      try {
        window.status = "printing... " + (massID+1) + "/" + toPrintIDs.length;
        obj = document.getElementById("SPRACHE");
        jobUrl = P2Service.nav.getMassPrintJob(massJobTyp, toPrintIDs[massID], massTable, null);
        if ((toPrintOptions != null) && (toPrintOptions != ""))
			    jobUrl += "&options=" + toPrintOptions[massID];
        url = jobUrl.split('?');
        url[0] = rel2absPath (document.location.href, url[0])
        encodedurl = codeQS(url.join('?'));
        
        if (jobUrl.indexOf("&batch=true") >= 0) {
          P2Service.nav.StoreBatchWordJob(massJobTyp, url.join('?'), 2);
        } else {
          serialPrintWnd = window.open("../WebObjects/jobProgress.aspx?typ=PRNT&batch=1&url=" + encodedurl + "&autoclose=1&bez=Serie " + codeQS(massJobTyp) + "&prio=0", "",
            "width=460,height=204,left=200,top=120,titlebar = no, toolbar=no, menubar=no, location=no, directories=no,resizable=no");
        } // if
        P2Service.nav.SetGedruckt(massTable, toPrintIDs[massID]);

      } catch (e) {
        massErrors += e.description;
      } // try
      massID++;
    } // if
  
    if (massID < toPrintIDs.length) {
      setTimeout (nextPrintStep, 300 , "JavaScript");
    } else {
      toPrintIDs = null;
      window.status = "Done";
      if (massErrors != "")
        askException (massErrors);
    } // if
  } // if
}


function MakeJobParam ()
{
  var res = "<jobparams>";
  for (var i = 0 ; i < arguments.length ; i++) {
    res += "<param>" + arguments[i] + "</param>";
  } // for
  res += "</jobparams>";
  return res;
} // MakeJobParam

/** Client Funktion zum starten eines Reports
 * @param url adresse der Job seite mit parametern
 * @param typ 4 zeiliger String zum angeben des Typs (zB: PRNT f&uuml;r drucken )
 * @param config bool: soll das config Dialog angezeigt werden
 * @param autoclose bool: soll das fenster beim fehlerfreies ende schliessen
 */
function startNewReport (url , typ)
{
  if (url.indexOf("://") < 0)
    url = rel2absPath(window.location.href,  url);
  P2Service.nav.createReport (url , typ);
}


