<html>
<!--
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.    
 -->
<head>
<title>Apache Tuscany Domain</TITLE>

    <script type="text/javascript" src="../SCADomain/scaDomain.js"></script>

    <script language="JavaScript">
    
       domainManager = new JSONRpcClient("../DomainManagerComponent/DomainManagerJson");

       function getNodeInfo() {
          domainManager.DomainManagerService.getNodeInfo(handleGetNodeInfo);
       }
       
       function handleGetNodeInfo(result) {
       
          var text = ""
          
          for (var i in result.list){
              var node = result.list[i];
              
              text = text + "<table>";
              text = text + "<TR CLASS='source_1' >";
              text = text + "  <TD>";
              text = text + "    <IMG SRC='node.png'/>&nbsp;&nbsp;" + node.domainUri;
              text = text + "  </TD>";
              
              var noProtocol = node.nodeManagerUrl.substring(7);
              var colonPos = noProtocol.indexOf(':')
              var nodeManagerWebUrl = noProtocol.substring(0, colonPos + 6);
              nodeManagerWebUrl = "http://" + nodeManagerWebUrl + "node/index.html";
              
              text = text + "  <TD CLASS='clickable link' ONCLICK=\"showNode('" + nodeManagerWebUrl + "')\">" + node.nodeUri + "</TD>";
              text = text + "</TR>";               
          }

          document.getElementById('domainInfo').innerHTML=text;
       }
       
        function showNode(url)
        {
            document.getElementById("nodePage").innerHTML="<IFRAME CLASS='alert_data' SRC='"+url+"'/>";
            window.location="#data";
            return;    
        }       

    </script>

    <link rel="stylesheet" type="text/css" href="style.css" />
</head>

<body onload="getNodeInfo()">

