Rensselaer Center for Open Source Software

finished up switch to CLI

114 files changed, 1192 lines added, 1016 lines removed

Changes

--- Collective Congress/src/org/colcon/web/client/ui/HeaderPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/HeaderPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,10 +1,8 @@
-import org.colcon.web.client.ui.link.AccountLink;
-import org.colcon.web.client.ui.link.NewsLink;
@@ -22,9 +20,6 @@
-    //headerPanel.add(new NewsLink(client));
-    //headerPanel.add(new GroupsLink(client));
-    //headerPanel.add(new UsersLink(client));
@@ -33,7 +28,7 @@
-      userPanel.add(new AccountLink(client));
+      userPanel.add(new LinkPanel(client, "user-item", client.getUser().getPath()));
--- Collective Congress/src/org/colcon/web/client/ui/ItemPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/ItemPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -3,6 +3,8 @@
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -15,7 +17,21 @@
-    add(new LinkPanel(client, "item-title", item.getPath()));
+    HorizontalPanel header = new HorizontalPanel();
+    HorizontalPanel headerRight = new HorizontalPanel();
+    
+    header.setWidth("100%");
+    headerRight.setWidth("100%");
+    
+    headerRight.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
+    
+    header.add(new LinkPanel(client, "link-title", item.getPath()));
+    
+    if(!item.isRoot())
+      headerRight.add(new LinkPanel(client, "link-parent", item.getParentPath()));
+    
+    header.add(headerRight);
+    add(header);
--- Collective Congress/src/org/colcon/web/client/ui/LinkPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/LinkPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -2,8 +2,11 @@
+import org.colcon.web.client.ui.panel.UserPanel;
+import org.colcon.web.model.Model;
+import org.colcon.web.model.framework.IUser;
@@ -19,7 +22,12 @@
-    super(client, style, Item.getId(path));
+    this(client, style, Model.parseId(path), path);
+  }
+  
+  public LinkPanel(Collective_Congress client, String style, String text, String path) 
+  {
+    super(client, style, text);
@@ -55,10 +63,16 @@
+          ItemPanel panel;
+          
-            getBodyPanel().add(new ContainerPanel(getClient(), (IContainer) item));
+            panel = new ContainerPanel(getClient(), (IContainer) item);
+          else if(item instanceof IUser)
+            panel = new UserPanel(getClient(), (IUser) item);
-            getBodyPanel().add(new ItemPanel(getClient(), item));
+            panel = new ItemPanel(getClient(), item);
+          
+          getBodyPanel().add(panel);
--- Collective Congress/src/org/colcon/web/client/ui/deprecated 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,18 @@
+100644 blob c9bfb2562976a4ea32eebfc005a8a22b28ca1127  AccountLink.java
+100644 blob e1c437dd95f3a19c6d13d72094277a76eaf54294  CreateGroupPanel.java
+100644 blob e0d02b82c6d47ffd5cec7734def147e70eb4e75e  ElectionPanel.java
+100644 blob 64e23379a11e2a91ed19394c1c9201cdedf0dd9b  GroupInfoPanel.java
+100644 blob 362557decd1093a77e1fb78d8c2d57e759742b0f  GroupsLink.java
+100644 blob e8906e9cfdbfdd6c61c00bd5c25d358ed4984dde  InfoNamePanel.java
+100644 blob 04a8bb78c5d757355180233af2db48d2623f4783  InfoPanel.java
+100644 blob 0d9694ce7040713608dd376fb998300a8c43584d  NamePanel.java
+100644 blob 6f352e4a162e9be92490cd6f691ce3fc183b035e  NamedItemListPanel.java
+100644 blob 629b8eb31adc5b4acb7a237a2055565d56ce96b5  NamedItemPanel.java
+100644 blob 508920e561c33556946098fb344a7d2d3a29e203  NewsLink.java
+100644 blob 4ff7a316fa6385f8808bedc299c213b0954c5631  NewsListPanel.java
+100644 blob a9198e34d9ddda3b8658567347592d2a1a538767  PowerInfoPanel.java
+100644 blob 9edf56c05cac25d9049c7aeb155760c6f1819ea6  PowerNamePanel.java
+100644 blob 673432f89f75b72f176cfd9e49432ba6e6d17a45  TitleInfoPanel.java
+100644 blob b3e9584be3354c28131dc711409bc1e323d58ea4  TitleNamePanel.java
+100644 blob 2d84bc2c2021345896546bfb420eafe74467816b  UserInfoPanel.java
+100644 blob 342c0acbdeafecdaeb8b8c5c591eb7181cd4dacc  UsersLink.java
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/AccountLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/AccountLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,40 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ClickablePanel;
+import org.colcon.web.model.User;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Label;
+
+public class AccountLink extends ClickablePanel
+{
+  public AccountLink(Collective_Congress client)
+  {
+    super(client, "user-item", client.getUser().getId());
+  }
+  
+  public void click()
+  {
+    getBodyPanel().clear();
+    getBodyPanel().add(new Label("Loading..."));
+    
+    getService().getUser(getClient().getUser().getId(), new AsyncCallback<User>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        System.err.println("Failed to refresh user " + getClient().getUser().getId());
+        getClient().logout();
+        getClient().refresh();
+      }
+      
+      public void onSuccess(User user)
+      {
+        getClient().login(user);
+        getBodyPanel().clear();
+        UserInfoPanel panel = new UserInfoPanel(getClient(), getClient().getUser());
+        getBodyPanel().add(panel);
+      }
+    });
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/CreateGroupPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/CreateGroupPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,125 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ColConPanel;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.TextArea;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.VerticalPanel;
+
+public class CreateGroupPanel extends ColConPanel
+{
+  private VerticalPanel panel = new VerticalPanel();
+  
+  private Grid grid = new Grid(3, 2);
+  
+  private Label nameLabel = new Label("Name:");
+  private TextBox nameBox = new TextBox();
+  private Label charterLabel = new Label("Charter:");
+  private TextArea charterBox = new TextArea();
+  private Button button = new Button("Create Group");
+  
+  public CreateGroupPanel(Collective_Congress client)
+  {
+    super(client, null, null);
+    
+    setStyleName("register");
+    
+    panel.setWidth("100%");
+    panel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
+    
+    button.addClickHandler(new MyButtonHandler());
+    
+    sinkEvents(Event.ONKEYPRESS);
+    addHandler(new MyEnterHandler(), KeyPressEvent.getType());
+    
+    grid.setWidget(0, 0, nameLabel);
+    grid.setWidget(0, 1, nameBox);
+    grid.setWidget(1, 0, charterLabel);
+    grid.setWidget(1, 1, charterBox);
+    grid.setWidget(2, 1, button);
+
+    panel.add(grid);
+    add(panel);
+    
+    setFocus(nameBox);
+  }
+  
+  private class MyButtonHandler implements ClickHandler
+  {
+    public void onClick(ClickEvent event) 
+    {
+      buttonClick();
+    }
+  }
+  
+  private class MyEnterHandler implements KeyPressHandler
+  {
+    public void onKeyPress(KeyPressEvent event) 
+    {
+      if(event.getCharCode() == KeyCodes.KEY_ENTER)
+        buttonClick();
+    }
+  }
+  
+  public void buttonClick() 
+  {
+    if(!validate())
+    {
+      panel.clear();
+      panel.add(grid);
+      panel.add(new HTML("Invalid input"));
+      return;
+    }
+    
+    panel.clear();
+    panel.add(new HTML("Loading..."));
+    
+    getService().addGroup(nameBox.getText(), charterBox.getText(), new AsyncCallback<Boolean>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        caught.printStackTrace();
+        
+        panel.clear();
+        panel.add(grid);
+        panel.add(new HTML(caught.getMessage()));
+      }
+      
+      public void onSuccess(Boolean result)
+      {
+        panel.clear();
+        
+        if(result)
+        {
+          panel.add(new HTML("Group creation successful"));
+        }
+        else
+        {
+          panel.add(grid);
+          panel.add(new HTML("Name already taken"));
+        }
+      }
+    });
+  }
+  
+  private boolean validate()
+  {
+    return
+      !(
+        nameBox.getText().isEmpty() ||  
+        charterBox.getText().isEmpty()
+      );
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/ElectionPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/ElectionPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,144 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.model.Ballot;
+import org.colcon.web.model.framework.IUser;
+import org.colcon.web.model.framework.IVote;
+import org.colcon.web.model.vote.ElectionVote;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.VerticalPanel;
+
+public class ElectionPanel extends InfoPanel 
+{
+  private VerticalPanel panel;
+  private RadioButton[] radioButtons;
+  private IUser[] candidates;
+  
+  public ElectionPanel(Collective_Congress client, IVote vote) 
+  {
+    super(client, vote);
+  }
+  
+  public void init()
+  {
+    super.init();
+    
+    IVote vote = getVote();
+    
+    sinkEvents(Event.ONKEYPRESS);
+    addHandler(new MyEnterHandler(), KeyPressEvent.getType());
+    
+    panel = new VerticalPanel();
+    
+    if(!vote.isEligible(getClient().getUser()))
+    {
+      panel.clear();
+      panel.add(new Label("You are not eligible for this vote or have already voted"));
+      add(panel);
+      return;
+    }
+    
+    ElectionVote election = (ElectionVote) vote;
+    
+    candidates = election.getCandidates();
+    radioButtons = new RadioButton[candidates.length];
+    
+    for(int i = 0; i < candidates.length; i++)
+    {
+      String username = candidates[i].getId();
+      int votes = election.getVotes(username);
+      if(votes > 0)
+        add(new Label(username + ": " + votes));
+    }
+    
+    for(int i = 0; i < candidates.length; i++)
+    {
+      radioButtons[i] = new RadioButton("buttonGroup", candidates[i].getId());
+      panel.add(radioButtons[i]);
+    }
+    
+    Button button = new Button("Submit Vote");
+    button.addClickHandler(new MyButtonHandler());
+    panel.add(button);
+    
+    add(panel);
+  }
+
+  public IVote getVote()
+  {
+    return (IVote) getItem();
+  }
+  
+  private class MyButtonHandler implements ClickHandler
+  {
+    public void onClick(ClickEvent event) 
+    {
+      buttonClick();
+    }
+  }
+  
+  private class MyEnterHandler implements KeyPressHandler
+  {
+    public void onKeyPress(KeyPressEvent event) 
+    {
+      if(event.getCharCode() == KeyCodes.KEY_ENTER)
+        buttonClick();
+    }
+  }
+  
+  public void buttonClick()
+  {
+    String user = getClient().getUser().getId();
+    
+    if(getVoteValue() == null)
+    {
+      init();
+      panel.add(new HTML("Invalid vote value"));
+      return;
+    }
+    
+    getService().submitVote(getVote().getPath(), user, getVoteValue(), new AsyncCallback<Ballot>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        panel.clear();
+        caught.printStackTrace();
+        panel.add(new HTML(caught.getMessage()));
+      }
+      
+      public void onSuccess(Ballot ballot)
+      {
+        if(ballot != null)
+        {
+          panel.clear();
+          panel.add(new HTML("Vote successful"));
+        }
+        else
+        {
+          panel.clear();
+          panel.add(new HTML("Vote failed"));
+        }
+      }
+    });
+  }
+  
+  public String getVoteValue()
+  {
+    for(int i = 0; i < radioButtons.length; i++)
+      if(radioButtons[i].getValue())
+        return candidates[i].getId();
+    
+    return null;
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/GroupInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/GroupInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,86 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.model.framework.IGroup;
+import org.colcon.web.model.framework.IProposal;
+import org.colcon.web.model.framework.ITitle;
+import org.colcon.web.model.framework.IVote;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Label;
+
+public class GroupInfoPanel extends InfoPanel 
+{
+  public GroupInfoPanel(Collective_Congress client, IGroup group) 
+  {
+    super(client, group);
+    
+    if(!group.hasMember(getClient().getUser().getId()))
+    {
+      Button joinButton = new Button("Join this group");
+      joinButton.addClickHandler(new MyButtonHandler());
+      add(joinButton);
+    }
+    
+    add(new Label("Members"));
+    for(String user : group.getMembers())
+      add(new NamePanel(client, user));
+    
+    add(new Label("Titles"));
+    for(ITitle title : group.getTitles())
+      add(new NamePanel(client, title.getPath()));
+    
+    add(new Label("Proposals"));
+    for(IProposal proposal : group.getProposals())
+      add(new NamePanel(client, proposal.getPath()));
+    
+    add(new Label("Votes"));
+    for(IVote vote : group.getVotes())
+      add(new NamePanel(client, vote.getPath()));
+  }
+  
+  public IGroup getGroup()
+  {
+    return (IGroup) getItem();
+  }
+  
+  private class MyButtonHandler implements ClickHandler
+  {
+    public void onClick(ClickEvent event) 
+    {
+      joinGroup();
+    }
+  }
+  
+  public void joinGroup() 
+  {
+    getService().addMember(getGroup().getId(), getClient().getUser().getId(), new AsyncCallback<Boolean>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        caught.printStackTrace();
+      }
+      
+      public void onSuccess(Boolean result)
+      {
+        if(result)
+        {
+          getBodyPanel().clear();
+          Label label = new Label("Group joined successfully");
+          label.setStyleName("item");
+          getBodyPanel().add(label);
+        }
+        else
+        {
+          getBodyPanel().clear();
+          Label label = new Label("GFailed to join group");
+          label.setStyleName("item");
+          getBodyPanel().add(label);
+        }
+      }
+    });
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/GroupsLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/GroupsLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,41 @@
+package org.colcon.web.client.ui.deprecated;
+
+import java.util.List;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ClickablePanel;
+import org.colcon.web.model.Group;
+import org.colcon.web.model.framework.IItem;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.HTML;
+
+public class GroupsLink extends ClickablePanel
+{
+  public GroupsLink(Collective_Congress client)
+  {
+    super(client, "header-item", "groups");
+  }
+  
+  public void click()
+  {
+    getBodyPanel().clear();
+    getBodyPanel().add(new HTML("Loading..."));
+    
+    getService().getGroups(new AsyncCallback<List<Group>>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        getBodyPanel().clear();
+        caught.printStackTrace();
+        getBodyPanel().add(new HTML(caught.getMessage()));
+      }
+      
+      public void onSuccess(List<Group> groups)
+      {
+        getBodyPanel().clear();
+        getBodyPanel().add(new NamedItemListPanel(getClient(), groups.toArray(new IItem[0])));
+      }
+    });
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/InfoNamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/InfoNamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,14 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+
+public class InfoNamePanel extends NamePanel 
+{
+  public InfoNamePanel(Collective_Congress client, String item) 
+  {
+    super(client, item);
+  }
+
+  // using this class disables info panel refreshing
+  public void click() {};
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/InfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/InfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,47 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ColConPanel;
+import org.colcon.web.model.framework.IItem;
+
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.Label;
+
+public class InfoPanel extends ColConPanel 
+{
+  private IItem item;
+  
+  public InfoPanel(Collective_Congress client, IItem item) 
+  {
+    super(client, "info", null);
+    
+    this.item = item;
+
+    init();
+  }
+  
+  public void init()
+  {
+    clear();
+    
+    add(getHeader());
+    
+    add(new Label(item.getText()));
+  }
+  
+  public HorizontalPanel getHeader()
+  {
+    HorizontalPanel header = new HorizontalPanel();
+    
+    NamePanel title = new InfoNamePanel(getClient(), item.getId());
+    title.setStyleName("info-title");
+    header.add(title);
+    
+    return header;
+  }
+  
+  public IItem getItem()
+  {
+    return item;
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/NamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/NamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,93 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ClickablePanel;
+import org.colcon.web.client.ui.panel.LoginPanel;
+import org.colcon.web.model.Item;
+import org.colcon.web.model.framework.IGroup;
+import org.colcon.web.model.framework.IItem;
+import org.colcon.web.model.framework.ITitle;
+import org.colcon.web.model.framework.IUser;
+import org.colcon.web.model.framework.IVote;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Label;
+
+public class NamePanel extends ClickablePanel 
+{
+  private String item;
+  
+  public NamePanel(Collective_Congress client, String item) 
+  {
+    this(client, item, item);
+  }
+  
+  public NamePanel(Collective_Congress client, String item, String text) 
+  {
+    super(client, "name", text);
+    
+    this.item = item;
+  }
+  
+  public String getItem()
+  {
+    return item;
+  }
+
+  public void click() 
+  {
+    getBodyPanel().clear();
+    
+    if(!getClient().loggedIn())
+    {
+      getBodyPanel().add(new LoginPanel(getClient()));
+      return;
+    }
+    
+    getBodyPanel().add(new Label("Loading..."));
+    
+    getService().get(item, new AsyncCallback<Item>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        getBodyPanel().clear();
+        getBodyPanel().add(new Label("failed to get item " + item));
+      }
+      
+      public void onSuccess(Item item)
+      {
+        getBodyPanel().clear();
+        
+        if(item != null)
+        {
+          getBodyPanel().add(getInfoPanel(item));
+        }
+        else
+        {
+          getBodyPanel().add(new Label("failed to get item " + item));
+        }
+      }
+    });
+  }
+  
+  public InfoPanel getInfoPanel(IItem item)
+  {
+    if(item instanceof IUser)
+      return new UserInfoPanel(getClient(), (IUser) item);
+    
+    if(item instanceof IGroup)
+      return new GroupInfoPanel(getClient(), (IGroup) item);
+    
+    if(item instanceof ITitle)
+      return new TitleInfoPanel(getClient(), (ITitle) item);
+    
+    if(item instanceof IVote)
+      return new ElectionPanel(getClient(), (IVote) item);
+    
+    //TODO: is PowerNamePanel necessary?
+    //if(item instanceof IPower)
+    //  use PowerNamePanel
+    
+    return new InfoPanel(getClient(), item);
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/NamedItemListPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/NamedItemListPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,27 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ColConPanel;
+import org.colcon.web.model.framework.IItem;
+
+import com.google.gwt.user.client.ui.HTML;
+
+public class NamedItemListPanel extends ColConPanel
+{
+  public NamedItemListPanel(Collective_Congress client, IItem[] items) 
+  {
+    super(client, "list");
+    
+    if(items != null && items.length > 0)
+    {
+      for(IItem item : items)
+        add(new NamedItemPanel(client, item));
+    }
+    else
+    {
+      HTML html = new HTML("No items found");
+      html.setStyleName("home");
+      add(html);
+    }
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/NamedItemPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/NamedItemPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,15 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ItemPanel;
+import org.colcon.web.model.framework.IItem;
+
+public class NamedItemPanel extends ItemPanel
+{
+  public NamedItemPanel(Collective_Congress client, IItem item)
+  {
+    super(client, item);
+
+    insert(new NamePanel(client, item.getId()), this.getElement(), 0, true);
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/NewsLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/NewsLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,18 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ClickablePanel;
+
+public class NewsLink extends ClickablePanel
+{
+  public NewsLink(Collective_Congress client)
+  {
+    super(client, "header-item", "news");
+  }
+  
+  public void click()
+  {
+    getBodyPanel().clear();
+    getBodyPanel().add(new NewsListPanel());
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/NewsListPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/NewsListPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,15 @@
+package org.colcon.web.client.ui.deprecated;
+
+import com.google.gwt.user.client.ui.HTMLPanel;
+
+public class NewsListPanel extends HTMLPanel
+{
+  public NewsListPanel()
+  {
+    super(
+        "<p>This will be a news ticker</p>"
+    );
+    
+    setStyleName("home");
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/PowerInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/PowerInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,137 @@
+package org.colcon.web.client.ui.deprecated;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.model.framework.IPower;
+import org.colcon.web.model.framework.ITitle;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyPressEvent;
+import com.google.gwt.event.dom.client.KeyPressHandler;
+import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.VerticalPanel;
+
+public class PowerInfoPanel extends InfoPanel
+{
+  private VerticalPanel panel;
+  private Grid grid;
+  private TextBox[] boxes;
+  
+  private ITitle title;
+  
+  public PowerInfoPanel(Collective_Congress client, ITitle title, IPower power) 
+  {
+    super(client, power);
+    
+    this.title = title;
+    
+    panel = new VerticalPanel();
+    
+    if(!title.hasHolder(client.getUser().getId()))
+    {
+      panel.add(new Label("You do not hold this title"));
+      add(panel);
+      return;
+    }
+    
+    String[] args = power.getDecisionArgs();
+    boxes = new TextBox[args.length];
+    
+    grid = new Grid(args.length + 1, 2);
+    
+    for(int i = 0; i < args.length; i++)
+    {
+      String p = args[i];
+      grid.setWidget(i, 0, new Label(p));
+      
+      TextBox box = new TextBox();
+      boxes[i] = box;
+      grid.setWidget(i, 1, box);
+    }
+    
+    Button button = new Button("Submit");
+    button.addClickHandler(new MyButtonHandler());
+    grid.setWidget(args.length, 1, button);
+    
+    sinkEvents(Event.ONKEYPRESS);
+    addHandler(new MyEnterHandler(), KeyPressEvent.getType());
+    
+    panel.add(grid);
+    add(panel);
+  }
+  
+  private IPower getPower()
+  {
+    return (IPower) getItem();
+  }
+  
+  private Map<String, String> getParams()
+  {
+    String[] args = getPower().getDecisionArgs();
+    Map<String, String> map = new HashMap<String, String>();
+    
+    for(int i = 0; i < args.length; i++)
+      map.put(args[i], boxes[i].getText());
+    
+    return map;
+  }
+  
+  private class MyButtonHandler implements ClickHandler
+  {
+    public void onClick(ClickEvent event) 
+    {
+      buttonClick();
+    }
+  }
+  
+  private class MyEnterHandler implements KeyPressHandler
+  {
+    public void onKeyPress(KeyPressEvent event) 
+    {
+      if(event.getCharCode() == KeyCodes.KEY_ENTER)
+        buttonClick();
+    }
+  }
+  
+  public void buttonClick()
+  {
+    IPower power = (IPower)getPower();
+    
+    panel.clear();
+    panel.add(new Label("Processing..."));
+    
+    getService().usePower(title.getLongName(), power.getId(), getParams(), new AsyncCallback<Boolean>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        caught.printStackTrace();
+        
+        panel.clear();
+        panel.add(new Label("Decision failed"));
+      }
+      
+      public void onSuccess(Boolean result)
+      {
+        if(result)
+        {
+          panel.clear();
+          panel.add(new Label("Decision complete"));
+        }
+        else
+        {
+          panel.clear();
+          panel.add(new Label("Decision failed"));
+        }
+      }
+    });
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/PowerNamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/PowerNamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,26 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.model.framework.IItem;
+import org.colcon.web.model.framework.ITitle;
+
+public class PowerNamePanel extends NamePanel
+{
+  private String power;
+  
+  public PowerNamePanel(Collective_Congress client, String title, String power) 
+  {
+    super(client, title);
+    
+    this.power = power;
+    
+    setWidth("300px");
+  }
+  
+  public InfoPanel getInfoPanel(IItem item)
+  {
+    ITitle title = (ITitle) item;
+    
+    return new PowerInfoPanel(getClient(), title, title.getPower(power));
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/TitleInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/TitleInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,35 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.model.framework.IPower;
+import org.colcon.web.model.framework.ITitle;
+
+import com.google.gwt.user.client.ui.HorizontalPanel;
+
+public class TitleInfoPanel extends InfoPanel 
+{
+  public TitleInfoPanel(Collective_Congress client, ITitle title) 
+  {
+    super(client, title);
+    
+    //add(new NamePanel(client, title.getGroup()));
+    
+    for(IPower power : title.getPowers())
+      add(new PowerNamePanel(getClient(), title.getPath(), power.getId()));
+  }
+  
+  public HorizontalPanel getHeader()
+  {
+    HorizontalPanel header = new HorizontalPanel();
+    header.setWidth("100%");
+    NamePanel title = new NamePanel(getClient(), getItem().getPath());
+    title.setStyleName("info-title");
+    header.add(title);
+    
+    NamePanel groupName = new NamePanel(getClient(), ((ITitle)getItem()).getGroup());
+    groupName.setStyleName("info-group");
+    header.add(groupName);
+    
+    return header;
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/TitleNamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/TitleNamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,12 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+
+public class TitleNamePanel extends NamePanel
+{
+  public TitleNamePanel(Collective_Congress client, String title) 
+  {
+    super(client, title);
+    setWidth("300px");
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/UserInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/UserInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,18 @@
+package org.colcon.web.client.ui.deprecated;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.model.framework.IUser;
+
+import com.google.gwt.user.client.ui.Label;
+
+public class UserInfoPanel extends InfoPanel 
+{
+  public UserInfoPanel(Collective_Congress client, IUser user) 
+  {
+    super(client, user);
+    
+    add(new Label("Titles"));
+    for(String title : user.getTitles())
+      add(new TitleNamePanel(client, title));
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/deprecated/UsersLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/deprecated/UsersLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,41 @@
+package org.colcon.web.client.ui.deprecated;
+
+import java.util.List;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ClickablePanel;
+import org.colcon.web.model.User;
+import org.colcon.web.model.framework.IItem;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.ui.HTML;
+
+public class UsersLink extends ClickablePanel
+{
+  public UsersLink(Collective_Congress client)
+  {
+    super(client, "header-item", "users");
+  }
+  
+  public void click()
+  {
+    getBodyPanel().clear();
+    getBodyPanel().add(new HTML("Loading..."));
+    
+    getService().getUsers(new AsyncCallback<List<User>>()
+    {
+      public void onFailure(Throwable caught)
+      {
+        getBodyPanel().clear();
+        caught.printStackTrace();
+        getBodyPanel().add(new HTML(caught.getMessage()));
+      }
+      
+      public void onSuccess(List<User> users)
+      {
+        getBodyPanel().clear();
+        getBodyPanel().add(new NamedItemListPanel(getClient(), users.toArray(new IItem[0])));
+      }
+    });
+  }
+}
--- Collective Congress/src/org/colcon/web/client/ui/link/AccountLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/link/AccountLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,41 +1,0 @@
-package org.colcon.web.client.ui.link;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ClickablePanel;
-import org.colcon.web.client.ui.panel.UserInfoPanel;
-import org.colcon.web.model.User;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Label;
-
-public class AccountLink extends ClickablePanel
-{
-  public AccountLink(Collective_Congress client)
-  {
-    super(client, "user-item", client.getUser().getId());
-  }
-  
-  public void click()
-  {
-    getBodyPanel().clear();
-    getBodyPanel().add(new Label("Loading..."));
-    
-    getService().getUser(getClient().getUser().getId(), new AsyncCallback<User>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        System.err.println("Failed to refresh user " + getClient().getUser().getId());
-        getClient().logout();
-        getClient().refresh();
-      }
-      
-      public void onSuccess(User user)
-      {
-        getClient().login(user);
-        getBodyPanel().clear();
-        UserInfoPanel panel = new UserInfoPanel(getClient(), getClient().getUser());
-        getBodyPanel().add(panel);
-      }
-    });
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/link/GroupsLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/link/GroupsLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,42 +1,0 @@
-package org.colcon.web.client.ui.link;
-
-import java.util.List;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ClickablePanel;
-import org.colcon.web.client.ui.panel.NamedItemListPanel;
-import org.colcon.web.model.Group;
-import org.colcon.web.model.framework.IItem;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.HTML;
-
-public class GroupsLink extends ClickablePanel
-{
-  public GroupsLink(Collective_Congress client)
-  {
-    super(client, "header-item", "groups");
-  }
-  
-  public void click()
-  {
-    getBodyPanel().clear();
-    getBodyPanel().add(new HTML("Loading..."));
-    
-    getService().getGroups(new AsyncCallback<List<Group>>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        getBodyPanel().clear();
-        caught.printStackTrace();
-        getBodyPanel().add(new HTML(caught.getMessage()));
-      }
-      
-      public void onSuccess(List<Group> groups)
-      {
-        getBodyPanel().clear();
-        getBodyPanel().add(new NamedItemListPanel(getClient(), groups.toArray(new IItem[0])));
-      }
-    });
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/link/NewsLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/link/NewsLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,19 +1,0 @@
-package org.colcon.web.client.ui.link;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ClickablePanel;
-import org.colcon.web.client.ui.panel.NewsListPanel;
-
-public class NewsLink extends ClickablePanel
-{
-  public NewsLink(Collective_Congress client)
-  {
-    super(client, "header-item", "news");
-  }
-  
-  public void click()
-  {
-    getBodyPanel().clear();
-    getBodyPanel().add(new NewsListPanel());
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/link/UsersLink.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/link/UsersLink.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,42 +1,0 @@
-package org.colcon.web.client.ui.link;
-
-import java.util.List;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ClickablePanel;
-import org.colcon.web.client.ui.panel.NamedItemListPanel;
-import org.colcon.web.model.User;
-import org.colcon.web.model.framework.IItem;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.HTML;
-
-public class UsersLink extends ClickablePanel
-{
-  public UsersLink(Collective_Congress client)
-  {
-    super(client, "header-item", "users");
-  }
-  
-  public void click()
-  {
-    getBodyPanel().clear();
-    getBodyPanel().add(new HTML("Loading..."));
-    
-    getService().getUsers(new AsyncCallback<List<User>>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        getBodyPanel().clear();
-        caught.printStackTrace();
-        getBodyPanel().add(new HTML(caught.getMessage()));
-      }
-      
-      public void onSuccess(List<User> users)
-      {
-        getBodyPanel().clear();
-        getBodyPanel().add(new NamedItemListPanel(getClient(), users.toArray(new IItem[0])));
-      }
-    });
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/CreateGroupPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/CreateGroupPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,125 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ColConPanel;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.TextArea;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-
-public class CreateGroupPanel extends ColConPanel
-{
-  private VerticalPanel panel = new VerticalPanel();
-  
-  private Grid grid = new Grid(3, 2);
-  
-  private Label nameLabel = new Label("Name:");
-  private TextBox nameBox = new TextBox();
-  private Label charterLabel = new Label("Charter:");
-  private TextArea charterBox = new TextArea();
-  private Button button = new Button("Create Group");
-  
-  public CreateGroupPanel(Collective_Congress client)
-  {
-    super(client, null, null);
-    
-    setStyleName("register");
-    
-    panel.setWidth("100%");
-    panel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
-    
-    button.addClickHandler(new MyButtonHandler());
-    
-    sinkEvents(Event.ONKEYPRESS);
-    addHandler(new MyEnterHandler(), KeyPressEvent.getType());
-    
-    grid.setWidget(0, 0, nameLabel);
-    grid.setWidget(0, 1, nameBox);
-    grid.setWidget(1, 0, charterLabel);
-    grid.setWidget(1, 1, charterBox);
-    grid.setWidget(2, 1, button);
-
-    panel.add(grid);
-    add(panel);
-    
-    setFocus(nameBox);
-  }
-  
-  private class MyButtonHandler implements ClickHandler
-  {
-    public void onClick(ClickEvent event) 
-    {
-      buttonClick();
-    }
-  }
-  
-  private class MyEnterHandler implements KeyPressHandler
-  {
-    public void onKeyPress(KeyPressEvent event) 
-    {
-      if(event.getCharCode() == KeyCodes.KEY_ENTER)
-        buttonClick();
-    }
-  }
-  
-  public void buttonClick() 
-  {
-    if(!validate())
-    {
-      panel.clear();
-      panel.add(grid);
-      panel.add(new HTML("Invalid input"));
-      return;
-    }
-    
-    panel.clear();
-    panel.add(new HTML("Loading..."));
-    
-    getService().addGroup(nameBox.getText(), charterBox.getText(), new AsyncCallback<Boolean>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        caught.printStackTrace();
-        
-        panel.clear();
-        panel.add(grid);
-        panel.add(new HTML(caught.getMessage()));
-      }
-      
-      public void onSuccess(Boolean result)
-      {
-        panel.clear();
-        
-        if(result)
-        {
-          panel.add(new HTML("Group creation successful"));
-        }
-        else
-        {
-          panel.add(grid);
-          panel.add(new HTML("Name already taken"));
-        }
-      }
-    });
-  }
-  
-  private boolean validate()
-  {
-    return
-      !(
-        nameBox.getText().isEmpty() ||  
-        charterBox.getText().isEmpty()
-      );
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/ElectionPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/ElectionPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,144 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.model.Ballot;
-import org.colcon.web.model.framework.IUser;
-import org.colcon.web.model.framework.IVote;
-import org.colcon.web.model.vote.ElectionVote;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.HTML;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.RadioButton;
-import com.google.gwt.user.client.ui.VerticalPanel;
-
-public class ElectionPanel extends InfoPanel 
-{
-  private VerticalPanel panel;
-  private RadioButton[] radioButtons;
-  private IUser[] candidates;
-  
-  public ElectionPanel(Collective_Congress client, IVote vote) 
-  {
-    super(client, vote);
-  }
-  
-  public void init()
-  {
-    super.init();
-    
-    IVote vote = getVote();
-    
-    sinkEvents(Event.ONKEYPRESS);
-    addHandler(new MyEnterHandler(), KeyPressEvent.getType());
-    
-    panel = new VerticalPanel();
-    
-    if(!vote.isEligible(getClient().getUser()))
-    {
-      panel.clear();
-      panel.add(new Label("You are not eligible for this vote or have already voted"));
-      add(panel);
-      return;
-    }
-    
-    ElectionVote election = (ElectionVote) vote;
-    
-    candidates = election.getCandidates();
-    radioButtons = new RadioButton[candidates.length];
-    
-    for(int i = 0; i < candidates.length; i++)
-    {
-      String username = candidates[i].getId();
-      int votes = election.getVotes(username);
-      if(votes > 0)
-        add(new Label(username + ": " + votes));
-    }
-    
-    for(int i = 0; i < candidates.length; i++)
-    {
-      radioButtons[i] = new RadioButton("buttonGroup", candidates[i].getId());
-      panel.add(radioButtons[i]);
-    }
-    
-    Button button = new Button("Submit Vote");
-    button.addClickHandler(new MyButtonHandler());
-    panel.add(button);
-    
-    add(panel);
-  }
-
-  public IVote getVote()
-  {
-    return (IVote) getItem();
-  }
-  
-  private class MyButtonHandler implements ClickHandler
-  {
-    public void onClick(ClickEvent event) 
-    {
-      buttonClick();
-    }
-  }
-  
-  private class MyEnterHandler implements KeyPressHandler
-  {
-    public void onKeyPress(KeyPressEvent event) 
-    {
-      if(event.getCharCode() == KeyCodes.KEY_ENTER)
-        buttonClick();
-    }
-  }
-  
-  public void buttonClick()
-  {
-    String user = getClient().getUser().getId();
-    
-    if(getVoteValue() == null)
-    {
-      init();
-      panel.add(new HTML("Invalid vote value"));
-      return;
-    }
-    
-    getService().submitVote(getVote().getPath(), user, getVoteValue(), new AsyncCallback<Ballot>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        panel.clear();
-        caught.printStackTrace();
-        panel.add(new HTML(caught.getMessage()));
-      }
-      
-      public void onSuccess(Ballot ballot)
-      {
-        if(ballot != null)
-        {
-          panel.clear();
-          panel.add(new HTML("Vote successful"));
-        }
-        else
-        {
-          panel.clear();
-          panel.add(new HTML("Vote failed"));
-        }
-      }
-    });
-  }
-  
-  public String getVoteValue()
-  {
-    for(int i = 0; i < radioButtons.length; i++)
-      if(radioButtons[i].getValue())
-        return candidates[i].getId();
-    
-    return null;
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/GroupInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/GroupInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,86 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.model.framework.IGroup;
-import org.colcon.web.model.framework.IProposal;
-import org.colcon.web.model.framework.ITitle;
-import org.colcon.web.model.framework.IVote;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Label;
-
-public class GroupInfoPanel extends InfoPanel 
-{
-  public GroupInfoPanel(Collective_Congress client, IGroup group) 
-  {
-    super(client, group);
-    
-    if(!group.hasMember(getClient().getUser().getId()))
-    {
-      Button joinButton = new Button("Join this group");
-      joinButton.addClickHandler(new MyButtonHandler());
-      add(joinButton);
-    }
-    
-    add(new Label("Members"));
-    for(String user : group.getMembers())
-      add(new NamePanel(client, user));
-    
-    add(new Label("Titles"));
-    for(ITitle title : group.getTitles())
-      add(new NamePanel(client, title.getPath()));
-    
-    add(new Label("Proposals"));
-    for(IProposal proposal : group.getProposals())
-      add(new NamePanel(client, proposal.getPath()));
-    
-    add(new Label("Votes"));
-    for(IVote vote : group.getVotes())
-      add(new NamePanel(client, vote.getPath()));
-  }
-  
-  public IGroup getGroup()
-  {
-    return (IGroup) getItem();
-  }
-  
-  private class MyButtonHandler implements ClickHandler
-  {
-    public void onClick(ClickEvent event) 
-    {
-      joinGroup();
-    }
-  }
-  
-  public void joinGroup() 
-  {
-    getService().addMember(getGroup().getId(), getClient().getUser().getId(), new AsyncCallback<Boolean>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        caught.printStackTrace();
-      }
-      
-      public void onSuccess(Boolean result)
-      {
-        if(result)
-        {
-          getBodyPanel().clear();
-          Label label = new Label("Group joined successfully");
-          label.setStyleName("item");
-          getBodyPanel().add(label);
-        }
-        else
-        {
-          getBodyPanel().clear();
-          Label label = new Label("GFailed to join group");
-          label.setStyleName("item");
-          getBodyPanel().add(label);
-        }
-      }
-    });
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/InfoNamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/InfoNamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,14 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-
-public class InfoNamePanel extends NamePanel 
-{
-  public InfoNamePanel(Collective_Congress client, String item) 
-  {
-    super(client, item);
-  }
-
-  // using this class disables info panel refreshing
-  public void click() {};
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/InfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/InfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,47 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ColConPanel;
-import org.colcon.web.model.framework.IItem;
-
-import com.google.gwt.user.client.ui.HorizontalPanel;
-import com.google.gwt.user.client.ui.Label;
-
-public class InfoPanel extends ColConPanel 
-{
-  private IItem item;
-  
-  public InfoPanel(Collective_Congress client, IItem item) 
-  {
-    super(client, "info", null);
-    
-    this.item = item;
-
-    init();
-  }
-  
-  public void init()
-  {
-    clear();
-    
-    add(getHeader());
-    
-    add(new Label(item.getText()));
-  }
-  
-  public HorizontalPanel getHeader()
-  {
-    HorizontalPanel header = new HorizontalPanel();
-    
-    NamePanel title = new InfoNamePanel(getClient(), item.getId());
-    title.setStyleName("info-title");
-    header.add(title);
-    
-    return header;
-  }
-  
-  public IItem getItem()
-  {
-    return item;
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/LoginPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/LoginPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -109,7 +109,7 @@
-          getBodyPanel().add(new UserInfoPanel(getClient(), getClient().getUser()));
+          getBodyPanel().add(new UserPanel(getClient(), getClient().getUser()));
--- Collective Congress/src/org/colcon/web/client/ui/panel/NamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/NamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,92 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ClickablePanel;
-import org.colcon.web.model.Item;
-import org.colcon.web.model.framework.IGroup;
-import org.colcon.web.model.framework.IItem;
-import org.colcon.web.model.framework.ITitle;
-import org.colcon.web.model.framework.IUser;
-import org.colcon.web.model.framework.IVote;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Label;
-
-public class NamePanel extends ClickablePanel 
-{
-  private String item;
-  
-  public NamePanel(Collective_Congress client, String item) 
-  {
-    this(client, item, item);
-  }
-  
-  public NamePanel(Collective_Congress client, String item, String text) 
-  {
-    super(client, "name", text);
-    
-    this.item = item;
-  }
-  
-  public String getItem()
-  {
-    return item;
-  }
-
-  public void click() 
-  {
-    getBodyPanel().clear();
-    
-    if(!getClient().loggedIn())
-    {
-      getBodyPanel().add(new LoginPanel(getClient()));
-      return;
-    }
-    
-    getBodyPanel().add(new Label("Loading..."));
-    
-    getService().get(item, new AsyncCallback<Item>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        getBodyPanel().clear();
-        getBodyPanel().add(new Label("failed to get item " + item));
-      }
-      
-      public void onSuccess(Item item)
-      {
-        getBodyPanel().clear();
-        
-        if(item != null)
-        {
-          getBodyPanel().add(getInfoPanel(item));
-        }
-        else
-        {
-          getBodyPanel().add(new Label("failed to get item " + item));
-        }
-      }
-    });
-  }
-  
-  public InfoPanel getInfoPanel(IItem item)
-  {
-    if(item instanceof IUser)
-      return new UserInfoPanel(getClient(), (IUser) item);
-    
-    if(item instanceof IGroup)
-      return new GroupInfoPanel(getClient(), (IGroup) item);
-    
-    if(item instanceof ITitle)
-      return new TitleInfoPanel(getClient(), (ITitle) item);
-    
-    if(item instanceof IVote)
-      return new ElectionPanel(getClient(), (IVote) item);
-    
-    //TODO: is PowerNamePanel necessary?
-    //if(item instanceof IPower)
-    //  use PowerNamePanel
-    
-    return new InfoPanel(getClient(), item);
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/NamedItemListPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/NamedItemListPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,27 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ColConPanel;
-import org.colcon.web.model.framework.IItem;
-
-import com.google.gwt.user.client.ui.HTML;
-
-public class NamedItemListPanel extends ColConPanel
-{
-  public NamedItemListPanel(Collective_Congress client, IItem[] items) 
-  {
-    super(client, "list");
-    
-    if(items != null && items.length > 0)
-    {
-      for(IItem item : items)
-        add(new NamedItemPanel(client, item));
-    }
-    else
-    {
-      HTML html = new HTML("No items found");
-      html.setStyleName("home");
-      add(html);
-    }
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/NamedItemPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/NamedItemPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,15 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.client.ui.ItemPanel;
-import org.colcon.web.model.framework.IItem;
-
-public class NamedItemPanel extends ItemPanel
-{
-  public NamedItemPanel(Collective_Congress client, IItem item)
-  {
-    super(client, item);
-
-    insert(new NamePanel(client, item.getId()), this.getElement(), 0, true);
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/NewsListPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/NewsListPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,15 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import com.google.gwt.user.client.ui.HTMLPanel;
-
-public class NewsListPanel extends HTMLPanel
-{
-  public NewsListPanel()
-  {
-    super(
-        "<p>This will be a news ticker</p>"
-    );
-    
-    setStyleName("home");
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/PowerInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/PowerInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,137 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.model.framework.IPower;
-import org.colcon.web.model.framework.ITitle;
-
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.KeyCodes;
-import com.google.gwt.event.dom.client.KeyPressEvent;
-import com.google.gwt.event.dom.client.KeyPressHandler;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Grid;
-import com.google.gwt.user.client.ui.Label;
-import com.google.gwt.user.client.ui.TextBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
-
-public class PowerInfoPanel extends InfoPanel
-{
-  private VerticalPanel panel;
-  private Grid grid;
-  private TextBox[] boxes;
-  
-  private ITitle title;
-  
-  public PowerInfoPanel(Collective_Congress client, ITitle title, IPower power) 
-  {
-    super(client, power);
-    
-    this.title = title;
-    
-    panel = new VerticalPanel();
-    
-    if(!title.hasHolder(client.getUser().getId()))
-    {
-      panel.add(new Label("You do not hold this title"));
-      add(panel);
-      return;
-    }
-    
-    String[] args = power.getDecisionArgs();
-    boxes = new TextBox[args.length];
-    
-    grid = new Grid(args.length + 1, 2);
-    
-    for(int i = 0; i < args.length; i++)
-    {
-      String p = args[i];
-      grid.setWidget(i, 0, new Label(p));
-      
-      TextBox box = new TextBox();
-      boxes[i] = box;
-      grid.setWidget(i, 1, box);
-    }
-    
-    Button button = new Button("Submit");
-    button.addClickHandler(new MyButtonHandler());
-    grid.setWidget(args.length, 1, button);
-    
-    sinkEvents(Event.ONKEYPRESS);
-    addHandler(new MyEnterHandler(), KeyPressEvent.getType());
-    
-    panel.add(grid);
-    add(panel);
-  }
-  
-  private IPower getPower()
-  {
-    return (IPower) getItem();
-  }
-  
-  private Map<String, String> getParams()
-  {
-    String[] args = getPower().getDecisionArgs();
-    Map<String, String> map = new HashMap<String, String>();
-    
-    for(int i = 0; i < args.length; i++)
-      map.put(args[i], boxes[i].getText());
-    
-    return map;
-  }
-  
-  private class MyButtonHandler implements ClickHandler
-  {
-    public void onClick(ClickEvent event) 
-    {
-      buttonClick();
-    }
-  }
-  
-  private class MyEnterHandler implements KeyPressHandler
-  {
-    public void onKeyPress(KeyPressEvent event) 
-    {
-      if(event.getCharCode() == KeyCodes.KEY_ENTER)
-        buttonClick();
-    }
-  }
-  
-  public void buttonClick()
-  {
-    IPower power = (IPower)getPower();
-    
-    panel.clear();
-    panel.add(new Label("Processing..."));
-    
-    getService().usePower(title.getLongName(), power.getId(), getParams(), new AsyncCallback<Boolean>()
-    {
-      public void onFailure(Throwable caught)
-      {
-        caught.printStackTrace();
-        
-        panel.clear();
-        panel.add(new Label("Decision failed"));
-      }
-      
-      public void onSuccess(Boolean result)
-      {
-        if(result)
-        {
-          panel.clear();
-          panel.add(new Label("Decision complete"));
-        }
-        else
-        {
-          panel.clear();
-          panel.add(new Label("Decision failed"));
-        }
-      }
-    });
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/PowerNamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/PowerNamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,26 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.model.framework.IItem;
-import org.colcon.web.model.framework.ITitle;
-
-public class PowerNamePanel extends NamePanel
-{
-  private String power;
-  
-  public PowerNamePanel(Collective_Congress client, String title, String power) 
-  {
-    super(client, title);
-    
-    this.power = power;
-    
-    setWidth("300px");
-  }
-  
-  public InfoPanel getInfoPanel(IItem item)
-  {
-    ITitle title = (ITitle) item;
-    
-    return new PowerInfoPanel(getClient(), title, title.getPower(power));
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/TitleInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/TitleInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,35 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.model.framework.IPower;
-import org.colcon.web.model.framework.ITitle;
-
-import com.google.gwt.user.client.ui.HorizontalPanel;
-
-public class TitleInfoPanel extends InfoPanel 
-{
-  public TitleInfoPanel(Collective_Congress client, ITitle title) 
-  {
-    super(client, title);
-    
-    //add(new NamePanel(client, title.getGroup()));
-    
-    for(IPower power : title.getPowers())
-      add(new PowerNamePanel(getClient(), title.getPath(), power.getId()));
-  }
-  
-  public HorizontalPanel getHeader()
-  {
-    HorizontalPanel header = new HorizontalPanel();
-    header.setWidth("100%");
-    NamePanel title = new NamePanel(getClient(), getItem().getPath());
-    title.setStyleName("info-title");
-    header.add(title);
-    
-    NamePanel groupName = new NamePanel(getClient(), ((ITitle)getItem()).getGroup());
-    groupName.setStyleName("info-group");
-    header.add(groupName);
-    
-    return header;
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/TitleNamePanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/TitleNamePanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,12 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-
-public class TitleNamePanel extends NamePanel
-{
-  public TitleNamePanel(Collective_Congress client, String title) 
-  {
-    super(client, title);
-    setWidth("300px");
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/UserInfoPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/UserInfoPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,18 +1,0 @@
-package org.colcon.web.client.ui.panel;
-
-import org.colcon.web.client.Collective_Congress;
-import org.colcon.web.model.framework.IUser;
-
-import com.google.gwt.user.client.ui.Label;
-
-public class UserInfoPanel extends InfoPanel 
-{
-  public UserInfoPanel(Collective_Congress client, IUser user) 
-  {
-    super(client, user);
-    
-    add(new Label("Titles"));
-    for(String title : user.getTitles())
-      add(new TitleNamePanel(client, title));
-  }
-}
--- Collective Congress/src/org/colcon/web/client/ui/panel/UserPanel.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/client/ui/panel/UserPanel.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,23 @@
+package org.colcon.web.client.ui.panel;
+
+import org.colcon.web.client.Collective_Congress;
+import org.colcon.web.client.ui.ItemPanel;
+import org.colcon.web.client.ui.LinkPanel;
+import org.colcon.web.model.Model;
+import org.colcon.web.model.framework.IUser;
+
+public class UserPanel extends ItemPanel 
+{
+  public UserPanel(Collective_Congress client, IUser user) 
+  {
+    super(client, user);
+    
+    for(String title : user.getTitles())
+      add(new LinkPanel(client, "link", Model.getTitleString(title), title));
+  }
+
+  public IUser getUser()
+  {
+    return (IUser) getItem();
+  }
+}
--- Collective Congress/src/org/colcon/web/model/CLI.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/CLI.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -27,6 +27,7 @@
+    HELP = "help",
@@ -105,6 +106,10 @@
+    else if(cmd.equals(HELP))
+    {
+      return getHelpString();
+    }
@@ -249,4 +254,16 @@
+  
+  public static String getHelpString()
+  {
+    return
+        "get -path [item_path]\n" +
+        "open -path [item_path]\n" +
+        "remove -path [item_path]\n" +
+        "add -path [item_path] -item_type [item_type] [item_args]\n" +
+        "create_user -id [group_id]\n" +
+        "create_group -id [group_id] -text [group_text]\n" +
+        "assign_title -path [title_path] -user [user_id]\n";
+  }
--- Collective Congress/src/org/colcon/web/model/Container.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Container.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -39,11 +39,6 @@
-  }
-  
-  public boolean isRoot()
-  {
-    return getParentPath() == null;
--- Collective Congress/src/org/colcon/web/model/Group.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Group.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -47,7 +47,7 @@
-    super(Model.getGroupContainer(), id);
+    super(Model.getGroupContainerPath(), id);
--- Collective Congress/src/org/colcon/web/model/Item.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Item.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -104,41 +104,8 @@
-  public static String formatId(String id)
+  public boolean isRoot()
-    String str = id.toLowerCase();
-    
-    str.replaceAll(" ", "_");
-    
-    return str;
-  }
-  
-  public static String getId(String path)
-  {
-    if(path == null || path.length() == 0)
-      return null;
-    
-    String[] array = path.split("/");
-    
-    if(array == null || array.length == 0)
-      return null;
-    
-    return array[array.length - 1];
-  }
-  
-  public static String getGroup(String path)
-  {
-    if(path == null || path.length() == 0)
-      return null;
-    
-    String[] array = path.split("/");
-    
-    if(array == null || array.length < 2)
-      return null;
-    
-    if(!array[0].equals(Model.GROUPS))
-      return null;
-    
-    return array[1];
+    return getParentPath() == null;
--- Collective Congress/src/org/colcon/web/model/Law.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Law.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -36,7 +36,7 @@
-    return Item.getGroup(getParentPath());
+    return Model.parseGroup(getParentPath());
--- Collective Congress/src/org/colcon/web/model/Model.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Model.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -119,7 +119,7 @@
-    item.setParentPath(parent);
+    //item.setParentPath(parent);
@@ -254,23 +254,81 @@
-  public static String getContainer(String id)
+  public static String getContainerPath(String id)
-  public static String getUserContainer()
-  {
-    return getContainer(USERS);
-  }
-  
-  public static String getGroupContainer()
-  {
-    return getContainer(GROUPS);
+  public static String getUserContainerPath()
+  {
+    return getContainerPath(USERS);
+  }
+  
+  public static String getGroupContainerPath()
+  {
+    return getContainerPath(GROUPS);
+  }
+  
+  public static String getUserPath(String id)
+  {
+    return getUserContainerPath() + '/' + id;
+  }
+  
+  public static String getGroupPath(String id)
+  {
+    return getGroupContainerPath() + '/' + id;
-    return Model.getGroupContainer() + '/' + group + '/' + Group.TITLES;
+    return getGroupPath(group) + '/' + Group.TITLES;
+  }
+  
+  public static String getTitlePath(String group, String title)
+  {
+    return getTitleContainer(group) + '/' + title;
+  }
+  
+  public static String formatId(String id)
+  {
+    String str = id.toLowerCase();
+    
+    str.replaceAll(" ", "_");
+    
+    return str;
+  }
+  
+  public static String parseId(String path)
+  {
+    if(path == null || path.length() == 0)
+      return null;
+    
+    String[] array = path.split("/");
+    
+    if(array == null || array.length == 0)
+      return null;
+    
+    return array[array.length - 1];
+  }
+  
+  public static String parseGroup(String path)
+  {
+    if(path == null || path.length() == 0)
+      return null;
+    
+    String[] array = path.split("/");
+    
+    if(array == null || array.length < 2)
+      return null;
+    
+    if(!array[0].equals(Model.GROUPS))
+      return null;
+    
+    return array[1];
+  }
+  
+  public static String getTitleString(String path)
+  {
+    return Model.parseId(path) + " of " + Model.parseGroup(path);
--- Collective Congress/src/org/colcon/web/model/Power.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Power.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -77,7 +77,7 @@
-    String group = Item.getGroup(getParentPath());
+    String group = Model.parseGroup(getParentPath());
--- Collective Congress/src/org/colcon/web/model/Title.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/Title.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -139,9 +139,4 @@
-  
-  public static String getString(String path)
-  {
-    return Item.getId(path) + " of " + Item.getGroup(path);
-  }
--- Collective Congress/src/org/colcon/web/model/User.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/User.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -34,7 +34,7 @@
-    super(Model.getUserContainer(), id);
+    super(Model.getUserContainerPath(), id);
@@ -52,10 +52,10 @@
-    String text = Title.getString(getTitles()[0]);
+    String text = Model.getTitleString(getTitles()[0]);
-      text += ", " + Title.getString(getTitles()[i]);
+      text += ", " + Model.getTitleString(getTitles()[i]);
--- Collective Congress/src/org/colcon/web/model/framework/IItem.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/framework/IItem.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -19,4 +19,5 @@
+  public boolean isRoot();
--- Collective Congress/src/org/colcon/web/model/power/CreateGroupPower.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/power/CreateGroupPower.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -16,11 +16,11 @@
-    super("groups/" + Model.USER_CONGRESS + "/titles/" + Group.MEMBER, 
+    super(
+        Model.getTitlePath(Model.USER_CONGRESS, Group.MEMBER), 
-
--- Collective Congress/src/org/colcon/web/model/power/CreateTitlePower.java 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/src/org/colcon/web/model/power/CreateTitlePower.java 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,6 +1,7 @@
+import org.colcon.web.model.Group;
@@ -20,7 +21,9 @@
-    super("create_title", group, 
+    super(
+        Model.getTitlePath(group, Group.MEMBER),
+        "create_title",
--- Collective Congress/war/Collective_Congress.css 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/war/Collective_Congress.css 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -210,13 +210,13 @@
-.item-title
+.link-title
-.item-title:hover
+.link-title:hover
@@ -226,7 +226,7 @@
-  width: 150px;
+  width: 200px;
@@ -239,6 +239,26 @@
+{
+  background-color: #FFFFFF;
+  color: rgb(136, 0, 21);
+}
+
+.link-parent
+{
+  width: 200px;
+  
+  padding: 5px;
+  margin: 5px;
+
+  border-radius: 10px;
+  background-color: rgb(136, 0, 21);
+  color: #FFFFFF;
+  
+  text-align: center;
+}
+
+.link-parent:hover
--- Collective Congress/war/WEB-INF/deploy/collective_congress/rpcPolicyManifest/manifests/49A566B27ED0EAE28B6772CBB368F3BC.txt 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/war/WEB-INF/deploy/collective_congress/rpcPolicyManifest/manifests/49A566B27ED0EAE28B6772CBB368F3BC.txt 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,2 @@
+serviceClass: org.colcon.web.client.ColConService
+path: 573CDAC0BAA96051CFB5863991048466.gwt.rpc
--- Collective Congress/war/collective_congress/573CDAC0BAA96051CFB5863991048466.gwt.rpc 8f4500f239b0633dc6b214642de1204981178655
+++ Collective Congress/war/collective_congress/573CDAC0BAA96051CFB5863991048466.gwt.rpc 63986c52115887bf23a4c6112d3fc2c23d53e92f
@@ -1,0 +1,55 @@
+com.google.gwt.i18n.shared.impl.DateRecord, true, true, false, false, com.google.gwt.i18n.shared.impl.DateRecord/3375188634, 3375188634
+com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException, true, true, true, true, com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533, 3936916533
+com.google.gwt.user.client.rpc.RpcTokenException, true, true, false, false, com.google.gwt.user.client.rpc.RpcTokenException/2345075298, 2345075298
+com.google.gwt.user.client.rpc.XsrfToken, false, false, true, true, com.google.gwt.user.client.rpc.XsrfToken/4254043109, 4254043109
+java.lang.Boolean, true, true, false, false, java.lang.Boolean/476441737, 476441737
+java.lang.Exception, true, false, true, false, java.lang.Exception/1920171873, 1920171873
+java.lang.RuntimeException, true, false, true, false, java.lang.RuntimeException/515124647, 515124647
+java.lang.String, true, true, true, true, java.lang.String/2004016611, 2004016611
+java.lang.Throwable, true, false, true, false, java.lang.Throwable/2953622131, 2953622131
+java.sql.Date, true, true, false, false, java.sql.Date/730999118, 730999118
+java.sql.Time, true, true, false, false, java.sql.Time/1816797103, 1816797103
+java.sql.Timestamp, true, true, false, false, java.sql.Timestamp/3040052672, 3040052672
+java.util.ArrayList, true, true, false, false, java.util.ArrayList/4159755760, 4159755760
+java.util.Arrays$ArrayList, true, true, false, false, java.util.Arrays$ArrayList/2507071751, 2507071751
+java.util.Collections$EmptyList, true, true, false, false, java.util.Collections$EmptyList/4157118744, 4157118744
+java.util.Collections$EmptyMap, true, true, true, true, java.util.Collections$EmptyMap/4174664486, 4174664486
+java.util.Collections$EmptySet, true, true, false, false, java.util.Collections$EmptySet/3523698179, 3523698179
+java.util.Collections$SingletonList, true, true, false, false, java.util.Collections$SingletonList/1586180994, 1586180994
+java.util.Date, true, true, false, false, java.util.Date/3385151746, 3385151746
+java.util.HashMap, true, true, true, true, java.util.HashMap/1797211028, 1797211028
+java.util.HashSet, true, true, false, false, java.util.HashSet/3273092938, 3273092938
+java.util.IdentityHashMap, true, true, true, true, java.util.IdentityHashMap/1839153020, 1839153020
+java.util.LinkedHashMap, true, true, true, true, java.util.LinkedHashMap/3008245022, 3008245022
+java.util.LinkedHashSet, true, true, false, false, java.util.LinkedHashSet/1826081506, 1826081506
+java.util.LinkedList, true, true, false, false, java.util.LinkedList/3953877921, 3953877921
+java.util.Stack, true, true, false, false, java.util.Stack/1346942793, 1346942793
+java.util.TreeMap, true, true, true, true, java.util.TreeMap/1493889780, 1493889780
+java.util.TreeSet, true, true, false, false, java.util.TreeSet/4043497002, 4043497002
+java.util.Vector, true, true, false, false, java.util.Vector/3057315478, 3057315478
+org.colcon.web.client.ColConService, false, false, false, false, _, 3056180247
+org.colcon.web.model.Ballot, true, true, false, false, org.colcon.web.model.Ballot/3523817985, 3523817985
+org.colcon.web.model.Container, true, true, false, false, org.colcon.web.model.Container/281291707, 281291707
+org.colcon.web.model.Decision, true, true, false, false, org.colcon.web.model.Decision/1190613842, 1190613842
+[Lorg.colcon.web.model.Decision;, true, true, false, false, [Lorg.colcon.web.model.Decision;/1622493706, 1622493706
+org.colcon.web.model.Group, true, true, false, false, org.colcon.web.model.Group/3080983413, 3080983413
+[Lorg.colcon.web.model.Group;, true, true, false, false, [Lorg.colcon.web.model.Group;/1319764090, 1319764090
+org.colcon.web.model.Item, true, true, false, false, org.colcon.web.model.Item/486676530, 486676530
+org.colcon.web.model.Law, true, true, false, false, org.colcon.web.model.Law/2377518243, 2377518243
+org.colcon.web.model.Param, true, true, false, false, org.colcon.web.model.Param/1428498524, 1428498524
+org.colcon.web.model.ParamItem, true, false, false, false, org.colcon.web.model.ParamItem/2741781645, 2741781645
+org.colcon.web.model.Power, true, true, false, false, org.colcon.web.model.Power/2816657101, 2816657101
+org.colcon.web.model.Proposal, true, true, false, false, org.colcon.web.model.Proposal/1782232273, 1782232273
+org.colcon.web.model.Title, true, true, false, false, org.colcon.web.model.Title/241242056, 241242056
+org.colcon.web.model.User, true, true, false, false, org.colcon.web.model.User/2617604530, 2617604530
+[Lorg.colcon.web.model.User;, true, true, false, false, [Lorg.colcon.web.model.User;/1641532903, 1641532903
+org.colcon.web.model.Vote, true, true, false, false, org.colcon.web.model.Vote/1927081577, 1927081577
+[Lorg.colcon.web.model.framework.IDecision;, true, true, false, false, [Lorg.colcon.web.model.framework.IDecision;/1706709822, 1706709822
+[Lorg.colcon.web.model.framework.IUser;, true, true, false, false, [Lorg.colcon.web.model.framework.IUser;/3551883336, 3551883336
+org.colcon.web.model.power.CreateGroupPower, true, true, false, false, org.colcon.web.model.power.CreateGroupPower/1741774176, 1741774176
+org.colcon.web.model.proposal.ElectionVoteProposal, true, true, false, false, org.colcon.web.model.proposal.ElectionVoteProposal/1069680350, 1069680350
+org.colcon.web.model.proposal.MultiChoiceVoteProposal, true, false, false, false, org.colcon.web.model.proposal.MultiChoiceVoteProposal/785921072, 785921072
+org.colcon.web.model.title.MemberTitle, true, true, false, false, org.colcon.web.model.title.MemberTitle/1671009497, 1671009497
+org.colcon.web.model.title.RepresentativeTitle, true, true, false, false, org.colcon.web.model.title.RepresentativeTitle/3192596617, 3192596617
+org.colcon.web.model.vote.ElectionVote, true, true, false, false, org.colcon.web.model.vote.ElectionVote/2882282232, 2882282232
+org.colcon.web.model.vote.MultiChoiceVote, true, false, false, false, org.colcon.web.model.vote.MultiChoiceVote/4158992156, 4158992156
danvegeto
Collective Congress • 57 weeks ago