<%
/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
%>
<%@ page contentType="text/html; charset=UTF-8" import="org.eclipse.wst.ws.internal.explorer.platform.uddi.perspective.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.uddi.datamodel.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.uddi.constants.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.uddi.actions.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.perspective.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.constants.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.datamodel.*,
                                                        org.eclipse.wst.ws.internal.explorer.platform.util.*,
                                                        org.uddi4j.datatype.business.*,
                                                        org.uddi4j.datatype.service.*,
                                                        java.util.*" %>

<jsp:useBean id="controller" class="org.eclipse.wst.ws.internal.explorer.platform.perspective.Controller" scope="session"/>
<jsp:useBean id="sectionHeaderInfo" class="org.eclipse.wst.ws.internal.explorer.platform.perspective.SectionHeaderInfo" scope="request"/>
<%
   UDDIPerspective uddiPerspective = controller.getUDDIPerspective();
   NodeManager navigatorManager = uddiPerspective.getNavigatorManager();
   UDDIMainNode uddiMainNode = (UDDIMainNode)navigatorManager.getRootNode();
   Node selectedNode = navigatorManager.getSelectedNode();
   FormTool formTool = (FormTool)(selectedNode.getCurrentToolManager().getSelectedTool());
   RegistryNode regNode = uddiMainNode.getRegistryNode(selectedNode);
   RegistryElement regElement = (RegistryElement)regNode.getTreeElement();
   BusinessElement busElement = (BusinessElement)selectedNode.getTreeElement();
%>
<jsp:useBean id="subQueryKeyProperty" class="org.eclipse.wst.ws.internal.explorer.platform.uddi.perspective.SubQueryKeyProperty" scope="request">
<%
   String sk = (String)formTool.getProperty(UDDIActionInputs.SUBQUERY_KEY);
   subQueryKeyProperty.setSubQueryKey(sk);
%>
</jsp:useBean>
<html>
<head>
  <title><%=uddiPerspective.getMessage("FORM_TITLE_MANAGE_REFERENCED_SERVICES")%></title>
  <link rel="stylesheet" type="text/css" href="<%=response.encodeURL(controller.getPathWithContext("css/windows.css"))%>">