<!--script type="text/javascript">
    
        // The proxy for the alert and alertsources services running in Tuscany
        var alertsService       = new dojo.rpc.JsonService("AlertsServiceJSONRPC?smd");
        var alertSourcesService = new dojo.rpc.JsonService("AlertsSourcesServiceJSONRPC?smd");

        // If you want to put an HTTP sniffer in the way to look at the JSONROPC packets you'll
        // need to edit the target address of the service in the smd. The only way to do this easily
        // is to read an smd from disc rather than generate one. There are two smds provided for this
	    //var alertsService       = new dojo.rpc.JsonService("service.smd");
        //var alertSourcesService = new dojo.rpc.JsonService("sources.smd");

        // The global list of alerts sources
        var alertSourceList = null;

        // The global list of alerts 
        var alertList       = null;

        // the constructor for entries on the alert source list
        function alertSourceType(name,id,address,feedAddress,feedType,popUsername,popPassword,popServer,lastChecked,javaClass) {
          this.name        = name;
          this.id          = id;
          this.address     = address;
          this.feedAddress = feedAddress;
          this.feedType    = feedType;
          this.lastChecked = lastChecked;
          this.javaClass   = "org.apache.tuscany.sca.demos.aggregator.types.impl.SourceTypeImpl";

        }

        function errorCallback(result, error, id) {
            var resultsNode = document.getElementById("errors");
            // There seems to be a problem somewhere as I should be able to get the error
            // details but all I can actually get is the Id from the error message
            // resultsNode.innerHTML = "there was an error! message id = "  + " error code = " + result.error.code + " error message = " + result.error.msg ;
           resultsNode.innerHTML = "An error was returned by the server. Message id = " +  result.id;
        }

        // Generate the alert sources table
        function getAlertSources()
        { 
            response = alertSourcesService.getAlertSources("Dojo");
            response.addCallbacks(getAlertSourcesCallback, errorCallback);

            getAlerts();
        }

        function getAlertSourcesCallback(result) {
            var resultsNode = document.getElementById("alertSourcesTable");
            if ( result.error != null ) {
                resultsNode.innerHTML = result.error;
            } else {
                // stash away the source list for when we come to edit it
                alertSourceList = result.source.list;

                // put out the html
                var text = ""
                var nextSourceId = 0
                for (var i in result.source.list){
                    var source = result.source.list[i];

                    text = text + "<table>";
                    text = text + "<TR CLASS='source_" + source.id + "' >";
                    text = text + "  <TD CLASS='source_name clickable' ONCLICK=\"displayAlert('" + source.address + "')\">";
                    text = text + "    <IMG SRC='rss.png'/>&nbsp;&nbsp;" + source.name;
                    text = text + "  </TD>";
                    text = text + "  <TD CLASS='clickable link' ONCLICK=\"showEditSource('" + source.id + "')\">Edit</TD>";
                    text = text + "  <TD CLASS='clickable link' ONCLICK=\"deleteSource('" + source.id + "')\">Delete</TD>";
                    text = text + "</TR>";
                    text = text + "<TR ID='edit_source_" + source.id + "' CLASS='hidden source_" + source.id + "'>";
                    text = text + "  <TD COLSPAN='3'>";
                    text = text + "    <TABLE CLASS='sourceDetailsTable'>";
                    text = text + "      <TR>";
                    text = text + "        <TD>Source name:</TD>";
                    text = text + "        <TD>";
                    text = text + "          <INPUT ID='source_" + source.id + "_name' TYPE='TEXT' SIZE='50' VALUE='" + source.name + "'/>";
                    text = text + "        </TD>";
                    text = text + "      </TR>";
                    text = text + "      <TR>";
                    text = text + "       <TD>Source address:</TD>"
                    text = text + "        <TD>";
                    text = text + "          <INPUT ID='source_" + source.id + "_address' TYPE='TEXT' SIZE='50' VALUE='" + source.address + "'/>";
                    text = text + "        </TD>";
                    text = text + "      </TR>";
                    text = text + "      <TR>";
                    text = text + "        <TD>";
                    text = text + "          <INPUT ID='source_" + source.id + "_type' TYPE='HIDDEN' VALUE='" + source.id + "'/>";
                    text = text + "          <INPUT TYPE='BUTTON' VALUE='Update' ONCLICK=\"updateSource('" + source.id + "')\"/>";
                    text = text + "          <INPUT TYPE='BUTTON' VALUE='Cancel' ONCLICK=\"hideEditSource('" + source.id + "')\"/>";
                    text = text + "        </TD>";
                    text = text + "      </TR>";
                    text = text + "    </TABLE>";
                    text = text + "  </TD>";
                    text = text + "</TR>";
               
                    nextSourceId = eval(source.id);
                }

                nextSourceId = nextSourceId + 1;

                text = text + "<TR CLASS='source_" + nextSourceId + "'>";
                text = text + "  <TD COLSPAN='4' CLASS='clickable link' ONCLICK=\"showAddNewSource('" + nextSourceId + "')\">Add new Alert Source</TD>";
                text = text + "</TR>";
                text = text + "<TR ID='add_source_" + nextSourceId + "' CLASS='hidden source_" + nextSourceId + "'>";
                text = text + "  <TD COLSPAN='4'>";
                text = text + "    <TABLE CLASS='sourceDetailsTable'>";
                text = text + "      <TR>";
                text = text + "        <TD>Source name:</TD>";
                text = text + "        <TD>";
                text = text + "          <INPUT ID='source_" + nextSourceId + "_name' TYPE='TEXT' SIZE='50'>";
                text = text + "        </TD>";
                text = text + "      </TR>";
                text = text + "      <TR>";
                text = text + "        <TD>Source address:</TD>";
                text = text + "        <TD>";
                text = text + "          <INPUT ID='source_" + nextSourceId + "_address' TYPE='TEXT' SIZE='50'>";
                text = text + "        </TD>";
                text = text + "      </TR>";
                text = text + "      <TR>";
                text = text + "        <TD>Source type:</TD>";
                text = text + "        <TD>";
                text = text + "          <SELECT ID='source_" + nextSourceId + "_type' ONCHANGE=\"showSourceType('" + nextSourceId + "')\">";
                text = text + "            <OPTION value='rss' selected='selected'>RSS/Atom feed</OPTION>";
                text = text + "          </SELECT>";
                text = text + "        </TD>";
                text = text + "      </TR>";
                text = text + "      <TR ID='add_rss_source'>";
                text = text + "        <TD COLSPAN='2'>";
                text = text + "          <TABLE CLASS='sourceDetailsTable'>";
                text = text + "            <TR>";
                text = text + "              <TD>Feed address:</TD>";
                text = text + "              <TD>";
                text = text + "                 <INPUT ID='source_" + nextSourceId + "_feedAddress' TYPE='TEXT' SIZE='50'/>";
                text = text + "              </TD>";
                text = text + "            </TR>";
                text = text + "          </TABLE>";
                text = text + "        </TD>";
                text = text + "      </TR>";
                text = text + "      <TR>";
                text = text + "        <TD>";
                text = text + "          <INPUT TYPE='BUTTON' VALUE='Add' ONCLICK=\"addSource('" + nextSourceId + "')\">";
                text = text + "          <INPUT TYPE='BUTTON' VALUE='Cancel' ONCLICK=\"hideAddNewSource('" + nextSourceId + "')\">";
                text = text + "        </TD>";
                text = text + "      </TR>";
                text = text + "    </TABLE>";
                text = text + "  </TD>";
                text = text + "</TR>";
                text = text + "</table>";

                resultsNode.innerHTML = text;  
            }
        }

        function showEditSource(sourceid)
        {
            document.getElementById("edit_source_"+sourceid).className = "source_"+sourceid;
        }

        function hideEditSource(sourceid)
        {
             document.getElementById("edit_source_"+sourceid).className = "hidden source_"+sourceid;
        }
 
        function updateSource(sourceid)
        {
            hideEditSource(sourceid);
            var source = getSource(sourceId);
            alertSourcesService.updateAlertSource(source);
            getAlertSources();
        }
 
        function deleteSource(sourceid)
        {
            alertSourcesService.removeAlertSource(sourceid);
            getAlertSources();
        }

        function showAddNewSource(sourceid)
        {
            document.getElementById("add_source_"+sourceid).className = "source_"+sourceid;
        }

        function hideAddNewSource(sourceid)
        {
            document.getElementById("add_source_"+sourceid).className = "hidden source_"+sourceid;
        }

        function addSource(sourceid)
        {
            hideAddNewSource(sourceid);
            var source = getSource(sourceid);
            alertSourcesService.addAlertSource(source); 

            // wait a little before getting the list back from the server
            setTimeout("getAlertSources()",1250);       
        }

        function getSource(sourceid)
        {
            var source = alertSourceList[sourceid];

            if ( source == null ){
                source = new alertSourceType("name","id","address","feedAddress","feedType","popUsername","popPassword","popServer","lastChecked","javaClass");
                alertSourceList[sourceid] = source;
            }
            
            source.name     = document.getElementById("source_"+sourceid+"_name").value;
            source.id       = sourceid;
            source.address  = document.getElementById("source_"+sourceid+"_address").value;
            var typeElem    = document.getElementById("source_"+sourceid+"_type");
            source.feedType = typeElem.options[typeElem.selectedIndex].value; 

            if(source.feedType=="rss")
            {
                source.feedAddress = document.getElementById("source_"+sourceid+"_feedAddress").value;
                
            }
            else if(source.feedType=="pop")
            {
                source.popServer   = document.getElementById("source_"+sourceid+"_popServer").value;
                source.popUsername = document.getElementById("source_"+sourceid+"_popUsername").value;
                source.popPassword = document.getElementById("source_"+sourceid+"_popPassword").value;
            } 
            return source;     
        }

        // Generate the alerts table
        function getAlerts()
        { 
            response = alertsService.getAllNewAlerts("Dojo");
            response.addCallbacks(getAlertsCallback, errorCallback);
        }

        function getAlertsCallback(result) {
            var resultsNode = document.getElementById("alertsTable");
            if ( result.error != null ) {
                resultsNode.innerHTML = result.error;
            } else {
                alertList = result.alert.list;
                var text = ""
                for (var i in result.alert.list){
                    var alert = result.alert.list[i];

                    text = text + "<table>";
                    text = text + "<TR class='source_" + alert.sourceId + " clickable' onclick=\"displayAlert('" + alert.address + "')\">";
                    text = text + " <TD class='alert_text'>";
                    text = text + "   <SPAN id='" + alert.id + "' class='unread_title'>" + alert.title + "</SPAN>";
                    text = text + "   <SPAN class='summary'> - " + alert.summary.substring(0, 80)  + "...</SPAN>";
                    text = text + " </TD>";
                    text = text + " <TD>";
                    text = text +     alert.date;
                    text = text + "  </TD>"
                    text = text + "</TR>"
                    text = text + "</table>";
                }

                resultsNode.innerHTML = text;  
            }
        }



        function displayAlert(url)
        {
            document.getElementById("alertData").innerHTML="<IFRAME CLASS='alert_data' SRC='"+url+"'/>";
            window.location="#data";
            return;    
        }
</script-->

<h1 id="top">Apache Tuscany Domain</h1>
<div id="errors"></div>

<p>Domain Name<span id="domainName"></span>:</p>

<div id="domainInfo"></div>

<p /><input type="button" value="Refresh" onclick="getNodeInfo()" />

<div id="nodePage"></div>

</body>
</html>
