You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by ki...@apache.org on 2015/06/13 22:28:33 UTC

svn commit: r1685321 [4/16] - /manifoldcf/trunk/framework/crawler-ui/src/main/webapp/

Modified: manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editjob.jsp
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editjob.jsp?rev=1685321&r1=1685320&r2=1685321&view=diff
==============================================================================
--- manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editjob.jsp (original)
+++ manifoldcf/trunk/framework/crawler-ui/src/main/webapp/editjob.jsp Sat Jun 13 20:28:32 2015
@@ -29,266 +29,266 @@
     // It may also be called directly with a parameter of "origjobid", which implies that a copy operation should be started.
     try
     {
-	// Get the job manager handle
-	IJobManager manager = JobManagerFactory.make(threadContext);
-	IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
-	IRepositoryConnection[] connList = connMgr.getAllConnections();
-	INotificationConnectionManager notificationMgr = NotificationConnectionManagerFactory.make(threadContext);
-	INotificationConnection[] notificationList = notificationMgr.getAllConnections();
-	IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(threadContext);
-	IOutputConnection[] outputList = outputMgr.getAllConnections();
-	ITransformationConnectionManager transformationMgr = TransformationConnectionManagerFactory.make(threadContext);
-	ITransformationConnection[] transformationList = transformationMgr.getAllConnections();
-
-	IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
-	IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
-	INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
-	ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
-
-	// Figure out tab name and sequence number
-	String tabName = variableContext.getParameter("tabname");
-	String tabSequenceNumber = variableContext.getParameter("sequencenumber");
-	int tabSequenceInt;
-	if (tabName == null || tabName.length() == 0)
-	{
-		tabName = Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name");
-		tabSequenceInt = -1;
-	}
-	else
-	{
-		if (tabSequenceNumber == null || tabSequenceNumber.length() == 0)
-			tabSequenceInt = -1;
-		else
-			tabSequenceInt = Integer.parseInt(tabSequenceNumber);
-	}
-	
-	// Get a loaded job object, somehow.
-	String jobID = null;
-	IJobDescription job = (IJobDescription)threadContext.get("JobObject");
-	if (job == null)
-	{
-		// We did not go through execute.jsp
-		// We might have received an argument specifying the connection name.
-		jobID = variableContext.getParameter("jobid");
-		String origJobID = variableContext.getParameter("origjobid");
-		if (origJobID == null || origJobID.length() == 0)
-			origJobID = jobID;
-		if (origJobID != null)
-			job = manager.load(new Long(origJobID));
-	}
-	else
-		jobID = job.getID().toString();
-
-	// Setup default fields
-	String connectionName = "";
-	String description = "";
-	int type = IJobDescription.TYPE_SPECIFIED;
-	Specification documentSpecification = new Specification();
-	
-	// Pipeline data
-	String[] pipelineConnectionNames = new String[0];
-	String[] pipelineDescriptions = new String[0];
-	boolean[] pipelineIsOutputs = new boolean[0];
-	int[] pipelinePrerequisites = new int[0];
-	Specification[] pipelineSpecifications = new Specification[0];
-	
-	String[] notificationConnectionNames = new String[0];
-	String[] notificationDescriptions = new String[0];
-	Specification[] notificationSpecifications = new Specification[0];
-	
-	ArrayList scheduleRecords = new ArrayList();
-
-	EnumeratedValues dayOfWeek = null;
-	EnumeratedValues dayOfMonth = null;
-	EnumeratedValues monthOfYear = null;
-	EnumeratedValues year = null;
-	EnumeratedValues hourOfDay = null;
-	EnumeratedValues minutesOfHour = null;
-	// Duration in minutes
-	Long duration = null;
-	// RequestMinimum flag
-	boolean requestMinimum = false;
-
-	// Priority
-	int priority = 5;
-	// Minimum recrawl interval (Default: 1 day)
-	Long recrawlInterval = new Long(60L * 24L);
-	// Maximum recrawl interval (Default: none)
-	Long maxRecrawlInterval = null;
-	// Reseed interval (Default: 60 minutes)
-	Long reseedInterval = new Long(60L);
-	// Expiration interval (Default: never)
-	Long expirationInterval = null;
-	// Start method
-	int startMethod = IJobDescription.START_DISABLE;
-	// Hopcount mode
-	int hopcountMode = IJobDescription.HOPCOUNT_ACCURATE;
-	// Hop filters
-	Map hopFilterMap = new HashMap();
-
-	// If the job is not null, prepopulate everything with what comes from it.
-	if (job != null)
-	{
-		// Set up values
-		description = job.getDescription();
-		connectionName = job.getConnectionName();
-		
-		pipelineConnectionNames = new String[job.countPipelineStages()];
-		pipelineDescriptions = new String[job.countPipelineStages()];
-		pipelineIsOutputs = new boolean[job.countPipelineStages()];
-		pipelinePrerequisites = new int[job.countPipelineStages()];
-		pipelineSpecifications = new Specification[job.countPipelineStages()];
-		for (int j = 0; j < job.countPipelineStages(); j++)
-		{
-			pipelineConnectionNames[j] = job.getPipelineStageConnectionName(j);
-			pipelineDescriptions[j] = job.getPipelineStageDescription(j);
-			pipelineIsOutputs[j] = job.getPipelineStageIsOutputConnection(j);
-			pipelinePrerequisites[j] = job.getPipelineStagePrerequisite(j);
-			pipelineSpecifications[j] = job.getPipelineStageSpecification(j);
-		}
-		notificationConnectionNames = new String[job.countNotifications()];
-		notificationDescriptions = new String[job.countNotifications()];
-		notificationSpecifications = new Specification[job.countNotifications()];
-		for (int j = 0; j < job.countNotifications(); j++)
-		{
-			notificationConnectionNames[j] = job.getNotificationConnectionName(j);
-			notificationDescriptions[j] = job.getNotificationDescription(j);
-			notificationSpecifications[j] = job.getNotificationSpecification(j);
-		}
-		
-		type = job.getType();
-		startMethod = job.getStartMethod();
-		hopcountMode = job.getHopcountMode();
-		documentSpecification = job.getSpecification();
-		// Fill in schedule records from job
-		for (int j = 0; j < job.getScheduleRecordCount(); j++)
-		{
-			scheduleRecords.add(job.getScheduleRecord(j));
-		}
-
-		priority = job.getPriority();
-		Long value = job.getInterval();
-		recrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
-		value = job.getMaxInterval();
-		maxRecrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
-		value = job.getReseedInterval();
-		reseedInterval = (value==null)?null:new Long(value.longValue()/60000L);
-		value = job.getExpiration();
-		expirationInterval = (value==null)?null:new Long(value.longValue()/60000L);
-		hopFilterMap = job.getHopCountFilters();
-	}
-
-
-	// This form reposts to itself.  It basically only allows the connection to be picked once; once done, the repost occurs
-	// and cannot be undone.
-	// Therefore, there are three possible entry conditions:
-	// 1) no jobid w/no connection name, which indicates a brand-new job without a chosen connection
-	// 2) no jobid w/a connection name, which indicates that the connection at least has been chosen
-	// 3) a jobid and a connection name, which indicates that we are editing an existing connection.
-	// There are similar combinations for output connections.
-
-	int model = IRepositoryConnector.MODEL_ADD_CHANGE_DELETE;
-	String[] relationshipTypes = null;
-	List<String> tabsArray = new ArrayList<String>();
-	List<Integer> sequenceArray = new ArrayList<Integer>();
-	
-	IRepositoryConnection connection = null;
-	if (connectionName.length() > 0)
-	{
-		connection = connMgr.load(connectionName);
-		model = RepositoryConnectorFactory.getConnectorModel(threadContext,connection.getClassName());
-		relationshipTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
-	}
-
-	// Set up the predefined tabs
-	tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name"));
-	sequenceArray.add(null);
-	tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection"));
-	sequenceArray.add(null);
-	if (connectionName.length() > 0)
-	{
-		tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Scheduling"));
-		sequenceArray.add(null);
-		if (relationshipTypes != null && relationshipTypes.length > 0)
-		{
-			tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters"));
-			sequenceArray.add(null);
-		}
-	}
-
-	// Get the names of the various Javascript methods we'll need to call
-	String checkMethod = "checkSpecification";
-	String saveCheckMethod = "checkSpecificationForSave";
-	String[] pipelineCheckMethods = new String[pipelineConnectionNames.length];
-	String[] pipelineCheckForSaveMethods = new String[pipelineConnectionNames.length];
-	String[] notificationCheckMethods = new String[notificationConnectionNames.length];
-	String[] notificationCheckForSaveMethods = new String[notificationConnectionNames.length];
-	
-	for (int j = 0; j < pipelineConnectionNames.length; j++)
-	{
-		pipelineCheckMethods[j] = "unknown";
-		pipelineCheckForSaveMethods[j] = "unknown";
-	}
-	for (int j = 0; j < notificationConnectionNames.length; j++)
-	{
-		notificationCheckMethods[j] = "unknown";
-		notificationCheckForSaveMethods[j] = "unknown";
-	}
-	
-	if (connection != null)
-	{
-		IRepositoryConnector connector = RepositoryConnectorFactory.getConnectorNoCheck(connection.getClassName());
-		if (connector != null)
-		{
-			checkMethod = connector.getFormCheckJavascriptMethodName(0);
-			saveCheckMethod = connector.getFormPresaveCheckJavascriptMethodName(0);
-		}
-	}
-
-	for (int j = 0; j < pipelineConnectionNames.length; j++)
-	{
-		if (pipelineIsOutputs[j])
-		{
-			IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
-			if (outputConnection != null)
-			{
-				IOutputConnector outputConnector = OutputConnectorFactory.getConnectorNoCheck(outputConnection.getClassName());
-				if (outputConnector != null)
-				{
-					pipelineCheckMethods[j] = outputConnector.getFormCheckJavascriptMethodName(1+j);
-					pipelineCheckForSaveMethods[j] = outputConnector.getFormPresaveCheckJavascriptMethodName(1+j);
-				}
-			}
-		}
-		else
-		{
-			ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
-			if (transformationConnection != null)
-			{
-				ITransformationConnector transformationConnector = TransformationConnectorFactory.getConnectorNoCheck(transformationConnection.getClassName());
-				if (transformationConnector != null)
-				{
-					pipelineCheckMethods[j] = transformationConnector.getFormCheckJavascriptMethodName(1+j);
-					pipelineCheckForSaveMethods[j] = transformationConnector.getFormPresaveCheckJavascriptMethodName(1+j);
-				}
-			}
-		}
-	}
-
-	for (int j = 0; j < notificationConnectionNames.length; j++)
-	{
-		INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
-		if (notificationConnection != null)
-		{
-			INotificationConnector notificationConnector = NotificationConnectorFactory.getConnectorNoCheck(notificationConnection.getClassName());
-			if (notificationConnector != null)
-			{
-				notificationCheckMethods[j] = notificationConnector.getFormCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
-				notificationCheckForSaveMethods[j] = notificationConnector.getFormPresaveCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
-			}
+  // Get the job manager handle
+  IJobManager manager = JobManagerFactory.make(threadContext);
+  IRepositoryConnectionManager connMgr = RepositoryConnectionManagerFactory.make(threadContext);
+  IRepositoryConnection[] connList = connMgr.getAllConnections();
+  INotificationConnectionManager notificationMgr = NotificationConnectionManagerFactory.make(threadContext);
+  INotificationConnection[] notificationList = notificationMgr.getAllConnections();
+  IOutputConnectionManager outputMgr = OutputConnectionManagerFactory.make(threadContext);
+  IOutputConnection[] outputList = outputMgr.getAllConnections();
+  ITransformationConnectionManager transformationMgr = TransformationConnectionManagerFactory.make(threadContext);
+  ITransformationConnection[] transformationList = transformationMgr.getAllConnections();
+
+  IOutputConnectorPool outputConnectorPool = OutputConnectorPoolFactory.make(threadContext);
+  IRepositoryConnectorPool repositoryConnectorPool = RepositoryConnectorPoolFactory.make(threadContext);
+  INotificationConnectorPool notificationConnectorPool = NotificationConnectorPoolFactory.make(threadContext);
+  ITransformationConnectorPool transformationConnectorPool = TransformationConnectorPoolFactory.make(threadContext);
+
+  // Figure out tab name and sequence number
+  String tabName = variableContext.getParameter("tabname");
+  String tabSequenceNumber = variableContext.getParameter("sequencenumber");
+  int tabSequenceInt;
+  if (tabName == null || tabName.length() == 0)
+  {
+    tabName = Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name");
+    tabSequenceInt = -1;
+  }
+  else
+  {
+    if (tabSequenceNumber == null || tabSequenceNumber.length() == 0)
+      tabSequenceInt = -1;
+    else
+      tabSequenceInt = Integer.parseInt(tabSequenceNumber);
+  }
+
+  // Get a loaded job object, somehow.
+  String jobID = null;
+  IJobDescription job = (IJobDescription)threadContext.get("JobObject");
+  if (job == null)
+  {
+    // We did not go through execute.jsp
+    // We might have received an argument specifying the connection name.
+    jobID = variableContext.getParameter("jobid");
+    String origJobID = variableContext.getParameter("origjobid");
+    if (origJobID == null || origJobID.length() == 0)
+      origJobID = jobID;
+    if (origJobID != null)
+      job = manager.load(new Long(origJobID));
+  }
+  else
+    jobID = job.getID().toString();
+
+  // Setup default fields
+  String connectionName = "";
+  String description = "";
+  int type = IJobDescription.TYPE_SPECIFIED;
+  Specification documentSpecification = new Specification();
+
+  // Pipeline data
+  String[] pipelineConnectionNames = new String[0];
+  String[] pipelineDescriptions = new String[0];
+  boolean[] pipelineIsOutputs = new boolean[0];
+  int[] pipelinePrerequisites = new int[0];
+  Specification[] pipelineSpecifications = new Specification[0];
+
+  String[] notificationConnectionNames = new String[0];
+  String[] notificationDescriptions = new String[0];
+  Specification[] notificationSpecifications = new Specification[0];
+
+  ArrayList scheduleRecords = new ArrayList();
+
+  EnumeratedValues dayOfWeek = null;
+  EnumeratedValues dayOfMonth = null;
+  EnumeratedValues monthOfYear = null;
+  EnumeratedValues year = null;
+  EnumeratedValues hourOfDay = null;
+  EnumeratedValues minutesOfHour = null;
+  // Duration in minutes
+  Long duration = null;
+  // RequestMinimum flag
+  boolean requestMinimum = false;
+
+  // Priority
+  int priority = 5;
+  // Minimum recrawl interval (Default: 1 day)
+  Long recrawlInterval = new Long(60L * 24L);
+  // Maximum recrawl interval (Default: none)
+  Long maxRecrawlInterval = null;
+  // Reseed interval (Default: 60 minutes)
+  Long reseedInterval = new Long(60L);
+  // Expiration interval (Default: never)
+  Long expirationInterval = null;
+  // Start method
+  int startMethod = IJobDescription.START_DISABLE;
+  // Hopcount mode
+  int hopcountMode = IJobDescription.HOPCOUNT_ACCURATE;
+  // Hop filters
+  Map hopFilterMap = new HashMap();
+
+  // If the job is not null, prepopulate everything with what comes from it.
+  if (job != null)
+  {
+    // Set up values
+    description = job.getDescription();
+    connectionName = job.getConnectionName();
+
+    pipelineConnectionNames = new String[job.countPipelineStages()];
+    pipelineDescriptions = new String[job.countPipelineStages()];
+    pipelineIsOutputs = new boolean[job.countPipelineStages()];
+    pipelinePrerequisites = new int[job.countPipelineStages()];
+    pipelineSpecifications = new Specification[job.countPipelineStages()];
+    for (int j = 0; j < job.countPipelineStages(); j++)
+    {
+      pipelineConnectionNames[j] = job.getPipelineStageConnectionName(j);
+      pipelineDescriptions[j] = job.getPipelineStageDescription(j);
+      pipelineIsOutputs[j] = job.getPipelineStageIsOutputConnection(j);
+      pipelinePrerequisites[j] = job.getPipelineStagePrerequisite(j);
+      pipelineSpecifications[j] = job.getPipelineStageSpecification(j);
+    }
+    notificationConnectionNames = new String[job.countNotifications()];
+    notificationDescriptions = new String[job.countNotifications()];
+    notificationSpecifications = new Specification[job.countNotifications()];
+    for (int j = 0; j < job.countNotifications(); j++)
+    {
+      notificationConnectionNames[j] = job.getNotificationConnectionName(j);
+      notificationDescriptions[j] = job.getNotificationDescription(j);
+      notificationSpecifications[j] = job.getNotificationSpecification(j);
+    }
+
+    type = job.getType();
+    startMethod = job.getStartMethod();
+    hopcountMode = job.getHopcountMode();
+    documentSpecification = job.getSpecification();
+    // Fill in schedule records from job
+    for (int j = 0; j < job.getScheduleRecordCount(); j++)
+    {
+      scheduleRecords.add(job.getScheduleRecord(j));
+    }
+
+    priority = job.getPriority();
+    Long value = job.getInterval();
+    recrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
+    value = job.getMaxInterval();
+    maxRecrawlInterval = (value==null)?null:new Long(value.longValue()/60000L);
+    value = job.getReseedInterval();
+    reseedInterval = (value==null)?null:new Long(value.longValue()/60000L);
+    value = job.getExpiration();
+    expirationInterval = (value==null)?null:new Long(value.longValue()/60000L);
+    hopFilterMap = job.getHopCountFilters();
+  }
+
+
+  // This form reposts to itself.  It basically only allows the connection to be picked once; once done, the repost occurs
+  // and cannot be undone.
+  // Therefore, there are three possible entry conditions:
+  // 1) no jobid w/no connection name, which indicates a brand-new job without a chosen connection
+  // 2) no jobid w/a connection name, which indicates that the connection at least has been chosen
+  // 3) a jobid and a connection name, which indicates that we are editing an existing connection.
+  // There are similar combinations for output connections.
+
+  int model = IRepositoryConnector.MODEL_ADD_CHANGE_DELETE;
+  String[] relationshipTypes = null;
+  List<String> tabsArray = new ArrayList<String>();
+  List<Integer> sequenceArray = new ArrayList<Integer>();
+
+  IRepositoryConnection connection = null;
+  if (connectionName.length() > 0)
+  {
+    connection = connMgr.load(connectionName);
+    model = RepositoryConnectorFactory.getConnectorModel(threadContext,connection.getClassName());
+    relationshipTypes = RepositoryConnectorFactory.getRelationshipTypes(threadContext,connection.getClassName());
+  }
+
+  // Set up the predefined tabs
+  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name"));
+  sequenceArray.add(null);
+  tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection"));
+  sequenceArray.add(null);
+  if (connectionName.length() > 0)
+  {
+    tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Scheduling"));
+    sequenceArray.add(null);
+    if (relationshipTypes != null && relationshipTypes.length > 0)
+    {
+      tabsArray.add(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters"));
+      sequenceArray.add(null);
+    }
+  }
+
+  // Get the names of the various Javascript methods we'll need to call
+  String checkMethod = "checkSpecification";
+  String saveCheckMethod = "checkSpecificationForSave";
+  String[] pipelineCheckMethods = new String[pipelineConnectionNames.length];
+  String[] pipelineCheckForSaveMethods = new String[pipelineConnectionNames.length];
+  String[] notificationCheckMethods = new String[notificationConnectionNames.length];
+  String[] notificationCheckForSaveMethods = new String[notificationConnectionNames.length];
+
+  for (int j = 0; j < pipelineConnectionNames.length; j++)
+  {
+    pipelineCheckMethods[j] = "unknown";
+    pipelineCheckForSaveMethods[j] = "unknown";
+  }
+  for (int j = 0; j < notificationConnectionNames.length; j++)
+  {
+    notificationCheckMethods[j] = "unknown";
+    notificationCheckForSaveMethods[j] = "unknown";
+  }
+
+  if (connection != null)
+  {
+    IRepositoryConnector connector = RepositoryConnectorFactory.getConnectorNoCheck(connection.getClassName());
+    if (connector != null)
+    {
+      checkMethod = connector.getFormCheckJavascriptMethodName(0);
+      saveCheckMethod = connector.getFormPresaveCheckJavascriptMethodName(0);
+    }
+  }
+
+  for (int j = 0; j < pipelineConnectionNames.length; j++)
+  {
+    if (pipelineIsOutputs[j])
+    {
+      IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
+      if (outputConnection != null)
+      {
+        IOutputConnector outputConnector = OutputConnectorFactory.getConnectorNoCheck(outputConnection.getClassName());
+        if (outputConnector != null)
+        {
+          pipelineCheckMethods[j] = outputConnector.getFormCheckJavascriptMethodName(1+j);
+          pipelineCheckForSaveMethods[j] = outputConnector.getFormPresaveCheckJavascriptMethodName(1+j);
+        }
+      }
+    }
+    else
+    {
+      ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
+      if (transformationConnection != null)
+      {
+        ITransformationConnector transformationConnector = TransformationConnectorFactory.getConnectorNoCheck(transformationConnection.getClassName());
+        if (transformationConnector != null)
+        {
+          pipelineCheckMethods[j] = transformationConnector.getFormCheckJavascriptMethodName(1+j);
+          pipelineCheckForSaveMethods[j] = transformationConnector.getFormPresaveCheckJavascriptMethodName(1+j);
+        }
+      }
+    }
+  }
+
+  for (int j = 0; j < notificationConnectionNames.length; j++)
+  {
+    INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
+    if (notificationConnection != null)
+    {
+      INotificationConnector notificationConnector = NotificationConnectorFactory.getConnectorNoCheck(notificationConnection.getClassName());
+      if (notificationConnector != null)
+      {
+        notificationCheckMethods[j] = notificationConnector.getFormCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
+        notificationCheckForSaveMethods[j] = notificationConnector.getFormPresaveCheckJavascriptMethodName(1+pipelineConnectionNames.length+j);
+      }
 
-		}
-	}
+    }
+  }
 %>
 
 <?xml version="1.0" encoding="utf-8"?>
@@ -297,452 +297,452 @@
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link rel="StyleSheet" href="style.css" type="text/css" media="screen"/>
-	<title>
-		<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ApacheManifoldCFEditJob")%>
-	</title>
-
-	<script type="text/javascript">
-	<!--
-
-	// Use this method to repost the form and pick a new tab
-	function SelectTab(newtab)
-	{
-		if (checkForm())
-		{
-			document.editjob.tabname.value = newtab;
-			document.editjob.sequencenumber.value = "";
-			document.editjob.submit();
-		}
-	}
-
-	// Use this method to repost the form and pick a new tab
-	function SelectSequencedTab(newtab, sequencenumber)
-	{
-		if (checkForm())
-		{
-			document.editjob.tabname.value = newtab;
-			document.editjob.sequencenumber.value = sequencenumber;
-			document.editjob.submit();
-		}
-	}
-
-	// Use this method to repost the form,
-	// and set the anchor request.
-	function postFormSetAnchor(anchorValue)
-	{
-		if (checkForm())
-		{
-			if (anchorValue != "")
-				document.editjob.action = document.editjob.action + "#" + anchorValue;
-			document.editjob.submit();
-		}
-	}
-
-	// Use this method to repost the form
-	function postFormNew()
-	{
-		if (checkForm())
-		{
-			document.editjob.submit();
-		}
-	}
-
-	// Deprecated
-	function postForm(schedCount)
-	{
-		if (checkForm())
-		{
-			document.editjob.submit();
-		}
-	}
-
-	function Save()
-	{
-		if (checkForm())
-		{
-			// Can't submit until all required fields have been set.
-			// Some of these don't live on the current tab, so don't set
-			// focus.
-
-			// Check our part of the form, for save
-			if (editjob.description.value == "")
-			{
-				alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.JobMustHaveAName")%>");
-				SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.Name")%>");
-				document.editjob.description.focus();
-				return;
-			}
-<%
-	for (int j = 0; j < pipelineCheckForSaveMethods.length; j++)
-	{
-%>
-			if (window.<%=pipelineCheckForSaveMethods[j]%>)
-			{
-				if (<%=pipelineCheckForSaveMethods[j]%>() == false)
-					return;
-			}
-<%
-	}
-	for (int j = 0; j < notificationCheckForSaveMethods.length; j++)
-	{
-%>
-			if (window.<%=notificationCheckForSaveMethods[j]%>)
-			{
-				if (<%=notificationCheckForSaveMethods[j]%>() == false)
-					return;
-			}
-<%
-	}
-%>
-			if (window.<%=saveCheckMethod%>)
-			{
-				if (<%=saveCheckMethod%>() == false)
-					return;
-			}
-			document.editjob.op.value="Save";
-			document.editjob.submit();
-		}
-	}
-
-	function Cancel()
-	{
-		document.editjob.op.value="Cancel";
-		document.editjob.submit();
-	}
-
-	function Continue()
-	{
-		document.editjob.op.value="Continue";
-		postFormNew();
-	}
-
-	function InsertPipelineStageTransformation(n)
-	{
-		if (editjob.transformation_connectionname.value == "")
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectATransformationStageConnectionName")%>");
-			editjob.transformation_connectionname.focus();
-			return;
-		}
-		eval("document.editjob.pipeline_"+n+"_op.value = 'InsertTransformation'");
-		postFormSetAnchor("pipeline_"+(n+1)+"_tag");
-	}
-
-	function InsertPipelineStageOutput(n)
-	{
-		if (editjob.output_connectionname.value == "")
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectAnOutputStageConnectionName")%>");
-			editjob.output_connectionname.focus();
-			return;
-		}
-		eval("document.editjob.pipeline_"+n+"_op.value = 'InsertOutput'");
-		postFormSetAnchor("pipeline_"+(n+1)+"_tag");
-	}
-
-	function AppendPipelineStageOutput()
-	{
-		if (editjob.output_connectionname.value == "")
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectAnOutputStageConnectionName")%>");
-			editjob.output_connectionname.focus();
-			return;
-		}
-		document.editjob.output_op.value="Add";
-		postFormSetAnchor("output_tag");
-	}
-	
-	function DeletePipelineStage(n)
-	{
-		eval("document.editjob.pipeline_"+n+"_op.value = 'Delete'");
-		if (n == 0)
-			postFormSetAnchor("pipeline_tag");
-		else
-			postFormSetAnchor("pipeline_"+(n-1)+"_tag");
-	}
-
-	function AppendNotification()
-	{
-		if (editjob.notification_connectionname.value == "")
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectANotificationConnectionName")%>");
-			editjob.notification_connectionname.focus();
-			return;
-		}
-		document.editjob.notification_op.value="Add";
-		postFormSetAnchor("notification_tag");
-	}
-	
-	function DeleteNotification(n)
-	{
-		eval("document.editjob.notification_"+n+"_op.value = 'Delete'");
-		if (n == 0)
-			postFormSetAnchor("notification_tag");
-		else
-			postFormSetAnchor("notification_"+(n-1)+"_tag");
-	}
-
-	function AddScheduledTime()
-	{
-		if (editjob.duration.value != "" && !isInteger(editjob.duration.value))
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.DurationMustBeAValidInteger")%>");
-			editjob.duration.focus();
-			return;
-		}
-		document.editjob.recordop.value="Add Scheduled Time";
-		postFormSetAnchor("add_schedule");
-	}
-
-	function RemoveSchedule(n)
-	{
-		eval("document.editjob.recordop"+n+".value = 'Remove Schedule'");
-		if (n == 0)
-			postFormSetAnchor("add_schedule");
-		else
-			postFormSetAnchor("remove_schedule_"+(n-1));
-	}
-
-	function checkForm()
-	{
-		if (!checkRecrawl())
-			return false;
-		if (!checkMaxRecrawl())
-			return false;
-		if (!checkRecrawlConsistent())
-			return false;
-		if (!checkReseed())
-			return false;
-		if (!checkExpiration())
-			return false;
-		if (!checkSchedule())
-			return false;
-<%
-	for (int j = 0; j < pipelineCheckMethods.length; j++)
-	{
-%>
-		if (window.<%=pipelineCheckMethods[j]%>)
-		{
-			if (<%=pipelineCheckMethods[j]%>() == false)
-				return false;
-		}
-<%
-	}
-	for (int j = 0; j < notificationCheckMethods.length; j++)
-	{
-%>
-		if (window.<%=notificationCheckMethods[j]%>)
-		{
-			if (<%=notificationCheckMethods[j]%>() == false)
-				return false;
-		}
-<%
-	}
-%>
-		// Check the connector part
-		if (window.<%=checkMethod%>)
-		{
-			if (<%=checkMethod%>() == false)
-				return false;
-		}
-		return true;
-	}
-
-	function checkSchedule()
-	{
-		var i = 0;
-		var schedCount = <%=Integer.toString(scheduleRecords.size())%>;
-		while (i < schedCount)
-		{
-			var propertyname = "duration" + i;
-			if (eval("editjob."+propertyname+".value") != "" && !isInteger(eval("editjob."+propertyname+".value")))
-			{
-				alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.DurationMustBeAValidInteger")%>");
-				eval("editjob."+propertyname+".focus()");
-				return false;
-			}
-			i = i+1;
-		}
-		return true;
-	}
-
-	function checkRecrawl()
-	{
-		if (editjob.recrawlinterval.value != "" && !isInteger(editjob.recrawlinterval.value))
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.RecrawlIntervalMustBeAValidIntegerOrNull")%>");
-			editjob.recrawlinterval.focus();
-			return false;
-		}
-		return true;
-	}
-
-	function checkMaxRecrawl()
-	{
-		if (editjob.maxrecrawlinterval.value != "" && !isInteger(editjob.maxrecrawlinterval.value))
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull")%>");
-			editjob.maxrecrawlinterval.focus();
-			return false;
-		}
-		return true;
-	}
-	
-	function checkRecrawlConsistent()
-	{
-		if (editjob.maxrecrawlinterval.value != "" && editjob.recrawlinterval.value != "" && parseInt(editjob.maxrecrawlinterval.value) < parseInt(editjob.recrawlinterval.value))
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval")%>");
-			editjob.maxrecrawlinterval.focus();
-			return false;
-		}
-		return true;
-	}
-
-	function checkReseed()
-	{
-		if (editjob.reseedinterval.value != "" && !isInteger(editjob.reseedinterval.value))
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.ReseedIntervalMustBeAValidIntegerOrNull")%>");
-			editjob.reseedinterval.focus();
-			return false;
-		}
-		return true;
-	}
-
-	function checkExpiration()
-	{
-		if (editjob.expirationinterval.value != "" && !isInteger(editjob.expirationinterval.value))
-		{
-			alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.ExpirationIntervalMustBeAValidIntegerOrNull")%>");
-			editjob.expirationinterval.focus();
-			return false;
-		}
-		return true;
-	}
-
-	function isInteger(value)
-	{
-		var anum=/(^\d+$)/;
-		return anum.test(value);
-	}
-
-	function isRegularExpression(value)
-	{
-		try
-		{
-			var foo = "teststring";
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <link rel="StyleSheet" href="style.css" type="text/css" media="screen"/>
+  <title>
+    <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.ApacheManifoldCFEditJob")%>
+  </title>
+
+  <script type="text/javascript">
+  <!--
+
+  // Use this method to repost the form and pick a new tab
+  function SelectTab(newtab)
+  {
+    if (checkForm())
+    {
+      document.editjob.tabname.value = newtab;
+      document.editjob.sequencenumber.value = "";
+      document.editjob.submit();
+    }
+  }
+
+  // Use this method to repost the form and pick a new tab
+  function SelectSequencedTab(newtab, sequencenumber)
+  {
+    if (checkForm())
+    {
+      document.editjob.tabname.value = newtab;
+      document.editjob.sequencenumber.value = sequencenumber;
+      document.editjob.submit();
+    }
+  }
+
+  // Use this method to repost the form,
+  // and set the anchor request.
+  function postFormSetAnchor(anchorValue)
+  {
+    if (checkForm())
+    {
+      if (anchorValue != "")
+        document.editjob.action = document.editjob.action + "#" + anchorValue;
+      document.editjob.submit();
+    }
+  }
+
+  // Use this method to repost the form
+  function postFormNew()
+  {
+    if (checkForm())
+    {
+      document.editjob.submit();
+    }
+  }
+
+  // Deprecated
+  function postForm(schedCount)
+  {
+    if (checkForm())
+    {
+      document.editjob.submit();
+    }
+  }
+
+  function Save()
+  {
+    if (checkForm())
+    {
+      // Can't submit until all required fields have been set.
+      // Some of these don't live on the current tab, so don't set
+      // focus.
+
+      // Check our part of the form, for save
+      if (editjob.description.value == "")
+      {
+        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.JobMustHaveAName")%>");
+        SelectTab("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.Name")%>");
+        document.editjob.description.focus();
+        return;
+      }
+<%
+  for (int j = 0; j < pipelineCheckForSaveMethods.length; j++)
+  {
+%>
+      if (window.<%=pipelineCheckForSaveMethods[j]%>)
+      {
+        if (<%=pipelineCheckForSaveMethods[j]%>() == false)
+          return;
+      }
+<%
+  }
+  for (int j = 0; j < notificationCheckForSaveMethods.length; j++)
+  {
+%>
+      if (window.<%=notificationCheckForSaveMethods[j]%>)
+      {
+        if (<%=notificationCheckForSaveMethods[j]%>() == false)
+          return;
+      }
+<%
+  }
+%>
+      if (window.<%=saveCheckMethod%>)
+      {
+        if (<%=saveCheckMethod%>() == false)
+          return;
+      }
+      document.editjob.op.value="Save";
+      document.editjob.submit();
+    }
+  }
+
+  function Cancel()
+  {
+    document.editjob.op.value="Cancel";
+    document.editjob.submit();
+  }
+
+  function Continue()
+  {
+    document.editjob.op.value="Continue";
+    postFormNew();
+  }
+
+  function InsertPipelineStageTransformation(n)
+  {
+    if (editjob.transformation_connectionname.value == "")
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectATransformationStageConnectionName")%>");
+      editjob.transformation_connectionname.focus();
+      return;
+    }
+    eval("document.editjob.pipeline_"+n+"_op.value = 'InsertTransformation'");
+    postFormSetAnchor("pipeline_"+(n+1)+"_tag");
+  }
+
+  function InsertPipelineStageOutput(n)
+  {
+    if (editjob.output_connectionname.value == "")
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectAnOutputStageConnectionName")%>");
+      editjob.output_connectionname.focus();
+      return;
+    }
+    eval("document.editjob.pipeline_"+n+"_op.value = 'InsertOutput'");
+    postFormSetAnchor("pipeline_"+(n+1)+"_tag");
+  }
+
+  function AppendPipelineStageOutput()
+  {
+    if (editjob.output_connectionname.value == "")
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectAnOutputStageConnectionName")%>");
+      editjob.output_connectionname.focus();
+      return;
+    }
+    document.editjob.output_op.value="Add";
+    postFormSetAnchor("output_tag");
+  }
+
+  function DeletePipelineStage(n)
+  {
+    eval("document.editjob.pipeline_"+n+"_op.value = 'Delete'");
+    if (n == 0)
+      postFormSetAnchor("pipeline_tag");
+    else
+      postFormSetAnchor("pipeline_"+(n-1)+"_tag");
+  }
+
+  function AppendNotification()
+  {
+    if (editjob.notification_connectionname.value == "")
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.SelectANotificationConnectionName")%>");
+      editjob.notification_connectionname.focus();
+      return;
+    }
+    document.editjob.notification_op.value="Add";
+    postFormSetAnchor("notification_tag");
+  }
+
+  function DeleteNotification(n)
+  {
+    eval("document.editjob.notification_"+n+"_op.value = 'Delete'");
+    if (n == 0)
+      postFormSetAnchor("notification_tag");
+    else
+      postFormSetAnchor("notification_"+(n-1)+"_tag");
+  }
+
+  function AddScheduledTime()
+  {
+    if (editjob.duration.value != "" && !isInteger(editjob.duration.value))
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.DurationMustBeAValidInteger")%>");
+      editjob.duration.focus();
+      return;
+    }
+    document.editjob.recordop.value="Add Scheduled Time";
+    postFormSetAnchor("add_schedule");
+  }
+
+  function RemoveSchedule(n)
+  {
+    eval("document.editjob.recordop"+n+".value = 'Remove Schedule'");
+    if (n == 0)
+      postFormSetAnchor("add_schedule");
+    else
+      postFormSetAnchor("remove_schedule_"+(n-1));
+  }
+
+  function checkForm()
+  {
+    if (!checkRecrawl())
+      return false;
+    if (!checkMaxRecrawl())
+      return false;
+    if (!checkRecrawlConsistent())
+      return false;
+    if (!checkReseed())
+      return false;
+    if (!checkExpiration())
+      return false;
+    if (!checkSchedule())
+      return false;
+<%
+  for (int j = 0; j < pipelineCheckMethods.length; j++)
+  {
+%>
+    if (window.<%=pipelineCheckMethods[j]%>)
+    {
+      if (<%=pipelineCheckMethods[j]%>() == false)
+        return false;
+    }
+<%
+  }
+  for (int j = 0; j < notificationCheckMethods.length; j++)
+  {
+%>
+    if (window.<%=notificationCheckMethods[j]%>)
+    {
+      if (<%=notificationCheckMethods[j]%>() == false)
+        return false;
+    }
+<%
+  }
+%>
+    // Check the connector part
+    if (window.<%=checkMethod%>)
+    {
+      if (<%=checkMethod%>() == false)
+        return false;
+    }
+    return true;
+  }
+
+  function checkSchedule()
+  {
+    var i = 0;
+    var schedCount = <%=Integer.toString(scheduleRecords.size())%>;
+    while (i < schedCount)
+    {
+      var propertyname = "duration" + i;
+      if (eval("editjob."+propertyname+".value") != "" && !isInteger(eval("editjob."+propertyname+".value")))
+      {
+        alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.DurationMustBeAValidInteger")%>");
+        eval("editjob."+propertyname+".focus()");
+        return false;
+      }
+      i = i+1;
+    }
+    return true;
+  }
+
+  function checkRecrawl()
+  {
+    if (editjob.recrawlinterval.value != "" && !isInteger(editjob.recrawlinterval.value))
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.RecrawlIntervalMustBeAValidIntegerOrNull")%>");
+      editjob.recrawlinterval.focus();
+      return false;
+    }
+    return true;
+  }
+
+  function checkMaxRecrawl()
+  {
+    if (editjob.maxrecrawlinterval.value != "" && !isInteger(editjob.maxrecrawlinterval.value))
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalMustBeAValidIntegerOrNull")%>");
+      editjob.maxrecrawlinterval.focus();
+      return false;
+    }
+    return true;
+  }
+
+  function checkRecrawlConsistent()
+  {
+    if (editjob.maxrecrawlinterval.value != "" && editjob.recrawlinterval.value != "" && parseInt(editjob.maxrecrawlinterval.value) < parseInt(editjob.recrawlinterval.value))
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.MaxRecrawlIntervalMustBeLargerThanRecrawlInterval")%>");
+      editjob.maxrecrawlinterval.focus();
+      return false;
+    }
+    return true;
+  }
+
+  function checkReseed()
+  {
+    if (editjob.reseedinterval.value != "" && !isInteger(editjob.reseedinterval.value))
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.ReseedIntervalMustBeAValidIntegerOrNull")%>");
+      editjob.reseedinterval.focus();
+      return false;
+    }
+    return true;
+  }
+
+  function checkExpiration()
+  {
+    if (editjob.expirationinterval.value != "" && !isInteger(editjob.expirationinterval.value))
+    {
+      alert("<%=Messages.getBodyJavascriptString(pageContext.getRequest().getLocale(),"editjob.ExpirationIntervalMustBeAValidIntegerOrNull")%>");
+      editjob.expirationinterval.focus();
+      return false;
+    }
+    return true;
+  }
+
+  function isInteger(value)
+  {
+    var anum=/(^\d+$)/;
+    return anum.test(value);
+  }
+
+  function isRegularExpression(value)
+  {
+    try
+    {
+      var foo = "teststring";
                         foo.search(value.replace(/\(\?i\)/,""));
-			return true;
-		}
-		catch (e)
-		{
-			return false;
-		}
-	}
-
-	//-->
-	</script>
-<%
-	if (connection != null)
-	{
-		IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
-		if (repositoryConnector != null)
-		{
-			try
-			{
-				repositoryConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),documentSpecification,0,tabsArray);
-			}
-			finally
-			{
-				repositoryConnectorPool.release(connection,repositoryConnector);
-			}
-		}
-		Integer repositoryConnectionSequenceNumber = new Integer(0);
-		while (sequenceArray.size() < tabsArray.size())
-		{
-			sequenceArray.add(repositoryConnectionSequenceNumber);
-		}
-	}
-%>
-
-<%
-	for (int j = 0; j < pipelineConnectionNames.length; j++)
-	{
-		if (pipelineIsOutputs[j])
-		{
-			IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
-			if (outputConnection != null)
-			{
-				IOutputConnector outputConnector = outputConnectorPool.grab(outputConnection);
-				if (outputConnector != null)
-				{
-					try
-					{
-						outputConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
-					}
-					finally
-					{
-						outputConnectorPool.release(outputConnection,outputConnector);
-					}
-				}
-			}
-		}
-		else
-		{
-			ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
-			if (transformationConnection != null)
-			{
-				ITransformationConnector transformationConnector = transformationConnectorPool.grab(transformationConnection);
-				if (transformationConnector != null)
-				{
-					try
-					{
-						transformationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
-					}
-					finally
-					{
-						transformationConnectorPool.release(transformationConnection,transformationConnector);
-					}
-				}
-			}
-		}
-		Integer connectionSequenceNumber = new Integer(1+j);
-		while (sequenceArray.size() < tabsArray.size())
-		{
-			sequenceArray.add(connectionSequenceNumber);
-		}
-	}
-	
-%>
-
-<%
-	for (int j = 0; j < notificationConnectionNames.length; j++)
-	{
-		INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
-		if (notificationConnection != null)
-		{
-			INotificationConnector notificationConnector = notificationConnectorPool.grab(notificationConnection);
-			if (notificationConnector != null)
-			{
-				try
-				{
-					notificationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),notificationSpecifications[j],1+pipelineConnectionNames.length+j,tabsArray);
-				}
-				finally
-				{
-					notificationConnectorPool.release(notificationConnection,notificationConnector);
-				}
-			}
-		}
-		Integer connectionSequenceNumber = new Integer(1+pipelineConnectionNames.length+j);
-		while (sequenceArray.size() < tabsArray.size())
-		{
-			sequenceArray.add(connectionSequenceNumber);
-		}
-	}
+      return true;
+    }
+    catch (e)
+    {
+      return false;
+    }
+  }
+
+  //-->
+  </script>
+<%
+  if (connection != null)
+  {
+    IRepositoryConnector repositoryConnector = repositoryConnectorPool.grab(connection);
+    if (repositoryConnector != null)
+    {
+      try
+      {
+        repositoryConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),documentSpecification,0,tabsArray);
+      }
+      finally
+      {
+        repositoryConnectorPool.release(connection,repositoryConnector);
+      }
+    }
+    Integer repositoryConnectionSequenceNumber = new Integer(0);
+    while (sequenceArray.size() < tabsArray.size())
+    {
+      sequenceArray.add(repositoryConnectionSequenceNumber);
+    }
+  }
+%>
+
+<%
+  for (int j = 0; j < pipelineConnectionNames.length; j++)
+  {
+    if (pipelineIsOutputs[j])
+    {
+      IOutputConnection outputConnection = outputMgr.load(pipelineConnectionNames[j]);
+      if (outputConnection != null)
+      {
+        IOutputConnector outputConnector = outputConnectorPool.grab(outputConnection);
+        if (outputConnector != null)
+        {
+          try
+          {
+            outputConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
+          }
+          finally
+          {
+            outputConnectorPool.release(outputConnection,outputConnector);
+          }
+        }
+      }
+    }
+    else
+    {
+      ITransformationConnection transformationConnection = transformationMgr.load(pipelineConnectionNames[j]);
+      if (transformationConnection != null)
+      {
+        ITransformationConnector transformationConnector = transformationConnectorPool.grab(transformationConnection);
+        if (transformationConnector != null)
+        {
+          try
+          {
+            transformationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),pipelineSpecifications[j],1+j,tabsArray);
+          }
+          finally
+          {
+            transformationConnectorPool.release(transformationConnection,transformationConnector);
+          }
+        }
+      }
+    }
+    Integer connectionSequenceNumber = new Integer(1+j);
+    while (sequenceArray.size() < tabsArray.size())
+    {
+      sequenceArray.add(connectionSequenceNumber);
+    }
+  }
+
+%>
+
+<%
+  for (int j = 0; j < notificationConnectionNames.length; j++)
+  {
+    INotificationConnection notificationConnection = notificationMgr.load(notificationConnectionNames[j]);
+    if (notificationConnection != null)
+    {
+      INotificationConnector notificationConnector = notificationConnectorPool.grab(notificationConnection);
+      if (notificationConnector != null)
+      {
+        try
+        {
+          notificationConnector.outputSpecificationHeader(new org.apache.manifoldcf.ui.jsp.JspWrapper(out,adminprofile),pageContext.getRequest().getLocale(),notificationSpecifications[j],1+pipelineConnectionNames.length+j,tabsArray);
+        }
+        finally
+        {
+          notificationConnectorPool.release(notificationConnection,notificationConnector);
+        }
+      }
+    }
+    Integer connectionSequenceNumber = new Integer(1+pipelineConnectionNames.length+j);
+    while (sequenceArray.size() < tabsArray.size())
+    {
+      sequenceArray.add(connectionSequenceNumber);
+    }
+  }
 %>
 
 </head>