<script language="javascript" src="<%=response.encodeURL(controller.getPathWithContext("scripts/browserdetect.js"))%>">
</script>
<jsp:include page="/uddi/scripts/results.jsp" flush="true"/>
<script language="javascript">
  function setDefaults()
  {
<%
   if (!regElement.isLoggedIn())
   {
     String publishURL = (String)formTool.getProperty(UDDIActionInputs.QUERY_INPUT_ADVANCED_PUBLISH_URL);
     String userId = (String)formTool.getProperty(UDDIActionInputs.QUERY_INPUT_ADVANCED_USERID);
     String password = (String)formTool.getProperty(UDDIActionInputs.QUERY_INPUT_ADVANCED_PASSWORD);
%>
    document.forms[0].<%=UDDIActionInputs.QUERY_INPUT_ADVANCED_PUBLISH_URL%>.value = "<%=HTMLUtils.JSMangle(publishURL)%>";
    document.forms[0].<%=UDDIActionInputs.QUERY_INPUT_ADVANCED_USERID%>.value = "<%=HTMLUtils.JSMangle(userId)%>";
    document.forms[0].<%=UDDIActionInputs.QUERY_INPUT_ADVANCED_PASSWORD%>.value = "<%=HTMLUtils.JSMangle(password)%>";
    document.getElementById("manageReferencedServicesAuthentication").style.display = "";
<%
   }
   String subQueryKey = subQueryKeyProperty.getSubQueryKey();
   FormToolPropertiesInterface formToolPI = ((MultipleFormToolPropertiesInterface)formTool).getFormToolProperties(subQueryKey);
   Vector referencedServices = (Vector)formToolPI.getProperty(UDDIActionInputs.QUERY_INPUT_REFERENCED_SERVICES);
   if (referencedServices == null)
   {
     referencedServices = new Vector();
     BusinessEntity businessEntity = busElement.getBusinessEntity();
     String businessKey = businessEntity.getBusinessKey();
     BusinessServices businessSvcs = businessEntity.getBusinessServices();
     if (businessSvcs != null)
     {
       Vector businessSvcVector = businessSvcs.getBusinessServiceVector();
       for (int i=0;i<businessSvcVector.size();i++)
       {
         BusinessService busService = (BusinessService)businessSvcVector.elementAt(i);
         if (!busService.getBusinessKey().equals(businessKey))
         {
           ListElement listElement = new ListElement(busService);
           referencedServices.addElement(listElement);
         }
       }
     }
     formToolPI.setProperty(UDDIActionInputs.QUERY_INPUT_REFERENCED_SERVICES,referencedServices);
   }

   for (int i=0;i<referencedServices.size();i++)
   {
     ListElement listElement = (ListElement)referencedServices.elementAt(i);
     int targetNodeId = listElement.getTargetNodeId();
     int targetToolId = listElement.getTargetToolId();
     int targetViewId = listElement.getTargetViewId();
     String url = SelectSubQueryItemAction.getActionLink(targetNodeId,targetToolId,targetViewId,subQueryKey,UDDIActionInputs.QUERY_INPUT_REFERENCED_SERVICES,i,UDDIActionInputs.QUERY_ITEM_SERVICES,false);
     BusinessService bs = (BusinessService)listElement.getObject();
     String name = bs.getDefaultNameString();
     String description = bs.getDefaultDescriptionString();
%>
    addResultRow("manageReferencedServicesReferences",<%=targetNodeId%>,"<%=response.encodeURL(controller.getPathWithContext(url))%>","<%=HTMLUtils.JSMangle(name)%>","<%=HTMLUtils.JSMangle(description)%>");
<%
   }

   Vector services = (Vector)formToolPI.getProperty(UDDIActionInputs.QUERY_INPUT_SERVICES);
   if (services != null)
   {
     for (int i=0;i<services.size();i++)
     {
       ListElement listElement = (ListElement)services.elementAt(i);
       int targetNodeId = listElement.getTargetNodeId();
       int targetToolId = listElement.getTargetToolId();
       int targetViewId = listElement.getTargetViewId();
       String url = SelectSubQueryItemAction.getActionLink(targetNodeId,targetToolId,targetViewId,subQueryKey,UDDIActionInputs.QUERY_INPUT_SERVICES,i,UDDIActionInputs.QUERY_ITEM_SERVICES,false);
       BusinessService bs = (BusinessService)listElement.getObject();
       String name = bs.getDefaultNameString();
       String description = bs.getDefaultDescriptionString();
%>
    addResultRow("manageReferencedServicesServices",<%=targetNodeId%>,"<%=response.encodeURL(controller.getPathWithContext(url))%>","<%=HTMLUtils.JSMangle(name)%>","<%=HTMLUtils.JSMangle(description)%>");
<%
     }
   }
%>
  }

  function processReferenceTable(tableContainerId,inputName,form)
  {
    var table = getTable(tableContainerId);
    for (var i=numberOfHeaderRows;i<table.rows.length;i++)
    {
      var inputs = table.rows[i].getElementsByTagName("input");
      form.appendChild(createHiddenElement(inputName,inputs.item(0).checked));
    }
  }

  function processForm(form)
  {
    if (handleSubmit(form))
    {
      processReferenceTable("manageReferencedServicesReferences","<%=UDDIActionInputs.REFERENCED_SERVICE_SELECT_STATE%>",form);
      processResultTable("manageReferencedServicesServices","<%=UDDIActionInputs.NODEID_SERVICE%>",form,false);
      form.submit();
    }
  }

  function processAddServices(form)
  {
    var table = getTable("manageReferencedServicesServices");
    if (table.rows.length == numberOfHeaderRows)
      alert("<%=HTMLUtils.JSMangle(uddiPerspective.getMessage("MSG_ERROR_NO_SERVICES"))%>");
    else
    {
      form.<%=UDDIActionInputs.MANAGE_REFERENCED_SERVICES_OPERATION%>.value = "<%=UDDIActionInputs.MANAGE_REFERENCED_SERVICES_OPERATION_ADD%>";
      processForm(form);
    }
  }

  function processRemoveReferences(form)
  {
    var numberOfSelections = getNumberOfSelections("manageReferencedServicesReferences");
    if (getNumberOfSelections("manageReferencedServicesReferences") == 0)
      alert("<%=HTMLUtils.JSMangle(uddiPerspective.getMessage("MSG_ERROR_NO_REFERENCE_SELECTED"))%>");
    else
    {
      form.<%=UDDIActionInputs.MANAGE_REFERENCED_SERVICES_OPERATION%>.value = "<%=UDDIActionInputs.MANAGE_REFERENCED_SERVICES_OPERATION_REMOVE%>";
      processForm(form);
    }
  }
