OSDN Git Service

new master
authorzeebraster <zeebra@v7.com>
Fri, 28 Oct 2011 01:34:34 +0000 (10:34 +0900)
committerzeebraster <zeebra@v7.com>
Fri, 28 Oct 2011 01:34:34 +0000 (10:34 +0900)
13 files changed:
src/beluga/BelugaClient.java [new file with mode: 0644]
src/beluga/BelugaFrame.form [new file with mode: 0644]
src/beluga/BelugaFrame.java [new file with mode: 0644]
src/beluga/EditorPane.form [new file with mode: 0644]
src/beluga/EditorPane.java [new file with mode: 0644]
src/beluga/IFBelugaFrame.java [new file with mode: 0644]
src/beluga/IMEControl.java [new file with mode: 0644]
src/beluga/PodBean.java [new file with mode: 0644]
src/beluga/PodPane.java [new file with mode: 0644]
src/beluga/PodRow.form [new file with mode: 0644]
src/beluga/PodRow.java [new file with mode: 0644]
src/beluga/PodRowBean.java [new file with mode: 0644]
src/beluga/favicon.png [new file with mode: 0644]

diff --git a/src/beluga/BelugaClient.java b/src/beluga/BelugaClient.java
new file mode 100644 (file)
index 0000000..3c6492c
--- /dev/null
@@ -0,0 +1,224 @@
+package beluga;
+
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.cookie.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.message.*;
+import org.apache.http.protocol.*;
+import org.apache.http.util.*;
+
+import java.io.*;
+import java.util.*;
+
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: g9133
+ * Date: 11/06/20
+ * Time: 10:35
+ * To change this template use File | Settings | File Templates.
+ */
+public class BelugaClient {
+    private static CookieStore cookieStore = null;
+
+
+    public static DefaultHttpClient getHttpClient() {
+        DefaultHttpClient client = new DefaultHttpClient();
+
+        client.setCookieStore(cookieStore);
+
+        return client;
+    }
+
+    public static HashMap login(String e_mail, String password) throws Exception {
+        DefaultHttpClient client = new DefaultHttpClient();
+        HttpGet           get    = new HttpGet("http://belugapods.com/login");
+        HashMap           map    = new HashMap();
+
+        try {
+            HttpResponse res = client.execute(get);
+            HttpEntity   ent = res.getEntity();
+
+            System.out.println("Login form get: " + res.getStatusLine());
+            EntityUtils.consume(ent);
+
+            System.out.println("Initial set of cookies:");
+
+            List<Cookie> cookies = client.getCookieStore().getCookies();
+
+            if (cookies.isEmpty()) {
+                System.out.println("None");
+            } else {
+                for (int i = 0; i < cookies.size(); i++) {
+                    System.out.println("- " + cookies.get(i).toString());
+                }
+            }
+
+
+            HttpPost httpost = new HttpPost("https://belugapods.com/login");
+
+            List <NameValuePair> nvps = new ArrayList <NameValuePair>();
+
+            map.put("_xsrf", cookies.get(0).getValue());
+
+            nvps.add(new BasicNameValuePair("_xsrf"   , cookies.get(0).getValue()));
+            nvps.add(new BasicNameValuePair("ident"   , e_mail));
+            nvps.add(new BasicNameValuePair("password", password));
+
+            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
+
+            res = client.execute(httpost);
+            ent = res.getEntity();
+
+            System.out.println("Login form get: " + res.getStatusLine());
+
+            EntityUtils.consume(ent);
+
+            System.out.println("Post logon cookies:");
+
+            cookies = client.getCookieStore().getCookies();
+            cookieStore = client.getCookieStore();
+
+            if (cookies.isEmpty()) {
+                System.out.println("None");
+            } else {
+                for (int i = 0; i < cookies.size(); i++) {
+                    System.out.println("- " + cookies.get(i).toString());
+                }
+
+                if (cookies.size() < 2) {
+                    return null;
+                }
+            }
+
+            get = new HttpGet("http://belugapods.com/pods");
+            res = client.execute(get);
+            ent = res.getEntity();
+
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+            String         line   = "";
+            ArrayList      pods   = new ArrayList();
+
+            while ((line = reader.readLine()) != null) {
+                if (line.indexOf("userimg") > -1) {
+                    map.put("user_image", line.replaceAll(".*src=\"", "").replaceAll("\".*", ""));
+                    
+                    reader.readLine();
+                    line = reader.readLine();
+
+                    map.put("user_name", line.replaceAll("</.*", "").replaceAll(".*>", ""));
+                }
+                
+                if (line.indexOf("\"pod\"") > -1) {
+                    PodBean pb = new PodBean();
+                    
+                    pb.setId(line.replaceAll("\">.*", "").replaceAll(".*\"", ""));
+                    
+                    reader.readLine();
+                    reader.readLine();
+                    line = reader.readLine();
+                    
+                    pb.setPodImg(line.replaceAll("\">.*", "").replaceAll(".*\"", ""));
+                    
+                    reader.readLine();
+                    reader.readLine();
+                    reader.readLine();
+                    line = reader.readLine();
+                    
+                    pb.setPodTime(line.replaceAll("</.*", "").replaceAll(".*>", ""));
+
+                    reader.readLine();
+                    line = reader.readLine();
+                    
+                    pb.setPodTitle(line.replaceAll("</.*", "").replaceAll(".*>", ""));
+
+                    line = reader.readLine();
+
+                    if (line.indexOf("</em>") > -1) {
+                        pb.setLastMessage(line.replaceAll("</.*", "").replaceAll(".*>", ""));
+                    } else {
+                        pb.setLastMessage(line.replaceAll(".*>", ""));
+                        pb.setLastMessage(pb.getLastMessage() + System.getProperty("line.separator"));
+
+                        do {
+                            pb.setLastMessage(pb.getLastMessage() + System.getProperty("line.separator"));
+                        } while (line.indexOf("</") > -1);
+                    }
+
+                    pb.setE_mail(e_mail);
+                    pb.setPassword(password);
+                    pods.add(pb);
+                }
+            }
+
+            map.put("pods", pods.toArray(new PodBean[pods.size()]));
+            map.put("client", client);
+
+//            get = new HttpGet("http://belugapods.com/pod/4daef271e694aa4e6e011f7e");
+//            res = client.execute(get);
+//            ent = res.getEntity();
+//
+//            reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+//
+//            while ((line = reader.readLine()) != null) {
+//                System.out.println(line);
+//            }
+        } catch (Exception ex) {
+            throw ex;
+        }
+
+        return map;
+    }
+    
+    public static void check() {
+        DefaultHttpClient client = new DefaultHttpClient();
+        HttpGet           get    = new HttpGet("http://belugapods.com/fblogin?next=");
+
+        try {
+            HttpResponse res = client.execute(get);
+            HttpEntity   ent = res.getEntity();
+
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+            String         line   = null;
+            
+            boolean isForm = false;
+            
+            while ((line = reader.readLine()) != null) {
+                String[] parce = line.split(">");
+                
+                for (int i = 0; i < parce.length; i++) {
+                    if (parce[i].indexOf("<form") > -1) {
+                        isForm = true;
+                    }
+                    if (isForm) {
+                        if (parce[i].indexOf("input") > -1 && parce[i].indexOf("name=") > -1) {
+                            
+                            
+                            System.out.print(parce[i].replaceAll(".*name=\"", "").replaceAll("\".*", ""));
+                            System.out.print(",");
+                            System.out.println(parce[i].replaceAll(".*value=\"", "").replaceAll("\".*", ""));
+                        }
+                    }
+
+                    if (parce[i].indexOf("</form") > -1) {
+                        isForm = false;
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) {
+        try {
+            BelugaClient.check();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+}
diff --git a/src/beluga/BelugaFrame.form b/src/beluga/BelugaFrame.form
new file mode 100644 (file)
index 0000000..573f0c9
--- /dev/null
@@ -0,0 +1,575 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+  <NonVisualComponents>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup">
+    </Component>
+    <Container class="javax.swing.JPopupMenu" name="jPopupMenu">
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_paste1">
+          <Properties>
+            <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+              <KeyStroke key="Ctrl+V"/>
+            </Property>
+            <Property name="mnemonic" type="int" value="80"/>
+            <Property name="text" type="java.lang.String" value="Paste"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_paste1ActionPerformed"/>
+          </Events>
+        </MenuItem>
+      </SubComponents>
+    </Container>
+    <Menu class="javax.swing.JMenuBar" name="jMenuBar">
+      <SubComponents>
+        <Menu class="javax.swing.JMenu" name="jMenu_file">
+          <Properties>
+            <Property name="mnemonic" type="int" value="70"/>
+            <Property name="text" type="java.lang.String" value="File"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_logout">
+              <Properties>
+                <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+                  <KeyStroke key="Ctrl+L"/>
+                </Property>
+                <Property name="mnemonic" type="int" value="76"/>
+                <Property name="text" type="java.lang.String" value="Logout"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_logoutActionPerformed"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_auto_login">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="Auto Login"/>
+              </Properties>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_quit">
+              <Properties>
+                <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+                  <KeyStroke key="Ctrl+Q"/>
+                </Property>
+                <Property name="mnemonic" type="int" value="81"/>
+                <Property name="text" type="java.lang.String" value="Quit"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_quitActionPerformed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenu_edit">
+          <Properties>
+            <Property name="mnemonic" type="int" value="69"/>
+            <Property name="text" type="java.lang.String" value="Edit"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_copy">
+              <Properties>
+                <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+                  <KeyStroke key="Ctrl+C"/>
+                </Property>
+                <Property name="mnemonic" type="int" value="67"/>
+                <Property name="text" type="java.lang.String" value="Copy"/>
+              </Properties>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_paste">
+              <Properties>
+                <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+                  <KeyStroke key="Ctrl+V"/>
+                </Property>
+                <Property name="mnemonic" type="int" value="80"/>
+                <Property name="text" type="java.lang.String" value="Paste"/>
+              </Properties>
+            </MenuItem>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_option">
+              <Properties>
+                <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+                  <KeyStroke key="Ctrl+O"/>
+                </Property>
+                <Property name="mnemonic" type="int" value="79"/>
+                <Property name="text" type="java.lang.String" value="Option"/>
+                <Property name="enabled" type="boolean" value="false"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_optionActionPerformed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenu_view">
+          <Properties>
+            <Property name="mnemonic" type="int" value="86"/>
+            <Property name="text" type="java.lang.String" value="View"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_user">
+              <Properties>
+                <Property name="selected" type="boolean" value="true"/>
+                <Property name="text" type="java.lang.String" value="Your Icon"/>
+              </Properties>
+              <Events>
+                <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="jCheckBoxMenuItem_userItemStateChanged"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_pod">
+              <Properties>
+                <Property name="selected" type="boolean" value="true"/>
+                <Property name="text" type="java.lang.String" value="Pod Icon"/>
+              </Properties>
+              <Events>
+                <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="jCheckBoxMenuItem_podItemStateChanged"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_member">
+              <Properties>
+                <Property name="selected" type="boolean" value="true"/>
+                <Property name="text" type="java.lang.String" value="Member Icon"/>
+              </Properties>
+              <Events>
+                <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="jCheckBoxMenuItem_memberItemStateChanged"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator1">
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_ontop">
+              <Properties>
+                <Property name="selected" type="boolean" value="true"/>
+                <Property name="text" type="java.lang.String" value="Always on Top"/>
+              </Properties>
+              <Events>
+                <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="jCheckBoxMenuItem_ontopItemStateChanged"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JPopupMenu$Separator" name="jSeparator2">
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_startup">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="Startup with Tray"/>
+              </Properties>
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_always">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="Always on Tray"/>
+              </Properties>
+              <Events>
+                <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="jCheckBoxMenuItem_alwaysItemStateChanged"/>
+              </Events>
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_minimize">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="Minimize to Tray"/>
+              </Properties>
+            </MenuItem>
+            <MenuItem class="javax.swing.JCheckBoxMenuItem" name="jCheckBoxMenuItem_close">
+              <Properties>
+                <Property name="text" type="java.lang.String" value="Close to Tray"/>
+              </Properties>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+        <Menu class="javax.swing.JMenu" name="jMenu_help">
+          <Properties>
+            <Property name="mnemonic" type="int" value="72"/>
+            <Property name="text" type="java.lang.String" value="Help"/>
+          </Properties>
+          <SubComponents>
+            <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_version">
+              <Properties>
+                <Property name="mnemonic" type="int" value="86"/>
+                <Property name="text" type="java.lang.String" value="Version"/>
+                <Property name="enabled" type="boolean" value="false"/>
+              </Properties>
+              <Events>
+                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_versionActionPerformed"/>
+              </Events>
+            </MenuItem>
+          </SubComponents>
+        </Menu>
+      </SubComponents>
+    </Menu>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="0"/>
+    <Property name="title" type="java.lang.String" value="Beluga Client for Java"/>
+    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+      <Dimension value="[420, 367]"/>
+    </Property>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="menuBar" type="java.lang.String" value="jMenuBar"/>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <Events>
+    <EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="formWindowClosing"/>
+    <EventHandler event="windowIconified" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="formWindowIconified"/>
+  </Events>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-98,0,0,1,-111"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel_context">
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="Center"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+      <SubComponents>
+        <Container class="javax.swing.JPanel" name="jPanel_north">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="North"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+          <SubComponents>
+            <Container class="javax.swing.JPanel" name="jPanel_top">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="First"/>
+                </Constraint>
+              </Constraints>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+              <SubComponents>
+                <Component class="javax.swing.JLabel" name="jLabel_ident">
+                  <Properties>
+                    <Property name="text" type="java.lang.String" value="E-Mail"/>
+                  </Properties>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+                      <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="3" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+                    </Constraint>
+                  </Constraints>
+                </Component>
+                <Component class="javax.swing.JTextField" name="jTextField_ident">
+                  <Properties>
+                    <Property name="columns" type="int" value="12"/>
+                    <Property name="text" type="java.lang.String" value="zeebra@v7.com"/>
+                    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                      <Dimension value="[100, 19]"/>
+                    </Property>
+                  </Properties>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+                      <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="3" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+                    </Constraint>
+                  </Constraints>
+                </Component>
+                <Component class="javax.swing.JLabel" name="jLabel_password">
+                  <Properties>
+                    <Property name="text" type="java.lang.String" value="Password"/>
+                  </Properties>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+                      <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="3" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+                    </Constraint>
+                  </Constraints>
+                </Component>
+                <Component class="javax.swing.JPasswordField" name="jPasswordField_password">
+                  <Properties>
+                    <Property name="columns" type="int" value="12"/>
+                    <Property name="text" type="java.lang.String" value="noel2lip"/>
+                    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                      <Dimension value="[100, 19]"/>
+                    </Property>
+                  </Properties>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+                      <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="3" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+                    </Constraint>
+                  </Constraints>
+                </Component>
+                <Component class="javax.swing.JToggleButton" name="jToggleButton_login">
+                  <Properties>
+                    <Property name="text" type="java.lang.String" value="Login"/>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButton_loginActionPerformed"/>
+                  </Events>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+                      <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="5" insetsLeft="5" insetsBottom="5" insetsRight="5" anchor="10" weightX="0.0" weightY="0.0"/>
+                    </Constraint>
+                  </Constraints>
+                </Component>
+              </SubComponents>
+            </Container>
+            <Component class="javax.swing.JSeparator" name="jSeparator">
+              <Properties>
+                <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[0, 4]"/>
+                </Property>
+                <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[0, 4]"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="Center"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JPanel" name="jPanel_center">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="Center"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+          <SubComponents>
+            <Container class="javax.swing.JSplitPane" name="jSplitPane">
+              <Properties>
+                <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+                  <Border info="null"/>
+                </Property>
+                <Property name="dividerLocation" type="int" value="50"/>
+                <Property name="orientation" type="int" value="0"/>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="Center"/>
+                </Constraint>
+              </Constraints>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
+              <SubComponents>
+                <Container class="javax.swing.JPanel" name="jPanel_input">
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+                      <JSplitPaneConstraints position="top"/>
+                    </Constraint>
+                  </Constraints>
+
+                  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+                  <SubComponents>
+                    <Container class="javax.swing.JScrollPane" name="jScrollPane">
+                      <Properties>
+                        <Property name="verticalScrollBarPolicy" type="int" value="22"/>
+                        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[270, 50]"/>
+                        </Property>
+                        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[270, 50]"/>
+                        </Property>
+                      </Properties>
+                      <Events>
+                        <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jScrollPaneMouseReleased"/>
+                      </Events>
+                      <AuxValues>
+                        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+                      </AuxValues>
+                      <Constraints>
+                        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                          <BorderConstraints direction="Center"/>
+                        </Constraint>
+                      </Constraints>
+
+                      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+                      <SubComponents>
+                        <Component class="javax.swing.JTextArea" name="jTextArea_message">
+                          <Properties>
+                            <Property name="columns" type="int" value="38"/>
+                            <Property name="lineWrap" type="boolean" value="true"/>
+                            <Property name="rows" type="int" value="3"/>
+                            <Property name="tabSize" type="int" value="0"/>
+                            <Property name="wrapStyleWord" type="boolean" value="true"/>
+                            <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                              <Dimension value="[140, 50]"/>
+                            </Property>
+                          </Properties>
+                          <Events>
+                            <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jTextArea_messageMouseReleased"/>
+                            <EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="jTextArea_messageKeyTyped"/>
+                          </Events>
+                        </Component>
+                      </SubComponents>
+                    </Container>
+                    <Component class="javax.swing.JButton" name="jButton_send">
+                      <Properties>
+                        <Property name="text" type="java.lang.String" value="Send"/>
+                        <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+                          <Insets value="[0, 0, 0, 0]"/>
+                        </Property>
+                        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[50, 50]"/>
+                        </Property>
+                        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[50, 50]"/>
+                        </Property>
+                        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[50, 50]"/>
+                        </Property>
+                      </Properties>
+                      <Events>
+                        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton_sendActionPerformed"/>
+                      </Events>
+                      <Constraints>
+                        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                          <BorderConstraints direction="East"/>
+                        </Constraint>
+                      </Constraints>
+                    </Component>
+                    <Component class="javax.swing.JLabel" name="jLabel_icon">
+                      <Properties>
+                        <Property name="alignmentY" type="float" value="0.0"/>
+                        <Property name="iconTextGap" type="int" value="0"/>
+                        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[50, 50]"/>
+                        </Property>
+                        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[50, 50]"/>
+                        </Property>
+                        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[50, 50]"/>
+                        </Property>
+                      </Properties>
+                      <Constraints>
+                        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                          <BorderConstraints direction="West"/>
+                        </Constraint>
+                      </Constraints>
+                    </Component>
+                  </SubComponents>
+                </Container>
+                <Container class="javax.swing.JTabbedPane" name="jTabbedPane_pods">
+                  <Properties>
+                    <Property name="tabLayoutPolicy" type="int" value="1"/>
+                    <Property name="requestFocusEnabled" type="boolean" value="false"/>
+                  </Properties>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
+                      <JSplitPaneConstraints position="bottom"/>
+                    </Constraint>
+                  </Constraints>
+
+                  <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
+                </Container>
+              </SubComponents>
+            </Container>
+          </SubComponents>
+        </Container>
+        <Container class="javax.swing.JPanel" name="jPanel_south">
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="South"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+          <SubComponents>
+            <Container class="javax.swing.JPanel" name="jPanel_buttons">
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="Center"/>
+                </Constraint>
+              </Constraints>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+                <Property name="columns" type="int" value="5"/>
+                <Property name="rows" type="int" value="0"/>
+              </Layout>
+              <SubComponents>
+                <Component class="javax.swing.JButton" name="jButton_reload">
+                  <Properties>
+                    <Property name="text" type="java.lang.String" value="Reload"/>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton_reloadActionPerformed"/>
+                  </Events>
+                </Component>
+                <Component class="javax.swing.JToggleButton" name="jToggleButton_updates">
+                  <Properties>
+                    <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+                      <ComponentRef name="buttonGroup"/>
+                    </Property>
+                    <Property name="selected" type="boolean" value="true"/>
+                    <Property name="text" type="java.lang.String" value="Updates"/>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButton_updatesActionPerformed"/>
+                  </Events>
+                </Component>
+                <Component class="javax.swing.JToggleButton" name="jToggleButton_members">
+                  <Properties>
+                    <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+                      <ComponentRef name="buttonGroup"/>
+                    </Property>
+                    <Property name="text" type="java.lang.String" value="Members"/>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButton_membersActionPerformed"/>
+                  </Events>
+                </Component>
+                <Component class="javax.swing.JToggleButton" name="jToggleButton_map">
+                  <Properties>
+                    <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+                      <ComponentRef name="buttonGroup"/>
+                    </Property>
+                    <Property name="text" type="java.lang.String" value="Map"/>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButton_mapActionPerformed"/>
+                  </Events>
+                </Component>
+                <Component class="javax.swing.JToggleButton" name="jToggleButton_edit">
+                  <Properties>
+                    <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
+                      <ComponentRef name="buttonGroup"/>
+                    </Property>
+                    <Property name="text" type="java.lang.String" value="Edit"/>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleButton_editActionPerformed"/>
+                  </Events>
+                </Component>
+              </SubComponents>
+            </Container>
+            <Component class="javax.swing.JLabel" name="jLabel_status">
+              <Properties>
+                <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+                  <Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
+                    <BevelBorder bevelType="1"/>
+                  </Border>
+                </Property>
+                <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[4, 19]"/>
+                </Property>
+                <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[4, 19]"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="South"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/src/beluga/BelugaFrame.java b/src/beluga/BelugaFrame.java
new file mode 100644 (file)
index 0000000..a0fdcd1
--- /dev/null
@@ -0,0 +1,1218 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * BelugaFrame.java
+ *
+ * Created on 2011/06/23, 13:38:15
+ */
+
+package beluga;
+
+
+import org.apache.http.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.*;
+import java.awt.datatransfer.*;
+import java.awt.event.*;
+import java.io.*;
+import java.util.*;
+import java.util.prefs.Preferences;
+import java.util.regex.*;
+
+
+/**
+ *
+ * @author g9133
+ */
+public class BelugaFrame extends javax.swing.JFrame implements IFBelugaFrame {
+
+    /** Creates new form BelugaFrame */
+    public BelugaFrame() {
+        initComponents();
+
+        this.setIconImage(new ImageIcon(this.getClass().getResource("favicon.png")).getImage());
+
+        setLocationRelativeTo(null);
+
+        Preferences pref = Preferences.userNodeForPackage(this.getClass());
+        
+        try {
+            jCheckBoxMenuItem_auto_login.setSelected(pref.getBoolean("login.auto", false));
+            
+            jTextField_ident.setText(pref.get("login.id", ""));
+            jPasswordField_password.setText(pref.get("login.pass", ""));
+
+            jCheckBoxMenuItem_user  .setSelected(pref.getBoolean("icon.user"  , true));
+            jCheckBoxMenuItem_pod   .setSelected(pref.getBoolean("icon.pod"   , true));
+            jCheckBoxMenuItem_member.setSelected(pref.getBoolean("icon.member", true));
+
+            jSplitPane.setDividerLocation(pref.getInt("div.size", 50));
+
+            this.setLocation(pref.getInt("loc.x", this.getX()), pref.getInt("loc.y", this.getY()));
+            this.setSize    (pref.getInt("size.width", this.getWidth()), pref.getInt("size.height", this.getHeight()));
+
+            jCheckBoxMenuItem_ontop   .setSelected(pref.getBoolean("start.ontop"  , false));
+            jCheckBoxMenuItem_startup .setSelected(pref.getBoolean("start.up"     , false));
+            jCheckBoxMenuItem_always  .setSelected(pref.getBoolean("task.always"  , false));
+            jCheckBoxMenuItem_close   .setSelected(pref.getBoolean("task.close"   , false));
+            jCheckBoxMenuItem_minimize.setSelected(pref.getBoolean("task.minimize", false));
+
+            this.setAlwaysOnTop(jCheckBoxMenuItem_ontop.isSelected());
+
+            if (jCheckBoxMenuItem_always.isSelected()) {
+                checkTaskTray(false);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        jTextArea_message.addFocusListener(new IMEControl(IMEControl.KANJI));
+        jTabbedPane_pods.addChangeListener(new ChangeListener() {
+            @Override
+            public void stateChanged(ChangeEvent e) {
+                PodPane pp = getSelectedPodPane();
+                
+                if (pp == null) {
+                    return;
+                }
+                
+                String  action = (String)  jLabel_status.getClientProperty(pp.getPodBean().getId());
+
+                pp.show(action);
+
+                if ("Updates".equals(action)) {
+                    jToggleButton_updates.setSelected(true);
+                } else if ("Members".equals(action)) {
+                    jToggleButton_members.setSelected(true);
+                } else if ("Map".equals(action)) {
+                    jToggleButton_map.setSelected(true);
+                } else if ("Edit".equals(action)) {
+                    jToggleButton_edit.setSelected(true);
+                }
+
+                jTextArea_message.requestFocus();
+            }
+        });
+    }
+    
+    public void open() {
+        if (!jCheckBoxMenuItem_startup.isSelected()) {
+            this.setVisible(true);
+        }
+
+        new Thread() {
+            public void run() {
+                if (jCheckBoxMenuItem_auto_login.isSelected()) {
+                    jToggleButton_loginActionPerformed(null);
+                }
+            }
+        }.start();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+        java.awt.GridBagConstraints gridBagConstraints;
+
+        buttonGroup = new javax.swing.ButtonGroup();
+        jPopupMenu = new javax.swing.JPopupMenu();
+        jMenuItem_paste1 = new javax.swing.JMenuItem();
+        jPanel_context = new javax.swing.JPanel();
+        jPanel_north = new javax.swing.JPanel();
+        jPanel_top = new javax.swing.JPanel();
+        jLabel_ident = new javax.swing.JLabel();
+        jTextField_ident = new javax.swing.JTextField();
+        jLabel_password = new javax.swing.JLabel();
+        jPasswordField_password = new javax.swing.JPasswordField();
+        jToggleButton_login = new javax.swing.JToggleButton();
+        jSeparator = new javax.swing.JSeparator();
+        jPanel_center = new javax.swing.JPanel();
+        jSplitPane = new javax.swing.JSplitPane();
+        jPanel_input = new javax.swing.JPanel();
+        jScrollPane = new javax.swing.JScrollPane();
+        jTextArea_message = new javax.swing.JTextArea();
+        jButton_send = new javax.swing.JButton();
+        jLabel_icon = new javax.swing.JLabel();
+        jTabbedPane_pods = new javax.swing.JTabbedPane();
+        jPanel_south = new javax.swing.JPanel();
+        jPanel_buttons = new javax.swing.JPanel();
+        jButton_reload = new javax.swing.JButton();
+        jToggleButton_updates = new javax.swing.JToggleButton();
+        jToggleButton_members = new javax.swing.JToggleButton();
+        jToggleButton_map = new javax.swing.JToggleButton();
+        jToggleButton_edit = new javax.swing.JToggleButton();
+        jLabel_status = new javax.swing.JLabel();
+        jMenuBar = new javax.swing.JMenuBar();
+        jMenu_file = new javax.swing.JMenu();
+        jMenuItem_logout = new javax.swing.JMenuItem();
+        jCheckBoxMenuItem_auto_login = new javax.swing.JCheckBoxMenuItem();
+        jMenuItem_quit = new javax.swing.JMenuItem();
+        jMenu_edit = new javax.swing.JMenu();
+        jMenuItem_copy = new javax.swing.JMenuItem();
+        jMenuItem_paste = new javax.swing.JMenuItem();
+        jMenuItem_option = new javax.swing.JMenuItem();
+        jMenu_view = new javax.swing.JMenu();
+        jCheckBoxMenuItem_user = new javax.swing.JCheckBoxMenuItem();
+        jCheckBoxMenuItem_pod = new javax.swing.JCheckBoxMenuItem();
+        jCheckBoxMenuItem_member = new javax.swing.JCheckBoxMenuItem();
+        jSeparator1 = new javax.swing.JPopupMenu.Separator();
+        jCheckBoxMenuItem_ontop = new javax.swing.JCheckBoxMenuItem();
+        jSeparator2 = new javax.swing.JPopupMenu.Separator();
+        jCheckBoxMenuItem_startup = new javax.swing.JCheckBoxMenuItem();
+        jCheckBoxMenuItem_always = new javax.swing.JCheckBoxMenuItem();
+        jCheckBoxMenuItem_minimize = new javax.swing.JCheckBoxMenuItem();
+        jCheckBoxMenuItem_close = new javax.swing.JCheckBoxMenuItem();
+        jMenu_help = new javax.swing.JMenu();
+        jMenuItem_version = new javax.swing.JMenuItem();
+
+        jMenuItem_paste1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_paste1.setMnemonic('P');
+        jMenuItem_paste1.setText("Paste");
+        jMenuItem_paste1.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_paste1ActionPerformed(evt);
+            }
+        });
+        jPopupMenu.add(jMenuItem_paste1);
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
+        setTitle("Beluga Client for Java");
+        setMinimumSize(new java.awt.Dimension(420, 367));
+        addWindowListener(new java.awt.event.WindowAdapter() {
+            public void windowClosing(java.awt.event.WindowEvent evt) {
+                formWindowClosing(evt);
+            }
+            public void windowIconified(java.awt.event.WindowEvent evt) {
+                formWindowIconified(evt);
+            }
+        });
+
+        jPanel_context.setLayout(new java.awt.BorderLayout());
+
+        jPanel_north.setLayout(new java.awt.BorderLayout());
+
+        jPanel_top.setLayout(new java.awt.GridBagLayout());
+
+        jLabel_ident.setText("E-Mail");
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
+        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
+        jPanel_top.add(jLabel_ident, gridBagConstraints);
+
+        jTextField_ident.setColumns(12);
+        jTextField_ident.setText("zeebra@v7.com");
+        jTextField_ident.setMinimumSize(new java.awt.Dimension(100, 19));
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
+        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
+        jPanel_top.add(jTextField_ident, gridBagConstraints);
+
+        jLabel_password.setText("Password");
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
+        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
+        jPanel_top.add(jLabel_password, gridBagConstraints);
+
+        jPasswordField_password.setColumns(12);
+        jPasswordField_password.setText("noel2lip");
+        jPasswordField_password.setMinimumSize(new java.awt.Dimension(100, 19));
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
+        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
+        jPanel_top.add(jPasswordField_password, gridBagConstraints);
+
+        jToggleButton_login.setText("Login");
+        jToggleButton_login.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButton_loginActionPerformed(evt);
+            }
+        });
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
+        jPanel_top.add(jToggleButton_login, gridBagConstraints);
+
+        jPanel_north.add(jPanel_top, java.awt.BorderLayout.PAGE_START);
+
+        jSeparator.setMinimumSize(new java.awt.Dimension(0, 4));
+        jSeparator.setPreferredSize(new java.awt.Dimension(0, 4));
+        jPanel_north.add(jSeparator, java.awt.BorderLayout.CENTER);
+
+        jPanel_context.add(jPanel_north, java.awt.BorderLayout.NORTH);
+
+        jPanel_center.setLayout(new java.awt.BorderLayout());
+
+        jSplitPane.setBorder(null);
+        jSplitPane.setDividerLocation(50);
+        jSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
+
+        jPanel_input.setLayout(new java.awt.BorderLayout());
+
+        jScrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+        jScrollPane.setMinimumSize(new java.awt.Dimension(270, 50));
+        jScrollPane.setPreferredSize(new java.awt.Dimension(270, 50));
+        jScrollPane.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseReleased(java.awt.event.MouseEvent evt) {
+                jScrollPaneMouseReleased(evt);
+            }
+        });
+
+        jTextArea_message.setColumns(38);
+        jTextArea_message.setLineWrap(true);
+        jTextArea_message.setRows(3);
+        jTextArea_message.setTabSize(0);
+        jTextArea_message.setWrapStyleWord(true);
+        jTextArea_message.setMinimumSize(new java.awt.Dimension(140, 50));
+        jTextArea_message.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseReleased(java.awt.event.MouseEvent evt) {
+                jTextArea_messageMouseReleased(evt);
+            }
+        });
+        jTextArea_message.addKeyListener(new java.awt.event.KeyAdapter() {
+            public void keyTyped(java.awt.event.KeyEvent evt) {
+                jTextArea_messageKeyTyped(evt);
+            }
+        });
+        jScrollPane.setViewportView(jTextArea_message);
+
+        jPanel_input.add(jScrollPane, java.awt.BorderLayout.CENTER);
+
+        jButton_send.setText("Send");
+        jButton_send.setMargin(new java.awt.Insets(0, 0, 0, 0));
+        jButton_send.setMaximumSize(new java.awt.Dimension(50, 50));
+        jButton_send.setMinimumSize(new java.awt.Dimension(50, 50));
+        jButton_send.setPreferredSize(new java.awt.Dimension(50, 50));
+        jButton_send.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButton_sendActionPerformed(evt);
+            }
+        });
+        jPanel_input.add(jButton_send, java.awt.BorderLayout.EAST);
+
+        jLabel_icon.setAlignmentY(0.0F);
+        jLabel_icon.setIconTextGap(0);
+        jLabel_icon.setMaximumSize(new java.awt.Dimension(50, 50));
+        jLabel_icon.setMinimumSize(new java.awt.Dimension(50, 50));
+        jLabel_icon.setPreferredSize(new java.awt.Dimension(50, 50));
+        jPanel_input.add(jLabel_icon, java.awt.BorderLayout.WEST);
+
+        jSplitPane.setTopComponent(jPanel_input);
+
+        jTabbedPane_pods.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT);
+        jTabbedPane_pods.setRequestFocusEnabled(false);
+        jSplitPane.setBottomComponent(jTabbedPane_pods);
+
+        jPanel_center.add(jSplitPane, java.awt.BorderLayout.CENTER);
+
+        jPanel_context.add(jPanel_center, java.awt.BorderLayout.CENTER);
+
+        jPanel_south.setLayout(new java.awt.BorderLayout());
+
+        jPanel_buttons.setLayout(new java.awt.GridLayout(0, 5));
+
+        jButton_reload.setText("Reload");
+        jButton_reload.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButton_reloadActionPerformed(evt);
+            }
+        });
+        jPanel_buttons.add(jButton_reload);
+
+        buttonGroup.add(jToggleButton_updates);
+        jToggleButton_updates.setSelected(true);
+        jToggleButton_updates.setText("Updates");
+        jToggleButton_updates.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButton_updatesActionPerformed(evt);
+            }
+        });
+        jPanel_buttons.add(jToggleButton_updates);
+
+        buttonGroup.add(jToggleButton_members);
+        jToggleButton_members.setText("Members");
+        jToggleButton_members.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButton_membersActionPerformed(evt);
+            }
+        });
+        jPanel_buttons.add(jToggleButton_members);
+
+        buttonGroup.add(jToggleButton_map);
+        jToggleButton_map.setText("Map");
+        jToggleButton_map.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButton_mapActionPerformed(evt);
+            }
+        });
+        jPanel_buttons.add(jToggleButton_map);
+
+        buttonGroup.add(jToggleButton_edit);
+        jToggleButton_edit.setText("Edit");
+        jToggleButton_edit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jToggleButton_editActionPerformed(evt);
+            }
+        });
+        jPanel_buttons.add(jToggleButton_edit);
+
+        jPanel_south.add(jPanel_buttons, java.awt.BorderLayout.CENTER);
+
+        jLabel_status.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
+        jLabel_status.setMinimumSize(new java.awt.Dimension(4, 19));
+        jLabel_status.setPreferredSize(new java.awt.Dimension(4, 19));
+        jPanel_south.add(jLabel_status, java.awt.BorderLayout.SOUTH);
+
+        jPanel_context.add(jPanel_south, java.awt.BorderLayout.SOUTH);
+
+        getContentPane().add(jPanel_context, java.awt.BorderLayout.CENTER);
+
+        jMenu_file.setMnemonic('F');
+        jMenu_file.setText("File");
+
+        jMenuItem_logout.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_logout.setMnemonic('L');
+        jMenuItem_logout.setText("Logout");
+        jMenuItem_logout.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_logoutActionPerformed(evt);
+            }
+        });
+        jMenu_file.add(jMenuItem_logout);
+
+        jCheckBoxMenuItem_auto_login.setText("Auto Login");
+        jMenu_file.add(jCheckBoxMenuItem_auto_login);
+
+        jMenuItem_quit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_quit.setMnemonic('Q');
+        jMenuItem_quit.setText("Quit");
+        jMenuItem_quit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_quitActionPerformed(evt);
+            }
+        });
+        jMenu_file.add(jMenuItem_quit);
+
+        jMenuBar.add(jMenu_file);
+
+        jMenu_edit.setMnemonic('E');
+        jMenu_edit.setText("Edit");
+
+        jMenuItem_copy.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_copy.setMnemonic('C');
+        jMenuItem_copy.setText("Copy");
+        jMenu_edit.add(jMenuItem_copy);
+
+        jMenuItem_paste.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_paste.setMnemonic('P');
+        jMenuItem_paste.setText("Paste");
+        jMenu_edit.add(jMenuItem_paste);
+
+        jMenuItem_option.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_option.setMnemonic('O');
+        jMenuItem_option.setText("Option");
+        jMenuItem_option.setEnabled(false);
+        jMenuItem_option.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_optionActionPerformed(evt);
+            }
+        });
+        jMenu_edit.add(jMenuItem_option);
+
+        jMenuBar.add(jMenu_edit);
+
+        jMenu_view.setMnemonic('V');
+        jMenu_view.setText("View");
+
+        jCheckBoxMenuItem_user.setSelected(true);
+        jCheckBoxMenuItem_user.setText("Your Icon");
+        jCheckBoxMenuItem_user.addItemListener(new java.awt.event.ItemListener() {
+            public void itemStateChanged(java.awt.event.ItemEvent evt) {
+                jCheckBoxMenuItem_userItemStateChanged(evt);
+            }
+        });
+        jMenu_view.add(jCheckBoxMenuItem_user);
+
+        jCheckBoxMenuItem_pod.setSelected(true);
+        jCheckBoxMenuItem_pod.setText("Pod Icon");
+        jCheckBoxMenuItem_pod.addItemListener(new java.awt.event.ItemListener() {
+            public void itemStateChanged(java.awt.event.ItemEvent evt) {
+                jCheckBoxMenuItem_podItemStateChanged(evt);
+            }
+        });
+        jMenu_view.add(jCheckBoxMenuItem_pod);
+
+        jCheckBoxMenuItem_member.setSelected(true);
+        jCheckBoxMenuItem_member.setText("Member Icon");
+        jCheckBoxMenuItem_member.addItemListener(new java.awt.event.ItemListener() {
+            public void itemStateChanged(java.awt.event.ItemEvent evt) {
+                jCheckBoxMenuItem_memberItemStateChanged(evt);
+            }
+        });
+        jMenu_view.add(jCheckBoxMenuItem_member);
+        jMenu_view.add(jSeparator1);
+
+        jCheckBoxMenuItem_ontop.setSelected(true);
+        jCheckBoxMenuItem_ontop.setText("Always on Top");
+        jCheckBoxMenuItem_ontop.addItemListener(new java.awt.event.ItemListener() {
+            public void itemStateChanged(java.awt.event.ItemEvent evt) {
+                jCheckBoxMenuItem_ontopItemStateChanged(evt);
+            }
+        });
+        jMenu_view.add(jCheckBoxMenuItem_ontop);
+        jMenu_view.add(jSeparator2);
+
+        jCheckBoxMenuItem_startup.setText("Startup with Tray");
+        jMenu_view.add(jCheckBoxMenuItem_startup);
+
+        jCheckBoxMenuItem_always.setText("Always on Tray");
+        jCheckBoxMenuItem_always.addItemListener(new java.awt.event.ItemListener() {
+            public void itemStateChanged(java.awt.event.ItemEvent evt) {
+                jCheckBoxMenuItem_alwaysItemStateChanged(evt);
+            }
+        });
+        jMenu_view.add(jCheckBoxMenuItem_always);
+
+        jCheckBoxMenuItem_minimize.setText("Minimize to Tray");
+        jMenu_view.add(jCheckBoxMenuItem_minimize);
+
+        jCheckBoxMenuItem_close.setText("Close to Tray");
+        jMenu_view.add(jCheckBoxMenuItem_close);
+
+        jMenuBar.add(jMenu_view);
+
+        jMenu_help.setMnemonic('H');
+        jMenu_help.setText("Help");
+
+        jMenuItem_version.setMnemonic('V');
+        jMenuItem_version.setText("Version");
+        jMenuItem_version.setEnabled(false);
+        jMenuItem_version.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_versionActionPerformed(evt);
+            }
+        });
+        jMenu_help.add(jMenuItem_version);
+
+        jMenuBar.add(jMenu_help);
+
+        setJMenuBar(jMenuBar);
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    private HashMap    constant_map = null;
+    private WaitWindow waitWindow    = null;
+
+    private void jToggleButton_loginActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton_loginActionPerformed
+        if (isShowing()) {
+            showWaitWindow("Please wait logging...");
+        }
+        
+        try {
+            if ((constant_map = login()) == null) {
+                closeWaitWindow();
+                return;
+            }
+
+            displayMessage("Beluga", "Login Successfly", TrayIcon.MessageType.INFO);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            displayMessage("Error", "Network error\n" + ex.getMessage(), TrayIcon.MessageType.ERROR);
+
+            setVisible(true);
+            setExtendedState(JFrame.NORMAL);
+            return;
+        } finally {
+            closeWaitWindow();
+        }
+
+        jPanel_north.setVisible(false);
+
+        this.setHttpClient((DefaultHttpClient) constant_map.get("client"));
+
+        jLabel_icon.setIcon(getImageIcon(getHttpClient(), (String) constant_map.get("user_image")));
+
+        SwingUtilities.invokeLater(new Runnable() {
+               public void run() {
+                   podsSetting();
+               }
+           });
+        
+    }//GEN-LAST:event_jToggleButton_loginActionPerformed
+
+    public HashMap getConstantMap() {
+        return constant_map;
+    }
+
+    private DefaultHttpClient client = null;
+    
+    private void setHttpClient(DefaultHttpClient client) {
+        this.client = client;
+    }
+    
+    public DefaultHttpClient getHttpClient() {
+        return this.client;
+    }
+    
+    private void jToggleButton_updatesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton_updatesActionPerformed
+        if (getSelectedPodPane() == null) {
+            return;
+        }
+
+        getSelectedPodPane().show(evt.getActionCommand());
+        jLabel_status.putClientProperty(getSelectedPodPane().getPodBean().getId(), evt.getActionCommand());
+    }//GEN-LAST:event_jToggleButton_updatesActionPerformed
+
+    private void jToggleButton_membersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton_membersActionPerformed
+        if (getSelectedPodPane() == null) {
+            return;
+        }
+
+        getSelectedPodPane().show(evt.getActionCommand());
+        jLabel_status.putClientProperty(getSelectedPodPane().getPodBean().getId(), evt.getActionCommand());
+    }//GEN-LAST:event_jToggleButton_membersActionPerformed
+
+    private void jToggleButton_mapActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton_mapActionPerformed
+        JOptionPane.showMessageDialog(this, "Map is not supported.", "Info", JOptionPane.WARNING_MESSAGE);
+
+        if (true) {
+            return;
+        }
+
+        if (getSelectedPodPane() == null) {
+            return;
+        }
+
+        getSelectedPodPane().show(evt.getActionCommand());
+        jLabel_status.putClientProperty(getSelectedPodPane().getPodBean().getId(), evt.getActionCommand());
+    }//GEN-LAST:event_jToggleButton_mapActionPerformed
+
+    private void jToggleButton_editActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton_editActionPerformed
+        if (getSelectedPodPane() == null) {
+            return;
+        }
+
+        getSelectedPodPane().show(evt.getActionCommand());
+        jLabel_status.putClientProperty(getSelectedPodPane().getPodBean().getId(), evt.getActionCommand());
+    }//GEN-LAST:event_jToggleButton_editActionPerformed
+
+    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
+        if (jCheckBoxMenuItem_close.isSelected()) {
+            checkTaskTray(true);
+            return;
+        }
+
+        systemExit(true);
+    }//GEN-LAST:event_formWindowClosing
+    
+    private void systemExit(boolean isConfirm) {
+        if (isConfirm) {
+            int ans = JOptionPane.showConfirmDialog(this, "Quit?", "Question", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
+    
+            if (ans != JOptionPane.YES_OPTION) {
+                return;
+            }
+        }
+
+        if (this.getHttpClient() != null) {
+            this.getHttpClient().getConnectionManager().shutdown();
+        }
+
+        Preferences pref = Preferences.userNodeForPackage(this.getClass());
+
+        try {
+            pref.putBoolean("login.auto" , jCheckBoxMenuItem_auto_login.isSelected());
+            pref.put       ("login.id"   , jTextField_ident.getText());
+            pref.put       ("login.pass" , String.valueOf(jPasswordField_password.getPassword()));
+            pref.putBoolean("icon.user"  , jCheckBoxMenuItem_user.isSelected());
+            pref.putBoolean("icon.pod"   , jCheckBoxMenuItem_pod.isSelected());
+            pref.putBoolean("icon.member", jCheckBoxMenuItem_member.isSelected());
+
+            try {
+                pref.putInt("div.size"   , jSplitPane.getDividerLocation());
+                pref.putInt("loc.x"      , getLocation().x);
+                pref.putInt("loc.y"      , getLocation().y);
+                pref.putInt("size.width" , getWidth());
+                pref.putInt("size.height", getHeight());
+            } catch (Exception ex) {
+            }
+
+            pref.putBoolean("start.ontop"  , jCheckBoxMenuItem_ontop.isSelected());
+            pref.putBoolean("start.up"     , jCheckBoxMenuItem_startup.isSelected());
+            pref.putBoolean("task.always"  , jCheckBoxMenuItem_always.isSelected());
+            pref.putBoolean("task.close"   , jCheckBoxMenuItem_always.isSelected());
+            pref.putBoolean("task.minimize", jCheckBoxMenuItem_always.isSelected());
+
+            pref.flush();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        System.exit(0);
+    }
+
+    private void jButton_sendActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_sendActionPerformed
+        try {
+            if (getSelectedPodPane() == null) {
+                return;
+            }
+
+            if (jTextArea_message.getText().length() < 1) {
+                return;
+            }
+
+            getSelectedPodPane().send(jTextArea_message.getText());
+
+            jToggleButton_updatesActionPerformed(new ActionEvent(jToggleButton_updates, 0, jToggleButton_updates.getActionCommand()));
+        } catch (Exception ex) {
+            ex.printStackTrace();
+
+            JOptionPane.showMessageDialog(this, "Send Error.\nPlease check me connection.", "Error", JOptionPane.ERROR_MESSAGE);
+            return;
+        }
+
+        jTextArea_message.setText("");
+    }//GEN-LAST:event_jButton_sendActionPerformed
+
+    private void jButton_reloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_reloadActionPerformed
+        try {
+            new Thread() {
+                public void run() {
+                    showWaitWindow("Please wait reload...");
+
+                    if (getSelectedPodPane() != null) {
+                        getSelectedPodPane().updatePod();
+                    }
+
+                    closeWaitWindow();
+                }
+            }.start();
+        } catch (NullPointerException ex) {
+            ex.printStackTrace();
+        }
+    }//GEN-LAST:event_jButton_reloadActionPerformed
+
+    private void jMenuItem_quitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_quitActionPerformed
+        systemExit(true);
+    }//GEN-LAST:event_jMenuItem_quitActionPerformed
+
+    private void jMenuItem_optionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_optionActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_jMenuItem_optionActionPerformed
+
+    private void jMenuItem_versionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_versionActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_jMenuItem_versionActionPerformed
+
+    private void jTextArea_messageKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextArea_messageKeyTyped
+        if (evt.getKeyChar() == evt.VK_TAB) {
+            evt.consume();
+            jButton_send.requestFocus();
+        }
+
+        if (evt.getKeyChar() == evt.VK_ESCAPE) {
+            evt.consume();
+            
+            jTextArea_message.setText("");
+        }
+    }//GEN-LAST:event_jTextArea_messageKeyTyped
+
+    private void jMenuItem_paste1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_paste1ActionPerformed
+        Transferable object = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
+
+        try {
+            jTextArea_message.setText((String) object.getTransferData(DataFlavor.stringFlavor));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }//GEN-LAST:event_jMenuItem_paste1ActionPerformed
+
+    private void jScrollPaneMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jScrollPaneMouseReleased
+        jMenuItem_paste1ActionPerformed(null);
+    }//GEN-LAST:event_jScrollPaneMouseReleased
+
+    private void jTextArea_messageMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTextArea_messageMouseReleased
+        if (!evt.isPopupTrigger()) {
+            return;
+        }
+
+        jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
+    }//GEN-LAST:event_jTextArea_messageMouseReleased
+
+    private void jCheckBoxMenuItem_userItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jCheckBoxMenuItem_userItemStateChanged
+        if (jCheckBoxMenuItem_user.isSelected()) {
+            jPanel_input.add(jLabel_icon, "West");
+        } else {
+            jPanel_input.remove(jLabel_icon);
+        }
+
+        jPanel_input.updateUI();
+    }//GEN-LAST:event_jCheckBoxMenuItem_userItemStateChanged
+
+    private void jCheckBoxMenuItem_podItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jCheckBoxMenuItem_podItemStateChanged
+        for (int i = 0; i < jTabbedPane_pods.getTabCount(); i++) {
+            jTabbedPane_pods.setIconAt(i, jCheckBoxMenuItem_pod.isSelected() ? getPodPaneAt(i).getPodImage() : null);
+            
+            if (jTabbedPane_pods.getTabComponentAt(i) != null) {
+                ((JLabel) jTabbedPane_pods.getTabComponentAt(i)).setIcon(jCheckBoxMenuItem_pod.isSelected() ? getPodPaneAt(i).getPodImage() : null);
+            }
+        }
+    }//GEN-LAST:event_jCheckBoxMenuItem_podItemStateChanged
+
+    private void jCheckBoxMenuItem_memberItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jCheckBoxMenuItem_memberItemStateChanged
+        new Thread() {
+            public void run() {
+                for (int i = 0; i < jTabbedPane_pods.getTabCount(); i++) {
+                    getPodPaneAt(i).setVisibleIcon(jCheckBoxMenuItem_member.isSelected());
+                    getPodPaneAt(i).updateUI();
+                }
+            }
+        }.start();
+    }//GEN-LAST:event_jCheckBoxMenuItem_memberItemStateChanged
+
+    private void formWindowIconified(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowIconified
+        if (jCheckBoxMenuItem_always.isSelected() || jCheckBoxMenuItem_minimize.isSelected()) {
+            checkTaskTray(true);
+            return;
+        }
+    }//GEN-LAST:event_formWindowIconified
+
+    private void jCheckBoxMenuItem_alwaysItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jCheckBoxMenuItem_alwaysItemStateChanged
+        jCheckBoxMenuItem_minimize.setEnabled(!jCheckBoxMenuItem_always.isSelected());
+        jCheckBoxMenuItem_close   .setEnabled(!jCheckBoxMenuItem_always.isSelected());
+    }//GEN-LAST:event_jCheckBoxMenuItem_alwaysItemStateChanged
+
+    private void jMenuItem_logoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_logoutActionPerformed
+        jPanel_north.setVisible(true);
+        jTabbedPane_pods.removeAll();
+    }//GEN-LAST:event_jMenuItem_logoutActionPerformed
+
+    private void jCheckBoxMenuItem_ontopItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jCheckBoxMenuItem_ontopItemStateChanged
+        this.setAlwaysOnTop(jCheckBoxMenuItem_ontop.isSelected());
+    }//GEN-LAST:event_jCheckBoxMenuItem_ontopItemStateChanged
+
+    private PodPane getSelectedPodPane() {
+        return getPodPaneAt(jTabbedPane_pods.getSelectedIndex());
+    }
+
+    private PodPane getPodPaneAt(int index) {
+        if (index < 0) {
+            return null;
+        }
+        
+        if (jTabbedPane_pods.getComponentAt(index) == null) {
+            return null;
+        }
+        
+        Component compo = jTabbedPane_pods.getComponentAt(index);
+
+        if (compo == null || !(compo instanceof PodPane)) {
+            return null;
+        }
+
+        PodPane podPane = (PodPane) compo;
+
+        if (podPane == null) {
+            return null;
+        }
+
+        return podPane;
+    }
+    
+    private boolean checkInputField() {
+        if (jTextField_ident.getText().length() < 1) {
+            if (!isShowing()) {
+                setVisible(true);
+                setExtendedState(JFrame.NORMAL);
+            }
+
+            JOptionPane.showMessageDialog(this, "Please input [ E-Mail ] field.", "Input error", JOptionPane.ERROR_MESSAGE);
+
+            SwingUtilities.invokeLater(new Runnable() {
+                                            public void run() {
+                                                jTextField_ident.requestFocus();
+                                                jTextField_ident.selectAll();
+                                                jToggleButton_login.setSelected(false);
+                                            }
+                                        });
+
+            return false;
+        }
+
+        if (!Pattern.compile("[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+").matcher(jTextField_ident.getText()).matches()) {
+            if (!isShowing()) {
+                setVisible(true);
+                setExtendedState(JFrame.NORMAL);
+            }
+
+            JOptionPane.showMessageDialog(this, "Please input [ E-Mail ] field.", "Format error", JOptionPane.ERROR_MESSAGE);
+
+            SwingUtilities.invokeLater(new Runnable() {
+                                            public void run() {
+                                                jTextField_ident.requestFocus();
+                                                jTextField_ident.selectAll();
+                                                jToggleButton_login.setSelected(false);
+                                            }
+                                        });
+
+            return false;
+        }
+
+        if (jPasswordField_password.getPassword().length < 1) {
+            if (!isShowing()) {
+                setVisible(true);
+                setExtendedState(JFrame.NORMAL);
+            }
+
+            JOptionPane.showMessageDialog(this, "Please input [ Password ] field.", "Input error", JOptionPane.ERROR_MESSAGE);
+
+            SwingUtilities.invokeLater(new Runnable() {
+                                            public void run() {
+                                                jPasswordField_password.requestFocus();
+                                                jToggleButton_login.setSelected(false);
+                                            }
+                                        });
+
+            return false;
+        }
+
+        return true;
+    }
+
+    private HashMap login() throws Exception {
+        if (!checkInputField()) {
+            return null;
+        }
+
+        try {
+            HashMap map = BelugaClient.login(jTextField_ident.getText(), String.valueOf(jPasswordField_password.getPassword()));
+    
+            if (map == null) {
+                closeWaitWindow();
+
+                if (!isShowing()) {
+                    setVisible(true);
+                    setExtendedState(JFrame.NORMAL);
+                }
+
+                JOptionPane.showMessageDialog(this, "Please check [ E-Mail ] or [ Password ] field.", "Login error", JOptionPane.ERROR_MESSAGE);
+    
+                SwingUtilities.invokeLater(new Runnable() {
+                    public void run() {
+                        jTextField_ident.selectAll();
+                        jTextField_ident.requestFocus();
+                        jToggleButton_login.setSelected(false);
+                    }
+                });
+            }
+
+            return map;
+        } catch (Exception ex) {
+            throw ex;
+        }
+    }
+    
+    private void podsSetting() {
+        PodBean[] pods = getPodBean();
+
+        for (final PodBean pb : pods) {
+            new Thread() {
+                public void run() { 
+                    PodPane podPane = new PodPane(BelugaFrame.this, pb);
+
+                    jTabbedPane_pods.addTab(pb.getPodTitle(), jCheckBoxMenuItem_pod.isSelected() ? podPane.getPodImage() : null, podPane);
+                    jTabbedPane_pods.setTabComponentAt(jTabbedPane_pods.getTabCount() - 1, new JLabel(pb.getPodTitle(), jCheckBoxMenuItem_pod.isSelected() ? podPane.getPodImage() : null, JLabel.HORIZONTAL));
+                    jLabel_status.putClientProperty(pb.getId(), "Updates");
+                    
+                    podPane.setVisibleIcon(jCheckBoxMenuItem_member.isSelected());
+
+                    jPanel_context.updateUI();
+
+                    if (jTabbedPane_pods.getTabCount() > 0) {
+                        jButton_send.setEnabled(true);
+                        jButton_reload.setEnabled(true);
+                        jToggleButton_updates.setEnabled(true);
+                        jToggleButton_members.setEnabled(true);
+                        jToggleButton_map.setEnabled(true);
+                        jToggleButton_edit.setEnabled(true);
+                    }
+
+                    closeWaitWindow();
+                }
+            }.start();
+        }
+    }
+
+
+    private HashMap image_map = new HashMap();
+    
+    public ImageIcon getImageIcon(DefaultHttpClient cli, String uri) {
+        if (!image_map.containsKey(uri)) {
+            try {
+                HttpGet      get = new HttpGet("http://belugapods.com" + uri);
+                HttpResponse res = cli.execute(get);
+                HttpEntity   ent = res.getEntity();
+        
+                BufferedInputStream   bis  = new BufferedInputStream(ent.getContent());
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                byte[]                data = new byte[512];
+                int                   len  = -1;
+                
+                while ((len = bis.read(data, 0, data.length)) != -1) {
+                    baos.write(data, 0, len);
+                }
+        
+                image_map.put(uri, new ImageIcon(new ImageIcon(baos.toByteArray()).getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH)));
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+
+        return (ImageIcon) image_map.get(uri);
+    }
+    
+    public PodBean[] getPodBean() {
+        return (PodBean[]) constant_map.get("pods");
+    }
+
+    public HashMap getImageMap() {
+        return image_map;
+    }
+    
+    public JLabel getStatusBar() {
+        return jLabel_status;
+    }
+    
+    public void setStatusBar(String status) {
+        jLabel_status.setText(status);
+    }
+    
+    private void showWaitWindow(final String message) {
+//        waitWindow = new WaitWindow(this);
+//
+//        new Thread() {
+//            public void run() {
+//                waitWindow.setMessage(message);
+//                waitWindow.start();
+//            }
+//        }.start();
+    }
+
+    private void closeWaitWindow() {
+//        if (waitWindow == null) {
+//            return;
+//        }
+//
+//        waitWindow.dispose();
+//        waitWindow = null;
+    }
+
+    private class WaitWindow extends Thread {
+        private JDialog jDialog = null;
+        JLabel jLabel_message = null;
+
+        public WaitWindow(JFrame parent) {
+            super();
+
+            jDialog = new JDialog(parent, true);
+            jDialog.setUndecorated(true);
+            jDialog.setSize(200, 80);
+            jDialog.setLocationRelativeTo(parent);
+            
+            Container con = jDialog.getContentPane();
+
+            jLabel_message = new JLabel();
+            jLabel_message.setHorizontalAlignment(JLabel.CENTER);
+            jLabel_message.setBackground(SystemColor.control);
+            jLabel_message.setBorder(BorderFactory.createEtchedBorder());
+            jLabel_message.addMouseListener(new MouseAdapter() {
+                @Override
+                public void mouseClicked(MouseEvent e) {
+                    if (e.getButton() == e.BUTTON1 && e.getClickCount() == 2) {
+                        jDialog.dispose();
+                    }
+                }
+            });
+            
+            con.add(jLabel_message, "Center");
+        }
+
+        public void run() {
+            jDialog.setVisible(true);
+        }
+
+        public void setMessage(String message) {
+            jLabel_message.setText(message);
+        }
+
+        public void dispose() {
+            jDialog.dispose();
+        }
+    }
+
+    private TrayIcon icon = null;
+
+    private void checkTaskTray(boolean isClose) {
+        try {
+            if (icon == null) {
+                if (!SystemTray.isSupported()) {
+                    return;
+                }
+
+                PopupMenu popupMenu = new PopupMenu();
+                MenuItem  menuItem  = new MenuItem("Quit");
+                
+                menuItem.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        systemExit(false);
+                    }
+                });
+
+                popupMenu.add(menuItem);
+
+                icon = new TrayIcon(getIconImage(), "Beluga Client for Java", popupMenu);
+
+                icon.addMouseListener(new MouseAdapter() {
+                    @Override
+                    public void mouseReleased(MouseEvent e) {
+                        if (e.getButton() == e.BUTTON1) {
+                            try {
+                                if (!isShowing()) {
+                                    setVisible(true);
+                                    setExtendedState(JFrame.NORMAL);
+                                } else {
+                                    setVisible(false);
+                                    setExtendedState(JFrame.ICONIFIED);
+                                }
+                            } finally {
+                                if (!jCheckBoxMenuItem_startup.isSelected() || !jCheckBoxMenuItem_always.isSelected()) {
+                                    SystemTray.getSystemTray().remove(icon);
+                                }
+                            }
+                        }
+                    }
+                });
+            }
+
+            try {
+                SystemTray.getSystemTray().add(icon);
+            } catch (Exception ex) {}
+
+            if (isClose) {
+                this.setState(JFrame.ICONIFIED);
+                this.setVisible(false);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+    
+    public void setMessage(String message) {
+        setMessage(message, false);
+    }
+
+    public void setMessage(String message, boolean isTop) {
+        jTextArea_message.setText(message.replaceAll("<br>", "").replaceAll("</.*>", "").replaceAll("<.*>", ""));
+
+        if (isTop) {
+            jTextArea_message.getCaret().moveDot(0);
+        } else {
+            jTextArea_message.getCaret().moveDot(jTextArea_message.getText().length());
+        }
+
+        jTextArea_message.select(0, 0);
+    }
+        
+    public void displayMessage(String caption, String message, TrayIcon.MessageType type) {
+        if (icon == null) {
+            return;
+        }
+
+        icon.displayMessage(caption, message, type);
+    }
+
+    /**
+    * @param args the command line arguments
+    */
+    public static void main(String args[]) {
+        try {
+            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+            
+            System.setProperty("awt.useSystemAAFontSettings", "on");
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        java.awt.EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                new BelugaFrame().open();
+            }
+        });
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.ButtonGroup buttonGroup;
+    private javax.swing.JButton jButton_reload;
+    private javax.swing.JButton jButton_send;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_always;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_auto_login;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_close;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_member;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_minimize;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_ontop;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_pod;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_startup;
+    private javax.swing.JCheckBoxMenuItem jCheckBoxMenuItem_user;
+    private javax.swing.JLabel jLabel_icon;
+    private javax.swing.JLabel jLabel_ident;
+    private javax.swing.JLabel jLabel_password;
+    private javax.swing.JLabel jLabel_status;
+    private javax.swing.JMenuBar jMenuBar;
+    private javax.swing.JMenuItem jMenuItem_copy;
+    private javax.swing.JMenuItem jMenuItem_logout;
+    private javax.swing.JMenuItem jMenuItem_option;
+    private javax.swing.JMenuItem jMenuItem_paste;
+    private javax.swing.JMenuItem jMenuItem_paste1;
+    private javax.swing.JMenuItem jMenuItem_quit;
+    private javax.swing.JMenuItem jMenuItem_version;
+    private javax.swing.JMenu jMenu_edit;
+    private javax.swing.JMenu jMenu_file;
+    private javax.swing.JMenu jMenu_help;
+    private javax.swing.JMenu jMenu_view;
+    private javax.swing.JPanel jPanel_buttons;
+    private javax.swing.JPanel jPanel_center;
+    private javax.swing.JPanel jPanel_context;
+    private javax.swing.JPanel jPanel_input;
+    private javax.swing.JPanel jPanel_north;
+    private javax.swing.JPanel jPanel_south;
+    private javax.swing.JPanel jPanel_top;
+    private javax.swing.JPasswordField jPasswordField_password;
+    private javax.swing.JPopupMenu jPopupMenu;
+    private javax.swing.JScrollPane jScrollPane;
+    private javax.swing.JSeparator jSeparator;
+    private javax.swing.JPopupMenu.Separator jSeparator1;
+    private javax.swing.JPopupMenu.Separator jSeparator2;
+    private javax.swing.JSplitPane jSplitPane;
+    private javax.swing.JTabbedPane jTabbedPane_pods;
+    private javax.swing.JTextArea jTextArea_message;
+    private javax.swing.JTextField jTextField_ident;
+    private javax.swing.JToggleButton jToggleButton_edit;
+    private javax.swing.JToggleButton jToggleButton_login;
+    private javax.swing.JToggleButton jToggleButton_map;
+    private javax.swing.JToggleButton jToggleButton_members;
+    private javax.swing.JToggleButton jToggleButton_updates;
+    // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/beluga/EditorPane.form b/src/beluga/EditorPane.form
new file mode 100644 (file)
index 0000000..b0bb570
--- /dev/null
@@ -0,0 +1,98 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-80,0,0,1,-37"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="jLabel_topic">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="Topic"/>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+          <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="10" insetsLeft="15" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Component class="javax.swing.JTextField" name="jTextField_topic">
+      <Properties>
+        <Property name="columns" type="int" value="30"/>
+        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[186, 19]"/>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+          <GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="10" insetsLeft="10" insetsBottom="0" insetsRight="10" anchor="13" weightX="0.0" weightY="0.0"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Component class="javax.swing.JLabel" name="jLabel_member">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="Add Members"/>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+          <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="10" insetsLeft="15" insetsBottom="0" insetsRight="0" anchor="11" weightX="0.0" weightY="0.0"/>
+        </Constraint>
+      </Constraints>
+    </Component>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+          <GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="10" insetsLeft="10" insetsBottom="0" insetsRight="10" anchor="10" weightX="0.0" weightY="0.0"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTextArea" name="jTextArea_emails">
+          <Properties>
+            <Property name="columns" type="int" value="40"/>
+            <Property name="lineWrap" type="boolean" value="true"/>
+            <Property name="rows" type="int" value="5"/>
+            <Property name="wrapStyleWord" type="boolean" value="true"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel_button">
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+          <GridBagConstraints gridX="0" gridY="2" gridWidth="2" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="10" insetsLeft="15" insetsBottom="10" insetsRight="10" anchor="10" weightX="0.0" weightY="0.0"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout">
+        <Property name="alignment" type="int" value="2"/>
+        <Property name="verticalGap" type="int" value="0"/>
+        <Property name="horizontalGap" type="int" value="0"/>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JButton" name="jButton">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Save"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonActionPerformed"/>
+          </Events>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/src/beluga/EditorPane.java b/src/beluga/EditorPane.java
new file mode 100644 (file)
index 0000000..92ae9a5
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * EditorPane.java
+ *
+ * Created on 2011/06/30, 13:44:44
+ */
+
+package beluga;
+
+
+import org.apache.http.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.message.*;
+import org.apache.http.protocol.*;
+
+import javax.swing.*;
+import java.awt.event.*;
+import java.io.*;
+import java.util.*;
+
+
+/**
+ *
+ * @author g9133
+ */
+public class EditorPane extends javax.swing.JPanel {
+    private PodBean podBean = null;
+
+    /** Creates new form EditorPane */
+    public EditorPane(PodBean podBean) {
+        this.podBean = podBean;
+
+        initComponents();
+
+        jTextField_topic.addFocusListener(new IMEControl(IMEControl.KANJI));
+        jTextField_topic.setText(podBean.getPodTitle());
+        jTextArea_emails.addFocusListener(new IMEControl(IMEControl.LATIN));
+        jTextArea_emails.addKeyListener(new KeyAdapter() {
+            public void keyPressed(KeyEvent e) {
+                if (e.getKeyCode() == e.VK_TAB) {
+                    e.consume();
+                }
+            }
+        });
+
+        SwingUtilities.invokeLater(new Runnable() {
+            @Override
+            public void run() {
+                jTextField_topic.requestFocus();
+            }
+        });
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+        java.awt.GridBagConstraints gridBagConstraints;
+
+        jLabel_topic = new javax.swing.JLabel();
+        jTextField_topic = new javax.swing.JTextField();
+        jLabel_member = new javax.swing.JLabel();
+        jScrollPane = new javax.swing.JScrollPane();
+        jTextArea_emails = new javax.swing.JTextArea();
+        jPanel_button = new javax.swing.JPanel();
+        jButton = new javax.swing.JButton();
+
+        setLayout(new java.awt.GridBagLayout());
+
+        jLabel_topic.setText("Topic");
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+        gridBagConstraints.insets = new java.awt.Insets(10, 15, 0, 0);
+        add(jLabel_topic, gridBagConstraints);
+
+        jTextField_topic.setColumns(30);
+        jTextField_topic.setMinimumSize(new java.awt.Dimension(186, 19));
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.gridx = 1;
+        gridBagConstraints.gridy = 0;
+        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
+        gridBagConstraints.insets = new java.awt.Insets(10, 10, 0, 10);
+        add(jTextField_topic, gridBagConstraints);
+
+        jLabel_member.setText("Add Members");
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
+        gridBagConstraints.insets = new java.awt.Insets(10, 15, 0, 0);
+        add(jLabel_member, gridBagConstraints);
+
+        jTextArea_emails.setColumns(40);
+        jTextArea_emails.setLineWrap(true);
+        jTextArea_emails.setRows(5);
+        jTextArea_emails.setWrapStyleWord(true);
+        jScrollPane.setViewportView(jTextArea_emails);
+
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.gridx = 1;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+        gridBagConstraints.insets = new java.awt.Insets(10, 10, 0, 10);
+        add(jScrollPane, gridBagConstraints);
+
+        jPanel_button.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 0, 0));
+
+        jButton.setText("Save");
+        jButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jButtonActionPerformed(evt);
+            }
+        });
+        jPanel_button.add(jButton);
+
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 2;
+        gridBagConstraints.gridwidth = 2;
+        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+        gridBagConstraints.insets = new java.awt.Insets(10, 15, 10, 10);
+        add(jPanel_button, gridBagConstraints);
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void jButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonActionPerformed
+        if (jTextField_topic.getText().length() < 1) {
+            JOptionPane.showMessageDialog(this, "<html><font color='red'>A pod must have a topic.", "Error", JOptionPane.ERROR_MESSAGE);
+            return;
+        }
+
+        try {
+            DefaultHttpClient    client = BelugaClient.getHttpClient();
+            HttpPost             post   = new HttpPost("http://belugapods.com/edit/" + podBean.getId());
+            List<NameValuePair>  nvps   = new ArrayList <NameValuePair>();
+    
+            nvps.add(new BasicNameValuePair("_xsrf" , client.getCookieStore().getCookies().get(0).getValue()));
+            nvps.add(new BasicNameValuePair("podid" , podBean.getId()));
+            nvps.add(new BasicNameValuePair("what"  , jTextField_topic.getText()));
+            
+            if (jTextArea_emails.getText().length() > 0) {
+                nvps.add(new BasicNameValuePair("emails", jTextArea_emails.getText()));
+            }
+    
+            post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
+
+            HttpResponse res = BelugaClient.getHttpClient().execute(post);
+            HttpEntity   ent = res.getEntity();
+
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+            String         line   = "";
+            
+            while ((line = reader.readLine()) != null) {
+                System.out.println(line);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }//GEN-LAST:event_jButtonActionPerformed
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton jButton;
+    private javax.swing.JLabel jLabel_member;
+    private javax.swing.JLabel jLabel_topic;
+    private javax.swing.JPanel jPanel_button;
+    private javax.swing.JScrollPane jScrollPane;
+    private javax.swing.JTextArea jTextArea_emails;
+    private javax.swing.JTextField jTextField_topic;
+    // End of variables declaration//GEN-END:variables
+
+}
diff --git a/src/beluga/IFBelugaFrame.java b/src/beluga/IFBelugaFrame.java
new file mode 100644 (file)
index 0000000..d46868c
--- /dev/null
@@ -0,0 +1,28 @@
+package beluga;
+
+
+import org.apache.http.impl.client.*;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.*;
+
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: g9133
+ * Date: 11/06/24
+ * Time: 13:35
+ * To change this template use File | Settings | File Templates.
+ */
+public interface IFBelugaFrame {
+    public HashMap getConstantMap();
+    public PodBean[] getPodBean();
+    public HashMap getImageMap();
+    public DefaultHttpClient getHttpClient();
+    public JLabel getStatusBar();
+    public void setStatusBar(String status);
+    public void displayMessage(String caption, String message, TrayIcon.MessageType type);
+    public void setMessage(String message);
+    public void setMessage(String message, boolean isTop);
+}
diff --git a/src/beluga/IMEControl.java b/src/beluga/IMEControl.java
new file mode 100644 (file)
index 0000000..baeba3e
--- /dev/null
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * \82h\82l\82d\90§\8cä\83A\83_\83v\83^
+ *
+ *    \8f\88\97\9d\91Î\8fÛ\81FJTextField\83N\83\89\83X
+ *                                         updatePod 20010928    JComboBox\82É\82à\91Î\89\9e
+ *                                         updatePod 20011019    JTextArea\82É\82à\91Î\89\9e
+ *                                         updatePod 20011126    JText..\82ð\82Ü\82Æ\82ß\82ÄJTextComponent\82É
+ *
+ * @version 1.0: 2001.08.21
+ ******************************************************************************/
+package beluga;
+
+
+import javax.swing.*;
+import javax.swing.text.*;
+import java.awt.event.*;
+import java.awt.im.*;
+
+
+public class IMEControl extends FocusAdapter {
+    public static final Character.Subset KANJI[]              = {InputSubset.KANJI};//\8a¿\8e\9a
+    public static final Character.Subset HALFWIDTH_KATAKANA[] = {InputSubset.HALFWIDTH_KATAKANA};//\94¼\8ap¶À¶Å
+    public static final Character.Subset LATIN[]              = {InputSubset.LATIN};//\89p\90\94\8e\9a\81iIME\83I\83t\81j
+    public static final Character.Subset FULLWIDTH_DIGITS[]   = {InputSubset.FULLWIDTH_DIGITS};//\91S\8ap\90\94\8e\9a
+    public static final Character.Subset FULLWIDTH_LATIN[]    = {InputSubset.FULLWIDTH_LATIN};//\91S\8ap\89p\90\94\8e\9a
+    private             Character.Subset subsets[];
+    public static final Character.UnicodeBlock KATAKANA[]     = {Character.UnicodeBlock.KATAKANA};
+    
+
+    //\83R\83\93\83X\83g\83\89\83N\83^
+    public IMEControl(Character.Subset[] sub) {
+        subsets = sub;
+    }
+    
+    //\83t\83H\81[\83J\83X\8eæ\93¾
+    public void focusGained(FocusEvent e) {
+        if (e.getComponent() instanceof JTextComponent ||
+            e.getComponent() instanceof JComboBox) {
+
+            if (e.getComponent().getInputContext() == null) {
+                return;
+            }
+
+            e.getComponent().getInputContext().setCharacterSubsets(subsets);
+        }
+    }
+
+    //\83t\83H\81[\83J\83X\91r\8e¸
+    public void focusLost(FocusEvent e) {
+        if (e.getComponent() instanceof JTextComponent ||
+            e.getComponent() instanceof JComboBox) {
+
+            if (e.getComponent().getInputContext() == null) {
+                return;
+            }
+
+            e.getComponent().getInputContext().setCharacterSubsets(null);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/beluga/PodBean.java b/src/beluga/PodBean.java
new file mode 100644 (file)
index 0000000..fffb526
--- /dev/null
@@ -0,0 +1,128 @@
+package beluga;
+
+
+import org.apache.http.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+
+import javax.swing.*;
+import java.awt.*;
+import java.io.*;
+import java.net.*;
+
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: g9133
+ * Date: 11/06/23
+ * Time: 14:04
+ * To change this template use File | Settings | File Templates.
+ */
+public class PodBean {
+    private String id;
+    private String podImg;
+    private String podTime;
+    private String podTitle;
+    private String lastMessage;
+    private ImageIcon icon;
+    private String e_mail;
+    private String password;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPodImg() {
+        return podImg;
+    }
+
+    public void setPodImg(String podImg) {
+        this.podImg = podImg;
+    }
+
+    public String getPodTime() {
+        return podTime;
+    }
+
+    public void setPodTime(String podTime) {
+        this.podTime = podTime;
+    }
+
+    public String getPodTitle() {
+        return podTitle;
+    }
+
+    public void setPodTitle(String podTitle) {
+        this.podTitle = podTitle;
+    }
+
+    public String getLastMessage() {
+        return lastMessage;
+    }
+
+    public void setLastMessage(String lastMessage) {
+        this.lastMessage = lastMessage;
+    }
+
+    public ImageIcon getPodImgIcon(DefaultHttpClient cli) {
+        if (icon == null) {
+            try {
+                HttpGet           get    = new HttpGet("http://belugapods.com" + getPodImg());
+                HttpResponse      res    = cli.execute(get);
+                HttpEntity        ent    = res.getEntity();
+
+                BufferedInputStream   bis  = new BufferedInputStream(ent.getContent());
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                byte[]                data = new byte[512];
+                int                   len  = -1;
+                
+                while ((len = bis.read(data, 0, data.length)) != -1) {
+                    baos.write(data, 0, len);
+                }
+
+                icon = new ImageIcon(new ImageIcon(baos.toByteArray()).getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH));
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+
+        return icon; 
+    }
+
+    public String getUrl_members() {
+        return "/members/" + this.getId();
+    }
+
+    public String getUrl_updates() {
+        return "/pod/" + this.getId();
+    }
+
+    public String getUrl_map() {
+        return "/map/" + this.getId();
+    }
+
+    public String getUrl_edit() {
+        return "/edit/" + this.getId();
+    }
+
+    public String getE_mail() {
+        return e_mail;
+    }
+
+    public void setE_mail(String e_mail) {
+        this.e_mail = e_mail;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}
diff --git a/src/beluga/PodPane.java b/src/beluga/PodPane.java
new file mode 100644 (file)
index 0000000..2fd6c6d
--- /dev/null
@@ -0,0 +1,399 @@
+package beluga;
+
+
+import org.apache.http.*;
+import org.apache.http.client.entity.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.message.*;
+import org.apache.http.protocol.*;
+import org.apache.http.util.*;
+
+import javax.swing.*;
+import javax.swing.Timer;
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.util.*;
+import java.util.List;
+
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: g9133
+ * Date: 11/06/24
+ * Time: 11:07
+ * To change this template use File | Settings | File Templates.
+ */
+public class PodPane extends JPanel {
+
+    private IFBelugaFrame frame = null;
+    private CardLayout layout = new CardLayout();
+    private JScrollPane jScrollPane_updates = new JScrollPane();
+    private JScrollPane jScrollPane_members = new JScrollPane();
+    private JScrollPane jScrollPane_map = new JScrollPane();
+    private JScrollPane jScrollPane_edit = new JScrollPane();
+    private int page_cnt = 30;
+    private JPanel jPanel = null;
+    private PodBean podBean = null;
+    private DefaultHttpClient client = null;
+    private String last_id = null;
+    private String old_id = null;
+    private boolean isVisible = true;
+
+
+    public PodPane(IFBelugaFrame frame, PodBean podBean) {
+        super();
+
+        this.frame   = frame;
+        this.podBean = podBean;
+        this.client  = BelugaClient.getHttpClient();
+
+        this.setLayout(layout);
+        this.add(jScrollPane_updates, "Updates");
+        this.add(jScrollPane_members, "Members");
+        this.add(jScrollPane_map, "Map");
+        this.add(jScrollPane_edit, "Edit");
+
+        jScrollPane_updates.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+        jScrollPane_updates.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+        jScrollPane_updates.getVerticalScrollBar().setUnitIncrement(13);
+        jScrollPane_members.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+        jScrollPane_members.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+        jScrollPane_members.getVerticalScrollBar().setUnitIncrement(13);
+
+        this.podBean.getPodImgIcon(client);
+        
+        PodRowBean[] prbs = getMembers();
+
+        JPanel jPanel_members = new JPanel(new GridLayout(prbs.length, 0));
+
+        for (PodRowBean prb : prbs) {
+            jPanel_members.add(new PodRow(PodPane.this.frame, prb));
+        }
+
+        jScrollPane_members.getViewport().setView(jPanel_members);
+
+        try {
+            JEditorPane jEditorPane = new JEditorPane("text/html", getMap());
+
+            jEditorPane.setEditable(false);
+
+            jScrollPane_map.getViewport().setView(jEditorPane);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        jScrollPane_edit.getViewport().setView(new EditorPane(podBean));
+
+        refreshPod();
+
+        Timer timer = new Timer(5000, new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                new Thread() {
+                    public void run() {
+                        refreshPod();
+                    }
+                }.start();
+
+                if (String.valueOf(Runtime.getRuntime().freeMemory()).length() > 6) {
+                    System.out.print(String.valueOf(Runtime.getRuntime().freeMemory() / 1000000) + "MB");
+                } else if (String.valueOf(Runtime.getRuntime().freeMemory()).length() > 3) {
+                    System.out.print(String.valueOf(Runtime.getRuntime().freeMemory() / 1000) + "KB");
+                } else {
+                    System.out.print(String.valueOf(Runtime.getRuntime().freeMemory()) + "B");
+                }
+
+                System.out.print("/");
+
+                if (String.valueOf(Runtime.getRuntime().totalMemory()).length() > 6) {
+                    System.out.print(String.valueOf(Runtime.getRuntime().totalMemory() / 1000000) + "MB");
+                } else if (String.valueOf(Runtime.getRuntime().totalMemory()).length() > 3) {
+                    System.out.print(String.valueOf(Runtime.getRuntime().totalMemory() / 1000) + "KB");
+                } else {
+                    System.out.print(String.valueOf(Runtime.getRuntime().totalMemory()) + "B");
+                }
+
+                System.out.println();
+            }
+        });
+
+        timer.setInitialDelay(5000);
+        timer.setRepeats(true);
+        timer.start();
+    }
+    
+    public PodBean getPodBean() {
+        return podBean;
+    }
+
+    public void show(String cmd) {
+        layout.show(this, cmd);
+    }
+
+    public void send(String message) throws Exception {
+        HttpPost            post   = new HttpPost("http://belugapods.com/update");
+        List<NameValuePair> nvps   = new ArrayList <NameValuePair>();
+
+        nvps.add(new BasicNameValuePair("_xsrf"        , client.getCookieStore().getCookies().get(0).getValue()));
+        nvps.add(new BasicNameValuePair("source"       , "mobile"));
+        nvps.add(new BasicNameValuePair("podid"        , podBean.getId()));
+        nvps.add(new BasicNameValuePair("text"         , message));
+        nvps.add(new BasicNameValuePair("composebutton", "Send"));
+
+        post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
+
+        EntityUtils.consume(BelugaClient.getHttpClient().execute(post).getEntity());
+
+        updatePod();
+    }
+
+    public void updatePod() {
+        last_id = "";
+
+        try {
+            if (jScrollPane_updates.getVerticalScrollBar().getValue() > 100) {
+                int unit = jScrollPane_updates.getVerticalScrollBar().getValue() / 50;
+
+                for (int i = jScrollPane_updates.getVerticalScrollBar().getValue(); i > 0; i -= unit) {
+                    jScrollPane_updates.getVerticalScrollBar().setValue(jScrollPane_updates.getVerticalScrollBar().getValue() - unit);
+
+                    Thread.sleep(15);
+                }
+            } else {
+                Thread.sleep(500);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        new Thread() {
+            public void run() {
+                refreshPod(page_cnt = 30, 0, false);
+            }
+        }.start();
+    }
+
+    public void refreshPod() {
+        refreshPod(0, 1, false);
+    }
+
+    public void refreshPod(int count, int verticals, boolean isForce) {
+        PodRow[] rows = getNewPodRows(isForce);
+
+        if (rows == null || rows.length < 1) {
+            return;
+        }
+
+        final int vertical = verticals == 0 ? 0 : jScrollPane_updates.getVerticalScrollBar().getValue();
+
+        page_cnt = count == 0 ? page_cnt : count;
+
+        JPanel   jPanel2 = new JPanel(new GridLayout(page_cnt + 1, 0));
+
+        for (int i = 0; i < rows.length; i++) {
+            jPanel2.add(rows[i]);
+        }
+
+        JButton jButton_next = new JButton("Load More");
+
+        jButton_next.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                page_cnt += 30;
+
+                refreshPod(0, 1, true);
+            }
+        });
+
+        jPanel2.add(jButton_next);
+
+        jPanel = jPanel2;
+
+        jScrollPane_updates.getViewport().setView(jPanel);
+        jScrollPane_updates.getVerticalScrollBar().setValue(vertical);
+
+        try {
+            this.updateUI();
+        } catch (NullPointerException ex) {}
+    }
+
+    public ImageIcon getPodImage() {
+        return podBean.getPodImgIcon(client);
+    }
+
+    private PodRow[] getNewPodRows() {
+        return getNewPodRows(false);
+    }
+
+    private PodRow[] getNewPodRows(boolean isForce) {
+        ArrayList<PodRow> list = new ArrayList<PodRow>();
+
+        synchronized (podBean.getId()) {
+            try {
+                HttpGet        get  = new HttpGet("http://belugapods.com/pod/" + podBean.getId() + "?n=" + page_cnt);
+                HttpResponse   res  = BelugaClient.getHttpClient().execute(get);
+                HttpEntity     ent  = res.getEntity();
+
+                BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+                String         line   = null;
+                boolean        renew  = false;
+
+                while ((line = reader.readLine()) != null) {
+                    if (line.indexOf("a name") > -1) {
+                        if (last_id != null && last_id.equals(line.replaceAll("\">.*", "").replaceAll(".*\"", ""))) {
+                            if (!isForce) {
+                                break;
+                            }
+                        } else {
+                            if (!renew) {
+                                last_id = line.replaceAll("\">.*", "").replaceAll(".*\"", "");
+                            }
+
+                            renew = true;
+                        }
+
+                        PodRow pr = new PodRow(frame, podBean, reader, line);
+
+                        if (pr.getPodRowBean().getMessage().length() < 1) {
+                            continue;
+                        }
+
+                        pr.setVisibleIcon(isVisible);
+
+                        list.add(pr);
+                    }
+                }
+
+                if (renew) {
+                    PodRowBean podRowBean = list.get(0).getPodRowBean();
+
+                    if (!podRowBean.getUname().equals(frame.getConstantMap().get("user_name"))) {
+                        frame.displayMessage(podRowBean.getUname() + ":" + podBean.getPodTitle(), podRowBean.getMessage().replaceAll("<br>", System.getProperty("line.separator")), TrayIcon.MessageType.INFO);
+                    }
+                }
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        }
+
+        return list.toArray(new PodRow[list.size()]);
+    }
+
+    public PodRow[] getPodRows() {
+        if (jScrollPane_updates.getViewport().getView() == null) {
+            return null;
+        }
+
+        ArrayList list = new ArrayList(Arrays.asList(jPanel.getComponents()));
+
+        list.remove(list.size() - 1);
+
+        return (PodRow[]) list.toArray(new PodRow[list.size()]);
+    }
+
+    public void setVisibleIcon(boolean isVisible) {
+        this.isVisible = isVisible;
+
+        PodRow[] podRow = getPodRows();
+
+        if (podRow != null) {
+            for (PodRow pr : podRow) {
+                pr.setVisibleIcon(isVisible);
+            }
+
+            this.updateUI();
+        }
+
+        podRow = getMemberRows();
+
+        if (podRow != null) {
+            for (PodRow pr : podRow) {
+                pr.setVisibleIcon(isVisible);
+            }
+
+            this.updateUI();
+        }
+    }
+
+
+    private PodRowBean[] getMembers() {
+        ArrayList<PodRowBean> list = new ArrayList<PodRowBean>();
+
+        try {
+            HttpGet        get  = new HttpGet("http://belugapods.com/members/" + podBean.getId());
+            HttpResponse   res  = BelugaClient.getHttpClient().execute(get);
+            HttpEntity     ent  = res.getEntity();
+
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+            String         line   = null;
+
+            while ((line = reader.readLine()) != null) {
+                PodRowBean prb = new PodRowBean();
+
+                try {
+                    while ((line = reader.readLine()).indexOf("update") < 0);
+                } catch (Exception ex) {
+                    break;
+                }
+
+                reader.readLine();
+                
+                line = reader.readLine();
+
+                prb.setUserimg(line.replaceAll(".*src=\"", "").replaceAll("\".*", ""));
+
+                while ((line = reader.readLine()).indexOf("mname") < 0);
+
+                prb.setUname(line.replaceAll("</.*", "").replaceAll(".*>", ""));
+
+                while ((line = reader.readLine()).indexOf("utext") < 0);
+
+                prb.setMessage(line.replaceAll("</span.*", "").replaceAll(".*utext\">", ""));
+
+                if (prb.getUserimg() == null || prb.getUname() == null || prb.getMessage() == null) {
+                    continue;
+                }
+
+                list.add(prb);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        return list.toArray(new PodRowBean[list.size()]);
+    }
+
+    private PodRow[] getMemberRows() {
+        if (jScrollPane_members.getViewport().getView() == null) {
+            return null;
+        }
+
+        ArrayList list = new ArrayList(Arrays.asList(((JPanel) jScrollPane_members.getViewport().getView()).getComponents()));
+
+        return (PodRow[]) list.toArray(new PodRow[list.size()]);
+    }
+    
+    private String getMap() {
+        StringBuffer sb = new StringBuffer();
+
+        try {
+            HttpGet        get  = new HttpGet("http://belugapods.com/map/" + podBean.getId());
+            HttpResponse   res  = BelugaClient.getHttpClient().execute(get);
+            HttpEntity     ent  = res.getEntity();
+
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+            
+            String         line   = null;
+
+            while ((line = reader.readLine()) != null) {
+                sb.append(line).append(System.getProperty("line.separator"));
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        return sb.toString();
+    }
+}
diff --git a/src/beluga/PodRow.form b/src/beluga/PodRow.form
new file mode 100644 (file)
index 0000000..339093a
--- /dev/null
@@ -0,0 +1,329 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JPopupMenu" name="jPopupMenu">
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
+        <Property name="useNullLayout" type="boolean" value="true"/>
+      </Layout>
+      <SubComponents>
+        <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_copy">
+          <Properties>
+            <Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
+              <KeyStroke key="Ctrl+C"/>
+            </Property>
+            <Property name="mnemonic" type="int" value="67"/>
+            <Property name="text" type="java.lang.String" value="Copy"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_copyActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_reply">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Reply"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_replyActionPerformed"/>
+          </Events>
+        </MenuItem>
+        <MenuItem class="javax.swing.JMenuItem" name="jMenuItem_quote_reply">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Quote Reply"/>
+          </Properties>
+          <Events>
+            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jMenuItem_quote_replyActionPerformed"/>
+          </Events>
+        </MenuItem>
+      </SubComponents>
+    </Container>
+  </NonVisualComponents>
+  <Properties>
+    <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+      <Color blue="ff" green="ff" id="white" palette="1" red="ff" type="palette"/>
+    </Property>
+    <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+      <Border info="org.netbeans.modules.form.compat2.border.LineBorderInfo">
+        <LineBorder>
+          <Color PropertyName="color" blue="f0" green="f0" id="&#x5236;&#x5fa1;" palette="2" red="f0" type="palette"/>
+        </LineBorder>
+      </Border>
+    </Property>
+    <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+      <Color id="Hand Cursor"/>
+    </Property>
+    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+      <Dimension value="[100, 50]"/>
+    </Property>
+    <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+      <Dimension value="[190, 50]"/>
+    </Property>
+  </Properties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,52,0,0,1,-107"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel_center">
+      <Properties>
+        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[200, 50]"/>
+        </Property>
+        <Property name="opaque" type="boolean" value="false"/>
+        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[200, 50]"/>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="Center"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel_space1">
+          <Properties>
+            <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+              <Dimension value="[5, 0]"/>
+            </Property>
+            <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+              <Dimension value="[5, 0]"/>
+            </Property>
+            <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+              <Dimension value="[5, 0]"/>
+            </Property>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="West"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+        <Container class="javax.swing.JPanel" name="jPanel_left">
+          <Properties>
+            <Property name="opaque" type="boolean" value="false"/>
+          </Properties>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="Center"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+          <SubComponents>
+            <Container class="javax.swing.JPanel" name="jPanel_top">
+              <Properties>
+                <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+                  <Color id="Hand Cursor"/>
+                </Property>
+                <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[140, 19]"/>
+                </Property>
+                <Property name="opaque" type="boolean" value="false"/>
+              </Properties>
+              <Events>
+                <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="formMouseClicked"/>
+              </Events>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="North"/>
+                </Constraint>
+              </Constraints>
+
+              <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+              <SubComponents>
+                <Component class="javax.swing.JLabel" name="jLabel_user_name">
+                  <Properties>
+                    <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+                      <Font name="MS UI Gothic" size="12" style="1"/>
+                    </Property>
+                    <Property name="horizontalAlignment" type="int" value="2"/>
+                    <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+                      <Color id="Hand Cursor"/>
+                    </Property>
+                    <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                      <Dimension value="[200, 19]"/>
+                    </Property>
+                    <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                      <Dimension value="[100, 19]"/>
+                    </Property>
+                    <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                      <Dimension value="[100, 19]"/>
+                    </Property>
+                  </Properties>
+                  <Events>
+                    <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="formMouseClicked"/>
+                  </Events>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                      <BorderConstraints direction="Center"/>
+                    </Constraint>
+                  </Constraints>
+                </Component>
+                <Container class="javax.swing.JPanel" name="jPanel_center2">
+                  <Properties>
+                    <Property name="opaque" type="boolean" value="false"/>
+                  </Properties>
+                  <Constraints>
+                    <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                      <BorderConstraints direction="East"/>
+                    </Constraint>
+                  </Constraints>
+
+                  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout">
+                    <Property name="alignment" type="int" value="2"/>
+                    <Property name="verticalGap" type="int" value="0"/>
+                    <Property name="horizontalGap" type="int" value="0"/>
+                  </Layout>
+                  <SubComponents>
+                    <Component class="javax.swing.JLabel" name="jLabel_uimg">
+                      <Properties>
+                        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[19, 19]"/>
+                        </Property>
+                        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[19, 19]"/>
+                        </Property>
+                        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[19, 19]"/>
+                        </Property>
+                      </Properties>
+                      <Events>
+                        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jLabel_uimgMouseClicked"/>
+                      </Events>
+                    </Component>
+                    <Component class="javax.swing.JLabel" name="jLabel_podtime">
+                      <Properties>
+                        <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+                          <Color blue="66" green="66" red="66" type="rgb"/>
+                        </Property>
+                        <Property name="horizontalAlignment" type="int" value="4"/>
+                        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[200, 19]"/>
+                        </Property>
+                        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[19, 19]"/>
+                        </Property>
+                        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                          <Dimension value="[19, 19]"/>
+                        </Property>
+                      </Properties>
+                      <Events>
+                        <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jLabel_podtimeMouseClicked"/>
+                      </Events>
+                    </Component>
+                  </SubComponents>
+                </Container>
+              </SubComponents>
+            </Container>
+            <Component class="javax.swing.JLabel" name="jLabel_message">
+              <Properties>
+                <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[32767, 32767]"/>
+                </Property>
+                <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[140, 31]"/>
+                </Property>
+                <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[140, 31]"/>
+                </Property>
+              </Properties>
+              <Events>
+                <EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jLabel_messageMouseReleased,formMouseClicked"/>
+              </Events>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="Center"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+            <Component class="javax.swing.JLabel" name="jLabel_space2">
+              <Properties>
+                <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[5, 0]"/>
+                </Property>
+                <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[5, 0]"/>
+                </Property>
+                <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+                  <Dimension value="[5, 0]"/>
+                </Property>
+              </Properties>
+              <Constraints>
+                <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+                  <BorderConstraints direction="West"/>
+                </Constraint>
+              </Constraints>
+            </Component>
+          </SubComponents>
+        </Container>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JPanel" name="jPanel_west">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="ff" type="rgb"/>
+        </Property>
+        <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[500, 500]"/>
+        </Property>
+        <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[50, 50]"/>
+        </Property>
+        <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+          <Dimension value="[50, 50]"/>
+        </Property>
+      </Properties>
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="West"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel_icon">
+          <Properties>
+            <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+              <Border info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
+                <EtchetBorder bevelType="0"/>
+              </Border>
+            </Property>
+            <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+              <Color id="Hand Cursor"/>
+            </Property>
+            <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+              <Dimension value="[50, 50]"/>
+            </Property>
+            <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+              <Dimension value="[50, 50]"/>
+            </Property>
+            <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+              <Dimension value="[50, 50]"/>
+            </Property>
+          </Properties>
+          <Events>
+            <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="jLabel_iconMouseClicked"/>
+          </Events>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+              <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+            </Constraint>
+          </Constraints>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/src/beluga/PodRow.java b/src/beluga/PodRow.java
new file mode 100644 (file)
index 0000000..3920de3
--- /dev/null
@@ -0,0 +1,765 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/*
+ * PodRow.java
+ *
+ * Created on 2011/06/23, 19:03:51
+ */
+
+package beluga;
+
+
+import org.apache.http.*;
+import org.apache.http.client.methods.*;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.*;
+import java.awt.font.*;
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+
+/**
+ *
+ * @author g9133
+ */
+public class PodRow extends javax.swing.JPanel {
+    private IFBelugaFrame frame      = null;
+    private PodRowBean    podRowBean = new PodRowBean(); 
+
+    private PodRow() {
+        initComponents();
+    }
+
+    /** Creates new form PodRow */
+    public PodRow(IFBelugaFrame frame, PodBean podBean, BufferedReader reader, String line) {
+        this();
+
+        this.frame = frame;
+
+        try {
+            initialize(podBean, reader, line);
+
+            displayInitialize();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    public PodRow(IFBelugaFrame frame, PodRowBean podRowBean) {
+        this();
+
+        this.frame      = frame;
+        this.podRowBean = podRowBean;
+
+        try {
+            displayInitialize();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+    
+    private void initialize(PodBean pb, BufferedReader reader, String line) throws Exception {
+        podRowBean.setId(line.replaceAll("\">.*", "").replaceAll(".*\"", ""));
+
+        while ((line = reader.readLine()).indexOf("userimg") < 0);
+        
+        podRowBean.setUserimg(line.replaceAll(".*src=\"", "").replaceAll("\".*", ""));
+
+        while ((line = reader.readLine()).indexOf("utitle") < 0);
+
+        line = reader.readLine();
+
+        podRowBean.setUtitle(line.replaceAll("\"></", "").replaceAll(".*\"", ""));
+
+        while ((line = reader.readLine()).indexOf("uname") < 0);
+
+        line = reader.readLine();
+
+        podRowBean.setDetails(line.replaceAll("\">.*", "").replaceAll(".*\"", ""));
+        podRowBean.setUname(line.replaceAll("</.*", "").replaceAll(".*>", ""));
+
+        while (true) {
+            line = reader.readLine();
+
+            if (line.indexOf("uimg") < 0 && line.indexOf("upin") < 0 && line.indexOf("utime") < 0) {
+                continue;
+            }
+            
+            if (line.indexOf("uimg") > -1) {
+                podRowBean.setUimg(line.replaceAll(".*src=\"", "").replaceAll("\".*", ""));
+            }
+    
+            if (line.indexOf("upin") > -1) {
+                podRowBean.setUpin(line.replaceAll(".*src=\"", "").replaceAll("\".*", ""));
+            }
+    
+            if (line.indexOf("utime") > -1) {
+                podRowBean.setUtime(getPodTime(line.replaceAll("</.*", "").replaceAll(".*>", "")));
+                break;
+            }
+        }
+
+        while ((line = reader.readLine()).indexOf("utext") < 0);
+
+        podRowBean.setMessage(line.replaceAll("</span.*", "").replaceAll(".*utext\">", ""));
+    }
+    
+    private void displayInitialize() {
+        jLabel_uimg.setIcon(getImageIcon(podRowBean.getUimg(), 16));
+        jLabel_podtime.setIcon(getImageIcon(podRowBean.getUpin(), 16));
+        jLabel_icon.setIcon(getImageIcon(podRowBean.getUserimg(), 50));
+        jLabel_user_name.setText(podRowBean.getUname());
+        
+        if (podRowBean.getUtime() != null) {
+            jLabel_podtime.setText(podRowBean.getUtime());
+
+            TextLayout tl = new TextLayout(podRowBean.getUtime(), jLabel_podtime.getFont(), ((Graphics2D) ((JFrame) frame).getGraphics()).getFontRenderContext());
+
+            jLabel_podtime.setPreferredSize(new Dimension((int) tl.getAdvance() + (jLabel_podtime.getIcon() != null ? 22 : 0) , 19));
+        }
+
+        jLabel_message.setText("<html>" + podRowBean.getMessage() + "</html>");
+
+        if (podRowBean.getMessage().split("<br>").length > 2) {
+            jLabel_message.setPreferredSize(new Dimension(jLabel_message.getPreferredSize().width, jLabel_message.getPreferredSize().height + ((podRowBean.getMessage().split("<br>").length - 2) * 14)));
+            jLabel_message.setMaximumSize  (jLabel_message.getPreferredSize());
+            jLabel_message.setMinimumSize  (jLabel_message.getPreferredSize());
+
+            this.setPreferredSize(new Dimension(this.getPreferredSize().width, this.getPreferredSize().height + ((podRowBean.getMessage().split("<br>").length - 2) * 14)));
+            this.setMaximumSize  (this.getPreferredSize());
+            this.setMinimumSize  (this.getPreferredSize());
+        }
+
+        if (podRowBean.getMessage().indexOf("<a") > -1) {
+            jLabel_message.putClientProperty("url", podRowBean.getMessage().replaceAll(".*href=\"", "").replaceAll("\".+", ""));
+        }
+
+        if (podRowBean.getUimg() != null || podRowBean.getUpin() != null) {
+            new Thread() {
+                public void run() {
+                    casheDetail();
+                }
+            }.start();
+        }
+    }
+
+    private String getPodTime(String line) {
+        return line.replaceAll("</.*", "").replaceAll(".*>", "").
+                    replaceAll("just now", "\82½\82Á\82½\8d¡").
+                    replaceAll("sec", "\95b").replaceAll("min", "\95ª").replaceAll("hr", "\8e\9e\8aÔ").replaceAll("yesterday", "\8dð\93ú").
+                    replaceAll("Jan ", "1/").replaceAll("Feb ", "2/").replaceAll("Mar ", "3/").replaceAll("Apr ",  "4/").replaceAll("May ",  "5/").replaceAll("Jun ",  "6/").
+                    replaceAll("Jul ", "7/").replaceAll("Aug ", "8/").replaceAll("Sep ", "9/").replaceAll("Oct ", "10/").replaceAll("Nov ", "11/").replaceAll("Dec ", "12/");
+    }
+
+    public ImageIcon getImageIcon(String uri, int size) {
+        if (uri == null) {
+            return null;
+        }
+        
+        if (!frame.getImageMap().containsKey(uri)) {
+            frame.getImageMap().put(uri, new ImageIcon(new ImageIcon(getImage(uri)).getImage().getScaledInstance(size, size, Image.SCALE_SMOOTH)));
+        }
+
+        return (ImageIcon) frame.getImageMap().get(uri);
+    }
+
+    private byte[] getImage(String uri) {
+        return getImage(uri, false);
+    }
+
+    private byte[] getImage(String uri, boolean isGoogle) {
+        if (uri == null) {
+            return null;
+        }
+
+        try {
+            HttpGet      get = new HttpGet(isGoogle ? uri : "http://belugapods.com" + uri);
+            HttpResponse res = BelugaClient.getHttpClient().execute(get);
+            HttpEntity   ent = res.getEntity();
+
+            BufferedInputStream   bis  = new BufferedInputStream(ent.getContent());
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            byte[]                data = new byte[4096];
+            int                   len  = -1;
+
+            while ((len = bis.read(data, 0, data.length)) != -1) {
+                baos.write(data, 0, len);
+            }
+
+            return baos.toByteArray();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+
+        return null;
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPopupMenu = new javax.swing.JPopupMenu();
+        jMenuItem_copy = new javax.swing.JMenuItem();
+        jMenuItem_reply = new javax.swing.JMenuItem();
+        jMenuItem_quote_reply = new javax.swing.JMenuItem();
+        jPanel_center = new javax.swing.JPanel();
+        jLabel_space1 = new javax.swing.JLabel();
+        jPanel_left = new javax.swing.JPanel();
+        jPanel_top = new javax.swing.JPanel();
+        jLabel_user_name = new javax.swing.JLabel();
+        jPanel_center2 = new javax.swing.JPanel();
+        jLabel_uimg = new javax.swing.JLabel();
+        jLabel_podtime = new javax.swing.JLabel();
+        jLabel_message = new javax.swing.JLabel();
+        jLabel_space2 = new javax.swing.JLabel();
+        jPanel_west = new javax.swing.JPanel();
+        jLabel_icon = new javax.swing.JLabel();
+
+        jMenuItem_copy.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.CTRL_MASK));
+        jMenuItem_copy.setMnemonic('C');
+        jMenuItem_copy.setText("Copy");
+        jMenuItem_copy.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_copyActionPerformed(evt);
+            }
+        });
+        jPopupMenu.add(jMenuItem_copy);
+
+        jMenuItem_reply.setText("Reply");
+        jMenuItem_reply.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_replyActionPerformed(evt);
+            }
+        });
+        jPopupMenu.add(jMenuItem_reply);
+
+        jMenuItem_quote_reply.setText("Quote Reply");
+        jMenuItem_quote_reply.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jMenuItem_quote_replyActionPerformed(evt);
+            }
+        });
+        jPopupMenu.add(jMenuItem_quote_reply);
+
+        setBackground(java.awt.Color.white);
+        setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.SystemColor.control));
+        setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        setMinimumSize(new java.awt.Dimension(100, 50));
+        setPreferredSize(new java.awt.Dimension(190, 50));
+        setLayout(new java.awt.BorderLayout());
+
+        jPanel_center.setMinimumSize(new java.awt.Dimension(200, 50));
+        jPanel_center.setOpaque(false);
+        jPanel_center.setPreferredSize(new java.awt.Dimension(200, 50));
+        jPanel_center.setLayout(new java.awt.BorderLayout());
+
+        jLabel_space1.setMaximumSize(new java.awt.Dimension(5, 0));
+        jLabel_space1.setMinimumSize(new java.awt.Dimension(5, 0));
+        jLabel_space1.setPreferredSize(new java.awt.Dimension(5, 0));
+        jPanel_center.add(jLabel_space1, java.awt.BorderLayout.WEST);
+
+        jPanel_left.setOpaque(false);
+        jPanel_left.setLayout(new java.awt.BorderLayout());
+
+        jPanel_top.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        jPanel_top.setMinimumSize(new java.awt.Dimension(140, 19));
+        jPanel_top.setOpaque(false);
+        jPanel_top.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseClicked(java.awt.event.MouseEvent evt) {
+                formMouseClicked(evt);
+            }
+        });
+        jPanel_top.setLayout(new java.awt.BorderLayout());
+
+        jLabel_user_name.setFont(new java.awt.Font("MS UI Gothic", 1, 12));
+        jLabel_user_name.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
+        jLabel_user_name.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        jLabel_user_name.setMaximumSize(new java.awt.Dimension(200, 19));
+        jLabel_user_name.setMinimumSize(new java.awt.Dimension(100, 19));
+        jLabel_user_name.setPreferredSize(new java.awt.Dimension(100, 19));
+        jLabel_user_name.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseClicked(java.awt.event.MouseEvent evt) {
+                formMouseClicked(evt);
+            }
+        });
+        jPanel_top.add(jLabel_user_name, java.awt.BorderLayout.CENTER);
+
+        jPanel_center2.setOpaque(false);
+        jPanel_center2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT, 0, 0));
+
+        jLabel_uimg.setMaximumSize(new java.awt.Dimension(19, 19));
+        jLabel_uimg.setMinimumSize(new java.awt.Dimension(19, 19));
+        jLabel_uimg.setPreferredSize(new java.awt.Dimension(19, 19));
+        jLabel_uimg.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseClicked(java.awt.event.MouseEvent evt) {
+                jLabel_uimgMouseClicked(evt);
+            }
+        });
+        jPanel_center2.add(jLabel_uimg);
+
+        jLabel_podtime.setForeground(new java.awt.Color(102, 102, 102));
+        jLabel_podtime.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
+        jLabel_podtime.setMaximumSize(new java.awt.Dimension(200, 19));
+        jLabel_podtime.setMinimumSize(new java.awt.Dimension(19, 19));
+        jLabel_podtime.setPreferredSize(new java.awt.Dimension(19, 19));
+        jLabel_podtime.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseClicked(java.awt.event.MouseEvent evt) {
+                jLabel_podtimeMouseClicked(evt);
+            }
+        });
+        jPanel_center2.add(jLabel_podtime);
+
+        jPanel_top.add(jPanel_center2, java.awt.BorderLayout.EAST);
+
+        jPanel_left.add(jPanel_top, java.awt.BorderLayout.NORTH);
+
+        jLabel_message.setMaximumSize(new java.awt.Dimension(32767, 32767));
+        jLabel_message.setMinimumSize(new java.awt.Dimension(140, 31));
+        jLabel_message.setPreferredSize(new java.awt.Dimension(140, 31));
+        jLabel_message.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseReleased(java.awt.event.MouseEvent evt) {
+                jLabel_messageMouseReleased(evt);
+                formMouseClicked(evt);
+            }
+        });
+        jPanel_left.add(jLabel_message, java.awt.BorderLayout.CENTER);
+
+        jLabel_space2.setMaximumSize(new java.awt.Dimension(5, 0));
+        jLabel_space2.setMinimumSize(new java.awt.Dimension(5, 0));
+        jLabel_space2.setPreferredSize(new java.awt.Dimension(5, 0));
+        jPanel_left.add(jLabel_space2, java.awt.BorderLayout.WEST);
+
+        jPanel_center.add(jPanel_left, java.awt.BorderLayout.CENTER);
+
+        add(jPanel_center, java.awt.BorderLayout.CENTER);
+
+        jPanel_west.setBackground(new java.awt.Color(255, 255, 255));
+        jPanel_west.setMaximumSize(new java.awt.Dimension(500, 500));
+        jPanel_west.setMinimumSize(new java.awt.Dimension(50, 50));
+        jPanel_west.setPreferredSize(new java.awt.Dimension(50, 50));
+        jPanel_west.setLayout(new java.awt.GridBagLayout());
+
+        jLabel_icon.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));
+        jLabel_icon.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        jLabel_icon.setMaximumSize(new java.awt.Dimension(50, 50));
+        jLabel_icon.setMinimumSize(new java.awt.Dimension(50, 50));
+        jLabel_icon.setPreferredSize(new java.awt.Dimension(50, 50));
+        jLabel_icon.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseClicked(java.awt.event.MouseEvent evt) {
+                jLabel_iconMouseClicked(evt);
+            }
+        });
+        jPanel_west.add(jLabel_icon, new java.awt.GridBagConstraints());
+
+        add(jPanel_west, java.awt.BorderLayout.WEST);
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mouseClicked
+        JPanel jPanel = (JPanel) SwingUtilities.getAncestorOfClass(JPanel.class, this);
+        
+        for (int i = 0; i < jPanel.getComponentCount(); i++) {
+            if (jPanel.getComponent(i) instanceof PodRow) {
+                ((PodRow) jPanel.getComponent(i)).setBorder(BorderFactory.createLineBorder(SystemColor.control));
+            }
+        }
+        
+        this.setBorder(BorderFactory.createLineBorder(Color.gray, 2));
+        
+    }//GEN-LAST:event_mouseClicked
+
+    private void jLabel_uimgMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel_uimgMouseClicked
+        if (((JLabel) evt.getComponent()).getIcon() == null) {
+            return;
+        }
+
+        showPreviewDialog(evt, podRowBean.getDetailImg(), false);
+    }//GEN-LAST:event_jLabel_uimgMouseClicked
+
+    private void jLabel_podtimeMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel_podtimeMouseClicked
+        if (((JLabel) evt.getComponent()).getIcon() == null) {
+            return;
+        }
+
+        showPreviewDialog(evt, podRowBean.getDetailMap(), true);
+    }//GEN-LAST:event_jLabel_podtimeMouseClicked
+
+    private void jLabel_messageMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel_messageMouseReleased
+        if (evt.isPopupTrigger()) {
+            jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
+            return;
+        }
+
+        if (jLabel_message.getClientProperty("url") == null) {
+            return;
+        }
+
+        try {
+            Desktop.getDesktop().browse(new URI((String) jLabel_message.getClientProperty("url")));
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }//GEN-LAST:event_jLabel_messageMouseReleased
+
+    private void jMenuItem_copyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_copyActionPerformed
+        Clipboard       cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+        StringSelection ss = new StringSelection(jLabel_message.getText().replaceAll("</?html>", "").replaceAll("<br>", System.getProperty("line.separator")));
+
+        cb.setContents(ss, null);
+    }//GEN-LAST:event_jMenuItem_copyActionPerformed
+
+    private void jLabel_iconMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel_iconMouseClicked
+        showPreviewDialog(evt, podRowBean.getUserimg(), false);
+    }//GEN-LAST:event_jLabel_iconMouseClicked
+
+    private void jMenuItem_replyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_replyActionPerformed
+        frame.setMessage("@" + podRowBean.getUname() + " ");
+    }//GEN-LAST:event_jMenuItem_replyActionPerformed
+
+    private void jMenuItem_quote_replyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem_quote_replyActionPerformed
+        frame.setMessage("QT@" + podRowBean.getUname() + " " + podRowBean.getMessage(), true);
+    }//GEN-LAST:event_jMenuItem_quote_replyActionPerformed
+
+    public void setVisibleIcon(boolean isVisible) {
+        if (isVisible) {
+            this.add(jPanel_west, "West");
+        } else {
+            this.remove(jPanel_west);
+        }
+    }
+
+    private void casheDetail() {
+        try {
+            HttpGet      get = new HttpGet("http://belugapods.com" + podRowBean.getDetails());
+            HttpResponse res = BelugaClient.getHttpClient().execute(get);
+            HttpEntity   ent = res.getEntity();
+                
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ent.getContent(), "UTF8"));
+            String         line   = null;
+            
+            while ((line = reader.readLine()) != null) {
+                if (line.indexOf("detailimg") > -1) {
+                    podRowBean.setDetailImg(line.replaceAll("\"/>.*", "").replaceAll(".*\"", ""));
+                }
+
+                if (line.indexOf("staticmap") > -1) {
+                    podRowBean.setDetailMap(line.replaceAll(".*src=\"", "").replaceAll("\".*", ""));
+                }
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+    private void showPreviewDialog(MouseEvent evt, final String uri, final boolean isGoogle) {
+        if (getImageMap().containsKey(uri)) {
+            return;
+        }
+
+        final JDialog jDialog   = new JDialog((JFrame) frame);
+        ImageIcon     imageIcon = new ImageIcon(getImage(uri, isGoogle));
+        final JLabel  jLabel    = new JLabel();
+
+        jDialog.setUndecorated(true);
+        jDialog.addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosed(WindowEvent e) {
+                getImageMap().remove(uri);
+            }
+        });
+
+        jDialog.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentMoved(ComponentEvent e) {
+                if (jLabel.getClientProperty("window") == null) {
+                    return;
+                }
+
+                JWindow jWindow = (JWindow) jLabel.getClientProperty("window");
+                
+                jWindow.setLocation(jDialog.getLocationOnScreen().x + jDialog.getWidth() - jWindow.getWidth() - 2, jDialog.getLocationOnScreen().y + jDialog.getHeight() - jWindow.getHeight() - 2);
+            }
+        });
+            
+        int width  = imageIcon.getImage().getWidth (imageIcon.getImageObserver());
+        int height = imageIcon.getImage().getHeight(imageIcon.getImageObserver());
+
+        if (!isGoogle) {
+            while (width > 320 || height > 240) {
+                width  = width  / 2;
+                height = height / 2;
+            }
+
+            imageIcon = new ImageIcon(imageIcon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH));
+        }
+
+        jLabel.setIcon(imageIcon);
+        jDialog.setSize(width, height);
+
+        int x = evt.getComponent().getLocationOnScreen().x + evt.getX();
+        int y = evt.getComponent().getLocationOnScreen().y + evt.getY();
+
+        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
+
+
+        if (x + jDialog.getWidth() > dim.getWidth()) {
+            x = ((int) dim.getWidth()) - jDialog.getWidth();
+        }
+
+        if (y + jDialog.getHeight() > dim.getHeight()) {
+            y = ((int) dim.getHeight()) - jDialog.getHeight();
+        }
+
+        jDialog.setLocation(x, y);
+
+        jLabel.setBorder(BorderFactory.createEtchedBorder());
+        jLabel.setToolTipText("Double Click to close");
+
+        jLabel.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mousePressed(MouseEvent e) {
+                jLabel.putClientProperty("loc1", jDialog.getLocationOnScreen());
+                jLabel.putClientProperty("loc2", MouseInfo.getPointerInfo().getLocation());
+
+                jLabel.setBorder(BorderFactory.createLineBorder(Color.gray, 2));
+
+                if (e.getButton() == e.BUTTON1 && e.getClickCount() == 2) {
+                    jDialog.dispose();
+                }
+            }
+
+            @Override
+            public void mouseExited(MouseEvent e) {
+                jLabel.setBorder(BorderFactory.createEtchedBorder());
+            }
+        });
+
+        jLabel.addMouseMotionListener(new MouseMotionAdapter() {
+            @Override
+            public void mouseDragged(MouseEvent e) {
+                Point loc1 = (Point) jLabel.getClientProperty("loc1");
+                Point loc2 = (Point) jLabel.getClientProperty("loc2");
+                Point loc3 = MouseInfo.getPointerInfo().getLocation();
+
+                jDialog.setLocation(loc1.x + loc3.x - loc2.x, loc1.y + loc3.y - loc2.y);
+            }
+        });
+
+        jDialog.getContentPane().add(jLabel, "Center");
+        jDialog.setVisible(true);
+
+        final JPopupMenu jPopupMenu      = new JPopupMenu();
+        JMenuItem        jMenuItem_org   = new JMenuItem("Original Size");
+        JMenuItem        jMenuItem_tobig = new JMenuItem("Size (+)");
+        JMenuItem        jMenuItem_tosml = new JMenuItem("Size (-)");
+        JMenuItem        jMenuItem_close = new JMenuItem("Close");
+
+        if (isGoogle) {
+            final JMenuItem jMenuItem_type = new JMenuItem("Type to Satellite");
+
+            jMenuItem_type.setEnabled(false);
+            jMenuItem_type.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    if (jLabel.getClientProperty("type") == null) {
+                        return;
+                    }
+
+                    if ("map_r_".equals(jLabel.getClientProperty("type"))) {
+                        jLabel.putClientProperty("type", "map_s_");
+                        jMenuItem_type.setText("Type to Roadmap");
+                    } else {
+                        jLabel.putClientProperty("type", "map_r_");
+                        jMenuItem_type.setText("Type to Satellite");
+                    }
+
+                    jLabel.setIcon(new ImageIcon(new ImageIcon((byte[]) jLabel.getClientProperty(((String) jLabel.getClientProperty("type")) + jLabel.getClientProperty("zoom"))).getImage().getScaledInstance(jDialog.getWidth(), jDialog.getHeight(), Image.SCALE_SMOOTH)));
+                }
+            });
+
+                    
+            jLabel.putClientProperty("menu", jMenuItem_type);
+            jPopupMenu.add(jMenuItem_type);
+        }
+
+        jMenuItem_org.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                ImageIcon icon = null;
+                
+                if (isGoogle) {
+                    icon = new ImageIcon((byte[]) jLabel.getClientProperty(((String) jLabel.getClientProperty("type")) + jLabel.getClientProperty("zoom")));
+                } else {
+                    icon = new ImageIcon(getImage(uri, isGoogle)); 
+                }
+
+                jDialog.setSize(icon.getIconWidth(), icon.getIconHeight());
+                jLabel.setIcon(icon);
+            }
+        });
+
+        jMenuItem_tobig.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                Dimension dim = jDialog.getSize();
+
+                if (dim.width * 2 > Toolkit.getDefaultToolkit().getScreenSize().width) {
+                    return;
+                }
+
+                jDialog.setSize(dim.width * 2, dim.height * 2);
+
+                if (isGoogle) {
+                    jLabel.setIcon(new ImageIcon(new ImageIcon((byte[]) jLabel.getClientProperty(((String) jLabel.getClientProperty("type")) + jLabel.getClientProperty("zoom"))).getImage().getScaledInstance(jDialog.getWidth(), jDialog.getHeight(), Image.SCALE_SMOOTH)));
+                } else {
+                    jLabel.setIcon(new ImageIcon(new ImageIcon(getImage(uri, isGoogle)).getImage().getScaledInstance(jDialog.getWidth(), jDialog.getHeight(), Image.SCALE_SMOOTH)));
+                }
+            }
+        });
+        jMenuItem_tosml.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                Dimension dim = jDialog.getSize();
+
+                if (dim.width / 2 < 50) {
+                    return;
+                }
+
+                jDialog.setSize(dim.width / 2, dim.height / 2);
+
+                if (isGoogle) {
+                    jLabel.setIcon(new ImageIcon(new ImageIcon((byte[]) jLabel.getClientProperty(((String) jLabel.getClientProperty("type")) + jLabel.getClientProperty("zoom"))).getImage().getScaledInstance(jDialog.getWidth(), jDialog.getHeight(), Image.SCALE_SMOOTH)));
+                } else {
+                    jLabel.setIcon(new ImageIcon(new ImageIcon(getImage(uri, isGoogle)).getImage().getScaledInstance(jDialog.getWidth(), jDialog.getHeight(), Image.SCALE_SMOOTH)));
+                }
+            }
+        });
+        jMenuItem_close.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                jDialog.dispose();
+            }
+        });
+
+        jPopupMenu.add(jMenuItem_org);
+        jPopupMenu.add(jMenuItem_tobig);
+        jPopupMenu.add(jMenuItem_tosml);
+        jPopupMenu.add(new JSeparator());
+        jPopupMenu.add(jMenuItem_close);
+
+        jLabel.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseReleased(MouseEvent e) {
+                if (!e.isPopupTrigger()) {
+                    return;
+                }
+
+                jPopupMenu.show(e.getComponent(), e.getX(), e.getY());
+            }
+        });
+
+        if (isGoogle) {
+            new Thread() {
+                public void run() {
+                    final JWindow jWindow = new JWindow(jDialog);
+                    final JLabel  jLabel2 = new JLabel("  Map Loading  ");
+
+                    jLabel.putClientProperty("window", jWindow);
+
+                    jLabel2.setBorder(BorderFactory.createEtchedBorder());
+                    jLabel2.setFont(new Font(jLabel2.getFont().getFamily(), Font.BOLD, jLabel2.getFont().getSize()));
+                    jLabel2.setForeground(Color.darkGray);
+                    
+                    jWindow.getContentPane().add(jLabel2, "Center");
+                    jWindow.pack();
+                    jWindow.setLocation(jDialog.getLocationOnScreen().x + jDialog.getWidth() - jWindow.getWidth() - 2, jDialog.getLocationOnScreen().y + jDialog.getHeight() - jWindow.getHeight() - 2);
+                    jWindow.setVisible(true);
+                    
+                    for (int i = 11; i < 20; i++) {
+                        jLabel.putClientProperty("map_r_" + i, getImage(uri.replaceAll("zoom=\\d\\d", "zoom=" + i), isGoogle));
+                        jLabel2.setForeground(Color.white);
+                        jLabel.putClientProperty("map_s_" + i, getImage(uri.replaceAll("zoom=\\d\\d", "zoom=" + i) + "&maptype=satellite", isGoogle));
+                        jLabel2.setForeground(Color.darkGray);
+                    }
+    
+                    if (jLabel.getClientProperty("menu") != null) {
+                        ((JMenuItem) jLabel.getClientProperty("menu")).setEnabled(true);
+                    }
+
+                    jLabel.putClientProperty("zoom", "15");
+                    jLabel.putClientProperty("type", "map_r_");
+    
+                    jLabel.addMouseWheelListener(new MouseWheelListener() {
+                        @Override
+                        public void mouseWheelMoved(MouseWheelEvent e) {
+                            String zoom = (String) jLabel.getClientProperty("zoom");
+    
+                            if (zoom == null) {
+                                return;
+                            }
+    
+                            int cnt = Integer.parseInt(zoom);
+    
+                            if (cnt + e.getWheelRotation() < 11 || cnt + e.getWheelRotation() > 19) {
+                                return;
+                            }
+    
+                            cnt += e.getWheelRotation();
+
+                            jLabel.putClientProperty("zoom", String.valueOf(cnt));
+                            jLabel.setIcon(new ImageIcon(new ImageIcon((byte[]) jLabel.getClientProperty(((String) jLabel.getClientProperty("type")) + cnt)).getImage().getScaledInstance(jDialog.getWidth(), jDialog.getHeight(), Image.SCALE_SMOOTH)));
+                        }
+                    });
+                    
+                    jWindow.setVisible(false);
+                    jLabel.putClientProperty("window", null);
+                }
+            }.start();
+        }
+
+        getImageMap().put(uri, jDialog);
+    }
+
+    private HashMap getImageMap() {
+        if (frame.getStatusBar().getClientProperty("image_cache") == null) {
+            frame.getStatusBar().putClientProperty("image_cache", new HashMap());
+        }
+        
+        return (HashMap) frame.getStatusBar().getClientProperty("image_cache");
+    }
+
+    public PodRowBean getPodRowBean() {
+        return podRowBean;
+    }
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel jLabel_icon;
+    private javax.swing.JLabel jLabel_message;
+    private javax.swing.JLabel jLabel_podtime;
+    private javax.swing.JLabel jLabel_space1;
+    private javax.swing.JLabel jLabel_space2;
+    private javax.swing.JLabel jLabel_uimg;
+    private javax.swing.JLabel jLabel_user_name;
+    private javax.swing.JMenuItem jMenuItem_copy;
+    private javax.swing.JMenuItem jMenuItem_quote_reply;
+    private javax.swing.JMenuItem jMenuItem_reply;
+    private javax.swing.JPanel jPanel_center;
+    private javax.swing.JPanel jPanel_center2;
+    private javax.swing.JPanel jPanel_left;
+    private javax.swing.JPanel jPanel_top;
+    private javax.swing.JPanel jPanel_west;
+    private javax.swing.JPopupMenu jPopupMenu;
+    // End of variables declaration//GEN-END:variables
+}
diff --git a/src/beluga/PodRowBean.java b/src/beluga/PodRowBean.java
new file mode 100644 (file)
index 0000000..43eadaa
--- /dev/null
@@ -0,0 +1,114 @@
+package beluga;
+
+
+import java.io.*;
+
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: g9133
+ * Date: 11/06/28
+ * Time: 17:23
+ * To change this template use File | Settings | File Templates.
+ */
+public class PodRowBean implements Serializable {
+    private String id      = null;
+    private String userimg = null;
+    private String utitle  = null;
+    private String uname   = null;
+    private String uimg    = null;
+    private String upin    = null;
+    private String utime   = null;
+    private String message = null;
+    private String details = null;
+    private String detailImg = null;
+    private String detailMap = null;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getUserimg() {
+        return userimg;
+    }
+
+    public void setUserimg(String userimg) {
+        this.userimg = userimg;
+    }
+
+    public String getUtitle() {
+        return utitle;
+    }
+
+    public void setUtitle(String utitle) {
+        this.utitle = utitle;
+    }
+
+    public String getUname() {
+        return uname;
+    }
+
+    public void setUname(String uname) {
+        this.uname = uname;
+    }
+
+    public String getUimg() {
+        return uimg;
+    }
+
+    public void setUimg(String uimg) {
+        this.uimg = uimg;
+    }
+
+    public String getUpin() {
+        return upin;
+    }
+
+    public void setUpin(String upin) {
+        this.upin = upin;
+    }
+
+    public String getUtime() {
+        return utime;
+    }
+
+    public void setUtime(String utime) {
+        this.utime = utime;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getDetails() {
+        return details;
+    }
+
+    public void setDetails(String details) {
+        this.details = details;
+    }
+
+    public String getDetailImg() {
+        return detailImg;
+    }
+
+    public void setDetailImg(String detailImg) {
+        this.detailImg = detailImg;
+    }
+
+    public String getDetailMap() {
+        return detailMap;
+    }
+
+    public void setDetailMap(String detailMap) {
+        this.detailMap = detailMap;
+    }
+}
diff --git a/src/beluga/favicon.png b/src/beluga/favicon.png
new file mode 100644 (file)
index 0000000..a2a9ab0
Binary files /dev/null and b/src/beluga/favicon.png differ