/*******************************************************************************
 * Copyright (c), 2001, 2002 N2 Broadband, Inc.  All Rights Reserved.
 *
 * This module contains unpublished, confidential, proprietary
 * material.  The use and dissemination of this material are
 * governed by a license.  The above copyright notice does not
 * evidence any actual or intended publication of this material.
 *
 * Author:  Drake H. Henderson
 * Created:  11-12-01
 *
 ******************************************************************************/
package com.n2bb.web.util;

import java.io.InputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.List;
import java.util.LinkedList;
import java.util.Collections;
import javax.servlet.ServletContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.*;
import com.n2bb.util.SortCriteria;

public class Dashboard {

  private static Log n2bbLog = LogFactory.getLog(Dashboard.class);

  public static String buildDash(ServletContext servletContext, String dashDir) {
    try {
      List dashItems = new LinkedList();
      
      Set dashPaths = servletContext.getResourcePaths(dashDir);
      for (Iterator iterator = dashPaths.iterator(); iterator.hasNext();) {
        String path = (String) iterator.next();
        if (path.endsWith(".xml")) {
          addDashItemsToList(servletContext, path, dashItems);
        }
      }
      
      n2bbLog.info("dashboard items... " + dashItems.size());
      
      if (dashItems.size() < 1)
        return "";
        
      StringBuffer dash = new StringBuffer("<table class=\"module\">\n");
      dash.append(getDashItems(dashItems));
      dash.append("</table>");
      return dash.toString();
      
    } catch (Exception e) {
      n2bbLog.error(e.getMessage(), e);
      return "<table><tr><td>init error</td></tr></table>";
    }
  }

  private static void addDashItemsToList(ServletContext servletContext, String path, List dashItems) {
    try {
      InputStream is = servletContext.getResourceAsStream(path);
      DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
      Document doc = domBuilder.parse(is);
      
      Node appPopupNode = doc.getFirstChild();
      NodeList list = appPopupNode.getChildNodes();

      for (int i = 0; i < list.getLength(); i++) {
        Node node = list.item(i);

        // if statement used to filter text nodes
        if (node.getNodeName().equals("dashItem")) {
          Element el = (Element) node;
          dashItems.add(new DashItem(
            el.getAttribute("display"), 
            el.getAttribute("path"), 
            el.getAttribute("img"), 
            el.getAttribute("newWin"), 
            el.getAttribute("priority")));
            
          n2bbLog.info("added dashboard item... " + el.getAttribute("display"));
        }
      }
    } catch (Exception e) {
      n2bbLog.error("error processing... " + path + " - message... " + e.getMessage(), e);
    }
  }

  private static String getDashItems(List dashItems) {

    // sort the nodes
    SortCriteria sort = new SortCriteria();
    sort.setPrimaryMethodCriteria("getPriority");
    sort.setSecondaryMethodCriteria("getDisplay");
    Collections.sort(dashItems, sort);
      
    StringBuffer sb = new StringBuffer();
    int itemCnt = 0;

    sb.append("  <tr>\n");
      
    for (Iterator iterator = dashItems.iterator(); iterator.hasNext();) {
      DashItem di = (DashItem) iterator.next();
      sb.append("    <td>\n");
      sb.append("      <a href=\"").append(di.path).append("\"><img\n");
      sb.append("      border=\"0\" height=\"50\" width=\"50\" title=\"").append(di.display).append("\"\n");
      sb.append("      src=\"").append(di.img).append("\"></a><br/>\n");
      sb.append("      <a href=\"").append(di.path).append("\">").append(di.display).append("</a>\n");
      sb.append("    </td>\n");

      // new row after four items
      if (itemCnt++ >= 3) {
        sb.append("  </tr>\n");
        sb.append("  <tr>\n");
        itemCnt = 0;
      }
        
    }
    
    sb.append("  </tr>\n");
      
    return sb.toString();
  }
  
}