@@ -754,1168 +754,1168 @@
       <tr><td class="navigation"><jsp:include page="navigation.jsp" flush="true"/></td>
        <td class="darkwindow">
 <%
-	if (connList.length == 0)
-	{
+  if (connList.length == 0)
+  {
+%>
+  <p class="windowtitle"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob")%></p>
+  <table class="displaytable"><tr><td class="message"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoRepositoryConnectionsDefinedCreateOneFirst")%></td></tr></table>
+<%
+  }
+  else if (outputList.length == 0)
+  {
+%>
+  <p class="windowtitle"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob")%></p>
+  <table class="displaytable"><tr><td class="message"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoOutputConnectionsDefinedCreateOneFirst")%></td></tr></table>
+<%
+  }
+  else
+  {
+%>
+  <form class="standardform" name="editjob" action="execute.jsp" method="POST" enctype="multipart/form-data">
+    <input type="hidden" name="op" value="Continue"/>
+    <input type="hidden" name="type" value="job"/>
+    <input type="hidden" name="index" value=""/>
+    <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
+    <input type="hidden" name="sequencenumber" value='<%=((tabSequenceInt==-1)?"":Integer.toString(tabSequenceInt))%>'/>
+<%
+  if (jobID != null)
+  {
+%>
+    <input type="hidden" name="jobid" value='<%=jobID%>'/>
+<%
+  }
+%>
+      <table class="tabtable">
+        <tr class="tabspacerrow">
+    <td class="spacertab" colspan="<%=tabsArray.size()%>"></td>
+    <td class="remaindertab" rowspan="3">
+<%
+  if (description.length() > 0)
+  {
+%>
+        <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditJob")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
+<%
+  }
+  else
+  {
+%>
+              <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob")%></nobr>
+<%
+  }
+%>
+    </td>
+        </tr>
+        <tr class="tabsequencerow">
+<%
+  Integer currentSequenceNumber = null;
+  int startColumn = 0;
+  for (int tabNum = 0; tabNum < tabsArray.size(); tabNum++)
+  {
+    boolean doswitch = false;
+    Integer sequenceNumber = sequenceArray.get(tabNum);
+    if (sequenceNumber == null || currentSequenceNumber == null)
+      doswitch = (sequenceNumber != null || currentSequenceNumber != null);
+    else
+      doswitch = !sequenceNumber.equals(currentSequenceNumber);
+    if (doswitch)
+    {
+      int colspan = tabNum - startColumn;
+      if (colspan > 0)
+      {
+        if (currentSequenceNumber == null)
+        {
+%>
+          <td class="blanksequencetab" colspan="<%=colspan%>"></td>
+<%
+        }
+        else
+        {
+%>
+          <td class="sequencetab" colspan="<%=colspan%>"><%=(currentSequenceNumber.intValue()+1)%>.</td>
+<%
+        }
+      }
+      startColumn = tabNum;
+      currentSequenceNumber = sequenceNumber;
+    }
+  }
+  if (startColumn != tabsArray.size())
+  {
+    int colspan = tabsArray.size() - startColumn;
+    if (currentSequenceNumber == null)
+    {
+%>
+          <td class="blanksequencetab" colspan="<%=colspan%>"></td>
+<%
+    }
+    else
+    {
+%>
+          <td class="sequencetab" colspan="<%=colspan%>"><%=(currentSequenceNumber.intValue()+1)%>.</td>
+<%
+    }
+  }
+  // Final (remainder) cell left out on purpose; filled in above.
+%>
+        </tr>
+        <tr class="tabrow">
+<%
+  for (int tabNum = 0; tabNum < tabsArray.size(); tabNum++)
+  {
+    String tab = tabsArray.get(tabNum);
+    Integer sequenceNumber = sequenceArray.get(tabNum);
+    int sequenceNumberInt = (sequenceNumber == null)?-1:sequenceNumber.intValue();
+    if (tab.equals(tabName) && (tabSequenceInt == -1 || sequenceNumberInt == tabSequenceInt))
+    {
+%>
+          <td class="activetab"><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></nobr></td>
+<%
+    }
+    else
+    {
+%>
+          <td class="passivetab"><nobr><a href="javascript:void(0);" alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.tab")%>' onclick='<%="javascript:SelectSequencedTab(\""+tab+"\",\""+((sequenceNumber==null)?"":sequenceNumber.toString())+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></nobr></td>
+<%
+    }
+  }
+  // Missing remainder tab ON PURPOSE -- comes from rowspan=2 tab above
+%>
+        </tr>
+        <tr class="tabbodyrow">
+    <td class="tabbody" colspan='<%=Integer.toString(tabsArray.size()+1)%>'>
+
+      <input type="hidden" name="schedulerecords" value='<%=Integer.toString(scheduleRecords.size())%>'/>
+<%
+  // The NAME tab
+  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name")) && tabSequenceInt == -1)
+  {
+%>
+      <table class="displaytable">
+      <tr>
+        <td class="separator" colspan="4"><hr/></td>
+      </tr>
+      <tr>
+        <td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NameColon")%></nobr></td><td class="value" colspan="3">
+          <input type="text" size="50" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
+        </td>
+      </tr>
+      </table>
+<%
+  }
+  else
+  {
+%>
+      <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
+<%
+  }
+
+  // Hop Filters tab
+  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters")) && tabSequenceInt == -1)
+  {
+      if (relationshipTypes != null)
+      {
+%>
+      <table class="displaytable">
+      <tr>
+        <td class="separator" colspan="4"><input type="hidden" name="hopfilters" value="true"/><hr/></td>
+      </tr>
+<%
+    int i = 0;
+    while (i < relationshipTypes.length)
+    {
+      String relationshipType = relationshipTypes[i++];
+      String mapField = "";
+      Long mapValue = (Long)hopFilterMap.get(relationshipType);
+      if (mapValue != null)
+        mapField = mapValue.toString();
+%>
+      <tr>
+        <td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MaximumHopCountForType")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(relationshipType)%>'<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.colon")%></nobr></td>
+        <td class="value" colspan="3" >
+          <input name='<%="hopmax_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(relationshipType)%>' type="text" size="5" value='<%=mapField%>'/>
+        </td>
+      </tr>
+<%
+    }
+%>
+      <tr><td class="separator" colspan="4"><hr/></td></tr>
+      <tr>
+        <td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.HopCountModeColon")%></nobr></td>
+        <td class="value" colspan="3">
+          <nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_ACCURATE)%>' <%=((hopcountMode==IJobDescription.HOPCOUNT_ACCURATE)?"checked=\"true\"":"")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.DeleteUnreachableDocuments")%></input></nobr><br/>
+          <nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_NODELETE)%>' <%=((hopcountMode==IJobDescription.HOPCOUNT_NODELETE)?"checked=\"true\"":"")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.KeepUnreachableDocumentsForNow")%></input></nobr><br/>
+          <nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_NEVERDELETE)%>' <%=((hopcountMode==IJobDescription.HOPCOUNT_NEVERDELETE)?"checked=\"true\"":"")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.KeepUnreachableDocumentsForever")%></input></nobr><br/>
+        </td>
+      </tr>
+      </table>
+<%
+      }
+  }
+  else
+  {
+      if (relationshipTypes != null)
+      {
+%>
+  <input type="hidden" name="hopfilters" value="true"/>
+<%
+    int i = 0;
+    while (i < relationshipTypes.length)
+    {
+      String relationshipType = relationshipTypes[i++];
+      String mapField = "";
+      Long mapValue = (Long)hopFilterMap.get(relationshipType);
+      if (mapValue != null)
+        mapField = mapValue.toString();
+%>
+  <input name='<%="hopmax_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(relationshipType)%>' type="hidden" value='<%=mapField%>'/>
+  <input name="hopcountmode" type="hidden" value='<%=Integer.toString(hopcountMode)%>'/>
+<%
+    }
+      }
+  }
+
+  // Connection tab
+  if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection")) && tabSequenceInt == -1)
+  {
+    int rowCounter = 0;
+
+%>
+      <table class="displaytable">
+      <tr><td class="separator" colspan="4"><hr/></td></tr>
+      <tr>
+        <td colspan="1" class="description"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.PipelineColon")%></nobr></td>
+        <td class="boxcell" colspan="3">
+          <table class="formtable">
+            <tr class="formheaderrow">
+              <td class="formcolumnheader">
+                <input name="pipeline_count" type="hidden" value="<%=pipelineConnectionNames.length%>"/>
+              </td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageNumber")%></nobr></td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageType")%></nobr></td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StagePrecedent")%></nobr></td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageDescription")%></nobr></td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageConnectionName")%></nobr></td>
+            </tr>
+            <tr class="<%=((rowCounter++ % 2)==0)?"evenformrow":"oddformrow"%>">
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell">1.</td>
+              <td class="formcolumncell"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Repository")%></td>
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell">
+<%
+    if (connectionName.length() == 0)
+    {
+%>
+                <select name="connectionname" size="1">
+                  <option <%="".equals(connectionName)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoneSelected")%> --</option>
+<%
+      for (IRepositoryConnection conn : connList)
+      {
+%>
+                  <option <%=conn.getName().equals(connectionName)?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
+<%
+      }
+%>
+                </select>
+<%
+    }
+    else
+    {
+%>
+                <input type="hidden" name="connectionname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%>
+<%
+    }
+%>
+              </td>
+            </tr>
+<%
+    // A map of stage number to reference count
+    Map<Integer,Integer> referenceCounts = new HashMap<Integer,Integer>();
+    // A list of precedents to pick from, displayed at the end
+    List<Integer> precedents = new ArrayList<Integer>();
+    // Repository connection is always allowed
+    precedents.add(new Integer(-1));
+    Set<String> alreadyPresent = new HashSet<String>();
+    for (int j = 0; j < pipelineConnectionNames.length; j++)
+    {
+      if (pipelineIsOutputs[j])
+        alreadyPresent.add(pipelineConnectionNames[j]);
+      else
+        precedents.add(new Integer(j));
+      if (pipelinePrerequisites[j] != -1)
+      {
+        Integer thisOne = new Integer(pipelinePrerequisites[j]);
+        Integer x = referenceCounts.get(thisOne);
+        if (x == null)
+          referenceCounts.put(thisOne,new Integer(1));
+        else
+          referenceCounts.put(thisOne,new Integer(x.intValue() + 1));
+      }
+    }
+    boolean anyTransformationButtons = false;
+    for (int j = 0; j < pipelineConnectionNames.length; j++)
+    {
+      String pipelineConnectionName = pipelineConnectionNames[j];
+      String pipelineDescription = pipelineDescriptions[j];
+      if (pipelineDescription == null)
+        pipelineDescription = "";
+      String pipelineType = pipelineIsOutputs[j]?Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Output"):Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Transformation");
+%>
+            <tr class="<%=((rowCounter++ % 2)==0)?"evenformrow":"oddformrow"%>">
+              <td class="formcolumncell">
+                <input name="pipeline_<%=j%>_op" type="hidden" value="Continue"/>
+                <a name="pipeline_<%=j%>_tag"/>
+<%
+      // We don't want to leave orphans around.  If the pipeline stage is an output, we can delete it ONLY if:
+      // -- the precedent is -1, OR
+      // -- the precedent is not -1 BUT more than one stage refers to the precedent
+      if (!pipelineIsOutputs[j] || pipelinePrerequisites[j] == -1 || referenceCounts.get(new Integer(pipelinePrerequisites[j])).intValue() > 1)
+      {
+%>
+                <input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Delete")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Deletepipelinestage")%>' onclick="javascript:DeletePipelineStage(<%=j%>);"/>
+<%
+      }
+      if (transformationList.length > 0)
+      {
+        anyTransformationButtons = true;
+%>
+                <input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.InsertTransformationBefore")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Insertnewtransformationhere")%>' onclick="javascript:InsertPipelineStageTransformation(<%=j%>);"/>
+<%
+      }
+      if (outputList.length != alreadyPresent.size())
+      {
+%>
+                <input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.InsertOutputBefore")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Insertnewoutputhere")%>' onclick="javascript:InsertPipelineStageOutput(<%=j%>);"/>
+<%
+      }
+%>
+              </td>
+              <td class="formcolumncell"><%=(j+2)%>.</td>
+              <td class="formcolumncell"><%=pipelineType%>
+                <input name="pipeline_<%=j%>_isoutput" type="hidden" value='<%=pipelineIsOutputs[j]?"true":"false"%>'/>
+              </td>
+              <td class="formcolumncell"><%=(pipelinePrerequisites[j] + 2)%>.
+                <input name="pipeline_<%=j%>_precedent" type="hidden" value="<%=pipelinePrerequisites[j]%>"/>
+              </td>
+              <td class="formcolumncell">
+                <input name="pipeline_<%=j%>_description" type="text" size="30" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pipelineDescription)%>"/>
+              </td>
+              <td class="formcolumncell">
+                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(pipelineConnectionName)%></nobr>
+                <input name="pipeline_<%=j%>_connectionname" type="hidden" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(pipelineConnectionName)%>"/>
+              </td>
+            </tr>
+<%
+    }
+    if (anyTransformationButtons)
+    {
+%>
+            <tr class="formrow"><td class="formseparator" colspan="4"><hr/></td></tr>
+            <tr class="formrow">
+              <td class="formcolumncell">
+                <a name="transformation_tag"/>
+              </td>
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Transformation")%></td>
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell">
+                <input name="transformation_description" type="text" size="30" value=""/>
+              </td>
+              <td class="formcolumncell">
+                <select name="transformation_connectionname" size="1">
+                  <option selected="selected" value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoneSelected")%> --</option>
+<%
+      for (ITransformationConnection conn : transformationList)
+      {
+%>
+                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
+<%
+      }
+%>
+                </select>
+              </td>
+            </tr>
+<%
+    }
+    if (outputList.length != alreadyPresent.size())
+    {
+%>
+            <tr class="formrow"><td class="formseparator" colspan="4"><hr/></td></tr>
+            <tr class="formrow">
+              <td class="formcolumncell">
+                <a name="output_tag"/>
+                <input type="button" value='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddOutput")%>' alt='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddAnOutput")%>' onclick="javascript:AppendPipelineStageOutput();"/>
+                <input name="output_op" type="hidden" value="Continue"/>
+              </td>
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Output")%></td>
+              <td class="formcolumncell">
+                <select name="output_precedent" size="1">
+<%
+      for (Integer pre : precedents)
+      {
+%>
+                  <option value="<%=pre%>"><%=(pre.intValue()+2)%></option>
+<%
+      }
+%>
+                </select>
+              </td>
+              <td class="formcolumncell">
+                <input name="output_description" type="text" size="30" value=""/>
+              </td>
+              <td class="formcolumncell">
+                <select name="output_connectionname" size="1">
+                  <option selected="selected" value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoneSelected")%> --</option>
+<%
+      for (IOutputConnection conn : outputList)
+      {
+        if (!alreadyPresent.contains(conn.getName()))
+        {
+%>
+                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
+<%
+        }
+      }
+%>
+                </select>
+              </td>
+            </tr>
+<%
+    }
+%>
+          </table>
+        </td>
+      </tr>
+
+<%
+    alreadyPresent = new HashSet<String>();
+    for (int j = 0; j < notificationConnectionNames.length; j++)
+    {
+      alreadyPresent.add(notificationConnectionNames[j]);
+    }
+    if (notificationList.length > 0)
+    {
+%>
+      <tr>
+        <td colspan="1" class="description"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NotificationsColon")%></nobr></td>
+        <td class="boxcell" colspan="3">
+          <table class="formtable">
+            <tr class="formheaderrow">
+              <td class="formcolumnheader">
+                <input name="notification_count" type="hidden" value="<%=notificationConnectionNames.length%>"/>
+              </td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageNumber")%></nobr></td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NotificationDescription")%></nobr></td>
+              <td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NotificationConnectionName")%></nobr></td>
+            </tr>
+<%
+      rowCounter = 0;
+      for (int j = 0; j < notificationConnectionNames.length; j++)
+      {
+        String notificationConnectionName = notificationConnectionNames[j];
+        String notificationDescription = notificationDescriptions[j];
+        if (notificationDescription == null)
+          notificationDescription = "";
+%>
+            <tr class="<%=((rowCounter++ % 2)==0)?"evenformrow":"oddformrow"%>">
+              <td class="formcolumncell">
+                <input name="notification_<%=j%>_op" type="hidden" value="Continue"/>
+                <a name="notification_<%=j%>_tag"/>
+                <input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Delete")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Deletenotification")%>' onclick="javascript:DeleteNotification(<%=j%>);"/>
+              </td>
+              <td class="formcolumncell"><%=(j+pipelineConnectionNames.length+2)%>.</td>
+              <td class="formcolumncell">
+                <input name="notification_<%=j%>_description" type="text" size="30" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(notificationDescription)%>"/>
+              </td>
+              <td class="formcolumncell">
+                <nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(notificationConnectionName)%></nobr>
+                <input name="notification_<%=j%>_connectionname" type="hidden" value="<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(notificationConnectionName)%>"/>
+              </td>
+            </tr>
+<%
+      }
+      if (notificationList.length != alreadyPresent.size())
+      {
+%>
+            <tr class="formrow"><td class="formseparator" colspan="4"><hr/></td></tr>
+            <tr class="formrow">
+              <td class="formcolumncell">
+                <a name="notification_tag"/>
+                <input type="button" value='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddNotification")%>' alt='<%=Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.AddANotification")%>' onclick="javascript:AppendNotification();"/>
+                <input name="notification_op" type="hidden" value="Continue"/>
+              </td>
+              <td class="formcolumncell"></td>
+              <td class="formcolumncell">
+                <input name="notification_description" type="text" size="30" value=""/>
+              </td>
+              <td class="formcolumncell">
+                <select name="notification_connectionname" size="1">
+                  <option selected="selected" value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoneSelected")%> --</option>
+<%
+        for (INotificationConnection conn : notificationList)
+        {
+          if (!alreadyPresent.contains(conn.getName()))
+          {
+%>
+                  <option value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
+<%
+          }
+        }
+%>
+                </select>
+              </td>
+            </tr>
+<%
+      }
+%>
+          </table>
+        </td>
+      </tr>
+<%
+    }
+%>
+      <tr><td class="separator" colspan="4"><hr/></td></tr>
+
+      <tr>
+        <td class="description"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.PriorityColon")%></nobr></td>
+        <td class="value">
+          <select name="priority" size="1">
+            <option value="1" <%=(priority==1)?"selected=\"selected\"":""%>>1 <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Highest")%></option>
+            <option value="2" <%=(priority==2)?"selected=\"selected\"":""%>>2</option>
+            <option value="3" <%=(priority==3)?"selected=\"selected\"":""%>>3</option>
+            <option value="4" <%=(priority==4)?"selected=\"selected\"":""%>>4</option>
+            <option value="5" <%=(priority==5)?"selected=\"selected\"":""%>>5</option>
+            <option value="6" <%=(priority==6)?"selected=\"selected\"":""%>>6</option>
+            <option value="7" <%=(priority==7)?"selected=\"selected\"":""%>>7</option>
+            <option value="8" <%=(priority==8)?"selected=\"selected\"":""%>>8</option>
+            <option value="9" <%=(priority==9)?"selected=\"selected\"":""%>>9</option>
+            <option value="10" <%=(priority==10)?"selected=\"selected\"":""%>>10 <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Lowest")%></option>
+          </select>
+        </td>
+        <td class="description"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StartMethodColon")%></nobr></td>
+        <td class="value">
+          <select name="startmethod" size="1">
+            <option value='<%=IJobDescription.START_WINDOWBEGIN%>' <%=(startMethod==IJobDescription.START_WINDOWBEGIN)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StartWhenScheduleWindowStarts")%></option>
+            <option value='<%=IJobDescription.START_WINDOWINSIDE%>' <%=(startMethod==IJobDescription.START_WINDOWINSIDE)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StartEvenInsideAScheduleWindow")%></option>
+            <option value='<%=IJobDescription.START_DISABLE%>' <%=(startMethod==IJobDescription.START_DISABLE)?"selected=\"selected\"":""%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.DontAutomaticallyStartThisJob")%></option>
+          </select>
+        </td>
+      </tr>
+      </table>
+<%
+  }
+  else
+  {
 %>
-	<p class="windowtitle"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob")%></p>
-	<table class="displaytable"><tr><td class="message"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoRepositoryConnectionsDefinedCreateOneFirst")%></td></tr></table>
+      <input type="hidden" name="connectionname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/>
+      <input type="hidden" name="pipeline_count" value="<%=pipelineConnectionNames.length%>"/>
+      <input type="hidden" name="notification_count" value="<%=notificationConnectionNames.length%>"/>
 <%
-	}
-	else if (outputList.length == 0)
-	{
-%>
-	<p class="windowtitle"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob")%></p>
-	<table class="displaytable"><tr><td class="message"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoOutputConnectionsDefinedCreateOneFirst")%></td></tr></table>
-<%
-	}
-	else
-	{
-%>
-	<form class="standardform" name="editjob" action="execute.jsp" method="POST" enctype="multipart/form-data">
-	  <input type="hidden" name="op" value="Continue"/>
-	  <input type="hidden" name="type" value="job"/>
-	  <input type="hidden" name="index" value=""/>
-	  <input type="hidden" name="tabname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tabName)%>'/>
-	  <input type="hidden" name="sequencenumber" value='<%=((tabSequenceInt==-1)?"":Integer.toString(tabSequenceInt))%>'/>
-<%
-	if (jobID != null)
-	{
-%>
-	  <input type="hidden" name="jobid" value='<%=jobID%>'/>
-<%
-	}
-%>
-	    <table class="tabtable">
-	      <tr class="tabspacerrow">
-		<td class="spacertab" colspan="<%=tabsArray.size()%>"></td>
-		<td class="remaindertab" rowspan="3">
-<%
-	if (description.length() > 0)
-	{
-%>
-			  <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditJob")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)%>'</nobr>
-<%
-	}
-	else
-	{
-%>
-		          <nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.EditaJob")%></nobr>
-<%
-	}
-%>
-		</td>
-	      </tr>
-	      <tr class="tabsequencerow">
-<%
-	Integer currentSequenceNumber = null;
-	int startColumn = 0;
-	for (int tabNum = 0; tabNum < tabsArray.size(); tabNum++)
-	{
-		boolean doswitch = false;
-		Integer sequenceNumber = sequenceArray.get(tabNum);
-		if (sequenceNumber == null || currentSequenceNumber == null)
-			doswitch = (sequenceNumber != null || currentSequenceNumber != null);
-		else
-			doswitch = !sequenceNumber.equals(currentSequenceNumber);
-		if (doswitch)
-		{
-			int colspan = tabNum - startColumn;
-			if (colspan > 0)
-			{
-				if (currentSequenceNumber == null)
-				{
-%>
-		      <td class="blanksequencetab" colspan="<%=colspan%>"></td>
-<%
-				}
-				else
-				{
-%>
-		      <td class="sequencetab" colspan="<%=colspan%>"><%=(currentSequenceNumber.intValue()+1)%>.</td>
-<%
-				}
-			}
-			startColumn = tabNum;
-			currentSequenceNumber = sequenceNumber;
-		}
-	}
-	if (startColumn != tabsArray.size())
-	{
-		int colspan = tabsArray.size() - startColumn;
-		if (currentSequenceNumber == null)
-		{
-%>
-		      <td class="blanksequencetab" colspan="<%=colspan%>"></td>
-<%
-		}
-		else
-		{
-%>
-		      <td class="sequencetab" colspan="<%=colspan%>"><%=(currentSequenceNumber.intValue()+1)%>.</td>
-<%
-		}
-	}
-	// Final (remainder) cell left out on purpose; filled in above.
-%>
-	      </tr>
-	      <tr class="tabrow">
-<%
-	for (int tabNum = 0; tabNum < tabsArray.size(); tabNum++)
-	{
-		String tab = tabsArray.get(tabNum);
-		Integer sequenceNumber = sequenceArray.get(tabNum);
-		int sequenceNumberInt = (sequenceNumber == null)?-1:sequenceNumber.intValue();
-		if (tab.equals(tabName) && (tabSequenceInt == -1 || sequenceNumberInt == tabSequenceInt))
-		{
-%>
-		      <td class="activetab"><nobr><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></nobr></td>
-<%
-		}
-		else
-		{
-%>
-		      <td class="passivetab"><nobr><a href="javascript:void(0);" alt='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(tab)+" "+Messages.getAttributeString(pageContext.getRequest().getLocale(),"editjob.tab")%>' onclick='<%="javascript:SelectSequencedTab(\""+tab+"\",\""+((sequenceNumber==null)?"":sequenceNumber.toString())+"\");return false;"%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(tab)%></a></nobr></td>
-<%
-		}
-	}
-	// Missing remainder tab ON PURPOSE -- comes from rowspan=2 tab above
-%>
-	      </tr>
-	      <tr class="tabbodyrow">
-		<td class="tabbody" colspan='<%=Integer.toString(tabsArray.size()+1)%>'>
-
-		  <input type="hidden" name="schedulerecords" value='<%=Integer.toString(scheduleRecords.size())%>'/>
-<%
-	// The NAME tab
-	if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Name")) && tabSequenceInt == -1)
-	{
-%>
-		  <table class="displaytable">
-			<tr>
-				<td class="separator" colspan="4"><hr/></td>
-			</tr>
-			<tr>
-				<td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NameColon")%></nobr></td><td class="value" colspan="3">
-					<input type="text" size="50" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-				</td>
-			</tr>
-		  </table>
-<%
-	}
-	else
-	{
-%>
-		  <input type="hidden" name="description" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(description)%>'/>
-<%
-	}
-
-	// Hop Filters tab
-	if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.HopFilters")) && tabSequenceInt == -1)
-	{
-	    if (relationshipTypes != null)
-	    {
-%>
-		  <table class="displaytable">
-			<tr>
-				<td class="separator" colspan="4"><input type="hidden" name="hopfilters" value="true"/><hr/></td>
-			</tr>
-<%
-		int i = 0;
-		while (i < relationshipTypes.length)
-		{
-			String relationshipType = relationshipTypes[i++];
-			String mapField = "";
-			Long mapValue = (Long)hopFilterMap.get(relationshipType);
-			if (mapValue != null)
-				mapField = mapValue.toString();
-%>
-			<tr>
-				<td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.MaximumHopCountForType")%> '<%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(relationshipType)%>'<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.colon")%></nobr></td>
-				<td class="value" colspan="3" >
-					<input name='<%="hopmax_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(relationshipType)%>' type="text" size="5" value='<%=mapField%>'/>
-				</td>
-			</tr>
-<%
-		}
-%>
-			<tr><td class="separator" colspan="4"><hr/></td></tr>
-			<tr>
-				<td class="description" colspan="1"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.HopCountModeColon")%></nobr></td>
-				<td class="value" colspan="3">
-					<nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_ACCURATE)%>' <%=((hopcountMode==IJobDescription.HOPCOUNT_ACCURATE)?"checked=\"true\"":"")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.DeleteUnreachableDocuments")%></input></nobr><br/>
-					<nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_NODELETE)%>' <%=((hopcountMode==IJobDescription.HOPCOUNT_NODELETE)?"checked=\"true\"":"")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.KeepUnreachableDocumentsForNow")%></input></nobr><br/>
-					<nobr><input type="radio" name="hopcountmode" value='<%=Integer.toString(IJobDescription.HOPCOUNT_NEVERDELETE)%>' <%=((hopcountMode==IJobDescription.HOPCOUNT_NEVERDELETE)?"checked=\"true\"":"")%>><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.KeepUnreachableDocumentsForever")%></input></nobr><br/>
-				</td>
-			</tr>
-		  </table>
-<%
-	    }
-	}
-	else
-	{
-	    if (relationshipTypes != null)
-	    {
-%>
-	<input type="hidden" name="hopfilters" value="true"/>
-<%
-		int i = 0;
-		while (i < relationshipTypes.length)
-		{
-			String relationshipType = relationshipTypes[i++];
-			String mapField = "";
-			Long mapValue = (Long)hopFilterMap.get(relationshipType);
-			if (mapValue != null)
-				mapField = mapValue.toString();
-%>
-	<input name='<%="hopmax_"+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(relationshipType)%>' type="hidden" value='<%=mapField%>'/>
-	<input name="hopcountmode" type="hidden" value='<%=Integer.toString(hopcountMode)%>'/>
-<%
-		}
-	    }
-	}
-
-	// Connection tab
-	if (tabName.equals(Messages.getString(pageContext.getRequest().getLocale(),"editjob.Connection")) && tabSequenceInt == -1)
-	{
-		int rowCounter = 0;
-
-%>
-		  <table class="displaytable">
-			<tr><td class="separator" colspan="4"><hr/></td></tr>
-			<tr>
-				<td colspan="1" class="description"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.PipelineColon")%></nobr></td>
-				<td class="boxcell" colspan="3">
-					<table class="formtable">
-						<tr class="formheaderrow">
-							<td class="formcolumnheader">
-								<input name="pipeline_count" type="hidden" value="<%=pipelineConnectionNames.length%>"/>
-							</td>
-							<td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageNumber")%></nobr></td>
-							<td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageType")%></nobr></td>
-							<td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StagePrecedent")%></nobr></td>
-							<td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageDescription")%></nobr></td>
-							<td class="formcolumnheader"><nobr><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.StageConnectionName")%></nobr></td>
-						</tr>
-						<tr class="<%=((rowCounter++ % 2)==0)?"evenformrow":"oddformrow"%>">
-							<td class="formcolumncell"></td>
-							<td class="formcolumncell">1.</td>
-							<td class="formcolumncell"><%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Repository")%></td>
-							<td class="formcolumncell"></td>
-							<td class="formcolumncell"></td>
-							<td class="formcolumncell">
-<%
-		if (connectionName.length() == 0)
-		{
-%>
-								<select name="connectionname" size="1">
-									<option <%="".equals(connectionName)?"selected=\"selected\"":""%> value="">-- <%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.NoneSelected")%> --</option>
-<%
-			for (IRepositoryConnection conn : connList)
-			{
-%>
-									<option <%=conn.getName().equals(connectionName)?"selected=\"selected\"":""%> value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(conn.getName())%>'><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(conn.getName())%></option>
-<%
-			}
-%>
-								</select>
-<%
-		}
-		else
-		{
-%>
-								<input type="hidden" name="connectionname" value='<%=org.apache.manifoldcf.ui.util.Encoder.attributeEscape(connectionName)%>'/><%=org.apache.manifoldcf.ui.util.Encoder.bodyEscape(connectionName)%>
-<%
-		}
-%>
-							</td>
-						</tr>
-<%
-		// A map of stage number to reference count
-		Map<Integer,Integer> referenceCounts = new HashMap<Integer,Integer>();
-		// A list of precedents to pick from, displayed at the end
-		List<Integer> precedents = new ArrayList<Integer>();
-		// Repository connection is always allowed
-		precedents.add(new Integer(-1));
-		Set<String> alreadyPresent = new HashSet<String>();
-		for (int j = 0; j < pipelineConnectionNames.length; j++)
-		{
-			if (pipelineIsOutputs[j])
-				alreadyPresent.add(pipelineConnectionNames[j]);
-			else
-				precedents.add(new Integer(j));
-			if (pipelinePrerequisites[j] != -1)
-			{
-				Integer thisOne = new Integer(pipelinePrerequisites[j]);
-				Integer x = referenceCounts.get(thisOne);
-				if (x == null)
-					referenceCounts.put(thisOne,new Integer(1));
-				else
-					referenceCounts.put(thisOne,new Integer(x.intValue() + 1));
-			}
-		}
-		boolean anyTransformationButtons = false;
-		for (int j = 0; j < pipelineConnectionNames.length; j++)
-		{
-			String pipelineConnectionName = pipelineConnectionNames[j];
-			String pipelineDescription = pipelineDescriptions[j];
-			if (pipelineDescription == null)
-				pipelineDescription = "";
-			String pipelineType = pipelineIsOutputs[j]?Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Output"):Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Transformation");
-%>
-						<tr class="<%=((rowCounter++ % 2)==0)?"evenformrow":"oddformrow"%>">
-							<td class="formcolumncell">
-								<input name="pipeline_<%=j%>_op" type="hidden" value="Continue"/>
-								<a name="pipeline_<%=j%>_tag"/>
-<%
-			// We don't want to leave orphans around.  If the pipeline stage is an output, we can delete it ONLY if:
-			// -- the precedent is -1, OR
-			// -- the precedent is not -1 BUT more than one stage refers to the precedent
-			if (!pipelineIsOutputs[j] || pipelinePrerequisites[j] == -1 || referenceCounts.get(new Integer(pipelinePrerequisites[j])).intValue() > 1)
-			{
-%>
-								<input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Delete")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Deletepipelinestage")%>' onclick="javascript:DeletePipelineStage(<%=j%>);"/>
-<%
-			}
-			if (transformationList.length > 0)
-			{
-				anyTransformationButtons = true;
-%>
-								<input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.InsertTransformationBefore")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Insertnewtransformationhere")%>' onclick="javascript:InsertPipelineStageTransformation(<%=j%>);"/>
-<%
-			}
-			if (outputList.length != alreadyPresent.size())
-			{
-%>
-								<input type="button" value="<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.InsertOutputBefore")%>" alt='<%=Messages.getBodyString(pageContext.getRequest().getLocale(),"editjob.Insertnewoutputhere")%>' onclick="javascript:InsertPipelineStageOutput(<%=j%>);"/>
-<%
-			}
-%>
-							</td>
-							<td class="formcolumncell"><%=(j+2)%>.</td>
-							<td class="formcolumncell"><%=pipelineType%>
-								<input name="pipeline_<%=j%>_isoutput" type="hidden" value='<%=pipelineIsOutputs[j]?"true":"false"%>'/>
-							</td>
-							<td class="formcolumncell"><%=(pipelinePrerequisites[j] + 2)%>.

[... 1436 lines stripped ...]