(5580,8,'2011-12-08 18:45:58','2011-12-08 18:45:58','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas. <!--more-->\n\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\n\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\n<h2>Zimbra Definition File</h2>\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\n\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\n    &lt;resource&gt;logo.png&lt;/resource&gt;\n&lt;/zimlet&gt;</pre>\nA few notes about our definition file...\n<ul>\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\n	<li>Version is the version of the Zimlet itself.</li>\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. Files are loaded in the order of the elements.</li>\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\n</ul>\n<h2>Zimbra Configuration File</h2>\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\n<h2>Creating the Handler Object</h2>\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\n<pre>function com_schedule_example_HandlerObject() {\n\n}</pre>\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\n<h2>Event: init</h2>\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\n<pre>com_schedule_example_HandlerObject.prototype.init =\n        function() {\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\n        };</pre>\nA few notes about the arguments of createApp....\n<ul>\n	<li>The first argument is the name that will appear in the tab for the application</li>\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\n</ul>\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\n...so we get a nice professional looking tab...\n\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\n\n<h2>Event: appLaunch</h2>\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\n        function(appName) {\n            switch (appName) {\n                    case this._AppName: {\n                            this._createMainContent();\n                            this._createToolbarContent();\n                            this._createOverviewContent();\n                    }\n            }\n        };</pre>\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\nDetailed explanation of the methods will be provided later.\n<h2>Event: appActive</h2>\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\n\n<strong>IMPORTANT: When designing your Zimlet, it is important to know that appActive fires during the initial load of the Zimlet, along side appLaunch. After tracing the stack, it seems it fires BEFORE appLaunch as well. </strong>\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\n        function(appName, active) {\n\n            switch (appName) {\n                case this._simpleAppName: {\n\n                    if (active)\n                        this._createMainContent();\n\n                break;\n                }\n            }\n        };</pre>\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\n<h2>Creating the Main Content</h2>\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\n        function() {\n            var app = appCtxt.getApp(globalAppName);\n            var html = this._callSOAPClient();\n            app.setContent(html);\n        }</pre>\n<h2>Creating Buttons in the ToolBar</h2>\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\n        function() {\n\n        }</pre>\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\n<pre>var app = appCtxt.getApp(appName);\nvar toolbar = app.getToolbar();</pre>\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\n<pre>var prev_button_params = {\n     id: \'com_egroup_schedule_prev\',\n     text: \'Prev 3 Weeks\',\n     image: \'leftArrowIcon\',\n     tooltip: \'View the Schedule for the next 3 weeks.\'\n}\n\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\n<ul>\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\n	<li>Text is the display text of the button</li>\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\n	<li>Tooltip is the message displayed when hovering the button.</li>\n</ul>\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\n\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\nprev_button.addSelectionListener(prev_button_listener):</pre>\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\n        function() {\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\n        }</pre>\nWe repeat the above process to create a next button and the end result looks something like this...\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\n\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"size-full wp-image-5584 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a></p>\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\n<pre>com_schedule_example.prototype._createOverviewContent =\n        function() {\n\n        }</pre>\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\n<pre>var app = appCtxt.getApp(appName);\nvar overview = app.getOverview();</pre>\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\n<pre>var treeview = new ZmTreeView({\n     parent: overview,\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\nNext, we create the dwHeaderTreeItem for our zmTreeView. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\n<pre>var tree_item_header = new DwtHeaderTreeItem({\n     parent: treeview,\n     text: \'Schedules\',\n     className: \'treeHeader\'\n});</pre>\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appended onto it during runtime, so the actual CSS Class will be \'treeHeader-Text\'\n\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\n<pre>var tree_item_engineer = new DwtTreeItem({\n     parent: treeview,\n     text: \'Engineers\'\n});\n\nvar tree_item_tc = new DwtTreeItem({\n     parent: treeview,\n     text: \'Technical Consultants\'\n});</pre>\nWe make sure the header is not able to be selected, but the two child items are.\n<pre>tree_item_header.enableSelection(false);\ntree_item_engineer.enableSelection(true);\ntree_item_tc.enableSelection(true);</pre>\nThen, we add the all the items to the zmTreeView\n<pre>treeview.addChild(tree_item_header);\ntreeview.addChild(tree_item_engineer);\ntreeview.addChild(tree_item_tc);</pre>\nAnd, finally, we add the zmTreeView to the zmOverView.\n<pre>overview.setTreeView(treeview.overviewId);</pre>\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\ntreeview.addSelectionListener(engineer_button_listener);</pre>\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\n        function(ev) {\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\n                var tree_item = DwtControl.getTargetControl(ev, false);\n                if (tree_item.getText() == \'Engineers\' )\n                    // Logic to retreive the engineering schedule\n                else\n                    // Logic to retreive the technical consultants schedule.\n            }\n}</pre>\nTo break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.\n\nWith it all said and done, we get an Overview that looks like this...\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\"><img class=\"size-full wp-image-5588 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\" alt=\"Example of Custom Overview\" width=\"177\" height=\"207\" /></a></p>\n<p style=\"text-align: center\">Figure 5. Custom TreeView in OverView</p>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-autosave','','','2011-12-08 18:45:58','2011-12-08 18:45:58','',5571,'http://egroup.jasonmangone.com/5571-autosave',0,'revision','',0),(5584,8,'2011-12-06 20:40:40','2011-12-06 20:40:40','','Tree View','','inherit','open','open','','blog_3','','','2011-12-06 20:40:40','2011-12-06 20:40:40','',5571,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png',0,'attachment','image/png',0),(5585,8,'2011-12-06 20:26:56','2011-12-06 20:26:56','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarcontent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be called during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if their is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week\r\n             // period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><img class=\"aligncenter\" src=\"image/png;base64,[encoded data, 6180 characters]\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"306\" height=\"106\" /></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><img class=\"aligncenter\" src=\"image/png;base64,[encoded data, 8480 characters]\" alt=\"Example of a TreeView\" width=\"248\" height=\"242\" /></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. The first item will be our header item. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appened onto it during runtime, so the actual CSS Class will be \'treeHeader-text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\n<pre>To break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.</pre>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-8','','','2011-12-06 20:26:56','2011-12-06 20:26:56','',5571,'http://egroup.jasonmangone.com/5571-revision-8',0,'revision','',0),(5581,8,'2011-12-06 20:23:49','2011-12-06 20:23:49','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be enhancing some of the basic tutorials and providing more advanced knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarcontent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be called during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if their is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week\r\n             // period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><img class=\"aligncenter\" src=\"image/png;base64,[encoded data, 6180 characters]\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"306\" height=\"106\" /></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><img class=\"aligncenter\" src=\"image/png;base64,[encoded data, 8480 characters]\" alt=\"Example of a TreeView\" width=\"248\" height=\"242\" /></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. The first item will be our header item. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appened onto it during runtime, so the actual CSS Class will be \'treeHeader-text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\n<pre>To break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.</pre>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-6','','','2011-12-06 20:23:49','2011-12-06 20:23:49','',5571,'http://egroup.jasonmangone.com/5571-revision-6',0,'revision','',0),(5586,8,'2011-12-06 20:41:17','2011-12-06 20:41:17','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"aligncenter size-full wp-image-5583\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a>\r\n<p style=\"text-align: center\"></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"aligncenter size-full wp-image-5584\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. The first item will be our header item. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appened onto it during runtime, so the actual CSS Class will be \'treeHeader-text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\n<pre>To break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.</pre>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-9','','','2011-12-06 20:41:17','2011-12-06 20:41:17','',5571,'http://egroup.jasonmangone.com/5571-revision-9',0,'revision','',0),(5582,8,'2011-12-06 20:26:21','2011-12-06 20:26:21','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\n&nbsp;\r\n\r\nThe first step in defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarcontent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be called during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if their is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week\r\n             // period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><img class=\"aligncenter\" src=\"image/png;base64,[encoded data, 6180 characters]\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"306\" height=\"106\" /></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><img class=\"aligncenter\" src=\"image/png;base64,[encoded data, 8480 characters]\" alt=\"Example of a TreeView\" width=\"248\" height=\"242\" /></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. The first item will be our header item. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appened onto it during runtime, so the actual CSS Class will be \'treeHeader-text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\n<pre>To break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.</pre>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-7','','','2011-12-06 20:26:21','2011-12-06 20:26:21','',5571,'http://egroup.jasonmangone.com/5571-revision-7',0,'revision','',0),(5583,8,'2011-12-06 20:39:35','2011-12-06 20:39:35','','Toolbar Buttons','','inherit','open','open','','blog_2','','','2011-12-06 20:39:35','2011-12-06 20:39:35','',5571,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png',0,'attachment','image/png',0),(5587,8,'2011-12-06 20:42:16','2011-12-06 20:42:16','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"aligncenter size-full wp-image-5584\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. The first item will be our header item. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appened onto it during runtime, so the actual CSS Class will be \'treeHeader-text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\n<pre>To break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.</pre>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-10','','','2011-12-06 20:42:16','2011-12-06 20:42:16','',5571,'http://egroup.jasonmangone.com/5571-revision-10',0,'revision','',0),(5588,8,'2011-12-06 20:50:54','2011-12-06 20:50:54','','Custom Overview','','inherit','open','open','','blog_4','','','2011-12-06 20:50:54','2011-12-06 20:50:54','',5571,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png',0,'attachment','image/png',0),(5589,8,'2011-12-06 20:42:40','2011-12-06 20:42:40','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"size-full wp-image-5584 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. The first item will be our header item. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appened onto it during runtime, so the actual CSS Class will be \'treeHeader-text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\n<pre>To break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.</pre>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-11','','','2011-12-06 20:42:40','2011-12-06 20:42:40','',5571,'http://egroup.jasonmangone.com/5571-revision-11',0,'revision','',0),(5590,8,'2011-12-06 20:51:56','2011-12-06 20:51:56','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"size-full wp-image-5584 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtHeaderTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appended onto it during runtime, so the actual CSS Class will be \'treeHeader-Text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\nTo break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.\r\n\r\nWith it all said and done, we get an Overview that looks like this...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\"><img class=\"aligncenter size-full wp-image-5588\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\" alt=\"Example of Custom Overview\" width=\"177\" height=\"207\" /></a>\r\n<p style=\"text-align: center\">Figure 5. Custom TreeView in OverView</p>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-12','','','2011-12-06 20:51:56','2011-12-06 20:51:56','',5571,'http://egroup.jasonmangone.com/5571-revision-12',0,'revision','',0),(5592,8,'2011-12-06 20:52:19','2011-12-06 20:52:19','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas.\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"size-full wp-image-5584 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtHeaderTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appended onto it during runtime, so the actual CSS Class will be \'treeHeader-Text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\nTo break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.\r\n\r\nWith it all said and done, we get an Overview that looks like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\"><img class=\"size-full wp-image-5588 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\" alt=\"Example of Custom Overview\" width=\"177\" height=\"207\" /></a></p>\r\n<p style=\"text-align: center\">Figure 5. Custom TreeView in OverView</p>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-13','','','2011-12-06 20:52:19','2011-12-06 20:52:19','',5571,'http://egroup.jasonmangone.com/5571-revision-13',0,'revision','',0),(5594,6,'2011-11-22 22:00:26','2011-11-22 22:00:26','The proliferation of smart phones and tablets are at record levels, and no one sees them stopping anytime soon. With these new devices coming out everyday, remote access and potential for issues to arise will continue to increase as well.\r\n\r\nMobile Security will be a big focus for a number of companies as we shift in 2012, and Trend Micro is here to help.\r\n\r\n  <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/11/TMMSfig1.jpg\"><img class=\"size-full wp-image-5509 alignleft\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/11/TMMSfig1.jpg\" alt=\"\" width=\"550\" height=\"329\" /></a>\r\n\r\n&nbsp;\r\n\r\nAs smart phones and tablets enter and traverse networks at record levels, IT administrators will have to find ways to ensure that devices accessing corporate resources are secure.\r\n\r\n&nbsp;\r\n\r\nLook no further than <a title=\"Trend Micro Mobile Security\" href=\"http://us.trendmicro.com/us/products/enterprise/mobile-security/\" target=\"_blank\">Trend Micro Mobile Security</a>.\r\n\r\n There are 3 main technologies behind the security:\r\n\r\n1. <strong>Walled Garden</strong> - essentially keeps network applications (email) completely separate from regular consumer applications\r\n\r\n2. <strong>Remote Wipe</strong> - if the phone is lost or falls into non-company hands, it can be remotely wiped\r\n\r\n3. <strong>Encryption</strong> - the contents of the phone can be encrypted and secure\r\n\r\nAs a plug-in to Trend Micro\'s OfficeScan, organizations can quickly deploy the mobile security app to IOS (iPad &amp; iPhone), Android, Windows, Symbian, and RIM Blackberry devices.\r\n\r\nThe devices can be remotely provisioned, encrypted and password protected. Remote lock, remote wipe, power-on-password enforcement, and location tracking are some of the key features that you will have at your disposal. Plus you\'ll know that your devices will be protected through Trend Micro\'s best in class cloud-based threat intelligence, Smart Protection Network, safeguarding against malware, viruses, malicious code and attacks.\r\n\r\nPlus the app gives the smart phone user the ability to filter calls and messages. So if an unwanted user is calling and texting you, you can simply put them on the block list and move on.\r\n\r\n The game has changed: Smart Phones and Tablets are omnipresent and being able to prevent enterprise assets from being at risk is key.\r\n\r\neGroup can help.','TREND MICRO MOBILE SECURITY','','inherit','open','open','','5507-revision-22','','','2011-11-22 22:00:26','2011-11-22 22:00:26','',5507,'http://egroup.jasonmangone.com/5507-revision-22',0,'revision','',0),(5595,8,'2011-12-07 13:51:53','2011-12-07 13:51:53','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas. <!--more-->\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"size-full wp-image-5584 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtHeaderTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appended onto it during runtime, so the actual CSS Class will be \'treeHeader-Text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\nTo break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.\r\n\r\nWith it all said and done, we get an Overview that looks like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\"><img class=\"size-full wp-image-5588 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\" alt=\"Example of Custom Overview\" width=\"177\" height=\"207\" /></a></p>\r\n<p style=\"text-align: center\">Figure 5. Custom TreeView in OverView</p>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-14','','','2011-12-07 13:51:53','2011-12-07 13:51:53','',5571,'http://egroup.jasonmangone.com/5571-revision-14',0,'revision','',0);
INSERT INTO `wp_posts` VALUES (5596,8,'2011-12-08 18:42:58','2011-12-08 18:42:58','If you have decided to capitalize on VMware\'s Open Source email and collaboration software, Zimbra Collaboration Suite 6.0, you might be struggling a bit to find in-depth tutorials on Zimlet development that give you the information you need to take advantage of Zimbra\'s rich AJAX web interface. This is normal with any new software release, particularly with a platform that supports a complex and rich API for plug-in and app development. To help make the power of the ZCS 6 API available to the general development community, we\'ll be expanding on some of the basic tutorials in the Zimbra Wiki and providing more detailed knowledge of some of the common features you will want to implement in one of your Zimlets. This article will focus on creating a Tab Applications that provides real world functionality in the Main Content, Toolbar, and Overview areas. <!--more-->\r\n\r\nIf you are new to Zimlet Development or have absolutely no idea what Zimbra is, we recommend visiting the <a href=\"http://www.zimbra.com/about/\" target=\"_blank\">VMWare Zimbra website</a> and reading the <a href=\"http://wiki.zimbra.com/index.php?title=ZCS_6.0:Zimlet_Developers_Guide:Introduction\" target=\"_blank\">ZCS 6.0 Developers Guide</a> before reading the tutorial. A good starter guide on the basic\'s of a Tab Application can be found at <a href=\"http://blog.zimbra.com/blog/archives/2010/01/adding-tab-applications-to-the-zimbra-web-client.html\" target=\"_blank\">Adding Tab Applications to the Zimbra Web Client</a> While we will be briefly going over some of the basics, we are going to assume that you have a basic understanding of Zimlet development, the structure of a Zimlet package and an in-depth understanding of JavaScript, HTML, XML and CSS.\r\n\r\nTo illustrate a real world example, we\'ll be using code segments from one of our Zimlets, built for the purpose of displaying the weekly schedules of our engineers and technical consultants. The names have been changed to protect the innocent\r\n<h2>Zimbra Definition File</h2>\r\nThe first step in Zimlet creation is defining your Zimlet Definition File, an XML file that defines the core behavior of the Zimlet and the resources included in the Zimlet package. If you wanted to implement your Zimlet as a content or panel Zimlet or create context menus, you would do so with XML elements in your Zimlet Definition File. The concept of the file is very similar to an Android Manifest file for any Droid developers out there. A complete reference of the file\'s structure can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Definition_File_Reference\" target=\"_blank\">Zimlet Definition File Reference</a>.\r\n\r\nWith a Tab application, implementation is done in the JavaScript code itself and thus, we only need to list our files and resources that are in the Zimlet package in our definition file\r\n<pre>&lt;zimlet name=\"com_schedule_example\" version=\"1.3\" description=\"Example of a Schedule Zimlet\"&gt;\r\n    &lt;include&gt;com_schedule_example.js&lt;/include&gt;\r\n    &lt;includeCSS&gt;master.css&lt;/includeCSS&gt;\r\n    &lt;handlerObject&gt;com_schedule_example_HandlerObject&lt;/handlerObject&gt;\r\n    &lt;resource&gt;logo.png&lt;/resource&gt;\r\n&lt;/zimlet&gt;</pre>\r\nA few notes about our definition file...\r\n<ul>\r\n	<li>The name attribute is the unique name of the Zimlet. Zimbra follows the same naming convention as Java does for it\'s packages. Your final zip file and the definition file itself will both share this name.</li>\r\n	<li>Version is the version of the Zimlet itself.</li>\r\n	<li>Description will show up on the Preferences-&gt;Zimlets tab after the Zimlet has been installed</li>\r\n	<li>com_schedule_example.js is our main Javascript file where the bulk of our Zimlet\'s logic is defined. You are free to break apart your source code into multiple files, each of which can be defined with their own &lt;include&gt; element. We can\'t confirm the order in which these JavaScript files are loaded at runtime, but operating off the assumption that it\'s done in the order of the elements has caused no problems in any of our Zimlets.</li>\r\n	<li>The handlerObject is the \"main\" function of the Zimlet and is a JavaScript class where all the Zimlet\'s life-cycle events are implemented. It is contained in com_schedule_example.js</li>\r\n	<li>Resource elements define any external files needed in your Zimlet (images, plain text, binaries, etc).</li>\r\n</ul>\r\n<h2>Zimbra Configuration File</h2>\r\nThe Zimlet Configuration File, config_template.xml, defines specific global and host properties that affect the operation of your Zimlet. For the purposes of this tutorial, we don\'t need any special configuration settings, so we will not be providing any example code, but this is, none the less, a very important file. A complete reference of the structure of the file can be found at <a href=\"http://wiki.zimbra.com/wiki/ZCS_6.0:Zimlet_Developers_Guide:Zimlet_Configuration_File_Reference\" target=\"_blank\">Zimlet Configuration File Reference</a>\r\n<h2>Creating the Handler Object</h2>\r\nAs mentioned previously, the HandlerObject is where all the Zimlet life-cycle events are defined along with their corresponding logic. To create our HandlerObject, we open up our com_schedule_example.js file and implement a class using the same name defined in our definition file.\r\n<pre>function com_schedule_example_HandlerObject() {\r\n\r\n}</pre>\r\nThis class\'s subclass will be ZmZimletBase so we have access to all the API methods.\r\n<pre>com_schedule_example_HandlerObject.prototype = new ZmZimletBase();\r\ncom_schedule_example_HandlerObject.prototype.constructor = com_schedule_example_HandlerObject;</pre>\r\nNow that we have defined our HandlerObject, we need to implement the three main events of a Zimlet\'s lifecycle: init, appLaunch, and appActive.\r\n<h2>Event: init</h2>\r\nThe init function is the equivalent to the OnCreate event in other platforms and is triggered once during loading of the Zimbra Desktop. This method is where we create our Tab Application via the createApp method. We store the app name returned by the method as a class property for access later on.\r\n<pre>com_schedule_example_HandlerObject.prototype.init =\r\n        function() {\r\n            this._AppName = this.createApp(\"Schedule\", \"tabIcon\", \"Display the Engineer and Technical Consulting schedules\");\r\n        };</pre>\r\nA few notes about the arguments of createApp....\r\n<ul>\r\n	<li>The first argument is the name that will appear in the tab for the application</li>\r\n	<li>The second argument is the CSS Class that will define the icon in our tab. \"Img\" will be prefixed to the CSS Class at runtime so the actual CSS Class will be \"ImgtabIcon\".</li>\r\n	<li>The final argument defines the message displayed in the tool-tip when you hover over the tab itself.</li>\r\n</ul>\r\nWe\'ll also take a moment to define our \"tabIcon\" class in our master.css stylesheet to wrap this up...\r\n<pre>.ImgtabIcon { background: url(\"logo.png\") no-repeat 0 0; width: 16px; height: 16px; overflow: hidden; }</pre>\r\n...so we get a nice professional looking tab...\r\n\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\"><img class=\"aligncenter size-full wp-image-5576\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_11.png\" alt=\"Example of Tab\" width=\"569\" height=\"38\" /></a>\r\n<p style=\"text-align: center\">Figure 1: Example of a Tab</p>\r\n\r\n<h2>Event: appLaunch</h2>\r\nThe appLaunch event is similar to the OnLoad event in other platforms and is triggered the first time the Tab application is clicked. The event arg, appName, informs the method which Zimlet is triggering the event. We use it in a switch statement to call our logic for only our Zimlet.\r\n<pre>com_schedule_example_HandlerObject.prototype.appLaunch =\r\n        function(appName) {\r\n            switch (appName) {\r\n                    case this._AppName: {\r\n                            this._createMainContent();\r\n                            this._createToolbarContent();\r\n                            this._createOverviewContent();\r\n                    }\r\n            }\r\n        };</pre>\r\nInside our case statement, we call three method, each responsible for creating the content for a different part of the anatomy of a Zimlet.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\"><img class=\"size-full wp-image-5575 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/zimlet-tab-anatomy.png\" alt=\"Anatomy of a Tab Application\" width=\"784\" height=\"496\" /></a></p>\r\n<p style=\"text-align: center\">Figure 2: Anatomy of a Tab Application</p>\r\nDetailed explanation of the methods will be provided later.\r\n<h2>Event: appActive</h2>\r\nThe appActive event is a combination of OnPause and OnStart events in other platforms. It is triggered both when the tab for the application is selected and unselected. Like appLaunch, it receives the app name as an event arg, but also a boolean value which informs us of whether or not the Zimlet is active.\r\n\r\n<strong>IMPORTANT: When designing your Zimlet, it is important to know that appActive fires during the initial load of the Zimlet, along side appLaunch. After tracing the stack, it seems it fires BEFORE appLaunch as well. </strong>\r\n<pre>com_schedule_example_HandlerObject.prototype.appActive =\r\n        function(appName, active) {\r\n\r\n            switch (appName) {\r\n                case this._simpleAppName: {\r\n\r\n                    if (active)\r\n                        this._createMainContent();\r\n\r\n                break;\r\n                }\r\n            }\r\n        };</pre>\r\nIn our Zimlet, the main content is retreived via a web service, so every time the Zimlet is activated, we want to call the web service and refresh the content. To do this, we check to ensure the Zimlet calling the event is our own and than check to see if the Zimlet is active. If it is, we recreate the main content using our createMainContent method.\r\n<h2>Creating the Main Content</h2>\r\nCreating our Main Content is relatively simple. We get the ZmZimletApp object for our Zimlet and call the setContent method with a string of HTML as an argument. In the context of our Scheduling app, we make a call to a SOAP client that returns a string of HTML representing the schedule. For the sake of brevity, we won\'t go into the details of the SOAP client, but you have our personal assurance that it works!\r\n<pre>com_schedule_example_HandlerObject.prototype._createMainContent =\r\n        function() {\r\n            var app = appCtxt.getApp(globalAppName);\r\n            var html = this._callSOAPClient();\r\n            app.setContent(html);\r\n        }</pre>\r\n<h2>Creating Buttons in the ToolBar</h2>\r\nNow, it\'s time to add Buttons to our ToolBar and things will get a bit more complicated. The logic for accomplishing this will be defined in our createToolbarContent method that we called during appLaunch. Unlike the dynamic content of the Main Content area, the Toolbar buttons will be static and unchanging for the duration of the Zimlet\'s life-cycle and do not need to be recreated during appActive.\r\n<pre>com_schedule_example_HandlerObject.prototype._createToolbarContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe step in creating buttons in our Toolbar is to get the ZmZimletApp object and the ZmToolBar object itself from ZmZimletApp.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar toolbar = app.getToolbar();</pre>\r\nFor the context of our scheduling Zimlet, we need two buttons, one that changes the date range for the schedule to a previous 3 week period and another that changes it to the next 3 weeks. To begin we will, create the previous button.\r\n<pre>var prev_button_params = {\r\n     id: \'com_egroup_schedule_prev\',\r\n     text: \'Prev 3 Weeks\',\r\n     image: \'leftArrowIcon\',\r\n     tooltip: \'View the Schedule for the next 3 weeks.\'\r\n}\r\n\r\nvar prev_button = toolbar.createButton(prev_button_params, prev_button_params);</pre>\r\nFirst, we define a hash of our parameters for the buttons. We are using a few basic ones. A detailed list can be found in the ZCS 6.0 API Specifications. A few notes about this...\r\n<ul>\r\n	<li>ID is an unique identifier for retrieving the button object via the API</li>\r\n	<li>Text is the display text of the button</li>\r\n	<li>Image is the CSS Class which defines the icon, identical to the tabIcon class we created for our App. \"Img\" is also prefixed to these CSS Classes, making the actual class name at runtime ImgleftArrowIcon</li>\r\n	<li>Tooltip is the message displayed when hovering the button.</li>\r\n</ul>\r\nThe params must be supplied as an argument twice to the createButton method. We don\'t fully understand the reasoning behind this or if there is any distinction between the two param arguments. What we can tell you is that omitting one of the arguments will cause a runtime error and including the same set of params as both arguments successfully creates a working button.\r\n\r\nNow, that we have our button created, we need to add a listener event so something magical happens when it is pressed. This is done via assignment of an AjxListener object\r\n<pre> var prev_button_listener = new AjxListener(this, this._eventPrevThreeWeeks);\r\nprev_button.addSelectionListener(prev_button_listener):</pre>\r\nThe first argument in the AjxListener consructor determines which object will call the provided method. In this case, it is the HandlerObject. The second argument is the actual method that is called when the listener is triggered. In our example, it\'s a custom method called eventPrevThreeWeeks. Finally, we call addSelectionListener so the AjxListener is called when the button is selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventPrevThreeWeeks=\r\n        function() {\r\n             // Normally, this event would make an SOAPClient call to update our Main Content area with a new schedule that represented the previous three week period, but for the sake of staying on topic, we\'ve removed that code.\r\n        }</pre>\r\nWe repeat the above process to create a next button and the end result looks something like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\"><img class=\"size-full wp-image-5583 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_2.png\" alt=\"Two Buttons in a Zimlet Tab Application\'s Toolbar\" width=\"311\" height=\"89\" /></a></p>\r\n<p style=\"text-align: center\">Figure 3. Two Buttons in a Tab Application\'s Toolbar</p>\r\n\r\n<h2 style=\"text-align: left\">Adding a TreeView to the Overview</h2>\r\nNow, we have a Main Content area with content and a Toolbar area with buttons, but our Overview is a little bare. For the context of our Zimlet, we need a way to switch back and forth between the schedule for Engineers and for Technical Consultants. We are going to implement this feature as a TreeView in the Overview section.\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\"><img class=\"size-full wp-image-5584 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_3.png\" alt=\"Example of a Tree View\" width=\"229\" height=\"208\" /></a></p>\r\n<p style=\"text-align: center\">Figure 4. Example of a Tree View in an Overview</p>\r\nThe logic for this will be called in the createOverviewContent method we implemented in appLaunch. Much like the Toolbar, this is a static feature and does not need to be recreated via appActive\r\n<pre>com_schedule_example.prototype._createOverviewContent =\r\n        function() {\r\n\r\n        }</pre>\r\nThe first step in the process is to get the ZmZimletApp object and from that, the ZmOverview object.\r\n<pre>var app = appCtxt.getApp(appName);\r\nvar overview = app.getOverview();</pre>\r\nAfter that, we need to create our ZmTreeView object. We pass the object a hash of params. We define the ZmTreeView\'s parent as the ZmOverview object. Don\'t be confused by overviewID. It\'s the unqiue ID for the ZmTreeView object, not the ZmOverview object. We are only using the basic params to create this object. A detailed list is in the ZCS 6.0 API Specifications.\r\n<pre>var treeview = new ZmTreeView({\r\n     parent: overview,\r\n     overviewId: \'com_egroup_schedule_treeview\'});</pre>\r\nNext, we create the dwHeaderTreeItem for our zmTreeView. As a quick note, the API documentation for TreeView suggests there is an alternative way to implement a DwHeaderTreeItem that will be recognized by the getHeaderItem method, but if it exists, it is not listed. As such, we are forced to implement our dwHeaderTreeItem like a dwTreeItem.\r\n<pre>var tree_item_header = new DwtHeaderTreeItem({\r\n     parent: treeview,\r\n     text: \'Schedules\',\r\n     className: \'treeHeader\'\r\n});</pre>\r\nWe set the parent for the DwtTreeitem to the ZmTreeView object, define the display text to be \'Schedules\' and give it an unique CSS Class so it can have it\'s own custom CSS. The CSS Class will have -Text appended onto it during runtime, so the actual CSS Class will be \'treeHeader-Text\'\r\n\r\nNow, we define our two TreeItems, one for Engineers and one for Technical Consultants.\r\n<pre>var tree_item_engineer = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Engineers\'\r\n});\r\n\r\nvar tree_item_tc = new DwtTreeItem({\r\n     parent: treeview,\r\n     text: \'Technical Consultants\'\r\n});</pre>\r\nWe make sure the header is not able to be selected, but the two child items are.\r\n<pre>tree_item_header.enableSelection(false);\r\ntree_item_engineer.enableSelection(true);\r\ntree_item_tc.enableSelection(true);</pre>\r\nThen, we add the all the items to the zmTreeView\r\n<pre>treeview.addChild(tree_item_header);\r\ntreeview.addChild(tree_item_engineer);\r\ntreeview.addChild(tree_item_tc);</pre>\r\nAnd, finally, we add the zmTreeView to the zmOverView.\r\n<pre>overview.setTreeView(treeview.overviewId);</pre>\r\nNow that we have our ZmTreeView , we need to assign it a listener, much like we did with the buttons, so we can fire logic when one of the items is selected.\r\n<pre>var engineer_button_listener = new AjxListener(this, this._eventTreeViewSelected);\r\ntreeview.addSelectionListener(engineer_button_listener);</pre>\r\nThe listener for the ZmTreeView works a little differently than the one for the buttons. Instead of having one method for every dwtTreeItem, we have a single method that receives a hash as an event argument. This hash allows us to determine which dwtTreeItem was selected.\r\n<pre>com_schedule_example_HandlerObject.prototype._eventTreeViewSelected =\r\n        function(ev) {\r\n            if (ev.items.length == 1 &amp;&amp; ev.detail == DwtTree.ITEM_SELECTED) {\r\n                var tree_item = DwtControl.getTargetControl(ev, false);\r\n                if (tree_item.getText() == \'Engineers\' )\r\n                    // Logic to retreive the engineering schedule\r\n                else\r\n                    // Logic to retreive the technical consultants schedule.\r\n            }\r\n}</pre>\r\nTo break down the above, we check to see if the event triggering the method was a dwtTreeItem being selected. If so, we get the actual dwtTreeItem object via getTargetControl and check it\'s display test to determine what dwtTreeItem it is. This allows us to execute the proper code for retrieving the engineering or technical consultant schedule.\r\n\r\nWith it all said and done, we get an Overview that looks like this...\r\n<p style=\"text-align: center\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\"><img class=\"size-full wp-image-5588 aligncenter\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/blog_4.png\" alt=\"Example of Custom Overview\" width=\"177\" height=\"207\" /></a></p>\r\n<p style=\"text-align: center\">Figure 5. Custom TreeView in OverView</p>','ZIMBRA ZIMLETS - CREATING A TAB APPLICATION','','inherit','open','open','','5571-revision-15','','','2011-12-08 18:42:58','2011-12-08 18:42:58','',5571,'http://egroup.jasonmangone.com/5571-revision-15',0,'revision','',0),(5761,44,'2011-12-27 11:15:05','2011-12-27 11:15:05','<span style=\"font-family: Calibri\"><span style=\"font-size: small\">Cisco UCS blades provide a new “Appliance” fabric interconnect port type that can be used to direct-connect IP SAN storage to the fabric interconnects. Here are a few tips learned from a recent project connecting an EMC VNX array to Cisco UCS B-Series blades using 10GB iSCSI:</span></span>\r\n<ul>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Designate two separate, isolated (non-routed) VLANs to be used for iSCSI traffic, one for each fabric interconnect:</span></span>\r\n<ul>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Name the VLANs something simple and self-documenting like iSCSI-A and iSCSI-B</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Assign a private IP address range to each VLAN. As a best practice, these should not conflict with any other IP addresses used inside the corporate network</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Create the VLANs on the network tab in UCS Manager</span></span></li>\r\n</ul>\r\n</li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Connect the storage array to the fabric interconnects using two 10GB links per storage processor.  Connect each SP to both fabric interconnects and configure the ports on the fabric interconnect as “Appliance” ports</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Assign the appliance ports on fabric interconnect A to VLAN iSCSI-A and the appliance ports on fabric interconnect B to VLAN iSCSI-B</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Configure the IP addresses on the SP ports. The ports connected to fabric interconnect A get an IP address in the range assigned to iSCSI-A and the ports connected to fabric B get an IP address in the range assigned to iSCSI-B</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Add two virtual interfaces in the host service profiles, one for iSCSI-A and one for iSCSI-B. Assign these to the appropriate VLAN</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Configure the host OS for iSCSI, assigning an IP address on the iSCSI-A VLAN for one interface and on iSCSI-B for the other.  In the iSCSI configuration specify the appropriate Storage Processor IP addresses initiator ports for each VLAN</span></span></li>\r\n	<li><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Here’s the key to success: The VLANs <span style=\"text-decoration: underline\">must exist</span> on the upstream switches the fabric interconnects use to interface with the rest of the network. The upstream switches are in the critical path for network traffic, even traffic between storage and servers in the UCS environment. This means that <em>having redundant upstream switches is essential for high-availability</em>, as <span style=\"text-decoration: underline\">network traffic will not flow inside the UCS</span> if the external uplink switches go down!</span></span></li>\r\n</ul>','HOW TO CONFIGURE VNX DIRECT-ATTACHED IP STORAGE ON CISCO UCS B-SERIES BLADES','','publish','open','open','','how-to-configure-vnx-direct-attached-ip-storage-on-cisco-ucs-b-series-blades','','','2011-12-27 11:16:50','2011-12-27 11:16:50','',0,'http://egroup.jasonmangone.com/?p=5761',0,'post','',2),(5665,44,'2011-12-20 11:19:32','2011-12-20 11:19:32','Veeam has released Veeam Backup &amp; Replication v6 with three key new features:\r\n<ol>\r\n	<li>1) New Enterprise Scalability -  v6 introduces a new distributed architecture. Installing a lightweight agent can turn any Windows server into a backup proxy. A central backup server uses intelligent load balancing to manage backup proxies across the enterprise, including remote or branch offices.</li>\r\n	<li>2) Enhanced replication times that are up to 10x faster</li>\r\n	<li>3) Multi-hypervisor support - now supports Microsoft Hyper-V in addition to VMware vSphere</li>\r\n</ol>\r\nAnother great feature is 1-click restore that simplifies the process of restoring individual files to their original location.\r\n\r\nFor more information see <a href=\"http://www.veeam.com/veeam_backup_6_0_whats_new_wn.pdf\" target=\"_blank\">What’s new in v6</a> on Veeam\'S web site.','VEEAM RELEASES BACKUP &amp; REPLICATION VERSION 6','','publish','open','open','','veeam-releases-backup-version-6','','','2011-12-20 11:21:19','2011-12-20 11:21:19','',0,'http://egroup.jasonmangone.com/?p=5665',0,'post','',0),(5600,2,'2011-12-12 22:05:29','2011-12-12 22:05:29','','More','','inherit','open','open','','egroup-%e2%80%93-marketing-and-corporate-communications-manager','','','2011-12-12 22:05:29','2011-12-12 22:05:29','',4668,'http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGroup-–-Marketing-and-Corporate-Communications-Manager.pdf',0,'attachment','application/pdf',0),(5601,2,'2011-08-09 20:22:37','2011-08-09 20:22:37','Headquartered in South Carolina with offices throughout the entire southeast, eGroup is always looking for upbeat, driven and self-motivated \"go getters\" to join our rapidly growing team! Available positions include:\r\n<ul>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Sales Account Executive</strong></span>: As an eGroup Sales Executive, you will utilize your sales experience to extend eGroup’s products, services, and solutions to executive management in a defined geography or strategic area, with an emphasis on selling products and services as “solutions” designed to directly address the business initiatives and requirements of these customers. Professional territory management and account development skills are a must. You must be motivated to generate new business, provide excellent customer service, and be self-reliant. You must be able to prospect, qualify, engage, and manage all the elements of a complex solution sale. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Sales-Account-Executive1.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Inside Sales Executive</strong></span>: This is an excellent opportunity for the sales professional with a positive, “can do” attitude. The right individual will be responsible for engaging customers, vendors, distributors, and manufacturers to assist eGroup in building maintaining, and delivering its sales pipeline. This will include lead qualification, proposal development, and writing with customer follow-up. This is a fantastic opportunity to work within a growing organization while mastering your skills. As an eGroup Inside Sales Executive, you will utilize your skills and drive to assist our Outside Sales team in extending eGroup’s products, services, and solutions to customers and prospects. You must be motivated to provide excellent customer service, work well in a team environment, and be self-reliant. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Inside-Sales-Executive.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Technical Consultant</strong></span>: An excellent opportunity for the motivated technical sales professional, you\'ll be backed by eGroup\'s continual investment in market proven technologies and support resources.  These \"best of breed\" technology offerings will position you for success in delivering sophisticated solutions to a growing set of customers with increasingly complex needs. This position primarily focuses on consultation, design and deployment of VMware, EMC, Cisco, Microsoft and Citrix technologies. You will work directly with our outside and inside sales teams to meet with current and prospective customers, understand their needs, and propose technology solutions to help them overcome their challenges based on intimate knowledge of eGroup services, products and technologies.  <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Technical-Consultant.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Applications Services Team</strong></span>: The Applications Services Team is focused on delivering solutions that solve real issues in the End-User Computing, Applications Services and Cloud Computing market.  Potential Applications Services Engineers will have a passion for identifying and solving real world issues by combining a variety of applications development, systems administration and product specific knowledge gained through training and certification. eGroup Application Services Engineers leverage their applications development and administration backgrounds to work with solutions and continually develop new skillsets.  <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Applications-Services-Team.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Systems Engineer</strong></span>:  This position primarily focuses on design, deployment, and support of VMware, EMC, Cisco, Microsoft and Citrix technologies. You will respond to and investigate end user inquiries, concerns, and issues via phone, Internet, e‐mail, and in person in a timely and courteous manner, and will recommend or perform actions to correct problems based on intimate knowledge of the technology or specific systems.  You should be proficient in communication both verbal and written, and be extremely passionate about technology. You should be a self‐motivated and driven individual capable of learning quickly and adapting to the latest industry trends and best practices. As a representative of eGroup, you must demonstrate a positive attitude and willingness to go above and beyond to ensure complete customer satisfaction. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Systems-Engineer.pdf\">More</a> </li>\r\n</ul>\r\n<strong>To apply or for more information: <a href=\"mailto:hr@eGroup-us.com\">hr@eGroup-us.com</a></strong>','Careers','','inherit','open','open','','4668-revision-v1','','','2011-08-09 20:22:37','2011-08-09 20:22:37','',4668,'http://egroup.jasonmangone.com/4668-revision-34',0,'revision','',0),(5603,2,'2011-12-12 22:20:23','2011-12-12 22:20:23','<strong>Target Audience</strong>\r\n\r\nIT Administrators, IT Operations Managers, IT Management, Application Business Owners\r\n\r\n<strong>Meet the Expert</strong>\r\n\r\nJim Silvera is a Solutions Architect with over 18 years experience in the Enterprise Management sector. Jim has helped many organizations increase IT efficiencies by successfully implementing management solutions.\r\n\r\n<strong>Agenda</strong>\r\n\r\nVMware vCenter Operations proactively ensures service levels, minimizes downtime and troubleshooting and optimizes resource usage in dynamic virtual and cloud environments.<!--more-->\r\n\r\n<strong>In this presentation and product demonstration, you will learn how:</strong>\r\n\r\n- VMware vCenter Operations uses patented analytics and powerful visualizations to automate performance and capacity management.\r\n\r\n-  It collects and analyzes performance data, correlates abnormalities and identifies the root cause of building performance problems.\r\n\r\n- vCenter Operations can collect and map change data to these abnormalities so you can quickly determine if a configuration change is the cause of the performance problem.\r\n\r\n- vCenter Operations also provides capacity management to optimize resource usage.\r\n\r\n-----------------------------------------------------\r\n\r\nTo register for this meeting\r\n\r\n-----------------------------------------------------\r\n\r\n1. Go to <a href=\"https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D\">https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D</a>\r\n\r\n2. Register for the meeting.\r\n\r\n-------------------------------------------------------\r\n\r\nTo start or join the online meeting\r\n\r\n-------------------------------------------------------\r\n\r\nGo to <a href=\"https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D\">https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D</a>\r\n\r\nTopic: VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite\r\n\r\nDate: Tuesday, December 13, 2011\r\n\r\nTime: 3:00 pm, Eastern Standard Time (New York, GMT-05:00)\r\n\r\nMeeting Number: 924 607 055\r\n\r\nMeeting Password: (This meeting does not require a password.)\r\n\r\n-------------------------------------------------------\r\n\r\nTeleconference information\r\n\r\n-------------------------------------------------------\r\n\r\nCall-in toll-free number (Premiere): 1-866-398-2885 (US)\r\n\r\nAttendee access code: 584 255 6681','12.13 VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite','','publish','open','open','','vmware-webinar-managing-complex-environments-with-vcenter-operations-management-suite','','','2011-12-13 15:34:16','2011-12-13 15:34:16','',0,'http://egroup.jasonmangone.com/?p=5603',0,'post','',0),(5602,2,'2011-12-12 22:06:36','2011-12-12 22:06:36','Headquartered in South Carolina with offices throughout the entire southeast, eGroup is always looking for upbeat, driven and self-motivated \"go getters\" to join our rapidly growing team! Available positions include:\r\n<ul>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Sales Account Executive</strong></span>: As an eGroup Sales Executive, you will utilize your sales experience to extend eGroup’s products, services, and solutions to executive management in a defined geography or strategic area, with an emphasis on selling products and services as “solutions” designed to directly address the business initiatives and requirements of these customers. Professional territory management and account development skills are a must. You must be motivated to generate new business, provide excellent customer service, and be self-reliant. You must be able to prospect, qualify, engage, and manage all the elements of a complex solution sale. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Sales-Account-Executive1.pdf\">More</a></li>\r\n	<li><strong><strong></strong></strong>\r\n<p align=\"left\"><span style=\"text-decoration: underline;\"><strong>eGroup Marketing and Corporate Communications Manager</strong></span><strong>: </strong>An excellent opportunity for the motivated professional, this vital team member will be responsible for strategic marketing and corporate communications aspects of company operations - and will provide leadership and coordination of business development activities associated with research and development of marketing/communication opportunities and plans. This position will have a heavy focus on developing eGroup brand recognition in new markets and evolving the awareness of eGroup as a southeastern company. This individual will be an essential and effective contributing member of the eGroup management and leadership team and will be chiefly responsible for developing and delivering the eGroup “experience”. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGroup-–-Marketing-and-Corporate-Communications-Manager.pdf\">More</a></p>\r\n</li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Inside Sales Executive</strong></span>: This is an excellent opportunity for the sales professional with a positive, “can do” attitude. The right individual will be responsible for engaging customers, vendors, distributors, and manufacturers to assist eGroup in building maintaining, and delivering its sales pipeline. This will include lead qualification, proposal development, and writing with customer follow-up. This is a fantastic opportunity to work within a growing organization while mastering your skills. As an eGroup Inside Sales Executive, you will utilize your skills and drive to assist our Outside Sales team in extending eGroup’s products, services, and solutions to customers and prospects. You must be motivated to provide excellent customer service, work well in a team environment, and be self-reliant. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Inside-Sales-Executive.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Technical Consultant</strong></span>: An excellent opportunity for the motivated technical sales professional, you\'ll be backed by eGroup\'s continual investment in market proven technologies and support resources.  These \"best of breed\" technology offerings will position you for success in delivering sophisticated solutions to a growing set of customers with increasingly complex needs. This position primarily focuses on consultation, design and deployment of VMware, EMC, Cisco, Microsoft and Citrix technologies. You will work directly with our outside and inside sales teams to meet with current and prospective customers, understand their needs, and propose technology solutions to help them overcome their challenges based on intimate knowledge of eGroup services, products and technologies.  <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Technical-Consultant.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Applications Services Team</strong></span>: The Applications Services Team is focused on delivering solutions that solve real issues in the End-User Computing, Applications Services and Cloud Computing market.  Potential Applications Services Engineers will have a passion for identifying and solving real world issues by combining a variety of applications development, systems administration and product specific knowledge gained through training and certification. eGroup Application Services Engineers leverage their applications development and administration backgrounds to work with solutions and continually develop new skillsets.  <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Applications-Services-Team.pdf\">More</a></li>\r\n	<li><span style=\"text-decoration: underline;\"><strong>eGroup Systems Engineer</strong></span>:  This position primarily focuses on design, deployment, and support of VMware, EMC, Cisco, Microsoft and Citrix technologies. You will respond to and investigate end user inquiries, concerns, and issues via phone, Internet, e‐mail, and in person in a timely and courteous manner, and will recommend or perform actions to correct problems based on intimate knowledge of the technology or specific systems.  You should be proficient in communication both verbal and written, and be extremely passionate about technology. You should be a self‐motivated and driven individual capable of learning quickly and adapting to the latest industry trends and best practices. As a representative of eGroup, you must demonstrate a positive attitude and willingness to go above and beyond to ensure complete customer satisfaction. <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/08/eGROUP-Systems-Engineer.pdf\">More</a> </li>\r\n</ul>\r\n<strong>To apply or for more information: <a href=\"mailto:hr@eGroup-us.com\">hr@eGroup-us.com</a></strong>','Careers','','inherit','open','open','','4668-revision-v1','','','2011-12-12 22:06:36','2011-12-12 22:06:36','',4668,'http://egroup.jasonmangone.com/4668-revision-35',0,'revision','',0),(5604,2,'2011-12-12 22:20:08','2011-12-12 22:20:08','<strong>Target Audience</strong>\n\n- IT Administrators\n\n- IT Operations Managers\n\n- IT Management\n\n- Application Business Owners\n\n<strong> Meet the Expert</strong>\n\n Jim Silvera is a Solutions Architect with over 18 years experience in the Enterprise Management sector. Jim has helped many organizations increase IT efficiencies by successfully implementing management solutions.\n\n<strong>Agenda</strong>\n\nVMware vCenter Operations proactively ensures service levels, minimizes downtime and troubleshooting and optimizes resource usage in dynamic virtual and cloud environments.<!--more-->\n\n<strong>In this presentation and product demonstration, you will learn how:</strong>\n\n- VMware vCenter Operations uses patented analytics and powerful visualizations to automate performance and capacity management.\n\n-  It collects and analyzes performance data, correlates abnormalities and identifies the root cause of building performance problems.\n\n- vCenter Operations can collect and map change data to these abnormalities so you can quickly determine if a configuration change is the cause of the performance problem.\n\n- vCenter Operations also provides capacity management to optimize resource usage.\n\n-----------------------------------------------------\n\nTo register for this meeting\n\n-----------------------------------------------------\n\n1. Go to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D\n\n2. Register for the meeting.\n\n-------------------------------------------------------\n\nTo start or join the online meeting\n\n-------------------------------------------------------\n\nGo to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D\n\nTopic: VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite\n\nDate: Tuesday, December 13, 2011\n\nTime: 3:00 pm, Eastern Standard Time (New York, GMT-05:00)\n\nMeeting Number: 924 607 055\n\nMeeting Password: (This meeting does not require a password.)\n\n-------------------------------------------------------\n\nTeleconference information\n\n-------------------------------------------------------\n\nCall-in toll-free number (Premiere): 1-866-398-2885 (US)\n\nAttendee access code: 584 255 6681','VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite','','inherit','open','open','','5603-revision','','','2011-12-12 22:20:08','2011-12-12 22:20:08','',5603,'http://egroup.jasonmangone.com/5603-revision',0,'revision','',0),(5605,2,'2011-12-12 22:20:23','2011-12-12 22:20:23','<strong>Target Audience</strong>\r\n\r\n- IT Administrators\r\n\r\n- IT Operations Managers\r\n\r\n- IT Management\r\n\r\n- Application Business Owners\r\n\r\n<strong> Meet the Expert</strong>\r\n\r\n Jim Silvera is a Solutions Architect with over 18 years experience in the Enterprise Management sector. Jim has helped many organizations increase IT efficiencies by successfully implementing management solutions.\r\n\r\n<strong>Agenda</strong>\r\n\r\nVMware vCenter Operations proactively ensures service levels, minimizes downtime and troubleshooting and optimizes resource usage in dynamic virtual and cloud environments.<!--more-->\r\n\r\n<strong>In this presentation and product demonstration, you will learn how:</strong>\r\n\r\n- VMware vCenter Operations uses patented analytics and powerful visualizations to automate performance and capacity management.\r\n\r\n-  It collects and analyzes performance data, correlates abnormalities and identifies the root cause of building performance problems.\r\n\r\n- vCenter Operations can collect and map change data to these abnormalities so you can quickly determine if a configuration change is the cause of the performance problem.\r\n\r\n- vCenter Operations also provides capacity management to optimize resource usage.\r\n\r\n-----------------------------------------------------\r\n\r\nTo register for this meeting\r\n\r\n-----------------------------------------------------\r\n\r\n1. Go to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D\r\n\r\n2. Register for the meeting.\r\n\r\n-------------------------------------------------------\r\n\r\nTo start or join the online meeting\r\n\r\n-------------------------------------------------------\r\n\r\nGo to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D\r\n\r\nTopic: VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite\r\n\r\nDate: Tuesday, December 13, 2011\r\n\r\nTime: 3:00 pm, Eastern Standard Time (New York, GMT-05:00)\r\n\r\nMeeting Number: 924 607 055\r\n\r\nMeeting Password: (This meeting does not require a password.)\r\n\r\n-------------------------------------------------------\r\n\r\nTeleconference information\r\n\r\n-------------------------------------------------------\r\n\r\nCall-in toll-free number (Premiere): 1-866-398-2885 (US)\r\n\r\nAttendee access code: 584 255 6681','VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite','','inherit','open','open','','5603-revision-2','','','2011-12-12 22:20:23','2011-12-12 22:20:23','',5603,'http://egroup.jasonmangone.com/5603-revision-2',0,'revision','',0),(5606,2,'2011-12-12 22:21:09','2011-12-12 22:21:09','<strong>Target Audience</strong>\r\n\r\nIT Administrators, IT Operations Managers, IT Management, Application Business Owners\r\n\r\n<strong> Meet the Expert</strong>\r\n\r\nJim Silvera is a Solutions Architect with over 18 years experience in the Enterprise Management sector. Jim has helped many organizations increase IT efficiencies by successfully implementing management solutions.\r\n\r\n<strong>Agenda</strong>\r\n\r\nVMware vCenter Operations proactively ensures service levels, minimizes downtime and troubleshooting and optimizes resource usage in dynamic virtual and cloud environments.<!--more-->\r\n\r\n<strong>In this presentation and product demonstration, you will learn how:</strong>\r\n\r\n- VMware vCenter Operations uses patented analytics and powerful visualizations to automate performance and capacity management.\r\n\r\n-  It collects and analyzes performance data, correlates abnormalities and identifies the root cause of building performance problems.\r\n\r\n- vCenter Operations can collect and map change data to these abnormalities so you can quickly determine if a configuration change is the cause of the performance problem.\r\n\r\n- vCenter Operations also provides capacity management to optimize resource usage.\r\n\r\n-----------------------------------------------------\r\n\r\nTo register for this meeting\r\n\r\n-----------------------------------------------------\r\n\r\n1. Go to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D\r\n\r\n2. Register for the meeting.\r\n\r\n-------------------------------------------------------\r\n\r\nTo start or join the online meeting\r\n\r\n-------------------------------------------------------\r\n\r\nGo to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D\r\n\r\nTopic: VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite\r\n\r\nDate: Tuesday, December 13, 2011\r\n\r\nTime: 3:00 pm, Eastern Standard Time (New York, GMT-05:00)\r\n\r\nMeeting Number: 924 607 055\r\n\r\nMeeting Password: (This meeting does not require a password.)\r\n\r\n-------------------------------------------------------\r\n\r\nTeleconference information\r\n\r\n-------------------------------------------------------\r\n\r\nCall-in toll-free number (Premiere): 1-866-398-2885 (US)\r\n\r\nAttendee access code: 584 255 6681','VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite','','inherit','open','open','','5603-revision-3','','','2011-12-12 22:21:09','2011-12-12 22:21:09','',5603,'http://egroup.jasonmangone.com/5603-revision-3',0,'revision','',0),(5607,2,'2011-12-12 22:21:30','2011-12-12 22:21:30','<strong>Target Audience</strong>\r\n\r\nIT Administrators, IT Operations Managers, IT Management, Application Business Owners\r\n\r\n<strong>Meet the Expert</strong>\r\n\r\nJim Silvera is a Solutions Architect with over 18 years experience in the Enterprise Management sector. Jim has helped many organizations increase IT efficiencies by successfully implementing management solutions.\r\n\r\n<strong>Agenda</strong>\r\n\r\nVMware vCenter Operations proactively ensures service levels, minimizes downtime and troubleshooting and optimizes resource usage in dynamic virtual and cloud environments.<!--more-->\r\n\r\n<strong>In this presentation and product demonstration, you will learn how:</strong>\r\n\r\n- VMware vCenter Operations uses patented analytics and powerful visualizations to automate performance and capacity management.\r\n\r\n-  It collects and analyzes performance data, correlates abnormalities and identifies the root cause of building performance problems.\r\n\r\n- vCenter Operations can collect and map change data to these abnormalities so you can quickly determine if a configuration change is the cause of the performance problem.\r\n\r\n- vCenter Operations also provides capacity management to optimize resource usage.\r\n\r\n-----------------------------------------------------\r\n\r\nTo register for this meeting\r\n\r\n-----------------------------------------------------\r\n\r\n1. Go to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D\r\n\r\n2. Register for the meeting.\r\n\r\n-------------------------------------------------------\r\n\r\nTo start or join the online meeting\r\n\r\n-------------------------------------------------------\r\n\r\nGo to https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D\r\n\r\nTopic: VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite\r\n\r\nDate: Tuesday, December 13, 2011\r\n\r\nTime: 3:00 pm, Eastern Standard Time (New York, GMT-05:00)\r\n\r\nMeeting Number: 924 607 055\r\n\r\nMeeting Password: (This meeting does not require a password.)\r\n\r\n-------------------------------------------------------\r\n\r\nTeleconference information\r\n\r\n-------------------------------------------------------\r\n\r\nCall-in toll-free number (Premiere): 1-866-398-2885 (US)\r\n\r\nAttendee access code: 584 255 6681','VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite','','inherit','open','open','','5603-revision-4','','','2011-12-12 22:21:30','2011-12-12 22:21:30','',5603,'http://egroup.jasonmangone.com/5603-revision-4',0,'revision','',0),(5608,2,'2011-12-13 15:33:47','2011-12-13 15:33:47','<strong>Target Audience</strong>\r\n\r\nIT Administrators, IT Operations Managers, IT Management, Application Business Owners\r\n\r\n<strong>Meet the Expert</strong>\r\n\r\nJim Silvera is a Solutions Architect with over 18 years experience in the Enterprise Management sector. Jim has helped many organizations increase IT efficiencies by successfully implementing management solutions.\r\n\r\n<strong>Agenda</strong>\r\n\r\nVMware vCenter Operations proactively ensures service levels, minimizes downtime and troubleshooting and optimizes resource usage in dynamic virtual and cloud environments.<!--more-->\r\n\r\n<strong>In this presentation and product demonstration, you will learn how:</strong>\r\n\r\n- VMware vCenter Operations uses patented analytics and powerful visualizations to automate performance and capacity management.\r\n\r\n-  It collects and analyzes performance data, correlates abnormalities and identifies the root cause of building performance problems.\r\n\r\n- vCenter Operations can collect and map change data to these abnormalities so you can quickly determine if a configuration change is the cause of the performance problem.\r\n\r\n- vCenter Operations also provides capacity management to optimize resource usage.\r\n\r\n-----------------------------------------------------\r\n\r\nTo register for this meeting\r\n\r\n-----------------------------------------------------\r\n\r\n1. Go to <a href=\"https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D\">https://vmware.webex.com/vmware/j.php?ED=172548467&amp;RG=1&amp;UID=0&amp;RT=MiMxMQ%3D%3D</a>\r\n\r\n2. Register for the meeting.\r\n\r\n-------------------------------------------------------\r\n\r\nTo start or join the online meeting\r\n\r\n-------------------------------------------------------\r\n\r\nGo to <a href=\"https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D\">https://vmware.webex.com/vmware/j.php?ED=172548467&amp;UID=485784078&amp;RT=MiMxMQ%3D%3D</a>\r\n\r\nTopic: VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite\r\n\r\nDate: Tuesday, December 13, 2011\r\n\r\nTime: 3:00 pm, Eastern Standard Time (New York, GMT-05:00)\r\n\r\nMeeting Number: 924 607 055\r\n\r\nMeeting Password: (This meeting does not require a password.)\r\n\r\n-------------------------------------------------------\r\n\r\nTeleconference information\r\n\r\n-------------------------------------------------------\r\n\r\nCall-in toll-free number (Premiere): 1-866-398-2885 (US)\r\n\r\nAttendee access code: 584 255 6681','VMware Webinar: Managing Complex Environments with vCenter Operations Management Suite','','inherit','open','open','','5603-revision-5','','','2011-12-13 15:33:47','2011-12-13 15:33:47','',5603,'http://egroup.jasonmangone.com/5603-revision-5',0,'revision','',0),(5612,6,'2011-12-15 18:46:00','2011-12-15 18:46:00','If you ever run across the following error in Group Policy Management:\r\n\r\n<strong>An error occurred while generating report:\r\nAn unknown error occurred while the HTML report was being created.</strong>\r\n\r\nThe follow these steps to fix it.\r\n\r\n1. Open the Group Policy Management\r\n2. Go to the Group Policy Object in question, and confirm you have the issue by selecting the \"Settings\" tab\r\n3. At this point, if you have the issue, the left hand side should read the above mention error\r\n4. Edit the GPO, and browse to User Configuration &gt; Windows Settings &gt; Internet Explorer Maintenance &gt; Security &gt; Security Zones and Content Ratings\r\n5. Change the setting from \"Import the current security zones and privacy settings\" to \"Do not customize security zones and privacy\", then exit out of the GPO editor\r\n6. Close Group Policy Management MMC, then reopen it\r\n7. Go back to the GPO in question and click the \"Settings\" tab\r\n\r\nThis time your GPO Settings Report should run properly.','GROUP POLICY MANAGEMENT ERROR &amp; HOW TO FIX IT','','inherit','open','open','','1833-autosave','','','2011-12-15 18:46:00','2011-12-15 18:46:00','',1833,'http://egroup.jasonmangone.com/1833-autosave',0,'revision','',0),(5797,35,'2012-01-14 23:13:32','2012-01-14 23:13:32','<div>One of the best ways to learn any new technology can be to install it in a test lab and see how it behaves. One of the benefits of virtualizing your learning lab is the ability to create server templates which let you rapidly deploy VMs, test applications, and then blow it all away and reset. This leads to lots of first time logins on newly installed servers. Here are a few useful group policies that make the process a bit more streamlined:</div>\r\n<ul>\r\n	<li>Force Classic Control Panel</li>\r\n<ul>\r\n	<li>As a geek, the first time I open the Control Panel on a Windows 7 or Server 2008/R2 VM, I reach up to that \"View by: Category\" dropdown and change it to \"View by: Small icons\" so that I can see all the control panel icons at once. This GPO sets that to the default view for all users.</li>\r\n<ul>\r\n	<li><strong>User Configuration\\Administrative Templates\\Control Panel\\<strong>Always open All Control Panel items</strong></strong></li>\r\n</ul>\r\n</ul>\r\n	<li>No Ctrl+Alt+Del</li>\r\n<ul>\r\n	<li>This turns off the \"Press Ctrl+Alt+Del to logon\" prompt and saves you from having to reach for Ctrl+Alt+Ins when you\'re logging in within the vSphere Client.</li>\r\n<ul>\r\n	<li><strong>Computer Configuration\\Windows Settings\\Security Settings\\Local Policies\\Security Options\\Disable CTRL+ALT+DEL requirement for logon</strong></li>\r\n</ul>\r\n</ul>\r\n	<li>No Initial Setup or Server Management</li>\r\n<ul>\r\n	<li>If you use the Initial Setup or Server Management dialogs to help you setup your servers, you\'ll want to skip this GPO. I normally close them as soon as they appear (and they reappear for every new user on the system). If it takes half of a second to close each one, just think of how many dozens of seconds this could potentially save me over the course of a lifetime &lt;sarcasm&gt;.</li>\r\n<ul>\r\n	<li><strong>Computer Configuration\\Policies\\Administrative Templates\\System\\Server Manager\\Do not display Initial Configuration Tasks window automatically at logon</strong></li>\r\n	<li><strong>Computer Configuration\\Policies\\Administrative Templates\\System\\Server Manager\\Do not display Server Manager automatically at logon</strong></li>\r\n</ul>\r\n</ul>\r\n</ul>\r\nWhat group policies do you use to keep things simple?','USEFUL GROUP POLICIES FOR VIRTUAL SERVERS','','publish','open','open','','useful-group-policies-for-virtual-servers','','','2012-01-14 23:16:48','2012-01-14 23:16:48','',0,'http://egroup.jasonmangone.com/?p=5797',0,'post','',0),(5614,12,'2011-10-23 21:03:15','2011-10-23 21:03:15','The \"journey to the cloud\" is a great tagline for helping customers go from a pure \"private cloud\" environment to a public or hybrid cloud solution.\r\n\r\n1. One of the first steps that most customers today are already at, is to virtualize the majority (if not all) of your workloads. Because of how common it is to find this already in place, I won\'t go into detail here.\r\n\r\n2. The second step once the systems are virtualized is to quantify the cost of the virtual machines and hardware powering them to establish a baseline and help determine the desired pricing to beat for a public cloud provider.\r\n\r\n3. Now here\'s where the nerd fun begins. At this step, number three if you\'re following along, an important decision must be made to determine how you will deliver access to your data/applications to end users. This can be done through a simple VPN connection, in which the user accesses the data over an encrypted tunnel (though this is a really limited model). It can be done through a web portal or similar Content Management System-- something along the lines of SharePoint can suffice for basic office documents and the like. But where the real power/flexibility comes in is when you start delivering either the application itself, or a desktop that contains the desired application, to the user through a portal or client application. The biggest players here are Citrix, who can deliver the desktop and/or the application and VMware, who can deliver the desktop (worth pointing out that VMware requires ESXi as the hypervisor for this, Citrix supports ESXi, XenServer, and Hyper-V).\r\n\r\nThese solutions allow users to get to their data / applications securely and remotely (if allowed by your company) without issue, and offer a near native experience for most use cases. And depending on which solution you go with, you can provide your users with a desktop or application on many different devices-- including Macs, iPads, iPhones, Android phones, Blackberry phones, Android tablets, ChromeBooks, etc.\r\n\r\n4. So the users in the company can now access their applications and do their work remotely with limited reduction in efficiency or capability. What\'s next? Well at this point, you essentially have a \"private cloud\" and lots of capabilities. This step is optional, but when followed can provide the best level of education and lead to easier / better decisions when looking outside the company for cloud resources.\r\n\r\nThis step is all about cost reporting and monitoring. VMware offers their product, vCenter Chargeback, but any similar product will suffice here. The goal is to accurately calculate the cost for your environment to provide compute resources on your private cloud. When you have this information you can easily see what individual machines cost, how much an entire department costs if your company allows for departmental chargeback, and even help you forecast out what you\'ll need to spend to grow your environment. But more importantly, this helps you line up cost for YOUR resources so you can directly compare them against the cost of cloud resources.\r\n\r\n5. Using your calculated price for resources, start to identify cloud partners you can leverage for compute resources needed to grow or scale your environment.','A DIFFERENT JOURNEY TO THE HYBRID CLOUD ','','inherit','open','open','','5318-revision-8','','','2011-10-23 21:03:15','2011-10-23 21:03:15','',5318,'http://egroup.jasonmangone.com/5318-revision-8',0,'revision','',0),(5616,12,'2011-12-16 14:37:13','2011-12-16 14:37:13','We\'ve seen an uptick in \"direct attach\" storage deployments on the Cisco UCS 2.0 platform lately-- and there doesn\'t\' seem to be a lot of good information available for this type of deployment. It\'s not hard to make work-- in fact, rather simple-- but once you go down to the hypervisor level, there seems to be much confusion and little detail available from Cisco or otherwise.\n\nFirst, it\'s important to understand what \"direct attach storage\" means in the Cisco UCS context. If you were to take your storage array (only a handful of them are certified by Cisco for this deployment mind you) and connect it directly in to the Cisco UCS Fabric Interconnects, it would be considered a \"direct attach\" deployment. This type of connectivity uses \"Appliance\" ports, which you simply configure though the UCS Manager by select the desired interface, and \"Configure as Appliance port\".','Cisco UCS - DIRECT ATTACH STORAGE - EMC VNX - vSphere 5!','','inherit','open','open','','5615-revision','','','2011-12-16 14:37:13','2011-12-16 14:37:13','',5615,'http://egroup.jasonmangone.com/5615-revision',0,'revision','',0),(5617,12,'2011-12-16 14:41:19','2011-12-16 14:41:19','We\'ve seen an uptick in \"direct attach\" storage deployments on the Cisco UCS 2.0 platform lately-- and there doesn\'t\' seem to be a lot of good information available for this type of deployment. It\'s not hard to make work-- in fact, rather simple-- but once you go down to the hypervisor level, there seems to be much confusion and little detail available from Cisco or otherwise.\n\nFirst, it\'s important to understand what \"direct attach storage\" means in the Cisco UCS context. If you were to take your storage array (only a handful of them are certified by Cisco for this deployment mind you) and connect it directly in to the Cisco UCS Fabric Interconnects, it would be considered a \"direct attach\" deployment. This type of connectivity uses \"Appliance\" ports, which you simply configure though the UCS Manager by select the desired interface, and \"Configure as Appliance port\".\n\nWith this configuration, you must create the necessary VLAN under the \"LAN\" tab within the UCSM below BOTH the \"Appliance\" VLAN section, and the \"LAN\" VLAN section. This is required-- as all \"Appliance\" ports pin to a traditional \"uplink\" port, and if the VLAN does not exist on the uplink, the Appliance port will not come up. This is what provides the capability for communication to other storage ports in a \"non-optimal\" flow of traffic (see image bel','Cisco UCS - DIRECT ATTACH STORAGE - EMC VNX - vSphere 5!','','inherit','open','open','','5615-revision-2','','','2011-12-16 14:41:19','2011-12-16 14:41:19','',5615,'http://egroup.jasonmangone.com/5615-revision-2',0,'revision','',0),(5618,12,'2011-12-16 14:43:14','2011-12-16 14:43:14','We\'ve seen an uptick in \"direct attach\" storage deployments on the Cisco UCS 2.0 platform lately-- and there doesn\'t\' seem to be a lot of good information available for this type of deployment. It\'s not hard to make work-- in fact, rather simple-- but once you go down to the hypervisor level, there seems to be much confusion and little detail available from Cisco or otherwise.\n\nFirst, it\'s important to understand what \"direct attach storage\" means in the Cisco UCS context. If you were to take your storage array (only a handful of them are certified by Cisco for this deployment mind you) and connect it directly in to the Cisco UCS Fabric Interconnects, it would be considered a \"direct attach\" deployment. This type of connectivity uses \"Appliance\" ports, which you simply configure though the UCS Manager by select the desired interface, and \"Configure as Appliance port\".\n\nWith this configuration, you must create the necessary VLAN under the \"LAN\" tab within the UCSM below BOTH the \"Appliance\" VLAN section, and the \"LAN\" VLAN section. This is required-- as all \"Appliance\" ports pin to a traditional \"uplink\" port, and if the VLAN does not exist on the uplink, the Appliance port will not come up. This is what provides the capability for communication to other storage ports in a \"non-optimal\" flow of traffic (see image below).\n\n&nbsp;\n\nTo help minimize the amount of traffic that flows up the uplinks and \"over\" to the other Fabric Interconnect to access storage ports, we decided to use a separate VLAN/subnet from within vSphere, and made sure our NICs were configured on the appropriate Fabric Interconnect.','Cisco UCS - DIRECT ATTACH STORAGE - EMC VNX - vSphere 5!','','inherit','open','open','','5615-revision-3','','','2011-12-16 14:43:14','2011-12-16 14:43:14','',5615,'http://egroup.jasonmangone.com/5615-revision-3',0,'revision','',0),(5756,44,'2011-12-30 11:54:42','2011-12-30 11:54:42','<span style=\"font-family: Calibri\"><span style=\"font-size: small\">I recently had the opportunity to upgrade a customer’s Quest (Vizioncore) vRanger Pro implementation to version 5.3.  I was pleasantly surprised with the performance and ease of use of the product compared to previous versions.</span></span>\r\n\r\n<span style=\"font-family: Calibri\"><span style=\"font-size: small\">Version 5.3 is a maintenance release of 5.2 that was released last August that also adds <a href=\"http://communities.quest.com/community/vranger/blog/2011/12/01/introduction-to-the-new-deduplication-option-for-quest-vranger-v53\">deduplication support</a>.  The product now includes</span></span> full VMware ESX and ESXi support, as well as VMware HotAdd support for faster speeds when making network backups of ESXi. The latest version of the platform also features the ability to run as a low-resource usage virtual appliance when replicating ESXi virtual machine data.\r\n\r\n<strong><span style=\"font-size: small\"><span style=\"font-family: Calibri\">Key Features in vRanger 5:</span></span></strong>\r\n\r\n<span style=\"font-family: Calibri\"><span style=\"font-size: small\"><strong>Full VMware ESX and ESXi Support </strong>— Provides a wide range of backup and recovery capabilities, plus replication</span></span>\r\n\r\n<strong>Flexible Enterprise-Class Deduplication</strong> — NetVault SmartDisk vRanger Edition offers flexible enterprise-class deduplication with an SMB price\r\n\r\n<strong>Virtual Appliance for ESXi</strong>— Uses low-resource Virtual Appliances to replicate ESXi VM data, including differential replication\r\n\r\n<strong>VMware HotAdd Support</strong> — Delivers faster speeds when making network backups of ESXi\r\n\r\n<strong>Fully integrates with vCenter</strong>— Enhances security for compliance with support for granular ESXi service lock-down and eliminates host login requirements as root\r\n\r\n<strong>vRanger 5 is Certified VMware-Ready for vSphere 5</strong>','QUEST VRANGER 5.3 CERTIFIED WITH VSPHERE 5','','publish','open','open','','quest-vranger-5-3-certified-with-vsphere-5','','','2011-12-30 12:06:36','2011-12-30 12:06:36','',0,'http://egroup.jasonmangone.com/?p=5756',0,'post','',1),(5620,13,'2011-12-18 19:54:36','2011-12-18 19:54:36','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n&nbsp;\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools has never been so easy.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would like more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at 1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','publish','open','open','','egroup-is-authorized-resell-the-new-mondopad-tablet-from-infocus','','','2011-12-18 20:14:58','2011-12-18 20:14:58','',0,'http://egroup.jasonmangone.com/?p=5620',0,'post','',1),(5621,13,'2011-12-18 19:15:48','2011-12-18 19:15:48','<p align=\"left\">On November 22, 2011, eGroup, Inc.　was authorized to resell the Infocus Mondopad.　　 This gives eGroup the ability to work with organizations to plan and deploy how they want topresent, annotate and collaborate within their organization as well as other organization on a giant tablet. An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Overview</a></p>\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\n\n<ul>\n	<li>55-inch 1080p LCD display with multi-touch overlay</li>\n	<li>High performance Intel i5 PC running Win 7 Pro</li>\n	<li>4 GB memory</li>\n	<li>Intel vPro technology for remote monitoring and management</li>\n	<li>High definition 720p camera with 4 integrated microphones</li>\n	<li>Voice-optimized sound bar for improved dialogue clarity</li>\n	<li>HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232</li>\n	<li>Full version of Microsoft Office</li>\n</ul>\n&nbsp;\n\n&nbsp;\n<p align=\"left\">If you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.</p>','','','inherit','open','open','','5620-revision','','','2011-12-18 19:15:48','2011-12-18 19:15:48','',5620,'http://egroup.jasonmangone.com/5620-revision',0,'revision','',0),(5623,13,'2011-12-18 19:31:38','2011-12-18 19:31:38','','InFocus-Mondopad-Quick-Overview[www.savevid.com]','','inherit','open','open','','infocus-mondopad-quick-overviewwww-savevid-com','','','2011-12-18 19:31:38','2011-12-18 19:31:38','',5620,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/InFocus-Mondopad-Quick-Overviewwww.savevid.com_.flv',0,'attachment','video/x-flv',0),(5622,13,'2011-12-18 19:16:01','2011-12-18 19:16:01','<p align=\"left\">On November 22, 2011, eGroup, Inc.　was authorized to resell the Infocus Mondopad.　　 This gives eGroup the ability to work with organizations to plan and deploy how they want topresent, annotate and collaborate within their organization as well as other organization on a giant tablet. An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Overview</a></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n\r\n<ul>\r\n	<li>55-inch 1080p LCD display with multi-touch overlay</li>\r\n	<li>High performance Intel i5 PC running Win 7 Pro</li>\r\n	<li>4 GB memory</li>\r\n	<li>Intel vPro technology for remote monitoring and management</li>\r\n	<li>High definition 720p camera with 4 integrated microphones</li>\r\n	<li>Voice-optimized sound bar for improved dialogue clarity</li>\r\n	<li>HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232</li>\r\n	<li>Full version of Microsoft Office</li>\r\n</ul>\r\n&nbsp;\r\n\r\n&nbsp;\r\n<p align=\"left\">If you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.</p>','','','inherit','open','open','','5620-revision-2','','','2011-12-18 19:16:01','2011-12-18 19:16:01','',5620,'http://egroup.jasonmangone.com/5620-revision-2',0,'revision','',0),(5624,13,'2011-12-18 19:33:05','2011-12-18 19:33:05','<p align=\"left\">On November 22, 2011, eGroup, Inc.　was authorized to resell the Infocus Mondopad.　　 This gives eGroup the ability to work with organizations to plan and deploy how they want topresent, annotate and collaborate within their organization as well as other organization on a giant tablet. An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/InFocus-Mondopad-Quick-Overviewwww.savevid.com_.flv\">InFocus-Mondopad-Quick-Overview[www.savevid.com]</a></p>\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\n\n<ul>\n	<li>55-inch 1080p LCD display with multi-touch overlay</li>\n	<li>High performance Intel i5 PC running Win 7 Pro</li>\n	<li>4 GB memory</li>\n	<li>Intel vPro technology for remote monitoring and management</li>\n	<li>High definition 720p camera with 4 integrated microphones</li>\n	<li>Voice-optimized sound bar for improved dialogue clarity</li>\n	<li>HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232</li>\n	<li>Full version of Microsoft Office</li>\n</ul>\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','','','inherit','open','open','','5620-revision-3','','','2011-12-18 19:33:05','2011-12-18 19:33:05','',5620,'http://egroup.jasonmangone.com/5620-revision-3',0,'revision','',0),(5625,13,'2011-12-18 19:34:05','2011-12-18 19:34:05','<p align=\"left\"> eGroup, Inc. was recently authorized to resell the Infocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want topresent, annotate and collaborate within their organization as well as other organization on a giant tablet. An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/InFocus-Mondopad-Quick-Overviewwww.savevid.com_.flv\">InFocus-Mondopad-Quick-Overview[www.savevid.com]</a></p>\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\n\n<ul>\n	<li>55-inch 1080p LCD display with multi-touch overlay</li>\n	<li>High performance Intel i5 PC running Win 7 Pro</li>\n	<li>4 GB memory</li>\n	<li>Intel vPro technology for remote monitoring and management</li>\n	<li>High definition 720p camera with 4 integrated microphones</li>\n	<li>Voice-optimized sound bar for improved dialogue clarity</li>\n	<li>HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232</li>\n	<li>Full version of Microsoft Office</li>\n</ul>\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','','','inherit','open','open','','5620-revision-4','','','2011-12-18 19:34:05','2011-12-18 19:34:05','',5620,'http://egroup.jasonmangone.com/5620-revision-4',0,'revision','',0),(5626,13,'2011-12-18 19:44:33','2011-12-18 19:44:33','<p align=\"left\"> eGroup, Inc. was recently authorized to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n\r\n<ul>\r\n	<li>55-inch 1080p LCD display with multi-touch overlay</li>\r\n	<li>High performance Intel i5 PC running Win 7 Pro</li>\r\n	<li>4 GB memory</li>\r\n	<li>Intel vPro technology for remote monitoring and management</li>\r\n	<li>High definition 720p camera with 4 integrated microphones</li>\r\n	<li>Voice-optimized sound bar for improved dialogue clarity</li>\r\n	<li>HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232</li>\r\n	<li>Full version of Microsoft Office</li>\r\n</ul>\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','eGROUP IS AUTHORIZED RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-5','','','2011-12-18 19:44:33','2011-12-18 19:44:33','',5620,'http://egroup.jasonmangone.com/5620-revision-5',0,'revision','',0),(5627,13,'2011-12-18 19:49:54','2011-12-18 19:49:54','','InFocus_Mondopad','','inherit','open','open','','infocus_mondopad','','','2011-12-18 19:49:54','2011-12-18 19:49:54','',5620,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/InFocus_Mondopad.jpg',0,'attachment','image/jpeg',0),(5628,13,'2011-12-18 19:52:52','2011-12-18 19:52:52','','Mondopad','','inherit','open','open','','mondopad','','','2011-12-18 19:52:52','2011-12-18 19:52:52','',5620,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif',0,'attachment','image/gif',0),(5629,13,'2011-12-18 19:47:42','2011-12-18 19:47:42','<p align=\"left\"> eGroup, Inc. was recently authorized to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','eGROUP IS AUTHORIZED RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-6','','','2011-12-18 19:47:42','2011-12-18 19:47:42','',5620,'http://egroup.jasonmangone.com/5620-revision-6',0,'revision','',0),(5630,13,'2011-12-18 19:53:21','2011-12-18 19:53:21','<p align=\"left\"> eGroup, Inc. was recently authorized to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n<p align=\"left\"> </p>\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','eGROUP IS AUTHORIZED RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-7','','','2011-12-18 19:53:21','2011-12-18 19:53:21','',5620,'http://egroup.jasonmangone.com/5620-revision-7',0,'revision','',0),(5631,13,'2011-12-18 20:14:03','2011-12-18 20:14:03','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\n&nbsp;\n<p align=\"left\"><!--more--></p>\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\n   -4 GB memory\n\n   -Intel vPro technology for remote monitoring and management\n\n   -High definition 720p camera with 4 integrated microphones\n\n   -Voice-optimized sound bar for improved dialogue clarity\n\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\n\n   -Full version of Microsoft Office\n\nIf you would like more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at 1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-autosave','','','2011-12-18 20:14:03','2011-12-18 20:14:03','',5620,'http://egroup.jasonmangone.com/5620-autosave',0,'revision','',0),(5632,13,'2011-12-18 20:01:09','2011-12-18 20:01:09','','mondopad','','inherit','open','open','','mondopaddy','','','2011-12-18 20:01:09','2011-12-18 20:01:09','',5620,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/mondopaddy.gif',0,'attachment','image/gif',0),(5633,13,'2011-12-18 19:54:36','2011-12-18 19:54:36','<p align=\"left\">eGroup, Inc. was recently authorized to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n<p align=\"left\"> </p>\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','eGROUP IS AUTHORIZED RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-8','','','2011-12-18 19:54:36','2011-12-18 19:54:36','',5620,'http://egroup.jasonmangone.com/5620-revision-8',0,'revision','',0),(5634,13,'2011-12-18 20:08:10','2011-12-18 20:08:10','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n&nbsp;\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-9','','','2011-12-18 20:08:10','2011-12-18 20:08:10','',5620,'http://egroup.jasonmangone.com/5620-revision-9',0,'revision','',0),(5635,13,'2011-12-18 20:09:01','2011-12-18 20:09:01','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n&nbsp;\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-10','','','2011-12-18 20:09:01','2011-12-18 20:09:01','',5620,'http://egroup.jasonmangone.com/5620-revision-10',0,'revision','',0),(5636,13,'2011-12-18 20:10:59','2011-12-18 20:10:59','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n&nbsp;\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at 1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-11','','','2011-12-18 20:10:59','2011-12-18 20:10:59','',5620,'http://egroup.jasonmangone.com/5620-revision-11',0,'revision','',0),(5637,13,'2011-12-18 20:14:23','2011-12-18 20:14:23','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n&nbsp;\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is a breeze.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would like more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at 1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-12','','','2011-12-18 20:14:23','2011-12-18 20:14:23','',5620,'http://egroup.jasonmangone.com/5620-revision-12',0,'revision','',0),(5638,13,'2011-12-18 20:14:45','2011-12-18 20:14:45','<p align=\"left\">eGroup, Inc. has recently become an authorized partner to resell the InFocus Mondopad. This gives eGroup the ability to work with organizations to plan and deploy how they want to present, annotate, and collaborate within their organization as well as other organization on a giant 55\" tablet.  An InFocus Mondopad puts everything you need to visually present, capture and share ideas at your fingertips, all integrated into a single device.</p>\r\n<p align=\"left\"><a href=\"http://www.youtube.com/watch?v=uybcaDHkZQ0&amp;feature=player_embedded#!\">Mondopad Video</a></p>\r\n<p align=\"left\"><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\"><img class=\"alignnone size-full wp-image-5628\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Mondopad.gif\" alt=\"\" width=\"454\" height=\"239\" /></a></p>\r\n&nbsp;\r\n<p align=\"left\"><!--more--></p>\r\n<p align=\"left\">Mondopad is built around industry standards and leading technologies from Intel and Microsoft, so upgrading to the latest software and tools is never been so easy.</p>\r\n<p align=\"left\">   -55inch 1080p LCD display with multi-touch overlay</p>\r\n<p align=\"left\">   -High performance Intel i5 PC running Win 7 Pro</p>\r\n   -4 GB memory\r\n\r\n   -Intel vPro technology for remote monitoring and management\r\n\r\n   -High definition 720p camera with 4 integrated microphones\r\n\r\n   -Voice-optimized sound bar for improved dialogue clarity\r\n\r\n   -HDMI 1.3, USB x 6, Ethernet x 2, VGA, S-video, component, composite, RS232\r\n\r\n   -Full version of Microsoft Office\r\n\r\nIf you would like more information or pricing please e-mail <a href=\"mailto:info@eGroup-us.com\">info@eGroup-us.com</a>  or contact us at 1-877-eGROUP-1.','eGROUP IS AUTHORIZED TO RESELL THE NEW MONDOPAD TABLET FROM INFOCUS','','inherit','open','open','','5620-revision-13','','','2011-12-18 20:14:45','2011-12-18 20:14:45','',5620,'http://egroup.jasonmangone.com/5620-revision-13',0,'revision','',0),(5639,12,'2011-12-19 18:42:28','2011-12-19 18:42:28','We\'ve seen an uptick in \"direct attach\" storage deployments on the Cisco UCS 2.0 platform lately-- and there doesn\'t\' seem to be a lot of good information available for this type of deployment. It\'s not hard to make work-- in fact, rather simple-- but once you go down to the hypervisor level, there seems to be much confusion and little detail available from Cisco or otherwise.\n\nFirst, it\'s important to understand what \"direct attach storage\" means in the Cisco UCS context. If you were to take your storage array (only a handful of them are certified by Cisco for this deployment mind you) and connect it directly in to the Cisco UCS Fabric Interconnects, it would be considered a \"direct attach\" deployment. This type of connectivity uses \"Appliance\" ports, which you simply configure though the UCS Manager by select the desired interface, and \"Configure as Appliance port\".\n\nWith this configuration, you must create the necessary VLAN under the \"LAN\" tab within the UCSM below BOTH the \"Appliance\" VLAN section, and the \"LAN\" VLAN section. This is required-- as all \"Appliance\" ports pin to a traditional \"uplink\" port, and if the VLAN does not exist on the uplink, the Appliance port will not come up. This is what provides the capability for communication to other storage ports in a \"non-optimal\" flow of traffic (see image below).\n\n&nbsp;\n\nTo help minimize the amount of traffic that flows up the uplinks and \"over\" to the other Fabric Interconnect to access storage ports, we decided to use separate VLANs/subnets from within vSphere, and made sure our NICs were configured on the appropriate Fabric Interconnect. For those who are not familiar, when you create your virtual NICs for your service profiles, you select which Fabric Interconnect you\'d like for them to be associated with. You also choose if you want to enable Fabric Failover (a feature I blogged about a ways back). In our case, we created vNIC 1 on Fabric Interconnect A. Then we used Subnet A with that specific vNIC to access the storage processor ports, also o','Cisco UCS - DIRECT ATTACH STORAGE - EMC VNX - vSphere 5!','','inherit','open','open','','5615-revision-4','','','2011-12-19 18:42:28','2011-12-19 18:42:28','',5615,'http://egroup.jasonmangone.com/5615-revision-4',0,'revision','',0),(5642,35,'2011-12-21 16:25:26','2011-12-21 16:25:26','<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1063.jpg\"><img class=\"size-medium wp-image-5708 alignleft\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1063-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" /></a>\r\n\r\nI received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new launcher with a handy shortcut to the Android Market, the notification pulldown lets you swipe to clear individual notifications and has a shortcut to the Settings app, and the app launcher now shows a preview gallery of widgets. The settings app also has quick shortcuts to toggle the Wifi and Bluetooth radios. GMail got a facelift and feels more like the new GMail web theme.\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png\"><img class=\"alignnone size-medium wp-image-5689\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-49-29.png\"><img class=\"alignnone size-medium wp-image-5690\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-49-29-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Search button move</li>\r\n<ul>\r\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube can go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen). Apps that used to hide functionality under the Menu button now display a vertical ellipsis (...) as an indicator that more functions are available.\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-13.png\"><img class=\"alignnone size-medium wp-image-5682\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-13-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-18.png\"><img class=\"alignnone size-medium wp-image-5683\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-18-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-36.png\"><img class=\"alignnone size-medium wp-image-5684\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-36-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Multi-tasking button</li>\r\n<ul>\r\n	<li>This might be my favorite new feature. On-screen at all times, this buttons triggers a scrollable overlay list of all the apps you have open on the phone displayed in the order you last used them. What\'s even better is the way it displays thumbnails of each app\'s last state so you can quickly identify the one you want.\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-27-25.png\"><img class=\"alignnone size-medium wp-image-5693\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-27-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it on in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB). There\'s also a nice visualization of how you\'re using the space (iTunes has had this functionality for iPods and iPhones for years).\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23.png\"><img class=\"alignnone size-medium wp-image-5688\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen. On the Galaxy Nexus I can quickly and accurately tap small links or buttons on the first try.</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but hardware is the one thing that can\'t change once you buy it, so I\'m glad they kept it in. Hopefully this will translate into some degree of future-proofing or longevity in the future.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a few sentences, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S.\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1057.jpg\"><img class=\"alignnone size-medium wp-image-5703\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1057-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1055.jpg\"><img class=\"alignnone size-medium wp-image-5701\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1055-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1059.jpg\"><img class=\"alignnone size-medium wp-image-5705\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1059-300x159.jpg\" alt=\"\" width=\"300\" height=\"159\" /></a><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1058.jpg\"><img class=\"alignnone size-medium wp-image-5704\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1058-300x121.jpg\" alt=\"\" width=\"300\" height=\"121\" /></a></li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. It\'s a tad slick (will slide off your jeans if you place it at an angle).\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1060.jpg\"><img class=\"alignnone size-medium wp-image-5706\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1060-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" /></a></li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under Android 4.0, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal one uses the charging contacts on the side of the phone so it\'s easy to dock and pick up (I hope!)\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1065.jpg\"><img class=\"alignnone size-medium wp-image-5710\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1065-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" /></a></li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I literally just found this feature as I wrote up this blog post. In the Android 4.0 browser, you can have it masquerade as a full-blown desktop browser (I\'m guessing it spoofs the browser user-agent, but can\'t confirm this). This is handy when you want to view the full version of a site but are only offered the mobile view. This setting is remembered on the phone on a per-domain basis!</li>\r\n</ul>\r\n	<li>Built-in screenshot functionality</li>\r\n<ul>\r\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone. It might be a small usability upgrade since you can now remember, \"Oh yeah, third app on the second page\" rather than picking one app out of a single long list.</li>\r\n</ul>\r\n	<li>Slightly curved screen</li>\r\n<ul>\r\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) are minor, so I\'ll put it here on the \"Neutral\" list.\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1061.jpg\"><img class=\"alignnone size-medium wp-image-5680\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1061-300x68.jpg\" alt=\"\" width=\"300\" height=\"68\" /></a></li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from my first full workday with the phone (4G disabled, screen brightness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not an endurance phone. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS','','publish','open','open','','verizon-samsung-galaxy-nexus-the-highs-and-lows','','','2011-12-21 16:25:26','2011-12-21 16:25:26','',0,'http://egroup.jasonmangone.com/?p=5642',0,'post','',0),(5643,35,'2011-12-20 03:03:24','2011-12-20 03:03:24','','Auto Draft','','inherit','open','open','','5642-revision','','','2011-12-20 03:03:24','2011-12-20 03:03:24','',5642,'http://egroup.jasonmangone.com/5642-revision',0,'revision','',0),(5644,35,'2011-12-20 03:13:29','2011-12-20 03:13:29','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes starts with a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:\n\nHighs\n<ul>\n	<li>Android 4.0 ICS</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post.</li>\n</ul>\n</ul>\nNeutral\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n</ul>\nLows\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-2','','','2011-12-20 03:13:29','2011-12-20 03:13:29','',5642,'http://egroup.jasonmangone.com/5642-revision-2',0,'revision','',0),(5645,35,'2011-12-20 03:16:35','2011-12-20 03:16:35','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes starts with a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice CS</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-3','','','2011-12-20 03:16:35','2011-12-20 03:16:35','',5642,'http://egroup.jasonmangone.com/5642-revision-3',0,'revision','',0),(5646,35,'2011-12-20 03:18:08','2011-12-20 03:18:08','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes starts with a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-4','','','2011-12-20 03:18:08','2011-12-20 03:18:08','',5642,'http://egroup.jasonmangone.com/5642-revision-4',0,'revision','',0),(5647,35,'2011-12-20 03:34:53','2011-12-20 03:34:53','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-5','','','2011-12-20 03:34:53','2011-12-20 03:34:53','',5642,'http://egroup.jasonmangone.com/5642-revision-5',0,'revision','',0),(5648,35,'2011-12-20 03:35:03','2011-12-20 03:35:03','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-6','','','2011-12-20 03:35:03','2011-12-20 03:35:03','',5642,'http://egroup.jasonmangone.com/5642-revision-6',0,'revision','',0),(5649,35,'2011-12-20 03:35:14','2011-12-20 03:35:14','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-7','','','2011-12-20 03:35:14','2011-12-20 03:35:14','',5642,'http://egroup.jasonmangone.com/5642-revision-7',0,'revision','',0),(5701,35,'2011-12-21 15:26:22','2011-12-21 15:26:22','','IMG_1055','','inherit','open','open','','img_1055','','','2011-12-21 15:26:22','2011-12-21 15:26:22','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1055.jpg',0,'attachment','image/jpeg',0),(5703,35,'2011-12-21 15:26:32','2011-12-21 15:26:32','','IMG_1057','','inherit','open','open','','img_1057','','','2011-12-21 15:26:32','2011-12-21 15:26:32','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1057.jpg',0,'attachment','image/jpeg',0),(5704,35,'2011-12-21 15:26:34','2011-12-21 15:26:34','','IMG_1058','','inherit','open','open','','img_1058','','','2011-12-21 15:26:34','2011-12-21 15:26:34','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1058.jpg',0,'attachment','image/jpeg',0),(5705,35,'2011-12-21 15:26:36','2011-12-21 15:26:36','','IMG_1059','','inherit','open','open','','img_1059','','','2011-12-21 15:26:36','2011-12-21 15:26:36','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1059.jpg',0,'attachment','image/jpeg',0),(5706,35,'2011-12-21 15:26:38','2011-12-21 15:26:38','','IMG_1060','','inherit','open','open','','img_1060','','','2011-12-21 15:26:38','2011-12-21 15:26:38','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1060.jpg',0,'attachment','image/jpeg',0),(5680,35,'2011-12-21 14:43:53','2011-12-21 14:43:53','','IMG_1061','','inherit','open','open','','img_1061','','','2011-12-21 14:43:53','2011-12-21 14:43:53','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1061.jpg',0,'attachment','image/jpeg',0),(5708,35,'2011-12-21 15:26:42','2011-12-21 15:26:42','','IMG_1063','','inherit','open','open','','img_1063','','','2011-12-21 15:26:42','2011-12-21 15:26:42','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1063.jpg',0,'attachment','image/jpeg',0),(5710,35,'2011-12-21 15:26:48','2011-12-21 15:26:48','','IMG_1065','','inherit','open','open','','img_1065','','','2011-12-21 15:26:48','2011-12-21 15:26:48','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1065.jpg',0,'attachment','image/jpeg',0),(5711,35,'2011-12-21 15:28:15','2011-12-21 15:28:15','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png\"><img class=\"alignnone size-medium wp-image-5689\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\n</ul>\n	<li>Search button move</li>\n<ul>\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen).</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it on in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB). There\'s also a nice visualization of how you\'re using the space (iTunes has had this functionality for iPods and iPhones for years).\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23.png\"><img class=\"alignnone size-medium wp-image-5688\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but hardware is the one thing that can\'t change once you buy it, so I\'m glad they kept it in. Hopefully this will translate into some degree of future-proofing or longevity in the future.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1057.jpg\"><img class=\"alignnone size-medium wp-image-5703\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1057-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" /></a></li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n	<li>Slightly curved screen</li>\n<ul>\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1061.jpg\"><img class=\"alignnone size-medium wp-image-5680\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/IMG_1061-300x68.jpg\" alt=\"\" width=\"300\" height=\"68\" /></a></li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-19','','','2011-12-21 15:28:15','2011-12-21 15:28:15','',5642,'http://egroup.jasonmangone.com/5642-revision-19',0,'revision','',0),(5663,35,'2011-12-20 03:52:06','2011-12-20 03:52:06','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li>Vertical and horizontal desktop docks, and the horizontal uses the charging contacts on the side so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-8','','','2011-12-20 03:52:06','2011-12-20 03:52:06','',5642,'http://egroup.jasonmangone.com/5642-revision-8',0,'revision','',0),(5664,35,'2011-12-20 04:11:31','2011-12-20 04:11:31','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-9','','','2011-12-20 04:11:31','2011-12-20 04:11:31','',5642,'http://egroup.jasonmangone.com/5642-revision-9',0,'revision','',0),(5666,44,'2011-12-20 10:48:54','2011-12-20 10:48:54','','Auto Draft','','inherit','open','open','','5665-revision','','','2011-12-20 10:48:54','2011-12-20 10:48:54','',5665,'http://egroup.jasonmangone.com/5665-revision',0,'revision','',0),(5667,44,'2011-12-24 15:51:30','2011-12-24 15:51:30','The procedure for adding a vCenter server in the RecoverPoint console can be confusing. It\'s not obvious what is required.\r\n\r\nCommon errors when attemprting this are \"Invalid Virtual Center Credentials supplied\" or \"Invalid port specified\".\r\n\r\nBy default the vCenter server listens on port 443, and for RecoverPoint to successfully connect to the vCenter server it must use the vCenter SSL certificate file copied from the vCenter server.\r\n\r\nHere’s how to add the vCenter server in RecoverPoint in three easy steps:\r\n\r\nStep 1: Copy the SSL certificate file rui.crt from the vCenter server to your local machine. The file location varies based on the vCenter server OS version:\r\n For W2K3: C:\\Documents and Settings\\All Users\\Application Data\\VMware\\VMware VirtualCenter\\SSL\\rui.crt\r\n For W2K8: C:\\Users\\All Users\\VMware\\VMware VirtualCenter\\SSL\\rui.crt\r\n\r\nStep 2: Using the RecoverPoint Management Console, right-click vCenter Servers, select Add vCenter Server\r\n\r\nStep 3:  Select the site where the vCenter server is located. Under Credentials:\r\n\r\n         Server IP:  &lt;Enter the Virtual Center IP address, not an ESXi host &gt;\r\n\r\n         Port number: 443\r\n\r\n         Username: &lt;Domain or Local user must be able to login to VC&gt;\r\n\r\n         Password: &lt;Enter password&gt;\r\n\r\n         Certificate files: &lt;Browse to rui.crt obtained in step 1&gt;\r\n\r\nThis simple procedure works reliably for me.','HOW TO ADD A VCENTER SERVER IN THE RECOVERPOINT CONSOLE','','publish','open','open','','how-to-add-vcenter-server-in-recoverpoint-console','','','2011-12-24 16:11:37','2011-12-24 16:11:37','',0,'http://egroup.jasonmangone.com/?p=5667',0,'post','',0),(5668,44,'2011-12-20 11:19:14','2011-12-20 11:19:14','Veeam has released Veeam Backup &amp; Replication v6 with three key new features:\n<ol>\n	<li>New Enterprise Scalability -  v6 introduces a new distributed architecture. Installing a lightweight agent can turn any Windows server into a backup proxy. A central backup server uses intelligent load balancing to manage backup proxies across the enterprise, including remote or branch offices.</li>\n	<li>Enhanced replication times that are up to 10x faster</li>\n	<li>Multi-hypervisor support - now supports Microsoft Hyper-V in addition to VMware vSphere</li>\n</ol>\nAnother great feature is 1-click restore that simplifies the process of restoring individual files to their original location.\n\nFor more information see What’s new in v6 on Veeam web site.','VEEAM RELEASES BACKUP VERSION 6','','inherit','open','open','','5665-revision-2','','','2011-12-20 11:19:14','2011-12-20 11:19:14','',5665,'http://egroup.jasonmangone.com/5665-revision-2',0,'revision','',0),(5669,44,'2011-12-20 11:22:21','2011-12-20 11:22:21','Veeam has released Veeam Backup &amp; Replication v6 with three key new features:\n<ol>\n	<li>1) New Enterprise Scalability -  v6 introduces a new distributed architecture. Installing a lightweight agent can turn any Windows server into a backup proxy. A central backup server uses intelligent load balancing to manage backup proxies across the enterprise, including remote or branch offices.</li>\n	<li>2) Enhanced replication times that are up to 10x faster</li>\n	<li>3) Multi-hypervisor support - now supports Microsoft Hyper-V in addition to VMware vSphere</li>\n</ol>\nAnother great feature is 1-click restore that simplifies the process of restoring individual files to their original location.\n\nFor more information see <a href=\"http://www.veeam.com/veeam_backup_6_0_whats_new_wn.pdf\" target=\"_blank\">What’s new in v6</a> on Veeam\'S web site.','VEEAM RELEASES BACKUP &amp; REPLICATION VERSION 6','','inherit','open','open','','5665-autosave','','','2011-12-20 11:22:21','2011-12-20 11:22:21','',5665,'http://egroup.jasonmangone.com/5665-autosave',0,'revision','',0),(5670,44,'2011-12-20 11:19:32','2011-12-20 11:19:32','Veeam has released Veeam Backup &amp; Replication v6 with three key new features:\r\n<ol>\r\n	<li>New Enterprise Scalability -  v6 introduces a new distributed architecture. Installing a lightweight agent can turn any Windows server into a backup proxy. A central backup server uses intelligent load balancing to manage backup proxies across the enterprise, including remote or branch offices.</li>\r\n	<li>Enhanced replication times that are up to 10x faster</li>\r\n	<li>Multi-hypervisor support - now supports Microsoft Hyper-V in addition to VMware vSphere</li>\r\n</ol>\r\nAnother great feature is 1-click restore that simplifies the process of restoring individual files to their original location.\r\n\r\nFor more information see <a href=\"http://www.veeam.com/veeam_backup_6_0_whats_new_wn.pdf\" target=\"_blank\">What’s new in v6</a> on Veeam web site.','VEEAM RELEASES BACKUP VERSION 6','','inherit','open','open','','5665-revision-3','','','2011-12-20 11:19:32','2011-12-20 11:19:32','',5665,'http://egroup.jasonmangone.com/5665-revision-3',0,'revision','',0),(5671,44,'2011-12-20 11:20:38','2011-12-20 11:20:38','Veeam has released Veeam Backup &amp; Replication v6 with three key new features:\r\n<ol>\r\n	<li>1) New Enterprise Scalability -  v6 introduces a new distributed architecture. Installing a lightweight agent can turn any Windows server into a backup proxy. A central backup server uses intelligent load balancing to manage backup proxies across the enterprise, including remote or branch offices.</li>\r\n	<li>2) Enhanced replication times that are up to 10x faster</li>\r\n	<li>3) Multi-hypervisor support - now supports Microsoft Hyper-V in addition to VMware vSphere</li>\r\n</ol>\r\nAnother great feature is 1-click restore that simplifies the process of restoring individual files to their original location.\r\n\r\nFor more information see <a href=\"http://www.veeam.com/veeam_backup_6_0_whats_new_wn.pdf\" target=\"_blank\">What’s new in v6</a> on Veeam web site.','VEEAM RELEASES BACKUP &amp; REPLICATION VERSION 6','','inherit','open','open','','5665-revision-4','','','2011-12-20 11:20:38','2011-12-20 11:20:38','',5665,'http://egroup.jasonmangone.com/5665-revision-4',0,'revision','',0),(5766,25,'2011-12-28 18:37:43','2011-12-28 18:37:43','I ran across an issue this week where one of our customers was reporting that a Terminal Server License error was being thrown when attempting to launch a published XenApp application.  The error stated the following: \"The remote session was disconnected because there are no Terminal Server License Servers available to Provide a license.\"  The odd element of this problem was that this was only occurring  on single machine.  We could never reproduce the error on another computer, and no other users were reporting any issues.\r\n\r\nAfter some investigation a colleague of mine pointed me to following Citrix forum discussion: <a href=\"http://forums.citrix.com/thread.jspa?threadID=93566\" target=\"_blank\">http://forums.citrix.com/thread.jspa?threadID=93566</a>.  To resolve the problem, the effected employee simply removed the Registry subkeys under \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSLicensing\\Store\".','Microsoft Terminal Server License Error When Attempting to Launch XenApp Published Applications','','publish','open','open','','microsoft-license-error-when-attempting-to-launch-xenapp-published-applications','','','2011-12-28 18:38:09','2011-12-28 18:38:09','',0,'http://egroup.jasonmangone.com/?p=5766',0,'post','',0),(5673,2,'2011-12-20 20:44:34','2011-12-20 20:44:34','<strong>Registration Now Open: Charleston VMUG Meeting</strong>\r\n\r\nJoin us for the upcoming Charleston VMUG meeting taking place on Wednesday, January 11, 2012.\r\n\r\n<a href=\"http://www.myvmug.org/e/in/eid=277&amp;source=5\">Registration is now open</a> and available to all VMUG members. This is a great opportunity to meet with your peers to discuss virtualization trends, best practices, and the latest technology!<!--more-->\r\n\r\n<strong>Location</strong>\r\n\r\nSPARC, LLC.\r\n2387 Clements Ferry Rd\r\nCharleston, SC 29429\r\n\r\nClick <a href=\"http://www.sparcedge.com/contact/\">here</a> for driving directions\r\n\r\n<strong>Time</strong>\r\n\r\n11:30 a.m. - 2:00 p.m.\r\n\r\n<strong>Meeting Agenda</strong>\r\n\r\n- 11:15 a.m. Check-In\r\n- 11:30 a.m. Lunch\r\n- 11:40 a.m. Welcome - Ron Davis, Charleston VMUG\r\n- 11:45 a.m. ThinApp Packaging Fundamentals - Jason Webster, Application Services Manager, eGroup, Inc.\r\n- 1:10 p.m. Break\r\n- 1:15 p.m. vSphere 5 Licensing - Matt Portnoy, Senior Systems Engineer, VMware\r\n- 2:00 p.m. Wrap-Up\r\n\r\nVisit the <a href=\"http://www.myvmug.org/e/in/eid=277&amp;source=5\">Event Details Page</a> for the full agenda. Be sure to share this meeting information with your colleagues.\r\n\r\nPlease note: You will need to log into the VMUG web site to register for this meeting. If you have not already obtained your VMUG login credentials, please visit the Username and/or Password Help page to request your username and password.\r\n\r\nFor questions, please contact <a href=\"mailto:memberservices@vmug.com\">memberservices@vmug.com</a>.','eGROUP TO SPONSOR JANUARY 11 CHARLESTON VMUG','','publish','open','open','','egroup-to-sponsor-january-11-charleston-vmug','','','2011-12-20 20:44:34','2011-12-20 20:44:34','',0,'http://egroup.jasonmangone.com/?p=5673',0,'post','',0),(5674,2,'2011-12-20 20:41:10','2011-12-20 20:41:10','<strong>Registration Now Open: Charleston VMUG Meeting</strong>\n\nJoin us for the upcoming Charleston VMUG meeting taking place on Wednesday, January 11, 2012.\n\n<a href=\"http://www.myvmug.org/e/in/eid=277&amp;source=5\">Registration is now open</a> and available to all VMUG members. This is a great opportunity to meet with your peers to discuss virtualization trends, best practices, and the latest technology!<!--more-->\n\n<strong>Location</strong>\n\nSPARC, LLC.\n2387 Clements Ferry Rd\nCharleston, SC 29429\n\nClick <a href=\"http://www.sparcedge.com/contact/\">here</a> for driving directions\n\n<strong>Time</strong>\n\n11:30 a.m. - 2:00 p.m.\n\n<strong>Meeting Agenda</strong>\n\n- 11:15 a.m. Check-In\n- 11:30 a.m. Lunch\n- 11:40 a.m. Welcome - Ron Davis, Charleston VMUG\n- 11:45 a.m. ThinApp Packaging Fundamentals - Jason Webster, Application Services Manager, eGroup, Inc.\n- 1:10 p.m. Break\n- 1:15 p.m. vSphere 5 Licensing - Matt Portnoy, Senior Systems Engineer, VMware\n- 2:00 p.m. Wrap-Up\n\nVisit the <a href=\"http://www.myvmug.org/e/in/eid=277&amp;source=5\">Event Details Page</a> for the full agenda. Be sure to share this meeting information with your colleagues.\n\nPlease note: You will need to log into the VMUG web site to register for this meeting. If you have not already obtained your VMUG login credentials, please visit the Username and/or Password Help page to request your username and password.\n\nFor questions, please contact <a href=\"mailto:memberservices@vmug.com\">memberservices@vmug.com</a>.','eGROUP TO SPONSOR JANUARY 11 CHARLESTON VMUG','','inherit','open','open','','5673-revision','','','2011-12-20 20:41:10','2011-12-20 20:41:10','',5673,'http://egroup.jasonmangone.com/5673-revision',0,'revision','',0),(5675,2,'2011-12-20 20:45:40','2011-12-20 20:45:40','<strong>Registration Now Open: Charleston VMUG Meeting</strong>\n\nJoin us for the upcoming Charleston VMUG meeting taking place on Wednesday, January 11, 2012.\n\n<a href=\"http://www.myvmug.org/e/in/eid=277&amp;source=5\">Registration is now open</a> and available to all VMUG members. This is a great opportunity to meet with your peers to discuss virtualization trends, best practices, and the latest technology!<!--more-->\n\n<strong>Location</strong>\n\nSPARC, LLC.\n2387 Clements Ferry Rd\nCharleston, SC 29429\n\nClick <a href=\"http://www.sparcedge.com/contact/\">here</a> for driving directions\n\n<strong>Time</strong>\n\n11:30 a.m. - 2:00 p.m.\n\n<strong>Meeting Agenda</strong>\n\n- 11:15 a.m. Check-In\n- 11:30 a.m. Lunch\n- 11:40 a.m. Welcome - Ron Davis, Charleston VMUG\n- 11:45 a.m. ThinApp Packaging Fundamentals - Jason Webster, Application Services Manager, eGroup, Inc.\n- 1:10 p.m. Break\n- 1:15 p.m. vSphere 5 Licensing - Matt Portnoy, Senior Systems Engineer, VMware\n- 2:00 p.m. Wrap-Up\n\nVisit the <a href=\"http://www.myvmug.org/e/in/eid=277&amp;source=5\">Event Details Page</a> for the full agenda. Be sure to share this meeting information with your colleagues.\n\nPlease note: You will need to log into the VMUG web site to register for this meeting. If you have not already obtained your VMUG login credentials, please visit the Username and/or Password Help page to request your username and password.\n\nFor questions, please contact <a href=\"mailto:memberservices@vmug.com\">memberservices@vmug.com</a>.','eGROUP TO SPONSOR JANUARY 11 CHARLESTON VMUG','','inherit','open','open','','5673-autosave','','','2011-12-20 20:45:40','2011-12-20 20:45:40','',5673,'http://egroup.jasonmangone.com/5673-autosave',0,'revision','',0),(5676,35,'2011-12-21 13:26:44','2011-12-21 13:26:44','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n	<li>Slightly curved screen</li>\n<ul>\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-10','','','2011-12-21 13:26:44','2011-12-21 13:26:44','',5642,'http://egroup.jasonmangone.com/5642-revision-10',0,'revision','',0),(5677,35,'2011-12-21 13:28:39','2011-12-21 13:28:39','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\r\n</ul>\r\n	<li>Built-in screenshot functionality</li>\r\n<ul>\r\n	<li>This has been a huge oversight on Android devices. At times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n	<li>Slightly curved screen</li>\r\n<ul>\r\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-11','','','2011-12-21 13:28:39','2011-12-21 13:28:39','',5642,'http://egroup.jasonmangone.com/5642-revision-11',0,'revision','',0),(5678,35,'2011-12-21 13:43:00','2011-12-21 13:43:00','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> - which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!, and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n	<li>Search button move</li>\n<ul>\n	<li>The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen).</li>\n</ul>\n	<li>Slightly curved screen</li>\n<ul>\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-12','','','2011-12-21 13:43:00','2011-12-21 13:43:00','',5642,'http://egroup.jasonmangone.com/5642-revision-12',0,'revision','',0),(5679,35,'2011-12-21 13:44:53','2011-12-21 13:44:53','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 36 hours as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and a workday\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n	<li>Search button move</li>\n<ul>\n	<li>The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen).</li>\n</ul>\n	<li>Slightly curved screen</li>\n<ul>\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-13','','','2011-12-21 13:44:53','2011-12-21 13:44:53','',5642,'http://egroup.jasonmangone.com/5642-revision-13',0,'revision','',0),(5681,35,'2011-12-21 14:46:21','2011-12-21 14:46:21','','Screenshot_2011-12-19-19-54-02','','inherit','open','open','','screenshot_2011-12-19-19-54-02','','','2011-12-21 14:46:21','2011-12-21 14:46:21','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png',0,'attachment','image/png',0),(5682,35,'2011-12-21 14:46:25','2011-12-21 14:46:25','','Screenshot_2011-12-19-20-09-13','','inherit','open','open','','screenshot_2011-12-19-20-09-13','','','2011-12-21 14:46:25','2011-12-21 14:46:25','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-13.png',0,'attachment','image/png',0),(5683,35,'2011-12-21 14:46:29','2011-12-21 14:46:29','','Screenshot_2011-12-19-20-09-18','','inherit','open','open','','screenshot_2011-12-19-20-09-18','','','2011-12-21 14:46:29','2011-12-21 14:46:29','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-18.png',0,'attachment','image/png',0),(5684,35,'2011-12-21 14:46:32','2011-12-21 14:46:32','','Screenshot_2011-12-19-20-09-36','','inherit','open','open','','screenshot_2011-12-19-20-09-36','','','2011-12-21 14:46:32','2011-12-21 14:46:32','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-36.png',0,'attachment','image/png',0),(5686,35,'2011-12-21 14:46:51','2011-12-21 14:46:51','','Screenshot_2011-12-19-20-09-50','','inherit','open','open','','screenshot_2011-12-19-20-09-50','','','2011-12-21 14:46:51','2011-12-21 14:46:51','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png',0,'attachment','image/png',0),(5687,35,'2011-12-21 14:46:55','2011-12-21 14:46:55','','Screenshot_2011-12-19-20-10-12','','inherit','open','open','','screenshot_2011-12-19-20-10-12','','','2011-12-21 14:46:55','2011-12-21 14:46:55','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png',0,'attachment','image/png',0),(5688,35,'2011-12-21 14:46:58','2011-12-21 14:46:58','','Screenshot_2011-12-19-20-10-23','','inherit','open','open','','screenshot_2011-12-19-20-10-23','','','2011-12-21 14:46:58','2011-12-21 14:46:58','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23.png',0,'attachment','image/png',0),(5689,35,'2011-12-21 14:47:02','2011-12-21 14:47:02','','Screenshot_2011-12-19-20-18-25','','inherit','open','open','','screenshot_2011-12-19-20-18-25','','','2011-12-21 14:47:02','2011-12-21 14:47:02','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png',0,'attachment','image/png',0),(5690,35,'2011-12-21 14:47:05','2011-12-21 14:47:05','','Screenshot_2011-12-19-20-49-29','','inherit','open','open','','screenshot_2011-12-19-20-49-29','','','2011-12-21 14:47:05','2011-12-21 14:47:05','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-49-29.png',0,'attachment','image/png',0),(5692,35,'2011-12-21 14:47:12','2011-12-21 14:47:12','','Screenshot_2011-12-19-21-04-06','','inherit','open','open','','screenshot_2011-12-19-21-04-06','','','2011-12-21 14:47:12','2011-12-21 14:47:12','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png',0,'attachment','image/png',0),(5693,35,'2011-12-21 14:47:15','2011-12-21 14:47:15','','Screenshot_2011-12-19-21-27-25','','inherit','open','open','','screenshot_2011-12-19-21-27-25','','','2011-12-21 14:47:15','2011-12-21 14:47:15','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-27-25.png',0,'attachment','image/png',0),(5694,35,'2011-12-21 15:02:46','2011-12-21 15:02:46','','Screenshot_2011-12-19-21-04-00','','inherit','open','open','','screenshot_2011-12-19-21-04-00','','','2011-12-21 15:02:46','2011-12-21 15:02:46','',5642,'http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png',0,'attachment','image/png',0),(5695,35,'2011-12-21 15:06:42','2011-12-21 15:06:42','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a><a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\n</ul>\n	<li>Search button move</li>\n<ul>\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen).</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n	<li>Slightly curved screen</li>\n<ul>\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-14','','','2011-12-21 15:06:42','2011-12-21 15:06:42','',5642,'http://egroup.jasonmangone.com/5642-revision-14',0,'revision','',0),(5696,35,'2011-12-21 15:07:20','2011-12-21 15:07:20','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png\"><img class=\"alignnone size-medium wp-image-5689\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Search button move</li>\r\n<ul>\r\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen).</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\r\n</ul>\r\n	<li>Built-in screenshot functionality</li>\r\n<ul>\r\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n	<li>Slightly curved screen</li>\r\n<ul>\r\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-15','','','2011-12-21 15:07:20','2011-12-21 15:07:20','',5642,'http://egroup.jasonmangone.com/5642-revision-15',0,'revision','',0),(5697,35,'2011-12-21 15:07:24','2011-12-21 15:07:24','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png\"><img class=\"alignnone size-medium wp-image-5689\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Search button move</li>\r\n<ul>\r\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen).</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\r\n</ul>\r\n	<li>Built-in screenshot functionality</li>\r\n<ul>\r\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n	<li>Slightly curved screen</li>\r\n<ul>\r\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-16','','','2011-12-21 15:07:24','2011-12-21 15:07:24','',5642,'http://egroup.jasonmangone.com/5642-revision-16',0,'revision','',0),(5698,35,'2011-12-21 15:07:44','2011-12-21 15:07:44','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\r\n<h3>Highs</h3>\r\n<ul>\r\n	<li>Android 4.0 Ice Cream Sandwich</li>\r\n<ul>\r\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.\r\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png\"><img class=\"alignnone size-medium wp-image-5689\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\r\n</ul>\r\n	<li>Search button move</li>\r\n<ul>\r\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen).</li>\r\n</ul>\r\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\r\n<ul>\r\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it in the interest of battery life.</li>\r\n</ul>\r\n	<li>32GB of storage</li>\r\n<ul>\r\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB).</li>\r\n</ul>\r\n	<li>Accurate digitizer</li>\r\n<ul>\r\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\r\n</ul>\r\n	<li>Quick sharp-focusing camera with rapid shooting</li>\r\n<ul>\r\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\r\n</ul>\r\n	<li>NFC</li>\r\n<ul>\r\n	<li>I\'m not using this yet, but you\'ll never use it in a phone that doesn\'t have it.</li>\r\n</ul>\r\n	<li>Responsive on-screen keyboard</li>\r\n<ul>\r\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\r\n</ul>\r\n	<li>Very thin</li>\r\n<ul>\r\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\r\n</ul>\r\n	<li>Slightly textured battery cover</li>\r\n<ul>\r\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\r\n</ul>\r\n	<li>Type-as-you-speak speech dictation</li>\r\n<ul>\r\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\r\n</ul>\r\n	<li>Multiple desktop dock options</li>\r\n<ul>\r\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\r\n</ul>\r\n	<li>Browser can remember user-agent preferences</li>\r\n<ul>\r\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\r\n</ul>\r\n	<li>Built-in screenshot functionality</li>\r\n<ul>\r\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\r\n</ul>\r\n</ul>\r\n<h3>Neutral</h3>\r\n<ul>\r\n	<li>Slight Android launcher redesign</li>\r\n<ul>\r\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\r\n</ul>\r\n	<li>Slightly curved screen</li>\r\n<ul>\r\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\r\n</ul>\r\n</ul>\r\n<h3>Lows</h3>\r\n<ul>\r\n	<li>No microSD slot</li>\r\n<ul>\r\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\r\n</ul>\r\n	<li>Battery life (130 emails, 4G disabled)</li>\r\n<ul>\r\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\r\n</ul>\r\n</ul>\r\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-17','','','2011-12-21 15:07:44','2011-12-21 15:07:44','',5642,'http://egroup.jasonmangone.com/5642-revision-17',0,'revision','',0),(5700,35,'2011-12-21 15:17:50','2011-12-21 15:17:50','I received my Samsung Galaxy Nexus on Friday, so I\'ve been using it solidly for a little over 4 days as I write this. I\'m loving it, and it\'s lightyears beyond previous versions of Android. For perspective, my history among smartphones goes back to a <a title=\"Cingular 8125\" href=\"http://en.wikipedia.org/wiki/HTC_Wizard\">Cingular 8125</a>, progresses to a Verizon <a title=\"Samsung SCH-i760\" href=\"http://www.gigatrike.com/i760.jpg\">Samsung SCH-i760</a>, takes a bold leap to a <a href=\"http://en.wikipedia.org/wiki/Palm_pre\">Sprint Palm Pre</a> (WebOS was robbed!), a lateral move to a Sprint <a href=\"http://en.wikipedia.org/wiki/HTC_Evo_4G\">HTC Evo 4G</a> (which became a true upgrade once I discovered <a href=\"http://www.cyanogenmod.com/\">CyanogenMod</a>!), and finally a very satisfying step forward to a Verizon Samsung Galaxy Nexus. Here\'s my \"first weekend and two workdays\" impressions:<!--more-->\n<h3>Highs</h3>\n<ul>\n	<li>Android 4.0 Ice Cream Sandwich</li>\n<ul>\n	<li>New browser app (more on this later), new dialer, new contacts, new settings layout, new launcher with new handy shortcuts (Market in the app drawer, settings in the notifications pulldown), swipe to clear notifications in pulldown shade, widget gallery in app drawer.\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02.png\"><img class=\"alignnone size-medium wp-image-5681\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-19-54-02-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25.png\"><img class=\"alignnone size-medium wp-image-5689\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-18-25-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00.png\"><img class=\"alignnone size-medium wp-image-5691\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-00-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50.png\"><img class=\"alignnone size-medium wp-image-5686\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-09-50-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12.png\"><img class=\"alignnone size-medium wp-image-5687\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-12-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a>   <a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06.png\"><img class=\"alignnone size-medium wp-image-5692\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-21-04-06-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\n</ul>\n	<li>Search button move</li>\n<ul>\n	<li>Technically this is part of the Android 4.0 bullet above, but it\'s worth calling out on its own. The traditional Android 4-button setup (Home, Menu, Back, and Search in varying orders) has changed in Android 4.0. There are now 3 fulltime buttons (Back, Home, and a dedicated multitask switching button) and a fourth Menu button that appears on an app-by-app basis. Additionally, there is now a fulltime Google search box on the home screen (and on every page of your home screen). This effectively makes the usable screen size much larger. Apps like Youtube go true \"full screen\" and even cover the Home button when you rotate the phone (the buttons reappear when you tap on the screen).</li>\n</ul>\n	<li>Beautiful high-res screen (720x1280 in 4.65\")</li>\n<ul>\n	<li>It\'s OLED, it\'s huge, and pretty. Leaving the brightness on \"auto\" leans just a tad dim for my taste, but for now I\'m leaving it on in the interest of battery life.</li>\n</ul>\n	<li>32GB of storage</li>\n<ul>\n	<li>I was actually pleasantly surprised to see so much internal storage space. I think this was a smart move on Google\'s part since it offsets the sticker shock of paying $299 for a new on-contract phone. $299 puts it at price and storage parity with the 32GB iPhone (except Verizon isn\'t getting the 16GB model and there isn\'t a 64GB). There\'s also a nice visualization of how you\'re using the space (iTunes has had this functionality for iPods and iPhones for years).\n<a href=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23.png\"><img class=\"alignnone size-medium wp-image-5688\" src=\"http://egroup.jasonmangone.com/wp-content/uploads/2011/12/Screenshot_2011-12-19-20-10-23-168x300.png\" alt=\"\" width=\"168\" height=\"300\" /></a></li>\n</ul>\n	<li>Accurate digitizer</li>\n<ul>\n	<li>My Evo had a large screen (4.3\") but the digitizer had a learning curve before I was able to accurately tap small things on-screen</li>\n</ul>\n	<li>Quick sharp-focusing camera with rapid shooting</li>\n<ul>\n	<li>The camera can utilize the flash as an auto-focus assist light when necessary. The lens supports tap-to-focus. You can take pictures about as fast as you can tap the button on-screen.</li>\n</ul>\n	<li>NFC</li>\n<ul>\n	<li>I\'m not using this yet, but hardware is the one thing that can\'t change once you buy it, so I\'m glad they kept it in. Hopefully this will translate into some degree of future-proofing or longevity in the future.</li>\n</ul>\n	<li>Responsive on-screen keyboard</li>\n<ul>\n	<li>My standard tactic of \"tap as fast as I can and correct typos later\" works great here. If I rapidly tap out a sentence or two, I normally only have 1 or 2 typos. Note: my soft keyboard typing skills are probably below average due to a long history of using Swype.</li>\n</ul>\n	<li>Very thin</li>\n<ul>\n	<li>Here\'s some comparison shots next to an iPhone 4S and my Evo 4G.</li>\n</ul>\n	<li>Slightly textured battery cover</li>\n<ul>\n	<li>It\'s a nice texture and fun to hold. Slightly slick (will slide off your jeans if you place it at an angle).</li>\n</ul>\n	<li>Type-as-you-speak speech dictation</li>\n<ul>\n	<li>Under Gingerbread and earlier versions of Android, dictated text would be recorded and sent up to Google servers for transcription. Under ICS, text is sent in much smaller bursts, maybe per word or per syllable. The end result is that text appears on-screen as you speak, much like using Dragon Dictation or iPhone 4S Siri dictation.</li>\n</ul>\n	<li>Multiple desktop dock options</li>\n<ul>\n	<li><a href=\"http://www.droid-life.com/2011/12/02/samsung-galaxy-nexus-docks-and-chargers-get-a-proper-fondling-prongs-put-to-use/\">Vertical and horizontal desktop docks</a>, and the horizontal uses the charging contacts on the side &lt;image link to closeup&gt; so it\'s easy to dock and pick up (I hope!)</li>\n</ul>\n	<li>Browser can remember user-agent preferences</li>\n<ul>\n	<li>I just found this feature as I wrote this blog post &lt;expand this&gt;.</li>\n</ul>\n	<li>Built-in screenshot functionality</li>\n<ul>\n	<li>This has been a huge oversight on Android devices. At certain times in the past, you actually needed a rooted (that\'s jailbroken for you iOS guys) phone just to be able to capture screenshots. I captured all the images in this post on my stock Nexus. Just hold down the power button and the volume-down button to save the current screen.</li>\n</ul>\n</ul>\n<h3>Neutral</h3>\n<ul>\n	<li>Slight Android launcher redesign</li>\n<ul>\n	<li>Apps in app drawer are paginated in a 4x5 grid. Swipe sideways to go from page to page. My understanding that this is a standard convention for Samsung TouchWiz launchers, but I won\'t swear to it since I\'ve never carried a TouchWiz phone.</li>\n</ul>\n	<li>Slightly curved screen</li>\n<ul>\n	<li>The Galaxy Nexus maintains the slightly curved screen from its predecessor, the Nexus S. It\'s extremely subtle, to the point that no one I\'ve handed my phone to has said, \"Oh hey, the screen is curved\". I often forget it curves at all. Perceived benefits (if any) and minor, so I\'ll put it here on the \"Neutral\" list.</li>\n</ul>\n</ul>\n<h3>Lows</h3>\n<ul>\n	<li>No microSD slot</li>\n<ul>\n	<li>This really isn\'t terrible since there\'s 32GB of storage onboard.</li>\n</ul>\n	<li>Battery life (130 emails, 4G disabled)</li>\n<ul>\n	<li>So here\'s the ugly truth. Battery life ain\'t pretty. Here\'s my raw stats from today (4G disabled, screen birghtness set to auto): off the charger at 7am at 100%, received 130 emails over the course of the workday (I was away from my desk all day, so I read a slightly above average amount of emails on the phone itself), was at 34% at 1:45PM, and was at 4% when I plugged it back in to charge at 6:15PM. So it\'s definitely not pretty. I\'ll be keeping my eyes on extended batteries, but so far the only one I\'ve heard about only extends the stock 1850mA battery to 2100mA, which doesn\'t sound like a huge increase to me.</li>\n</ul>\n</ul>\nOverall, I\'m thrilled with the phone, and I\'d buy it again in a heartbeat. I\'m also looking forward to the next major CyanogenMod release (CM9) based off the Android 4.0 Ice Cream Sandwich code.','VERIZON SAMSUNG GALAXY NEXUS - THE HIGHS AND LOWS - Draft','','inherit','open','open','','5642-revision-18','','','2011-12-21 15:17:50','2011-12-21 15:17:50','',5642,'http://egroup.jasonmangone.com/5642-revision-18',0,'revision','',0),