</script>
</head>
<body class="contentbodymargin">
  <div id="contentborder">
    <div id="manageReferencedServices">
<%
   String titleImagePath = "uddi/images/referenced_services_highlighted.gif";
   String title = uddiPerspective.getMessage("ALT_MANAGE_REFERENCED_SERVICES");
%>
<%@ include file="/forms/formheader.inc" %>
      <form action="<%=response.encodeURL(controller.getPathWithContext("uddi/actions/ManageReferencedServicesActionJSP.jsp"))%>" method="post" target="<%=FrameNames.PERSPECTIVE_WORKAREA%>" enctype="multipart/form-data" style="margin-top:0;">
        <input type="hidden" name="<%=UDDIActionInputs.SUBQUERY_KEY%>">
        <input type="hidden" name="<%=UDDIActionInputs.SUBQUERY_GET%>">
        <input type="hidden" name="<%=UDDIActionInputs.NEW_SUBQUERY_INITIATED%>">
        <input type="hidden" name="<%=UDDIActionInputs.NEW_SUBQUERY_QUERY_ITEM%>">
        <input type="hidden" name="<%=UDDIActionInputs.MANAGE_REFERENCED_SERVICES_OPERATION%>">
        <table width="90%" border=0 cellpadding=3 cellspacing=0>
          <tr>
            <td class="labels">
              <%=uddiPerspective.getMessage("FORM_LABEL_MANAGE_REFERENCED_SERVICES_DESC")%>
            </td>
          </tr>
        </table>
<%
   String[] projectionsSpecificInfo = {"FORM_LABEL_REFERENCED_SERVICES",Boolean.FALSE.toString(),String.valueOf(UDDIActionInputs.QUERY_ITEM_SERVICES),"manageReferencedServices",UDDIActionInputs.QUERY_INPUT_REFERENCED_SERVICES};
   sectionHeaderInfo.clear();
   sectionHeaderInfo.setContainerId("manageReferencedServicesReferences");
   sectionHeaderInfo.setOtherProperties(projectionsSpecificInfo);
   sectionHeaderInfo.enableDynamic(false);
%>
<jsp:include page="/uddi/forms/uddiObjects_table.jsp" flush="true"/>
<%
   String[] servicesSpecificInfo = {"FORM_OPTION_SERVICES",Boolean.FALSE.toString(),String.valueOf(UDDIActionInputs.QUERY_ITEM_SERVICES),"manageReferencedServices",UDDIActionInputs.QUERY_INPUT_SERVICES};
   sectionHeaderInfo.clear();
   sectionHeaderInfo.setContainerId("manageReferencedServicesServices");
   sectionHeaderInfo.setOtherProperties(servicesSpecificInfo);
%>
<jsp:include page="/uddi/forms/uddiObjects_table.jsp" flush="true"/>
<%
   sectionHeaderInfo.clear();
   sectionHeaderInfo.setContainerId("manageReferencedServicesAuthentication");
%>
<jsp:include page="/uddi/forms/authentication_table.jsp" flush="true"/>
        <table border=0 cellpadding=2 cellspacing=0>
          <tr>
            <td height=30 valign="bottom" align="left" nowrap>
              <input type="button" value="<%=uddiPerspective.getMessage("FORM_BUTTON_ADD_SERVICES")%>" onClick="processAddServices(this.form)" class="button">
            </td>
            <td height=30 valign="bottom" align="left" nowrap>
              <input type="button" value="<%=uddiPerspective.getMessage("FORM_BUTTON_REMOVE_REFERENCES")%>" onClick="processRemoveReferences(this.form)" class="button">
            </td>
            <td nowrap width="90%">&nbsp;</td>
          </tr>
        </table>
      </form>
    </div>
  </div>
<script language="javascript">
  setDefaults();
</script>
</body>
</html>
