[pLog-svn] r4710 - in plog/trunk: . class/action class/action/admin class/bayesian class/dao class/dao/customfields class/dao/userdata class/data class/data/validator class/database class/database/pdb/drivers class/file class/gallery/dao class/locale class/net class/net/http/session class/summary/action class/summary/dao class/template/templatesets class/test/tests/dao class/test/tests/data/validator class/view config js/editor js/tinymce/plugins/insertvideo js/tinymce/plugins/insertvideo/css js/tinymce/plugins/insertvideo/images js/ui locale locale/unported release styles templates/LifeType templates/LifeType/en_UK templates/LifeType/images templates/admin templates/admin/chooser templates/default templates/standard templates/summary templates/wizard

oscar at devel.lifetype.net oscar at devel.lifetype.net
Sat Feb 10 13:49:30 EST 2007


Author: oscar
Date: 2007-02-10 13:49:29 -0500 (Sat, 10 Feb 2007)
New Revision: 4710

Added:
   plog/trunk/class/data/validator/blognamevalidator.class.php
   plog/trunk/class/test/tests/dao/userinfo_test.class.php
   plog/trunk/class/test/tests/data/validator/blognamevalidator_test.class.php
   plog/trunk/js/editor/lifetypeeditor.css
   plog/trunk/js/editor/lifetypeeditor.js
   plog/trunk/js/tinymce/plugins/insertvideo/images/grouper.png
   plog/trunk/js/ui/core.js
   plog/trunk/js/ui/tableeffects.js
   plog/trunk/locale/locale_es_ES.php
   plog/trunk/release/cache.properties.php.dist
   plog/trunk/release/userdata.properties.php.dist
   plog/trunk/templates/LifeType/images/partner_limedaley.gif
Removed:
   plog/trunk/class/bayesian/bayesianfilterutils.class.php
   plog/trunk/js/editor/plogeditor.css
   plog/trunk/js/editor/plogeditor.js
   plog/trunk/locale/unported/locale_es_ES.php
   plog/trunk/release/config.properties.php.release-0.1.dist
   plog/trunk/release/dist.sh
   plog/trunk/templates/LifeType/commentform.template
   plog/trunk/templates/LifeType/images/partner_ferca.jpg
Modified:
   plog/trunk/class/action/admin/adminaction.class.php
   plog/trunk/class/action/admin/adminaddblogaction.class.php
   plog/trunk/class/action/admin/admincleanupaction.class.php
   plog/trunk/class/action/admin/admindeleteblogcategoryaction.class.php
   plog/trunk/class/action/admin/admindoregisterblogaction.class.php
   plog/trunk/class/action/admin/adminsavedraftarticleajaxaction.class.php
   plog/trunk/class/action/admin/adminupdateblogsettingsaction.class.php
   plog/trunk/class/action/admin/adminupdateeditblogaction.class.php
   plog/trunk/class/action/blogaction.class.php
   plog/trunk/class/action/defaultaction.class.php
   plog/trunk/class/action/resourceserveraction.class.php
   plog/trunk/class/action/searchaction.class.php
   plog/trunk/class/action/viewalbumaction.class.php
   plog/trunk/class/action/viewarticleaction.class.php
   plog/trunk/class/action/viewresourceaction.class.php
   plog/trunk/class/bayesian/bayesianfiltercore.class.php
   plog/trunk/class/dao/articles.class.php
   plog/trunk/class/dao/bayesianfilterinfos.class.php
   plog/trunk/class/dao/commentscommon.class.php
   plog/trunk/class/dao/customfields/customfieldsvalues.class.php
   plog/trunk/class/dao/model.class.php
   plog/trunk/class/dao/searchengine.class.php
   plog/trunk/class/dao/userdata/baseuserdataprovider.class.php
   plog/trunk/class/dao/userinfo.class.php
   plog/trunk/class/data/textfilter.class.php
   plog/trunk/class/database/db.class.php
   plog/trunk/class/database/pdb/drivers/pdbdriverbase.class.php
   plog/trunk/class/database/pdb/drivers/pdbmysqldriver.class.php
   plog/trunk/class/file/file.class.php
   plog/trunk/class/gallery/dao/galleryalbums.class.php
   plog/trunk/class/gallery/dao/galleryresources.class.php
   plog/trunk/class/locale/locale.class.php
   plog/trunk/class/net/http/session/sessionmanager.class.php
   plog/trunk/class/net/rawrequestgenerator.class.php
   plog/trunk/class/summary/action/doblogregistration.class.php
   plog/trunk/class/summary/dao/summarystats.class.php
   plog/trunk/class/template/templatesets/templatefinder.class.php
   plog/trunk/class/view/blogview.class.php
   plog/trunk/class/view/defaultview.class.php
   plog/trunk/class/view/errorview.class.php
   plog/trunk/class/view/viewarticleview.class.php
   plog/trunk/config/logging.properties.php
   plog/trunk/index.php
   plog/trunk/js/tinymce/plugins/insertvideo/css/content.css
   plog/trunk/js/tinymce/plugins/insertvideo/editor_plugin.js
   plog/trunk/js/tinymce/plugins/insertvideo/functions.js
   plog/trunk/js/tinymce/plugins/insertvideo/videoinput.html
   plog/trunk/js/ui/summary.js
   plog/trunk/locale/locale_en_UK.php
   plog/trunk/release/config.properties.php.dist
   plog/trunk/release/logging.properties.php.dist
   plog/trunk/styles/admin.css
   plog/trunk/summary.php
   plog/trunk/templates/LifeType/aboutus.template
   plog/trunk/templates/LifeType/blog.template
   plog/trunk/templates/LifeType/development.template
   plog/trunk/templates/LifeType/downloads.template
   plog/trunk/templates/LifeType/en_UK/strings.txt
   plog/trunk/templates/LifeType/features.template
   plog/trunk/templates/LifeType/footer.template
   plog/trunk/templates/LifeType/footermain.template
   plog/trunk/templates/LifeType/header.template
   plog/trunk/templates/LifeType/headermain.template
   plog/trunk/templates/LifeType/main.template
   plog/trunk/templates/LifeType/postandcomments.template
   plog/trunk/templates/LifeType/searchresults.template
   plog/trunk/templates/LifeType/style.css
   plog/trunk/templates/LifeType/support.template
   plog/trunk/templates/admin/blogsettings.template
   plog/trunk/templates/admin/blogtemplates.template
   plog/trunk/templates/admin/blogusers.template
   plog/trunk/templates/admin/chooser/blogtemplatechooser.template
   plog/trunk/templates/admin/chooser/header.template
   plog/trunk/templates/admin/chooser/resourcelist.template
   plog/trunk/templates/admin/chooser/siteuserschooser.template
   plog/trunk/templates/admin/chooser/userpictureselect.template
   plog/trunk/templates/admin/createblog.template
   plog/trunk/templates/admin/customfields.template
   plog/trunk/templates/admin/dashboard.template
   plog/trunk/templates/admin/editarticlecategories.template
   plog/trunk/templates/admin/editblog.template
   plog/trunk/templates/admin/editcomments.template
   plog/trunk/templates/admin/editlinkcategories.template
   plog/trunk/templates/admin/editlinks.template
   plog/trunk/templates/admin/editpost.template
   plog/trunk/templates/admin/editposts.template
   plog/trunk/templates/admin/edittrackbacks.template
   plog/trunk/templates/admin/globalsettings_summary.template
   plog/trunk/templates/admin/header.template
   plog/trunk/templates/admin/newlink.template
   plog/trunk/templates/admin/newpost.template
   plog/trunk/templates/admin/plugincenter.template
   plog/trunk/templates/admin/poststats.template
   plog/trunk/templates/admin/registerblog.template
   plog/trunk/templates/admin/resources.template
   plog/trunk/templates/admin/simpleheader.template
   plog/trunk/templates/admin/sitelocales.template
   plog/trunk/templates/admin/sitetemplates.template
   plog/trunk/templates/admin/siteusers.template
   plog/trunk/templates/admin/statistics.template
   plog/trunk/templates/default/commentform.template
   plog/trunk/templates/standard/albums.template
   plog/trunk/templates/standard/archives.template
   plog/trunk/templates/standard/header.template
   plog/trunk/templates/standard/links.template
   plog/trunk/templates/standard/style.css
   plog/trunk/templates/summary/blogprofile.template
   plog/trunk/templates/summary/registerstep2.template
   plog/trunk/templates/summary/searchresults.template
   plog/trunk/templates/wizard/header.template
   plog/trunk/templates/wizard/update3.template
   plog/trunk/wizard.php
Log:
merge from lifetype 1.2 to trunk/1.3, from revision 4604 to HEAD


Modified: plog/trunk/class/action/admin/adminaction.class.php
===================================================================
--- plog/trunk/class/action/admin/adminaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/adminaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -129,7 +129,7 @@
         {
             $session = HttpVars::getSession();
             $sessionInfo = $session["SessionInfo"];
-            $this->_userInfo = $sessionInfo->getValue("userInfo");           
+            $this->_userInfo = $sessionInfo->getValue("userInfo");
         }
 
         /**

Modified: plog/trunk/class/action/admin/adminaddblogaction.class.php
===================================================================
--- plog/trunk/class/action/admin/adminaddblogaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/adminaddblogaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -4,6 +4,7 @@
     lt_include( PLOG_CLASS_PATH."class/view/admin/admincreateblogview.class.php" );
     lt_include( PLOG_CLASS_PATH."class/view/admin/adminsiteblogslistview.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+    lt_include( PLOG_CLASS_PATH."class/data/validator/blognamevalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/domainvalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/dao/users.class.php" );
@@ -28,7 +29,7 @@
         	$this->AdminAction( $actionInfo, $request );
         	
         	// data validation
-        	$this->registerFieldValidator( "blogName", new StringValidator());
+        	$this->registerFieldValidator( "blogName", new BlogNameValidator());
         	$this->registerFieldValidator( "userId", new IntegerValidator());
 			if( Subdomains::getSubdomainsEnabled()) {
 				$this->registerFieldValidator( "blogSubDomain", new DomainValidator());

Modified: plog/trunk/class/action/admin/admincleanupaction.class.php
===================================================================
--- plog/trunk/class/action/admin/admincleanupaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/admincleanupaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -134,8 +134,9 @@
 		{
 			include_once( PLOG_CLASS_PATH."class/config/config.class.php" );
 			$config =& Config::getConfig();
-			$tmpFolder = $config->getValue( "temp_folder", TEMP_FOLDER );
-			File::deleteDir( $tmpFolder, true, true );
+			$tmpFolder = $config->getValue( "temp_folder" );
+			$excludes = array('.htaccess');
+			File::deleteDir( $tmpFolder, true, true, $excludes );
 			
 			$this->_message = $this->_locale->tr( "temp_folder_reset_ok" );
 			
@@ -179,4 +180,4 @@
 			return true;
 		}
 	}
-?>
\ No newline at end of file
+?>

Modified: plog/trunk/class/action/admin/admindeleteblogcategoryaction.class.php
===================================================================
--- plog/trunk/class/action/admin/admindeleteblogcategoryaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/admindeleteblogcategoryaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -54,6 +54,12 @@
 			$totalOk = 0;
 			
             foreach( $this->_categoryIds as $categoryId ) {
+				// if there's only one blog category left, we can't do this
+				if( $categories->getNumBlogCategories() == 1 ) {
+					$errorMessage .= $this->_locale->tr( "error_cannot_delete_last_blog_category" );
+					break;
+				}
+	
             	// get the category
                 $category   = $categories->getBlogCategory( $categoryId );
 				if( $category ) {

Modified: plog/trunk/class/action/admin/admindoregisterblogaction.class.php
===================================================================
--- plog/trunk/class/action/admin/admindoregisterblogaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/admindoregisterblogaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -4,6 +4,7 @@
 	lt_include( PLOG_CLASS_PATH."class/view/admin/adminregisterblogview.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/view/admin/admindashboardview.class.php" );	
 	lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+	lt_include( PLOG_CLASS_PATH."class/data/validator/blognamevalidator.class.php" );	
 	lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );	
     lt_include( PLOG_CLASS_PATH."class/data/validator/domainvalidator.class.php" );	
 	lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
@@ -22,7 +23,7 @@
 		{
 			$this->AdminAction( $actionInfo, $request );
 			
-			$this->registerFieldValidator( "blogName", new StringValidator());
+			$this->registerFieldValidator( "blogName", new BlogNameValidator());
             $this->registerFieldValidator( "blogSubDomain", new DomainValidator(), true );
             $this->registerFieldValidator( "blogMainDomain", new DomainValidator(), true );
             $this->registerFieldValidator( "blogLocale", new StringValidator());

Modified: plog/trunk/class/action/admin/adminsavedraftarticleajaxaction.class.php
===================================================================
--- plog/trunk/class/action/admin/adminsavedraftarticleajaxaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/adminsavedraftarticleajaxaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -11,6 +11,9 @@
      */
 	class AdminSaveDraftArticleAjaxAction extends AdminAction
 	{
+		
+		var $_postText;
+		var $_postTopic;
 
 		function AdminSaveDraftArticleAjaxAction( $actionInfo, $request )
 		{
@@ -20,12 +23,10 @@
 		function validate()
 		{
         	$this->_postText     = $this->_request->getValue( "postText" );
-            $this->_postExtendedText = $this->_request->getValue( "postExtendedText" );
             $this->_postTopic    = $this->_request->getValue( "postTopic" );
 
             // if there is no text, extended text or topic there is no point in saving anything
-            if( $this->_postText == "" && $this->_postExtendedTExt == "" &&
-                $this->_postTopic == "" ) {
+            if( $this->_postText == "" && $this->_postTopic == "" ) {
                 // nothing to do yet, so let's quit
                 $this->_view = new AdminXmlView( $this->_blogInfo, "response" );
                 $this->_view->setValue( "method", "saveDraftArticleAjax" );
@@ -84,7 +85,7 @@
 		{
             $status = POST_STATUS_DRAFT;
             $articles = new Articles();
-            $postText = Textfilter::xhtmlize($this->_postText).POST_EXTENDED_TEXT_MODIFIER.Textfilter::xhtmlize($this->_postExtendedText);
+            $postText = Textfilter::xhtmlize($this->_postText);
             
             $article  = new Article( $this->_postTopic, $postText, $this->_postCategories, $this->_userInfo->getId(),
                                      $this->_blogInfo->getId(), $status, 0, Array(), $this->_postSlug );
@@ -98,7 +99,7 @@
                 foreach( $this->_customFields as $fieldId => $fieldValue ) {
                     // 3 of those parameters are not really need when creating a new object... it's enough that
                     // we know the field definition id.
-                    $customField = new CustomFieldValue( $fieldId, $fieldValue, "", -1, "", $artId, $this->_blogInfo->getId(), -1);
+                    $customField = new CustomFieldValue( $fieldId, $fieldValue, "", -1, "", -1, $this->_blogInfo->getId(), -1);
                     array_push( $fields, $customField );
                 }
                 $article->setFields( $fields );

Modified: plog/trunk/class/action/admin/adminupdateblogsettingsaction.class.php
===================================================================
--- plog/trunk/class/action/admin/adminupdateblogsettingsaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/adminupdateblogsettingsaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -3,6 +3,7 @@
 	lt_include( PLOG_CLASS_PATH."class/action/admin/adminaction.class.php" );
     lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+    lt_include( PLOG_CLASS_PATH."class/data/validator/blognamevalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/data/textfilter.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/view/admin/adminblogsettingsview.class.php" );
@@ -33,7 +34,7 @@
 			$this->registerFieldValidator( "blogMaxMainPageItems", $val );			
 			// the rest of validators, as normal...
 			$this->registerFieldValidator( "blogMaxRecentItems", new IntegerValidator());
-			$this->registerFieldValidator( "blogName",  new StringValidator());
+			$this->registerFieldValidator( "blogName",  new BlogNameValidator());
 			$this->registerFieldValidator( "blogLocale", new StringValidator());
 			$this->registerFieldValidator( "blogTemplate", new StringValidator());
 			$this->registerFieldValidator( "blogCategory", new IntegerValidator());

Modified: plog/trunk/class/action/admin/adminupdateeditblogaction.class.php
===================================================================
--- plog/trunk/class/action/admin/adminupdateeditblogaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/admin/adminupdateeditblogaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -7,6 +7,7 @@
     lt_include( PLOG_CLASS_PATH."class/dao/users.class.php" );
     lt_include( PLOG_CLASS_PATH."class/dao/userpermissions.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+    lt_include( PLOG_CLASS_PATH."class/data/validator/blognamevalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/domainvalidator.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/data/validator/arrayvalidator.class.php" );
@@ -41,7 +42,7 @@
 			
 			// data validation
 			$this->registerFieldValidator( "blogUsers", new ArrayValidator(), true );
-			$this->registerFieldValidator( "blogName", new StringValidator());
+			$this->registerFieldValidator( "blogName", new BlogNameValidator());
 			$this->registerFieldValidator( "blogId", new IntegerValidator());
 			$this->registerFieldValidator( "blogStatus", new IntegerValidator());
 			$this->registerFieldValidator( "blogLocale", new StringValidator());

Modified: plog/trunk/class/action/blogaction.class.php
===================================================================
--- plog/trunk/class/action/blogaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/blogaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -229,21 +229,26 @@
             }
 			
             // fetch the BlogInfo object
+            include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );			
+            $blogs = new Blogs();
             if( $blogId ) {
 				lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );			
                 $blogs = new Blogs();
                 $this->_blogInfo = $blogs->getBlogInfo( $blogId );
             }
-            else if($blogName){
+            else if($blogName) {
 				lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );			
                 $blogs = new Blogs();
                 $this->_blogInfo = $blogs->getBlogInfoByName( $blogName );
             }
-            else{
-				lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );			
+            else if($blogDomain) {
+				lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
                 $blogs = new Blogs();
                 $this->_blogInfo = $blogs->getBlogInfoByDomain( $blogDomain );
             }
+            else {
+                $this->_blogInfo = false;
+            }
 
             $blogExists = true;
             

Modified: plog/trunk/class/action/defaultaction.class.php
===================================================================
--- plog/trunk/class/action/defaultaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/defaultaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -241,6 +241,12 @@
     	                            $numArticles,            // total number of articles
     	                            $this->_postAmount );    	        
     	        $this->_view->setValue( 'pager', $pager );
+
+                    // pass the date onto the template, in case users would like to show it
+                if( $this->_date > - 1 ) {
+                    $date = str_pad( $this->_date, 14, "0" );
+                    $this->_view->setValue( "date", new Timestamp( $date ));
+                }
             }           
 
             $this->setCommonData();
@@ -250,4 +256,4 @@
             return true;
         }
     }
-?>
+?>
\ No newline at end of file

Modified: plog/trunk/class/action/resourceserveraction.class.php
===================================================================
--- plog/trunk/class/action/resourceserveraction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/resourceserveraction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -67,20 +67,26 @@
 			if( $config->getValue( "subdomains_enabled" )) {
 				$subdomainInfo = Subdomains::getSubdomainInfoFromRequest();
 
-				if( $subdomainInfo["username"] != "" && $this->_request->getValue( 'blogUserName' ) == "" )
-					$this->_request->setValue( 'blogUserName', $subdomainInfo["username"] );
-				if( $subdomainInfo["blogname"] != "" && $this->_request->getValue( 'blogName' ) == "" ) 
-					$this->_request->setValue( 'blogName', $subdomainInfo["blogname"] );				
+                if( !empty($subdomainInfo["blogdomain"]) && $this->_request->getValue( 'blogDomain' ) == "" ) {
+                    $this->_request->setValue( 'blogDomain', $subdomainInfo["blogdomain"] );
+                }
+                if( !empty($subdomainInfo["username"]) && $this->_request->getValue( 'blogUserName' ) == "" ) {
+                    $this->_request->setValue( 'blogUserName', $subdomainInfo["username"] );
+                }
+                if( !empty($subdomainInfo["blogname"]) && $this->_request->getValue( 'blogName' ) == "" ) {
+                    $this->_request->setValue( 'blogName', $subdomainInfo["blogname"] );
+                }
 			}
 
     		$blogId = $this->_request->getValue( 'blogId' );
     		$blogName = $this->_request->getValue( 'blogName' );
     		$userId = $this->_request->getValue( 'userId' );
     		$userName = $this->_request->getValue( 'blogUserName' );
+            $blogDomain = $this->_request->getValue( 'blogDomain' );
 			
             // if there is a "blogId" parameter, it takes precedence over the
             // "user" parameter.
-            if( !$blogId && !$blogName ) {
+            if( !$blogId && !$blogName && !$blogDomain) {
             	// check if there was a user parameter
                 if( !empty($userName) ) {
                 	// if so, check to which blogs the user belongs
@@ -114,12 +120,20 @@
             }
 			
             // fetch the BlogInfo object
-			include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
+            include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );			
             $blogs = new Blogs();
-            if( $blogId )
+            if( $blogId ) {
                 $this->_blogInfo = $blogs->getBlogInfo( $blogId );
-            else
+            }
+            else if($blogName){
                 $this->_blogInfo = $blogs->getBlogInfoByName( $blogName );
+            }
+            else if($blogDomain){
+                $this->_blogInfo = $blogs->getBlogInfoByDomain( $blogDomain );
+            }
+            else{
+                $this->_blogInfo = false;
+            }
         }
 		
 		function validate()

Modified: plog/trunk/class/action/searchaction.class.php
===================================================================
--- plog/trunk/class/action/searchaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/searchaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -107,6 +107,8 @@
 			$config =& Config::getConfig();
             $urlmode = $config->getValue( "request_format_mode" );			
             $this->_view->setValue( "urlmode", $urlmode );
+                // set the page title
+            $this->_view->setPageTitle( $this->_blogInfo->getBlog()." | ".$this->_locale->tr("search_results"));
 
 			// build the pager
 	        $url = $this->_blogInfo->getBlogRequestGenerator();

Modified: plog/trunk/class/action/viewalbumaction.class.php
===================================================================
--- plog/trunk/class/action/viewalbumaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/viewalbumaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -85,6 +85,7 @@
 				else {
 					$this->notifyEvent( EVENT_ALBUMS_LOADED, Array( "albums" => &$blogAlbums ));
 					$this->_view->setValue( "albums", $blogAlbums );
+					$this->_view->setPageTitle( $this->_blogInfo->getBlog()." | ".$this->_locale->tr("albums"));
 				}
             }
             else {
@@ -107,6 +108,8 @@
 				$this->notifyEvent( EVENT_ALBUM_LOADED, Array( "album" => &$blogAlbum ));				
                 // put the album to the template
                 $this->_view->setValue( "album", $album );
+				// and set a page title
+				$this->_view->setPageTitle( $this->_blogInfo->getBlog()." | ".$album->getName());
 				
 				// load the resources and build the pager
 				$resources = $galleryResources->getUserResources( $this->_blogInfo->getId(),

Modified: plog/trunk/class/action/viewarticleaction.class.php
===================================================================
--- plog/trunk/class/action/viewarticleaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/viewarticleaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -26,6 +26,7 @@
 		var $_userName;
 		var $_categoryId;
 		var $_categoryName;
+		var $_article;
 
 		function ViewArticleAction( $actionInfo, $request )
         {
@@ -130,7 +131,7 @@
 			
 			return( true );
 		}
-
+		
         function perform()
         {		
 	        lt_include( PLOG_CLASS_PATH."class/view/viewarticleview.class.php" );
@@ -227,6 +228,8 @@
                 $this->_setErrorView();
                 return false;
             }
+
+			$this->_article = $article;
 			
             // check if we have to update how many times an article has been read
             if( $this->_config->getValue( "update_article_reads" )) {

Modified: plog/trunk/class/action/viewresourceaction.class.php
===================================================================
--- plog/trunk/class/action/viewresourceaction.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/action/viewresourceaction.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -125,6 +125,10 @@
             $this->_view->setValue( "resource", $resource );
 			$this->_view->setValue( "prevresource", $prevResource );
 			$this->_view->setValue( "nextresource", $nextResource );
+			
+			// set the page title for the view
+			$this->_view->setPageTitle( $this->_blogInfo->getBlog()." | ".$resource->getFileName());
+			
             $this->setCommonData();
 
             // and return everything normal

Modified: plog/trunk/class/bayesian/bayesianfiltercore.class.php
===================================================================
--- plog/trunk/class/bayesian/bayesianfiltercore.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/bayesian/bayesianfiltercore.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -81,7 +81,7 @@
                 $bayesianTokens->incSpamOccurrencesFromTokensArray($blogId, $tokens, $totalSpam, $totalNonSpam);
             }
             else
-            {
+            {	
                 $totalNonSpam++;
                 $bayesianFilterInfos->incTotalNonSpam($bayesianFilterInfo->getId());
                 $bayesianTokens->incNonSpamOccurrencesFromTokensArray($blogId, $tokens, $totalSpam, $totalNonSpam);

Deleted: plog/trunk/class/bayesian/bayesianfilterutils.class.php
===================================================================
--- plog/trunk/class/bayesian/bayesianfilterutils.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/bayesian/bayesianfilterutils.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,60 +0,0 @@
-<?php
-
-	lt_include( PLOG_CLASS_PATH."class/dao/model.class.php" );
-    lt_include( PLOG_CLASS_PATH."class/bayesian/bayesianfiltercore.class.php" );
-    lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
-    lt_include( PLOG_CLASS_PATH."class/dao/articlecomments.class.php" );
-
-    /**
-     * \ingroup Bayesian
-     *
-     * some commodity functions have been included here such as making the filter
-     * take all the comments from the blog and train the filter using those comments
-     * as "good" raw material and so on. These functions do not really belong to the
-     * core so I've put them here.
-     */
-    class BayesianFilterUtils extends Model
-    {
-
-    	function BayesianFilterUtils()
-        {
-        	$this->Model();
-        }
-
-        /**
-         * marks all the articles from the given blog (or all of them
-         * if blogId==0) as non-spam. This is good food for the
-         * filter since then it knows which things should be allowed.
-         *
-         * @static
-         * @param blogId The blog
-         * @return Always true
-         */
-        function markArticlesAsNonSpam( $blogId = 0 )
-        {
-            die("is this even used!?");
-        }
-
-        /**
-         * @private
-         */
-        function _getAllComments( $blogId = 0 )
-        {
-            die("is this even used!?");
-        }
-
-        /**
-         * marks all the comments from the given blog (or all of them
-         * if blogId==0) as non-spam. This is good food for the
-         * filter since then it knows which things should be allowed.
-         *
-         * @static
-         * @param blogId The blog
-         * @return Always true
-         */
-        function markCommentsAsNonSpam( $blogId = 0 )
-        {
-            die("is this even used!?");        
-        }
-    }
-?>
\ No newline at end of file

Modified: plog/trunk/class/dao/articles.class.php
===================================================================
--- plog/trunk/class/dao/articles.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/articles.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -295,27 +295,34 @@
 			lt_include( PLOG_CLASS_PATH."class/dao/searchengine.class.php" );
 			$searchTerms = SearchEngine::adaptSearchString( $searchTerms );
 			
-            // Split the search term by space
-            $query_array = explode(' ', $searchTerms);
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {
+				// fastpath when FULLTEXT is supported
+				$whereString = " MATCH(normalized_text, normalized_topic) AGAINST ('{$searchTerms}' IN BOOLEAN MODE)";
+			}
+			else {
+	            // Split the search term by space
+	            $query_array = explode(' ', $searchTerms);
 
-            // For each search terms, I should make a like query for it   
-            $whereString = "(";
-            $whereString .= "((normalized_topic LIKE '%{$query_array[0]}%') OR (normalized_text LIKE '%{$query_array[0]}%'))";
-            for ( $i = 1; $i < count($query_array); $i = $i + 1) {
+	            // For each search terms, I should make a like query for it   
+	            $whereString = "(";
+	            $whereString .= "((normalized_topic LIKE '%{$query_array[0]}%') OR (normalized_text LIKE '%{$query_array[0]}%'))";
+	            for ( $i = 1; $i < count($query_array); $i = $i + 1) {
 				
-                $whereString .= " AND ((normalized_topic LIKE '%{$query_array[$i]}%') OR (normalized_text LIKE '%{$query_array[$i]}%'))";
-            }
-            $whereString .= " OR ((normalized_topic LIKE '%{$searchTerms}%') OR (normalized_text LIKE '%{$searchTerms}%'))";
-            $whereString .= ")";			
-				
+	                $whereString .= " AND ((normalized_topic LIKE '%{$query_array[$i]}%') OR (normalized_text LIKE '%{$query_array[$i]}%'))";
+	            }
+	            $whereString .= " OR ((normalized_topic LIKE '%{$searchTerms}%') OR (normalized_text LIKE '%{$searchTerms}%'))";
+	            $whereString .= ")";			
+			}
+							
 			$query = "SELECT article_id FROM ".$this->getPrefix()."articles_text
-			          WHERE $whereString";
+			          WHERE $whereString";			
 			
 			// execute the query and process the result if any
 			$result = $this->Execute( $query );			
 			if( !$result )
 				return( "" );
-				
+			
 			$ids = Array();
 			while( $row = $result->FetchRow()) {
 				$ids[] = $row['article_id'];
@@ -657,12 +664,10 @@
 				
 			$articleCategories = new ArticleCategories();
             foreach( $categories as $categoryId ) {
-                $keyValuePairs = array();
-                $keyValuePairs['article_id']  = $articleId;
-                $keyValuePairs['category_id'] = $categoryId;
+	
+				$query = "INSERT INTO ".$this->getPrefix()."article_categories_link (article_id, category_id) VALUES (".
+				         "'".Db::qstr( $articleId )."', '".Db::qstr( $categoryId )."')";
 
-                $query = Db::buildInsertQuery( ARTICLE_CATEGORIES_RELATIONSHIP_TABLENAME,
-                                               $keyValuePairs );
                 $this->Execute( $query );
 
                	$category = $articleCategories->getCategory( $categoryId );                
@@ -688,9 +693,7 @@
             require_once( PLOG_CLASS_PATH."class/dao/articlecategories.class.php" );
 
 			$articleId = $article->getId();
-            $query = Db::buildDeleteQuery( ARTICLE_CATEGORIES_RELATIONSHIP_TABLENAME,
-                                           'article_id',
-                                           $articleId );
+			$query = "DELETE FROM ".$this->getPrefix()."article_categories_link WHERE article_id = '".Db::qstr( $article->getId())."'";
 
             if( ( $result = $this->Execute( $query ))) {
             	// updated the category counters
@@ -768,7 +771,7 @@
             {
                 $slug = $newArticle->getPostSlug();
                 $i = 1;
-                    // check if there already is a blog with the same mangled name
+                    // check if there already is an article with the same mangled name
                 while($this->getBlogArticleByTitle($slug,
                                                    $newArticle->getBlog()))
                 {
@@ -812,9 +815,11 @@
             
             // update the blog counters
             if( $newArticle->getStatus() == POST_STATUS_PUBLISHED ) {
+				include_once( PLOG_CLASS_PATH."class/data/timestamp.class.php" );	
 	            $blogs = new Blogs();
     	        $blogInfo = $newArticle->getBlogInfo();
         	    $blogInfo->setTotalPosts( $blogInfo->getTotalPosts() + 1 );
+				$blogInfo->setUpdateDate( Timestamp::getNowTimestamp());
             	$blogs->updateBlog( $blogInfo );
             }
 
@@ -836,21 +841,16 @@
 		function addArticleText( $newArticle )
 		{
             require_once( PLOG_CLASS_PATH . 'class/data/textfilter.class.php' );
-            require_once( PLOG_CLASS_PATH . 'class/database/db.class.php' );
 
 			$filter = new Textfilter();
+			$query = "INSERT INTO ".$this->getPrefix()."articles_text (article_id, topic, text, normalized_text, normalized_topic, mangled_topic) ".
+			         " VALUES ('".Db::qstr($newArticle->getId())."',".
+			         "'".Db::qstr($newArticle->getTopic())."',".
+			         "'".Db::qstr($newArticle->getText(false))."',".
+			         "'".Db::qstr($filter->normalizeText( $newArticle->getText(false)))."',".
+			         "'".Db::qstr($filter->normalizeText( $newArticle->getTopic()))."',".
+			         "'')";
 
-            $valuesToInsert = array();
-            $valuesToInsert['article_id']       = $newArticle->getId();
-            $valuesToInsert['topic']            = $newArticle->getTopic();
-            $valuesToInsert['text']             = $newArticle->getText(false);
-            $valuesToInsert['normalized_text']  = $filter->normalizeText( $newArticle->getText(false) );
-            $valuesToInsert['normalized_topic'] = $filter->normalizeText( $newArticle->getTopic() );
-            $valuesToInsert['mangled_topic']    = '';
-
-            $query = Db::buildInsertQuery( ARTICLETEXTS_TABLENAME,
-                                           $valuesToInsert );
-
 			return( $this->Execute( $query ));
 		}
 		
@@ -865,19 +865,11 @@
             $text = $this->_cache->getData( $articleId, CACHE_ARTICLETEXT );
 
             if( !$text ) {
-                $query = Db::buildSelectQuery( ARTICLETEXTS_TABLENAME,
-                                               array(),
-                                               'article_id',
-                                               $articleId );
-
-                $result = $this->Execute( $query );
-                
-                if( !$result ) 
-                    return false;
-                    
+				$query = "SELECT text, normalized_text, topic, normalized_topic FROM ".$this->getPrefix()."articles_text ".
+				         "WHERE article_id = '".Db::qstr( $articleId )."'";
+                $result = $this->Execute( $query );    
                 $text = $result->FetchRow();
                 $result->Close();
-
                 $this->_cache->setData( $articleId, CACHE_ARTICLETEXT, $text );
             }
 
@@ -894,18 +886,13 @@
 		{
 			$filter = new Textfilter();
 
-            $keyValuePairs = array();
+			$query = "UPDATE ".$this->getPrefix()."articles_text SET ".
+			         "topic = '".Db::qstr($article->getTopic())."', ".
+			         "text = '".Db::qstr($article->getText(false))."', ".
+			         "normalized_text = '".Db::qstr($filter->normalizeText( $article->getText(false)))."', ".
+			         "normalized_topic = '".Db::qstr($filter->normalizeText( $article->getTopic()))."' ".
+			         "WHERE article_id = '".Db::qstr( $article->getId())."'";
 
-            $keyValuePairs['topic']            = $article->getTopic();
-            $keyValuePairs['text']             = $article->getText(false);
-            $keyValuePairs['normalized_text']  = $filter->normalizeText( $article->getText(false) );
-            $keyValuePairs['normalized_topic'] = $filter->normalizeText( $article->getTopic() );
-
-            $query = Db::buildUpdateQuery( ARTICLETEXTS_TABLENAME,
-                                           $keyValuePairs,
-                                           'article_id',
-                                           $article->getId() );
-
             $this->_cache->removeData( $article->getId(), CACHE_ARTICLETEXT );
 
 			return($this->Execute( $query ));
@@ -926,14 +913,18 @@
             {
                 $slug = $article->getPostSlug();
                 $i = 1;
-                    // check if there already is a blog with the same mangled name
-                while($this->getBlogArticleByTitle($slug,
-                                                   $article->getBlog()))
+                    // check if there already is an article with the same mangled name
+                while($existingArticle = $this->getBlogArticleByTitle($slug,
+                                                                      $article->getBlog()))
                 {
-                    $i++;
-                        // and if so, assign a new one
+                        // if we found ourselves, it is okay to keep using this name
+                    if($existingArticle->getId() == $article->getId())
+                        break;
+                
+                        // found a match, so assign a new one
                         // if we already tried with slug+"i" we have
                         // to strip "i" before adding it again!
+                    $i++;
                     $slug = substr($slug, 0,
                                    ($i > 2) ? strlen($slug)-strlen($i-1) : strlen($slug)).$i;
                 }
@@ -970,15 +961,19 @@
 			}
 
 			// update the blog counter
-			if( $oldArticle->getStatus() == POST_STATUS_PUBLISHED && $article->getStatus() != POST_STATUS_PUBLISHED ) {            
+			if( $oldArticle->getStatus() == POST_STATUS_PUBLISHED && $article->getStatus() != POST_STATUS_PUBLISHED ) {
+				include_once( PLOG_CLASS_PATH."class/data/timestamp.class.php" );				
 		    	$blogs = new Blogs();
 	    	    $blogInfo = $article->getBlogInfo();
 	        	$blogInfo->setTotalPosts( $blogInfo->getTotalPosts() - 1 );
+				$blogInfo->setUpdateDate( Timestamp::getNowTimestamp());
 	            $blogs->updateBlog( $blogInfo );
 	        } elseif ( $oldArticle->getStatus() != POST_STATUS_PUBLISHED && $article->getStatus() == POST_STATUS_PUBLISHED ) {
+				include_once( PLOG_CLASS_PATH."class/data/timestamp.class.php" );		
 		    	$blogs = new Blogs();
 	    	    $blogInfo = $article->getBlogInfo();
 	        	$blogInfo->setTotalPosts( $blogInfo->getTotalPosts() + 1 );
+				$blogInfo->setUpdateDate( Timestamp::getNowTimestamp());	
 	            $blogs->updateBlog( $blogInfo );
 	    	}
 
@@ -1034,25 +1029,12 @@
         {
             require_once( PLOG_CLASS_PATH . 'class/database/db.class.php' );
 
-            $article  = $this->getArticle( $articleId );
-            $numReads = $article->getNumReads() + 1;
+            $query = "UPDATE ".$this->getPrefix()."articles SET ".
+                     " num_reads = num_reads+1, date = date".
+			         " WHERE id = '".Db::qstr( $articleId )."'";
 
-            $article->setNumReads( $numReads );
-
-            $keyValuePairs = array();
-            $keyValuePairs['num_reads'] = $numReads;
-            $keyValuePairs['date']      = '@date';
-
-            $query = Db::buildUpdateQuery( ARTICLES_TABLENAME,
-                                           $keyValuePairs,
-                                           'id',
-                                           $articleId );
-
             $result = $this->Execute( $query );
 
-            if( $result )
-                $this->_cache->setData( $articleId, CACHE_ARTICLES, $article );
-
             return $result;
         }
 		
@@ -1066,8 +1048,7 @@
         {
             // we have to build up the query, which will be pretty long...
             $query = "UPDATE ".$this->getPrefix()."articles SET ".
-                     " num_reads = num_reads+1 ".
-                     ", date = date ".
+                     " num_reads = num_reads+1, date = date".
                      " WHERE slug = '".Db::qstr($articleName)."'";
 
             $result = $this->Execute( $query );
@@ -1148,11 +1129,8 @@
 		 */
 		function deleteArticleText( $articleId )
 		{
-            $query = Db::buildDeleteQuery( ARTICLETEXTS_TABLENAME,
-                                           'article_id',
-                                           $articleId );
-			
-			return( $this->Execute($query) );
+			$query = "DELETE FROM ".$this->getPrefix()."articles_text WHERE article_id = ".Db::qstr( $articleId )."'";
+			return( $this->Execute( $query ));
 		}
 
         /**

Modified: plog/trunk/class/dao/bayesianfilterinfos.class.php
===================================================================
--- plog/trunk/class/dao/bayesianfilterinfos.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/bayesianfilterinfos.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -26,7 +26,23 @@
         {
         	$query = "SELECT * FROM ". $this->getPrefix() . "bayesian_filter_info WHERE blog_id = $blogId";
 
-            return $this->getBayesianFilterInfoFromQuery($query);
+            $result = $this->Execute($query);
+
+            if( !$result )
+            	return false;
+
+			if( $result->RowCount() == 0 ) {
+				// this is a bit of an special case... for whatever reason there is no spam information
+				// for this blog so we have to calculate it now...
+				$this->insertLate( $blogId );
+				
+				// and then we call ourselves again
+				return( $this->getBlogBayesianFilterInfo( $blogId ));				
+			}
+
+            $row = $result->FetchRow();
+            $result->Close();			
+            return $this->_mapRowToObject($row);
         }
 
         /**
@@ -72,7 +88,7 @@
         * -- Add function info here --
         */
         function _incTotal($id, $field)
-        {
+        {	
         	$query = "UPDATE " . $this->getPrefix() . "bayesian_filter_info SET " .
                      "$field = $field + 1 WHERE id=$id;";
             
@@ -136,6 +152,30 @@
         /**
         * -- Add function info here --
         */
+        function insertLate($blogId )
+        {
+			$currentStats = "SELECT SUM(spam_occurrences) AS total_spam, 
+			                        SUM(nonspam_occurrences) AS total_nonspam 
+			                 FROM ".$this->getPrefix()."bayesian_tokens 
+			                 WHERE blog_id = $blogId";
+			$result = $this->Execute( $currentStats );
+			
+			if( $result ) {
+				$row = $result->FetchRow();
+				isset( $row["total_spam"]) ? $totalSpam = $row["total_spam"] : $totalSpam = 0;
+				isset( $row["total_nonspam"]) ? $totalNonSpam = $row["total_nonspam"] : $totalNonSpam = 0;
+			}
+			else {
+				$totalSpam = 0;
+				$totalNonSpam = 0;
+			}
+
+			return( $this->insert( $blogId, $totalSpam, $totalNonspam ));
+        }
+
+        /**
+        * -- Add function info here --
+        */
         function deleteBayesianFilterInfoByBlogId( $blogId )
         {
             $query = "DELETE FROM " . $this->getPrefix() . "bayesian_filter_info WHERE blog_id=$blogId";

Modified: plog/trunk/class/dao/commentscommon.class.php
===================================================================
--- plog/trunk/class/dao/commentscommon.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/commentscommon.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -3,7 +3,7 @@
 	lt_include( PLOG_CLASS_PATH."class/dao/model.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );	
 	lt_include( PLOG_CLASS_PATH."class/dao/articlecommentstatus.class.php" );
-	lt_include( PLOG_CLASS_PATH."class/dao/daocacheconstants.properties.php" );	
+	lt_include( PLOG_CLASS_PATH."class/dao/daocacheconstants.properties.php" ); 
 
 	/** 
 	 * different orders that comments can have
@@ -18,10 +18,10 @@
 	define( "COMMENT_TYPE_TRACKBACK", 2 );	
 	define( "COMMENT_TYPE_ANY", -1 );
 	
-    /**
+	/**
 	 * \ingroup DAO
 	 *
-     * Since comments and trackbacks are now in the same table, this class contains all the
+	 * Since comments and trackbacks are now in the same table, this class contains all the
 	 * common code needed to deal with these items. Most of the methods are exactly the same in both
 	 * ArticleComments and Trackbacks except that they take an additional parameter called 'status'
 	 * which can either be
@@ -31,7 +31,7 @@
 	 * - COMMENT_TYPE_ANY
 	 *
 	 * Depending on whether we'd like to retrieve a trackback or a comment.
-     */
+	 */
 	class CommentsCommon extends Model 
 	{
 
@@ -39,55 +39,55 @@
 		var $blogSettings;
 		var $timeDiff;
 
-    	function CommentsCommon()
-        {
-        	$this->Model();
+		function CommentsCommon()
+		{
+			$this->Model();
 			$this->table = $this->getPrefix()."articles_comments";
-        }
+		}
 
-        /**
-         * Adds a comment to an article
+		/**
+		 * Adds a comment to an article
 		 *
 		 * @param comment the UserComment object that we're going to add.
 		 * @return Returns true if successful or false if error. Also in case of success, it will modify the UserComment
 		 * object passed by reference and include its new id.
-         */
+		 */
 		function addComment( &$comment ) 
-        {
-        	if(( $result = $this->add( $comment ))) {
-        		lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+		{
+			if(( $result = $this->add( $comment ))) {
+				lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
 				$this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST );
 				$this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST );
 				// update the article comments
 				$article = $comment->getArticle();
 				$blog = $article->getBlogInfo();
 				if( $comment->getType() == COMMENT_TYPE_COMMENT ) {
-        			$article->setNumComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().
-                                                                  ' AND status = '.COMMENT_STATUS_NONSPAM.
-        		        	                                      ' AND type = '.$comment->getType()));
-        			$article->setTotalComments($this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                 'article_id = '.$article->getId().' AND type = '.$comment->getType()));
+					$article->setNumComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().
+																  ' AND status = '.COMMENT_STATUS_NONSPAM.
+																  ' AND type = '.$comment->getType()));
+					$article->setTotalComments($this->getNumItems( $this->getPrefix().'articles_comments', 
+														 'article_id = '.$article->getId().' AND type = '.$comment->getType()));
 					$blog->setTotalComments($this->getNumItems( $this->getPrefix().'articles_comments', 
-					                                            'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));
+																'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));
 				}
 				else {
-        			$article->setNumTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().
-                                                                  ' AND status = '.COMMENT_STATUS_NONSPAM.
-        		        	                                      ' AND type = '.$comment->getType()));
-        			$article->setTotalTrackbacks($this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                 'article_id = '.$article->getId().' AND type = '.$comment->getType()));
+					$article->setNumTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().
+																  ' AND status = '.COMMENT_STATUS_NONSPAM.
+																  ' AND type = '.$comment->getType()));
+					$article->setTotalTrackbacks($this->getNumItems( $this->getPrefix().'articles_comments', 
+														 'article_id = '.$article->getId().' AND type = '.$comment->getType()));
 					$blog->setTotalTrackbacks($this->getNumItems( $this->getPrefix().'articles_comments', 
-					                                              'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));					
+																  'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));					
 				}
 				$articles = new Articles();
 				$articles->updateArticle( $article );
 				$blogs = new Blogs();
 				$blogs->updateBlog( $blog );
-        	}
-        	return( $result );
-        }
+			}
+			return( $result );
+		}
 
 		/**
 		 * Retrieves all the comments for a post
@@ -101,30 +101,30 @@
 		 * @return False if error or an array of ArticleComments objects
 		 */
 		function getPostComments( $artid, 
-		                          $order = COMMENT_ORDER_NEWEST_FIRST, 
-		                          $status = COMMENT_STATUS_ALL, 
-		                          $type = COMMENT_TYPE_ANY, 
-		                          $page = -1, 
-		                          $itemsPerPage = DEFAULT_ITEMS_PER_PAGE )
+								  $order = COMMENT_ORDER_NEWEST_FIRST, 
+								  $status = COMMENT_STATUS_ALL, 
+								  $type = COMMENT_TYPE_ANY, 
+								  $page = -1, 
+								  $itemsPerPage = DEFAULT_ITEMS_PER_PAGE )
 		{
 			if( $order == COMMENT_ORDER_NEWEST_FIRST ){
 				$order = Array( "date" => "DESC" );
-                $cache_item = CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST;
-            }
+				$cache_item = CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST;
+			}
 			else{
 				$order = Array( "date" => "ASC" );
-                $cache_item = CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST;
-            }
+				$cache_item = CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST;
+			}
 		
 			$comments = $this->getMany( "article_id",
-			                            $artid,
-                                        $cache_item,
-			                            Array(),
-			                            $order,
+										$artid,
+										$cache_item,
+										Array(),
+										$order,
 										"",
-			                            $page,
-			                            $itemsPerPage );
-						                            
+										$page,
+										$itemsPerPage );
+													
 			$result = Array();
 			
 			if( $comments ) {
@@ -145,7 +145,7 @@
 				$result = Array();
 				
 				
-			return( $result );			               
+			return( $result );						   
 		}
 		
 		/**
@@ -169,23 +169,23 @@
 			return( true );
 		}
 		
-        /**
-         * Returns the total number of comments for a post
+		/**
+		 * Returns the total number of comments for a post
 		 *
 		 * @param artId the post id
 		 * @param status
 		 * @return The number of comments
-         */
-        function getNumPostComments( $artId, $status = COMMENT_STATUS_ALL, $type = COMMENT_TYPE_ANY )
-        {
-        	lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
-        	$numComments = 0;
+		 */
+		function getNumPostComments( $artId, $status = COMMENT_STATUS_ALL, $type = COMMENT_TYPE_ANY )
+		{
+			lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+			$numComments = 0;
 			$articles = new Articles();
-			$article = $articles->getArticle( $artId );        	
+			$article = $articles->getArticle( $artId );			
 
-            if(!$article)
-                return 0;
-            
+			if(!$article)
+				return 0;
+			
 			if( $type == COMMENT_TYPE_COMMENT ) {
 				if( $status == COMMENT_STATUS_ALL ) {
 					$numComments = $article->getTotalComments();
@@ -197,7 +197,7 @@
 					$numComments = $article->getTotalComments() - $article->getNumComments();
 				}
 				else {
-                    $numComments = 0;
+					$numComments = 0;
 				}
 			}
 			else if($type == COMMENT_TYPE_TRACKBACK) {
@@ -208,46 +208,46 @@
 					$numComments = $article->getNumTrackBacks();
 				}
 				elseif( $status == COMMENT_STATUS_SPAM ) {
-                        $numComments = $article->getTotalTrackbacks() - $article->getNumTrackbacks();
+						$numComments = $article->getTotalTrackbacks() - $article->getNumTrackbacks();
 				}
 				else {
-                    $numComments = 0;
+					$numComments = 0;
 				}
 			}
-            else{
-                $numComments = $this->getNumPostComments($artId, $status, COMMENT_TYPE_COMMENT) +
-                    $this->getNumPostComments($artId, $status, COMMENT_TYPE_TRACKBACK);
-            }
+			else{
+				$numComments = $this->getNumPostComments($artId, $status, COMMENT_TYPE_COMMENT) +
+					$this->getNumPostComments($artId, $status, COMMENT_TYPE_TRACKBACK);
+			}
 			
 			return( $numComments );
-        }
-        
-        /**
-         * returns the number of comments that a blog has
-         *
-         * @param blogId
-         * @param status
-         * @param type
+		}
+		
+		/**
+		 * returns the number of comments that a blog has
+		 *
+		 * @param blogId
+		 * @param status
+		 * @param type
 		 * @param searchTerms
-         * @return The number of comments, or 0 if error or no comments
-         */
-        function getNumBlogComments( $blogId, $status = COMMENT_STATUS_ALL, $type = COMMENT_TYPE_ANY, $searchTerms = "" )
-        {
-        	if( $status == COMMENT_STATUS_ALL && $type != COMMENT_TYPE_ANY && $searchTerms == "" ) {
-        		// fast case, we can load the blog and query one of its intrinsic fields
-        		lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
-        		$blogs = new Blogs();
-        		$blogInfo = $blogs->getBlogInfo( $blogId );
-        		if( !$blogInfo )
-        			$numComments = 0;
-        		else {
-        			if( $type == COMMENT_TYPE_COMMENT )
-	        			$numComments = $blogInfo->getTotalComments();
-	        		else
-	        			$numComments = $blogInfo->getTotalTrackbacks();
-        		}
-        	}
-        	else {			
+		 * @return The number of comments, or 0 if error or no comments
+		 */
+		function getNumBlogComments( $blogId, $status = COMMENT_STATUS_ALL, $type = COMMENT_TYPE_ANY, $searchTerms = "" )
+		{
+			if( $status == COMMENT_STATUS_ALL && $type != COMMENT_TYPE_ANY && $searchTerms == "" ) {
+				// fast case, we can load the blog and query one of its intrinsic fields
+				lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
+				$blogs = new Blogs();
+				$blogInfo = $blogs->getBlogInfo( $blogId );
+				if( !$blogInfo )
+					$numComments = 0;
+				else {
+					if( $type == COMMENT_TYPE_COMMENT )
+						$numComments = $blogInfo->getTotalComments();
+					else
+						$numComments = $blogInfo->getTotalTrackbacks();
+				}
+			}
+			else {			
 				// create the table name
 				$prefix = $this->getPrefix();
 				$table = "{$prefix}articles_comments c";
@@ -257,66 +257,66 @@
 					$cond .= " AND c.status = '".Db::qstr($status)."'";
 				if( $type != COMMENT_TYPE_ANY )
 					$cond .= " AND c.type = '".Db::qstr($type)."'";
-                if( $searchTerms != "" )
-                    $cond .= " AND ".$this->getSearchConditions( $searchTerms );
-                    //print("type = ".$type." - cond = $cond");
+				if( $searchTerms != "" )
+					$cond .= " AND ".$this->getSearchConditions( $searchTerms );
+					//print("type = ".$type." - cond = $cond");
 				$numComments = $this->getNumItems( $table, $cond );
-        	}
-        	
-        	return( $numComments );
-        }
+			}
+			
+			return( $numComments );
+		}
 
 		/**
 		 * Removes a comment from a post. It also updates all the other posts that
-         * have this one as the parent and makes them look as if they were 'top level'
-         * comments with no parent.
-         *
-         * @param artid The article identifier.
-         * @param commentid The comment identifier.
+		 * have this one as the parent and makes them look as if they were 'top level'
+		 * comments with no parent.
+		 *
+		 * @param artid The article identifier.
+		 * @param commentid The comment identifier.
 		 */
 		function deleteComment( $commentid )
 		{
 			$comment = $this->getComment( $commentid );
-			if( $comment )  {
+			if( $comment )	{
 				$this->delete( "id", $commentid );
-	            // update all the other posts
-    	        $query = "UPDATE ".$this->getPrefix()."articles_comments SET parent_id = 0 WHERE parent_id = '".
-				         Db::qstr($commentid)."' AND article_id = '".
+				// update all the other posts
+				$query = "UPDATE ".$this->getPrefix()."articles_comments SET parent_id = 0 WHERE parent_id = '".
+						 Db::qstr($commentid)."' AND article_id = '".
 						 Db::qstr( $comment->getArticleId())."'";
-        	    $result = $this->Execute( $query );
-                $this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST );
-                $this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST );
-        	    $this->_cache->removeData( $comment->getId(), CACHE_ARTICLE_COMMENTS );
-        	    
-        	    // update the blog and the article counters
-        	    lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
-        	    lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+				$result = $this->Execute( $query );
+				$this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST );
+				$this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST );
+				$this->_cache->removeData( $comment->getId(), CACHE_ARTICLE_COMMENTS );
+				
+				// update the blog and the article counters
+				lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
+				lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
 
-        	    $article = $comment->getArticle();
-        	    $blog = $article->getBlogInfo();
-        	    $type = $comment->getType();
-        	    if( $type == COMMENT_TYPE_COMMENT ) {
-        			$article->setNumComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
-        		        	                                      ' AND type = '.$comment->getType()));
-        			$article->setTotalComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                            'article_id = '.$article->getId().' AND type = '.$comment->getType()));
+				$article = $comment->getArticle();
+				$blog = $article->getBlogInfo();
+				$type = $comment->getType();
+				if( $type == COMMENT_TYPE_COMMENT ) {
+					$article->setNumComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
+																  ' AND type = '.$comment->getType()));
+					$article->setTotalComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																	'article_id = '.$article->getId().' AND type = '.$comment->getType()));
 					$blog->setTotalComments($this->getNumItems( $this->getPrefix().'articles_comments', 
-					                                            'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));
-	        	}
-	        	else {
-        			$article->setNumTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
-        		        	                                      ' AND type = '.$comment->getType()));
-        			$article->setTotalTrackbacks($this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND type = '.$comment->getType()));
+																'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));
+				}
+				else {
+					$article->setNumTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
+																  ' AND type = '.$comment->getType()));
+					$article->setTotalTrackbacks($this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND type = '.$comment->getType()));
 					$blog->setTotalTrackbacks($this->getNumItems( $this->getPrefix().'articles_comments',
-   					                                              'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));
-	        	}
-        	    $blogs = new Blogs();
-	        	$blogs->updateBlog( $blog );
-        	    $articles = new Articles();
-        	    $articles->updateArticle( $article );        	    
+																  'blog_id = '.$blog->getId().' AND type = '.$comment->getType()));
+				}
+				$blogs = new Blogs();
+				$blogs->updateBlog( $blog );
+				$articles = new Articles();
+				$articles->updateArticle( $article );				
 			}
 			else {
 				return false;
@@ -325,15 +325,15 @@
 			return( true );
 		}		
 
-        /**
-         * Updates a comment. It also takes into account status changes and updates counters in
-         * the blogs and articles table accordingly.
-         *
-         * @param comment An UserComment object
-         * @return true if update successful or false otherwise.
-         */
-        function updateComment( $comment )
-        {
+		/**
+		 * Updates a comment. It also takes into account status changes and updates counters in
+		 * the blogs and articles table accordingly.
+		 *
+		 * @param comment An UserComment object
+		 * @return true if update successful or false otherwise.
+		 */
+		function updateComment( $comment )
+		{
 			// we need to undo the time offset before updating the comment, or else the comment will be saved
 			// with the time offset applied
 			$blogInfo = $comment->getBlogInfo();
@@ -344,41 +344,41 @@
 				$comment->setDate( $newDate );
 			}
 	
-        	if(($result = $this->update( $comment ))) {
-	        	// reset the cache
-                $this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST );
-                $this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST );
-        		$this->_cache->removeData( $comment->getId(), CACHE_ARTICLE_COMMENTS );
-        		// update counters in the articles table according to the status
-        		lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
-        		$articles = new Articles();
-        		// load the article
-        		$article = $comment->getArticle();
-        		if( $comment->getType() == COMMENT_TYPE_COMMENT ) {
-        			$article->setNumComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
-        		        	                                      ' AND type = '.$comment->getType()));
-        			$article->setTotalComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND type = '.$comment->getType()));
-    			}
-    			elseif( $comment->getType() == COMMENT_TYPE_TRACKBACK ) {
-        			$article->setNumTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
-        		        	                                      ' AND type = '.$comment->getType()));
-        			$article->setTotalTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
-        		    	                                          'article_id = '.$article->getId().' AND type = '.$comment->getType()));
-    			}
-    			$articles->updateArticle( $article );
-        	}
+			if(($result = $this->update( $comment ))) {
+				// reset the cache
+				$this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_NEWEST_TO_OLDEST );
+				$this->_cache->removeData( $comment->getArticleId(), CACHE_ARTICLE_COMMENTS_BYARTICLE_OLDEST_TO_NEWEST );
+				$this->_cache->removeData( $comment->getId(), CACHE_ARTICLE_COMMENTS );
+				// update counters in the articles table according to the status
+				lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+				$articles = new Articles();
+				// load the article
+				$article = $comment->getArticle();
+				if( $comment->getType() == COMMENT_TYPE_COMMENT ) {
+					$article->setNumComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
+																  ' AND type = '.$comment->getType()));
+					$article->setTotalComments( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND type = '.$comment->getType()));
+				}
+				elseif( $comment->getType() == COMMENT_TYPE_TRACKBACK ) {
+					$article->setNumTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND status = '.COMMENT_STATUS_NONSPAM.
+																  ' AND type = '.$comment->getType()));
+					$article->setTotalTrackbacks( $this->getNumItems( $this->getPrefix().'articles_comments', 
+																  'article_id = '.$article->getId().' AND type = '.$comment->getType()));
+				}
+				$articles->updateArticle( $article );
+			}
 
 			// this is not the cleanest solution but it will do the trick for now...
 			if( $blogOffset != 0 ) {
 				$newDate = Timestamp::getDateWithOffset( $comment->getDate(), $blogOffset );
 				$comment->setDate( $newDate );
 			}
-        	
-        	return( $result );
-        }
+			
+			return( $result );
+		}
 
 		/**
 		 * returns a single comment, identified by its identifier
@@ -412,7 +412,7 @@
 		 * @return An array of ArticleComment objects
 		 */
 		function getBlogComments( $blogId, 
-		                          $order = COMMENT_ORDER_NEWEST_FIRST, 
+								  $order = COMMENT_ORDER_NEWEST_FIRST, 
 								  $status = COMMENT_STATUS_ALL, 
 								  $type = COMMENT_TYPE_ANY, 
 								  $searchTerms = "", 
@@ -425,10 +425,10 @@
 			 */
 			$prefix = $this->getPrefix();
 			$query = "SELECT c.*
-			          FROM {$prefix}articles_comments c
-			          WHERE c.blog_id = '".Db::qstr( $blogId )."'";
-            if( $status != COMMENT_STATUS_ALL )
-            	$query .= " AND status = $status";
+					  FROM {$prefix}articles_comments c
+					  WHERE c.blog_id = '".Db::qstr( $blogId )."'";
+			if( $status != COMMENT_STATUS_ALL )
+				$query .= " AND status = $status";
 			if( $type != COMMENT_TYPE_ANY )
 				$query .= " AND type = '".Db::qstr($type)."'";
 			if( $searchTerms != "" ) {
@@ -447,20 +447,20 @@
 				return false;
 				
 			if( $result->RowCount() == 0 ){
-                $result->Close();			
+				$result->Close();			
 				return Array();
-            }
+			}
 				
 			$comments = Array();
 			$articles = new Articles();
 			while( $row = $result->FetchRow()) {
 				$comments[] = $this->mapRow( $row );
 			}
-            $result->Close();			
+			$result->Close();			
 
 			/*if( $page > -1 && $amount > -1 )
-				$comments = array_slice( $comments,	($page-1) * $amount, $amount );*/
-        				 
+				$comments = array_slice( $comments, ($page-1) * $amount, $amount );*/
+						 
 			return( $comments );
 		}
 		
@@ -470,35 +470,35 @@
 		 */
 		function mapRow( $row )
 		{
-            require_once( PLOG_CLASS_PATH."class/dao/usercomment.class.php" );
-            require_once( PLOG_CLASS_PATH."class/data/timestamp.class.php" );
+			require_once( PLOG_CLASS_PATH."class/dao/usercomment.class.php" );
+			require_once( PLOG_CLASS_PATH."class/data/timestamp.class.php" );
 
-            $prefix = $this->getPrefix();
-            $date = $row["date"];
-            $articleId = $row["article_id"];
-            $blogId = $row["blog_id"];
-            
-            $blogs =  new Blogs();
-            $blogInfo = $blogs->getBlogInfo( $blogId );
-            $blogSettings = $blogInfo->getSettings();
-            $timeDiff = $blogSettings->getValue( "time_offset" );
+			$prefix = $this->getPrefix();
+			$date = $row["date"];
+			$articleId = $row["article_id"];
+			$blogId = $row["blog_id"];
 			
-            $date = Timestamp::getDateWithOffset( $date, $timeDiff );
+			$blogs =  new Blogs();
+			$blogInfo = $blogs->getBlogInfo( $blogId );
+			$blogSettings = $blogInfo->getSettings();
+			$timeDiff = $blogSettings->getValue( "time_offset" );
+			
+			$date = Timestamp::getDateWithOffset( $date, $timeDiff );
 
-        	$comment = new UserComment( $row["article_id"],
-        	                            $row['blog_id'],
-            							$row["parent_id"],
-                                        $row["topic"],
-                                        $row["text"],
-                                        $date,
-                                        $row["user_name"],
-                                        $row["user_email"],
-                                        $row["user_url"],
-                                        $row["client_ip"],
-                                        $row["spam_rate"],
-                                        $row["status"],
-                                        unserialize($row["properties"]),
-                                        $row["id"] );
+			$comment = new UserComment( $row["article_id"],
+										$row['blog_id'],
+										$row["parent_id"],
+										$row["topic"],
+										$row["text"],
+										$date,
+										$row["user_name"],
+										$row["user_email"],
+										$row["user_url"],
+										$row["client_ip"],
+										$row["spam_rate"],
+										$row["status"],
+										unserialize($row["properties"]),
+										$row["id"] );
 										
 			// set the normalized text and topic
 			$comment->setNormalizedText( $row['normalized_text'] );
@@ -506,7 +506,7 @@
 			$comment->setType( $row['type'] );
 			$comment->setUserId( $row['user_id'] );
 
-            return $comment;
+			return $comment;
 		}
 		
 		/**
@@ -520,19 +520,26 @@
 			
 			$query = SearchEngine::adaptSearchString($searchTerms);
 
-            // MARKWU: I also need to take care when there are multiplu search term
+			// MARKWU: I also need to take care when there are multiplu search term
 
-            // Split the search term by space
-            $query_array = explode(' ',$query);
+			// Split the search term by space
+			$query_array = explode(' ',$query);
 		
-            // For each search terms, I should make a like query for it   
-            $where_string = "(";
-            $where_string .= "((c.normalized_topic LIKE '%{$query_array[0]}%') OR (c.normalized_text LIKE '%{$query_array[0]}%'))";
-            for ( $i = 1; $i < count($query_array); $i = $i + 1) {
-                $where_string .= " AND ((c.normalized_topic LIKE '%{$query_array[$i]}%') OR (c.normalized_text LIKE '%{$query_array[$i]}%'))";
-            }
-            $where_string .= " OR ((c.normalized_topic LIKE '%{$query}%') OR (c.normalized_text LIKE '%{$query}%'))";
-            $where_string .= ")";
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {
+				// fast path used when FULLTEXT searches are supported
+				$where_string = "(MATCH(c.normalized_text) AGAINST ('{$query}' IN BOOLEAN MODE))";
+			}
+			else {
+				// old and slower path for those cases when they are not
+				$where_string = "(";
+				$where_string .= "((c.normalized_topic LIKE '%{$query_array[0]}%') OR (c.normalized_text LIKE '%{$query_array[0]}%'))";
+				for ( $i = 1; $i < count($query_array); $i = $i + 1) {
+					$where_string .= " AND ((c.normalized_topic LIKE '%{$query_array[$i]}%') OR (c.normalized_text LIKE '%{$query_array[$i]}%'))";
+				}
+				$where_string .= " OR ((c.normalized_topic LIKE '%{$query}%') OR (c.normalized_text LIKE '%{$query}%'))";
+				$where_string .= ")";
+			}
 
 			return( $where_string );		
 		}

Modified: plog/trunk/class/dao/customfields/customfieldsvalues.class.php
===================================================================
--- plog/trunk/class/dao/customfields/customfieldsvalues.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/customfields/customfieldsvalues.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -148,15 +148,22 @@
 			
 			$query = SearchEngine::adaptSearchString($searchTerms);
 
-            $query_array = explode(' ',$query);			
+            $query_array = explode(' ',$query);	
 			
-            $where_string = "(";
-            $where_string .= "(v.normalized_value LIKE '%{$query_array[0]}%')";
-            for ( $i = 1; $i < count($query_array); $i = $i + 1) {
-                $where_string .= " AND ((v.normalized_value LIKE '%{$query_array[$i]}%'))";
-            }
-            $where_string .= " OR (v.normalized_value LIKE '%{$query}%')";
-            $where_string .= ")";
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {			
+				// fast path used when FULLTEXT searches are supported
+				$where_string = "(MATCH(c.normalized_value) AGAINST ('{$query}' IN BOOLEAN MODE))";				
+			}
+			else {
+	            $where_string = "(";
+	            $where_string .= "(v.normalized_value LIKE '%{$query_array[0]}%')";
+	            for ( $i = 1; $i < count($query_array); $i = $i + 1) {
+	                $where_string .= " AND ((v.normalized_value LIKE '%{$query_array[$i]}%'))";
+	            }
+	            $where_string .= " OR (v.normalized_value LIKE '%{$query}%')";
+	            $where_string .= ")";
+			}
 
 			return( $where_string );
 		}

Modified: plog/trunk/class/dao/model.class.php
===================================================================
--- plog/trunk/class/dao/model.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/model.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -215,41 +215,7 @@
 	        return( $dbObject );
         	
         }
-        
-        /**
-         * given several conditions, concatenates them with an "AND" operator. If one of the
-         * items of the array is an empty string, the condition will not be used
-         *
-         * @deprecated use Db Class build(Select|Insert|...)Query instead
-         * @param conds
-         * @return a string
-         */
-        function buildWhereCondition( $conds = Array(), $useWhere = true )
-        {
-            $valid = 0;
-            $where = "";
-            
-            foreach( $conds as $cond ) {
-                if( $cond ) {
-                    // only if the condition is not empty...
-                    
-                    if( $valid > 0 )
-                        $where .= " AND ";
-                    
-                    // append the condition
-                    $where .= "$cond";
-                    
-                    // we've got a valid condition
-                    $valid++;
-                }
-            }
-            
-            if( $valid > 0 && $useWhere )
-                $where = "WHERE $where";
                 
-            return( $where );
-        }        
-        
 		/**
 		 * Retrieves all the rows from the given table
 		 *

Modified: plog/trunk/class/dao/searchengine.class.php
===================================================================
--- plog/trunk/class/dao/searchengine.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/searchengine.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -80,34 +80,56 @@
 		 */
 		function search( $blogId, $searchTerms, $status = POST_STATUS_PUBLISHED, $includeFuture = true, $page = -1, $itemsPerPage = -1 )
 		{			
-			$prefix = $this->getPrefix();
-			$query = "SELECT DISTINCT a.id AS id FROM {$prefix}articles a ".
-			         "WHERE ".$this->getArticleSearchConditions( $searchTerms );
-			
+			// calculate the conditions right away, they will be used by both sides of the union
+			$conds = "";
 			if( $blogId != -1 )
-				$query .= " AND a.blog_id = ".Db::qstr( $blogId );
-				
+				$conds .= " AND a.blog_id = ".Db::qstr( $blogId );
 			if( $status != -1 ) 
-				$query .= " AND a.status = ".$status;
-				
+				$conds .= " AND a.status = ".$status;
 			if( !$includeFuture )
-				$query .= " AND a.date < NOW()";
-				
-			$query .= " ORDER BY a.date DESC";
+				$conds .= " AND a.date < NOW()";
+
+			// first change
+			$prefix = $this->getPrefix();
 			
+			// check if we can use fulltext indexes
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {
+				$query = "(SELECT a.* FROM {$prefix}articles a 
+						  INNER JOIN {$prefix}articles_text at ON a.id = at.article_id
+				          WHERE MATCH(at.normalized_text, at.normalized_topic) AGAINST ('{$searchTerms}' IN BOOLEAN MODE) 
+				          {$conds})
+					 	  UNION
+						  (SELECT a.* FROM {$prefix}articles a 
+						  INNER JOIN {$prefix}custom_fields_values cfv ON a.id = cfv.article_id
+						  WHERE MATCH(cfv.normalized_value) AGAINST ('{$searchTerms}' IN BOOLEAN MODE) 
+						  {$conds})
+						  ORDER BY date DESC";
+			}
+			else {
+				$query = "SELECT DISTINCT a.id AS id FROM {$prefix}articles a ".
+				         "WHERE ".$this->getArticleSearchConditions( $searchTerms )." {$conds} ORDER BY a.date DESC";
+			}
+
 			$result = $this->Execute( $query, $page, $itemsPerPage );
-			
-			lt_include( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+
+			include_once( PLOG_CLASS_PATH."class/dao/articles.class.php" );
 			$articles = new Articles();
-			
+
 			if( !$result )
 				return( Array());
-				
+
 			$results = Array();
 			while( $row = $result->FetchRow()) {
-				$results[] = new SearchResult( $articles->getArticle( $row["id"] ), SEARCH_RESULT_ARTICLE, $searchTerms );
+				// depending on whether fulltext is available, we will have either fetched all we need so that
+				// we can map the row directly into an object, or then we have to use the cache to get all
+				// articles one by one
+				if( $db->isFullTextSupported()) 
+					$results[] = new SearchResult( $articles->mapRow( $row ), SEARCH_RESULT_ARTICLE, $searchTerms );
+				else
+					$results[] =  new SearchResult( $articles->getArticle( $row["id"] ), SEARCH_RESULT_ARTICLE, $searchTerms );
 			}
-			
+
 			return( $results );
 		}
 		
@@ -123,20 +145,49 @@
 		 */
 		function getNumSearchResults( $blogId, $searchTerms, $status, $includeFuture = true )
 		{
-			$prefix = $this->getPrefix();
-			$query = $this->getArticleSearchConditions( $searchTerms );
-			
+			$prefix = $this->getPrefix();	
+
+			// calculate the additional conditions beforehad
+			$conds = "";
 			if( $blogId != -1 )
-				$query .= " AND a.blog_id = ".Db::qstr( $blogId );
-				
+				$conds .= " AND a.blog_id = ".Db::qstr( $blogId );					
 			if( $status != -1 )
-				$query .= " AND a.status = ".$status;
-				
+				$conds .= " AND a.status = ".$status;							
 			if( !$includeFuture )
-				$query .= " AND a.date < NOW()";
-				
-			$total = $this->getNumItems( "{$prefix}articles a", $query, "a.id" );			
-			return( $total );
+				$conds .= " AND a.date < NOW()";
+			
+			// check if the db supports fulltext searches and if so act accordingly		
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {
+				// faster path via the fulltext indexes
+				$query = "(SELECT COUNT(a.id) AS total FROM {$prefix}articles a 
+						  INNER JOIN {$prefix}articles_text at ON a.id = at.article_id
+				          WHERE MATCH(at.normalized_text, at.normalized_topic) AGAINST ('{$searchTerms}' IN BOOLEAN MODE) 
+				          {$conds})
+					 	  UNION
+						  (SELECT COUNT(a.id) AS total FROM {$prefix}articles a 
+						  INNER JOIN {$prefix}custom_fields_values cfv ON a.id = cfv.article_id
+						  WHERE MATCH(cfv.normalized_value) AGAINST ('{$searchTerms}' IN BOOLEAN MODE) 
+						  {$conds})";
+				// execute the query, and it should give us exactly two rows: one per each one of the queries of the union, so 
+				// the total amount of posts that match the search condition should be the sum of those two rows
+				$result = $this->Execute( $query );
+				if( !$result )				
+					return 0;
+					
+				$total = 0;
+				while( $row = $result->FetchRow()) {
+					$total += $row["total"];
+				}
+			}
+			else {
+				// alternative, slower path
+				$query = $this->getArticleSearchConditions( $searchTerms );
+								
+				$total = $this->getNumItems( "{$prefix}articles a", $query, "a.id" );				
+			}
+			
+			return( $total );			
 		}
 		
 		/**
@@ -163,7 +214,7 @@
 			$tmpCond = $comments->getSearchConditions( $searchTerms );
 			$query = "SELECT c.article_id AS article_id FROM {$prefix}articles_comments c 
 			          WHERE $tmpCond AND c.status = ".COMMENT_STATUS_NONSPAM;
-			$result = $this->Execute( $query );			
+			$result = $this->Execute( $query );
 				
 			$ids = Array();
 			while( $row = $result->FetchRow()) {
@@ -179,7 +230,7 @@
 			$fields = new CustomFieldsValues();
 			$tmpCond = $fields->getSearchConditions( $searchTerms );
 			$query = "SELECT v.article_id AS article_id FROM {$prefix}custom_fields_values v WHERE $tmpCond";
-			$result = $this->Execute( $query );			
+			$result = $this->Execute( $query );	
 				
 			$ids = Array();
 			while( $row = $result->FetchRow()) {

Modified: plog/trunk/class/dao/userdata/baseuserdataprovider.class.php
===================================================================
--- plog/trunk/class/dao/userdata/baseuserdataprovider.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/userdata/baseuserdataprovider.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -155,7 +155,7 @@
                                       $query_result["id"]);
                                                                             
             // set some permissions
-			isset( $query_result["site_admin"] ) ? $siteAdmin = $query_result["site_admin"] : $siteAdmin = false;
+			isset( $query_result["site_admin"] ) ? $siteAdmin = $query_result["site_admin"] : $siteAdmin = 0;
             $userInfo->setSiteAdmin( $siteAdmin );
             $userInfo->setStatus( $query_result["status"] );
 

Modified: plog/trunk/class/dao/userinfo.class.php
===================================================================
--- plog/trunk/class/dao/userinfo.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/dao/userinfo.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -53,7 +53,7 @@
 			$this->_email = $email;
 			$this->_blogs = "";
 			$this->_fullName = $fullName;
-            $this->_siteAdmin = false;
+            $this->_siteAdmin = 0;
 			$this->setPictureId( $resourcePictureId );
 			$this->setProperties( $properties );
 			$this->_perms = Array();
@@ -194,7 +194,7 @@
 
         function isSiteAdmin()
         {
-			if( $this->_siteAdmin == "" ) $this->_siteAdmin = false;
+			if( $this->_siteAdmin == "" ) $this->_siteAdmin = 0;
         	return $this->_siteAdmin;
         }
 
@@ -300,6 +300,7 @@
 		function __sleep()
 		{
 			$this->perms = null;
+			$this->_blogs = null;
 			
 			return( parent::__sleep());
 		}

Modified: plog/trunk/class/data/textfilter.class.php
===================================================================
--- plog/trunk/class/data/textfilter.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/data/textfilter.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -233,9 +233,13 @@
 		 */
 		function htmlDecode( $htmlString, $quote_style = ENT_QUOTES )
 		{
-            $trans_table = array_flip(get_html_translation_table( HTML_SPECIALCHARS, $quote_style ));
-            $trans_table['&#39;'] = "'";
-            return( strtr( $htmlString, $trans_table ));
+                // replace numeric entities
+            $htmlString = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $htmlString);
+            $htmlString = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $htmlString);
+                // replace literal entities
+            $trans_tbl = get_html_translation_table(HTML_ENTITIES);
+            $trans_tbl = array_flip($trans_tbl);
+            return strtr($htmlString, $trans_tbl);
 		}
 		
 		/**

Copied: plog/trunk/class/data/validator/blognamevalidator.class.php (from rev 4709, plog/branches/lifetype-1.2/class/data/validator/blognamevalidator.class.php)
===================================================================
--- plog/trunk/class/data/validator/blognamevalidator.class.php	                        (rev 0)
+++ plog/trunk/class/data/validator/blognamevalidator.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,47 @@
+<?php
+
+	lt_include( PLOG_CLASS_PATH."class/data/validator/validator.class.php" );
+	lt_include( PLOG_CLASS_PATH."class/data/validator/rules/nonemptyrule.class.php" );
+	lt_include( PLOG_CLASS_PATH."class/data/validator/rules/filteredpatternsrule.class.php" );
+	lt_include( PLOG_CLASS_PATH."class/config/config.class.php" );
+
+    /**
+     * \ingroup Validator
+     *
+     * Checks if a blog name is valid. Usernames have to comply with the following rules:
+     *
+	 * - They must not be empty
+	 * - They must not match any of the regular expressions set by administrators as forbidden_blogname_regexp
+     *
+     * @see NonEmptyRule
+     * @see RegExpRule
+     */
+    class BlogNameValidator extends Validator 
+    {
+    	function BlogNameValidator()
+        {
+        	$this->Validator();
+        	
+			// it can't be empty
+        	$this->addRule( new NonEmptyRule());
+
+			// it can't be any of the forbidden ones
+			$config =& Config::getConfig();			
+			$forbiddenBlognames = $config->getValue( "forbidden_blognames", "" );
+			$forbiddenBlognamesArray = explode( " ", $forbiddenBlognames );
+			$this->addRule( new FilteredPatternsRule( $forbiddenBlognamesArray, false ));
+        }
+
+		function validate( $value )
+		{
+			if( !parent::validate( $value )) 
+				return false;
+				
+			// in addition to the other rules, the blog name won't be valid if its domainized() version
+			// returns empty spaces, so this is what would happen if we set a blog name of
+			// things like non-characters for example
+			lt_include( PLOG_CLASS_PATH."class/data/textfilter.class.php" );			
+			return(( Textfilter::domainize( Textfilter::filterAllHTML( $value ))) != "" );
+		}
+    }
+?>
\ No newline at end of file

Modified: plog/trunk/class/database/db.class.php
===================================================================
--- plog/trunk/class/database/db.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/database/db.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -85,10 +85,9 @@
 	            		die();
 	            	}
             	}
-	           	// just in case, forcing to use indexing by field name instead of
-    	       	// by field number
-        	   	//$db->SetFetchMode( ADODB_FETCH_ASSOC );       	
-        	   	// comment out the line above if you're planning to test pdb
+
+				// pass the options to the driver, if any
+				$db->setDriverOpts( $fileConfig->getValue( "db_options" ));
             }
             
             return $db;
@@ -118,10 +117,6 @@
             		throw( new Exception( "getNewDb: Fatal error: could not connect to the database!" ));
                 	die();
             	}
-
-            	// just in case, forcing to use indexing by field name instead of
-            	// by field number
-            	//$db->SetFetchMode( ADODB_FETCH_ASSOC );				
 			}		
 			
 			return( $dbs[$key] );				
@@ -146,244 +141,7 @@
             }
 		}
 
-
 		/**
-		 * Builds a SELECT query
-		 *
-		 * @param tableName The table from where we want to build the SELECT query
-		 * @param fieldsToFetch An array with the list of fields we'd like to fetch
-		 * @param whereColumn Column used in the WHERE clause
-		 * @param whereValue Value used in the WHERE clause
-		 * @param orderColumn Column used to sort the data
-		 * @param limit Number of records to return
-		 * @param whereGlue Logical operator used to glue the different WHERE conditions, 'AND'
-		 * by default.
-		 * @return Returns the SELECT query defined by the provided parameters
-		 */
-        function buildSelectQuery( $tableName, 
-                                   $fieldsToFetch = array(),
-                                   $whereColumn   = null, 
-                                   $whereValue    = null,
-                                   $orderColumn   = null,
-                                   $limit         = null,
-                                   $whereGlue     = ' AND ')
-        {
-            $db = Db::getDb();
-
-            $tableName = Db::addTablePrefixToTableName( $tableName );
-
-            $query = $db->buildSelectQuery( $tableName,
-                                            $fieldsToFetch,
-                                            $whereColumn,
-                                            $whereValue,
-                                            $orderColumn,
-                                            $limit,
-                                            $whereGlue );
-
-            return $query;
-        }
-
-		/**
-		 * Builds an INSERT query
-		 *
-		 * @param tableName Name of the table where data is to be inserted
-		 * @param keyValuePairs An associative array where the key is the name of the column and the
-		 * value is the value of the column in the query
-		 * @return Returns the INSERT query
-		 */
-        function buildInsertQuery( $tableName,
-                                   $keyValuePairs )
-        {
-            $tableName = Db::addTablePrefixToTableName( $tableName );
-
-            $query  = 'INSERT INTO ' . $tableName;
-
-            foreach( $keyValuePairs as $key => $value ) {
-                $keys[]   = $key;
-                $values[] = Db::quoteValue( $value );
-            }
-            $query .= ' (' . implode( ",", $keys ) . ')';
-            $query .= ' VALUES (';
-            $query .= implode( ",", $values );
-            $query .= ');';
-
-            return $query;
-        }
-
-		/**
-		 * Builds an UPDATE query
-		 *
-		 * @param tableName Name of the table where data is to be inserted
-		 * @param keyValuePairs An associative array where the key is the name of the column and the
-		 * value is the value of the column in the query		
-		 * @param whereColumn Column used in the WHERE clause
-		 * @param whereValue Value used in the WHERE clause		
-		 * @return Returns the UPDATE query
-		 */
-        function buildUpdateQuery( $tableName,
-                                   $keyValuePairs,
-                                   $whereColumn   = null, 
-                                   $whereValue    = null,
-                                   $whereGlue     = ' AND ')
-        {
-            $tableName = Db::addTablePrefixToTableName( $tableName );
-
-            $query  = 'UPDATE ' . $tableName . ' SET ';
-
-            $valuesToSet = array();
-            foreach( $keyValuePairs as $key => $value ) {
-                $queryPart  = $key . ' = ';
-                $queryPart .= Db::quoteValue( $value );
-                $valuesToSet[] = $queryPart;
-            }
-            $query .= implode( ",", $valuesToSet );
-            
-            if( $whereColumn != null )
-                $query .= Db::buildWhereConditions( $whereColumn, $whereValue, $whereGlue );
-
-            return $query;
-        }
-
-		/**
-		 * Builds a DELETE query
-		 * 
-		 * @param tableName Name of the table where data is to be inserted		
-		 * @param whereColumn Column used in the WHERE clause
-		 * @param whereValue Value used in the WHERE clause		
-		 * @param whereGlue Logical operator used to glue the different WHERE conditions, 'AND'
-		 * by default.
-		 */
-        function buildDeleteQuery( $tableName,
-                                   $whereColumn = null,
-                                   $whereValue  = null,
-                                   $whereGlue   = ' AND ')
-        {
-            $tableName = Db::addTablePrefixToTableName( $tableName );
-
-            $query  = 'DELETE FROM ' . $tableName;
-
-            if( $whereColumn != null )
-                $query .= Db::buildWhereConditions( $whereColumn, $whereValue, $whereGlue );
-
-            return $query;
-        }
-
-		/**
-		 * @private
-		 * Adds the current database prefix to the given table name. If the table name does not have
-		 * the prefix yet, it will be added in front of the table name but if it's already there, the table
-		 * name will not be modified
-		 *
-		 * @param tableName Name of the table, without prefix. 
-		 * @return The table name with the prefix
-		 */
-        function addTablePrefixToTableName( $tableName ) {
-            if ( !preg_match( "/^" . Db::getPrefix() . "/", $tableName) ) {
-                $tableName = Db::getPrefix() . $tableName;
-            }
-            return $tableName;
-        }
-
-		/**
-		 * Builds a WHERE clause for SELECT and DELETE queries
-		 *
-		 * @param whereColumn The column, it can either be a single column or an array of columns. If it
-		 * is an array of columns, it should be an associative array where the key is the name of the column
-		 * and the value is the value assigned to this column.
-		 * @param whereValue The value assigned to the column, in case $whereColumn is only one column
-		 * @param whereGlue The glue used to link the different conditions
-		 * @return A string that can be used as a WHERE clause in a query
-		 */
-        function buildWhereConditions( $whereColumn, $whereValue, $whereGlue )
-        {
-            $queryPart = ' WHERE ';
-            if( is_array($whereColumn) ) {
-                $conditions = array();
-                foreach( $whereColumn as $column => $value ) {
-                    if($column && $value){
-                        $conditions[] = Db::buildWhereCondition( $column, $value );
-                    }
-                }
-                $imploded = implode( $whereGlue , $conditions );
-                if(!$imploded)
-                    return null;
-                $queryPart .= $imploded;
-            } elseif( !empty($whereColumn) ) {
-                $queryPart .= Db::buildWhereCondition( $whereColumn, $whereValue );
-            }
-
-            return $queryPart;
-        }
-
-		/**
-		 * Builds one single condition for a WHERE clause
-		 *
-		 * @param columnName the column name
-		 * @param columnValue the value for the column
-		 * @return A string as part of a WHERE clause
-		 */
-        function buildWhereCondition( $columnName, $columnValue )
-        {
-            $db =& Db::getDb();
-            return $db->buildWhereCondition( $columnName, $columnValue );
-        }
-
-		/**
-		 * @private
-		 */
-        function _buildOrderCondition( $orderColumn )
-        {
-            preg_match( '/^(.)(.*)$/', $orderColumn, $matches );
-
-            $queryPart = ' ORDER BY '; 
-            $firstValueCharacter = $matches[1]; 
-            switch( $firstValueCharacter ) {
-                case '-':
-                    $orderColumn = $matches[2];
-                    $direction = ' DESC';
-                case '+':
-                    $orderColumn = $matches[2];
-                default:
-                    $direction  = '';
-                    $queryPart .= $orderColumn . $direction;
-            }
-            return $queryPart;
-        }
-
-        /**
-         * Quote a value for a SQL query. Depending on the type of the
-         * value, this method will return the correct string to store
-         * the value in the database.
-         *
-         * - if the value is numeric, it will return the numeric value
-         * - if the value is a Timestamp(), it will return an isoDate
-         * - if the value is a string, it will return a quoted string
-         * - if the value starts with an '@', it will return the
-         *   unquoted value. this is used e.g. for adding something
-         *   like "date = date" in Articles()->deleteArticle().
-         *
-         * @param value a value to be stored in the database
-         * @return string the correctly quoted value
-         * @access public
-         */
-        function quoteValue( $value )
-        {
-            if( is_numeric($value) )
-                return $value;
-            if( preg_match('/^@(.*)/', $value, $matches) )
-                return $matches[1];
-            elseif( is_object($value) ) {
-                switch (get_class($value)) {
-                    case 'timestamp':
-                        return Db::quoteValue($value->getIsoDate());
-                        break;
-                }
-            }
-            else
-                return '\'' . Db::qstr( $value ) . '\'';
-        }
-
-		/**
 		 * Prepares a string for an SQL query by escaping apostrophe
 		 * characters. If the PHP configuration setting 'magic_quotes_gpc'
 		 * is set to ON, it will first strip the added slashes. Apostrophe

Modified: plog/trunk/class/database/pdb/drivers/pdbdriverbase.class.php
===================================================================
--- plog/trunk/class/database/pdb/drivers/pdbdriverbase.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/database/pdb/drivers/pdbdriverbase.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -23,6 +23,7 @@
 		var $nameQuote = '`';
 		var $_debug = false;
 		var $_connected = false;
+		var $_opts;
 	
 	    /**
 	     * Generates a new instance of the driver. Please use PDb::getDriver() instead
@@ -31,7 +32,7 @@
 	     */
 		function PDbDriverBase()
 		{
-			
+			$this->_opts = Array();
         }
 		
 		/** 
@@ -42,10 +43,21 @@
 		 */
 		function setDriverOpt( $key, $value )
 		{
-			// to be implemented by child classes	
+			$this->_opts[$key] = $value;
 		}
 		
 		/**
+		 * Set the driver options via an array. This method will completely replace any
+		 * options that have been set up until this moment via PDbDriverBase::setDriverOpt.
+		 *
+		 * @param opts An associative array containing driver-specific options
+		 */
+		function setDriverOpts( $opts )
+		{
+			$this->_opts = $opts;
+		}
+		
+		/**
 		 * Executes a query and returns a PDbResultSet as a result, or false if the query wasn't
 		 * successfully executed.
 		 *
@@ -187,86 +199,6 @@
 		{
 		    $this->_debug = $debug;
 		}
-
-        /**
-         * Start of DB dependent code, be sure to override these methods in
-         * your driver class, if the generic version are not good enough for
-         * your driver.
-         */ 
-        function buildSelectQuery( $tableName,
-                                   $fieldsToFetch,
-                                   $whereColumn,
-                                   $whereValue,
-                                   $orderColumn,
-                                   $limit,
-                                   $whereGlue )
-        {
-            $query = 'SELECT ';
-            if( $fieldsToFetch == array() ) {
-                $query .= '*';
-            } else {
-                $query .= implode(",", $fieldsToFetch);
-            }
-            $query .= ' FROM ' . $tableName;
-
-            if( $orderColumn != null ) {
-                $query .= Db::_buildOrderCondition( $orderColumn );
-            }
-
-            if( $whereColumn != null ) {
-                $query .= Db::buildWhereConditions( $whereColumn, $whereValue, $whereGlue );
-            }
-
-            if( $limit != null ) {
-                $query .= ' LIMIT ' . $limit;
-            }
-
-            // not needed!
-            //$query .= ';';
-
-            return $query;
-        }
-
-
-         
-        /**
-         * Generic method to build where conditions. Column values might start
-         * with a keyword, each db driver may overwrite this method to implement
-         * db specific where conditions.
-         * 
-         * Please allow the following keywords:
-         * ~ - Column Value is a search string, add wildcards at the start
-         *     and the end of the searchstring. Use 'LIKE' or equivalent.
-         * > - Implement a 'greater then' search.
-         * < - Implement a 'less then' search.
-         * = - Equal, 
-         */
-        function buildWhereCondition( $columnName, $columnValue )
-        {
-            preg_match( '/^(.)(.*)$/', $columnValue, $matches );
-            $firstValueCharacter = $matches[1];
-            switch( $firstValueCharacter ) {
-                case '~':
-                    $operator = 'LIKE';
-                    $columnValue = '%' . $matches[2] . '%';
-                case '>':
-                    $operator = '>';
-                    $columnValue = $matches[2];
-                    break;
-                case '<':
-                    $operator = '<';
-                    $columnValue = $matches[2];
-                    break;
-                case '=':
-                    $columnValue = $matches[2];
-                    // no break, we want to continue to the default
-                default:
-                    $operator = '=';
-                }
-            $queryPart  = $columnName . ' ' . $operator . ' ';
-            $queryPart .= Db::quoteValue( $columnValue );
-            return $queryPart;
-        }
         
         /**
          * for compatibility with ADOdb. Use Db::qstr() instead
@@ -473,5 +405,24 @@
 			global $__pdb_num_queries;
 			return( $__pdb_num_queries );
 		}
+		
+		/**
+		 * @return Returns the name of current character set, or 'default' if none has been explicitely selected
+		 */
+		function getDbCharacterSet()
+		{
+			return( 'default' );
+		}
+		
+		/**
+		 * Returns true if the current database supports FULLTEXT searches. This method needs to be
+		 * implemented by child classes.
+		 *
+		 * @return true if FULLTEXT is supported
+		 */
+		function isFullTextSupported()
+		{
+			return( false );
+		}
 	}
 ?>

Modified: plog/trunk/class/database/pdb/drivers/pdbmysqldriver.class.php
===================================================================
--- plog/trunk/class/database/pdb/drivers/pdbmysqldriver.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/database/pdb/drivers/pdbmysqldriver.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -12,6 +12,7 @@
 		
 		var $_res;
 		var $_dbname;
+		var $_charset;
 	
 	    /**
 	     * Constructor of the driver. Doesn't do much.
@@ -22,6 +23,9 @@
 			
 			// the driver name
 			$this->_type = 'mysql';	
+			
+			// character set, 'default' until one is explicitely set
+			$this->_charset = 'default';
 		}
 		
 		/**
@@ -76,8 +80,10 @@
 				return false;
 				
 			// set the right character encoding for mysql 4.1+ client, connection and collation
-			if( !empty( $dbcharset ) && $dbcharset != "default" )
+			if( !empty( $dbcharset ) && $dbcharset != "default" ) {
 	           	mysql_query( "SET NAMES ".$dbcharset, $this->_res );
+				$this->_charset = $dbcharset;
+			}
 				
 			// continue otherwise and try to select our db
 			if( $dbname )
@@ -99,8 +105,10 @@
 				return false;				
 				
 			// set the right character encoding for mysql 4.1+ client, connection and collation
-			if( !empty( $dbcharset ) && $dbcharset != "default" )
+			if( !empty( $dbcharset ) && $dbcharset != "default" ) {
 	           	mysql_query( "SET NAMES ".$dbcharset, $this->_res );
+				$this->_charset = $dbcharset;	
+			}
 
 			// continue otherwise and try to select our db
 			if( $dbname )
@@ -148,5 +156,32 @@
         {
             return( PDbDriverBase::getDriverDataDictionary( 'mysql' ));
         }
+
+		/**
+		 * Returns true if the current database supports FULLTEXT searches. This is currently 
+		 * configured in the database configuration file, config/config.properties.php:
+		 *
+		 * <pre>
+		 *  $config['db_options'] = Array( "enable_mysql_fulltext_search" => false );
+		 * </pre>
+		 *
+		 * @return true if FULLTEXT is supported
+		 */
+		function isFullTextSupported()
+		{			
+			isset( $this->_opts["enable_mysql_fulltext_search"] ) ? $enableFullText = $this->_opts["enable_mysql_fulltext_search"] : $enableFullText = false;
+			
+			return( $enableFullText );
+		}
+		
+		/**
+		 * Return the name of the character set currently being used
+		 *
+		 * @see PDbDriverBase::getDbCharacterSet()
+		 */
+		function getDbCharacterSet()
+		{
+			return( $this->_charset );
+		}
 	}
 ?>
\ No newline at end of file

Modified: plog/trunk/class/file/file.class.php
===================================================================
--- plog/trunk/class/file/file.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/file/file.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -240,17 +240,19 @@
 		  * @param onlyFiles If the recursive mode is enabled, setting this to 'true' will
 		  * force the method to only remove files but not folders. The directory will not be
 		  * removed but all the files included it in (and all subdirectories) will be.
+		  * @param excludedFiles If some files should not be removed (like .htaccess) they can be added
+		  * to this array. This operation is case sensitive!
 		  * @return True if successful or false otherwise
 		  * @static
 		  */
-		 function deleteDir( $dirName, $recursive = false, $onlyFiles = false )
+		 function deleteDir( $dirName, $recursive = false, $onlyFiles = false, $excludedFiles = array('') )
 		 {
 			// if the directory can't be read, then quit with an error
 			if( !File::isReadable( $dirName ) || !File::exists( $dirName )) {
 				return false;
 			}
 		 
-			// if it's not a file, let's get out of here and transfer flow
+			// if it's not a directory, let's get out of here and transfer flow
 			// to the right place...
 			if( !File::isDir( $dirName )) {
 				return File::delete( $dirName );
@@ -261,21 +263,29 @@
 			// will automatically ignore things like "." and ".." for us, 
 			// making it much easier!
 			$files = Glob::myGlob( $dirName, "*" );
-			foreach( $files as $file ) {
+			foreach( $files as $file ) 
+			{
 				if( File::isDir( $file )) {
 					// perform a recursive call if we were allowed to do so
-					if( $recursive ) 
+					if( $recursive ) {
 						File::deleteDir( $file, $recursive, $onlyFiles );
+					}
 				}
-				
-				// File::delete can remove empty folders as well as files
-				if( File::isReadable( $file ))
-					File::delete( $file );			}
+
+				// check if the filename is in the list of files we must not delete
+				if(array_search(basename( $file ), $excludedFiles) === false) {
+				    // File::delete can remove empty folders as well as files
+				    if( File::isReadable( $file )) {
+					    File::delete( $file );
+					}
+				}
+			}
 			
 			// finally, remove the top-level folder but only in case we
 			// are supposed to!
-			if( !$onlyFiles )
+			if( !$onlyFiles ) {
     			File::delete( $dirName );
+    		}
 			
 			return true;
 		 }

Modified: plog/trunk/class/gallery/dao/galleryalbums.class.php
===================================================================
--- plog/trunk/class/gallery/dao/galleryalbums.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/gallery/dao/galleryalbums.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -408,7 +408,15 @@
 		 */
 		function getSearchConditions( $searchTerms )
 		{
-			return( "name LIKE '%".Db::qstr( $searchTerms )."%' OR normalized_description LIKE '%".Db::qstr( $searchTerms )."%'" );
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {			
+				$query = "MATCH(normalized_name,normalized_description) AGAINST ('{$searchTerms}')";
+			}
+			else {
+				$query = "name LIKE '%".Db::qstr( $searchTerms )."%' OR normalized_description LIKE '%".Db::qstr( $searchTerms )."%'";
+			}
+			
+			return( $query );
 		}
 		
 		/**

Modified: plog/trunk/class/gallery/dao/galleryresources.class.php
===================================================================
--- plog/trunk/class/gallery/dao/galleryresources.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/gallery/dao/galleryresources.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -851,7 +851,20 @@
 		 */
 		function getSearchConditions( $searchTerms )
 		{
-			return( "file_name LIKE '%".Db::qstr( $searchTerms )."%' OR normalized_description LIKE '%".Db::qstr( $searchTerms )."%'" );
+			$query = "file_name LIKE '%".Db::qstr( $searchTerms )."%'";
+			
+			// search the text via the existing FULLTEXT index
+			$db =& Db::getDb();
+			if( $db->isFullTextSupported()) {			
+				$query .= " OR MATCH(normalized_description) AGAINST ('{$searchTerms}')";	
+			}
+			else {
+				$query .= " OR normalized_description LIKE '%".Db::qstr( $searchTerms )."%'";
+			}
+			
+			print($query);
+			
+			return( $query );
 		}
 		
         /**

Modified: plog/trunk/class/locale/locale.class.php
===================================================================
--- plog/trunk/class/locale/locale.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/locale/locale.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -283,20 +283,22 @@
 		/**
 		 * calls printf on the translated string.
 		 *
-		 * Crappy Crappy! Since it only accepts two arguments... ;) Well, if we
-		 * ever need more than two, I'll change it!
+		 * Crappy Crappy! Since it only accepts three arguments... ;) Well, if we
+		 * ever need more than three, I'll change it!
          * @private
 		 */
-		function pr( $id, $arg1 = null, $arg2 = null )
+		function pr( $id, $arg1 = null, $arg2 = null, $arg3 = null )
 		{
 			// first of all, we translate the string
 			$str = $this->tr( $id );
 			if( $arg1 == null )
 				$result = $str;
-			if( $arg2 == null )
+			else if( $arg2 == null )
 				$result = sprintf( $str, $arg1 );
+			else if( $arg3 == null )
+				$result = sprintf( $str, $arg1, $arg2 );
 			else
-				$result = sprintf( $str, $arg1, $arg2 );
+				$result = sprintf( $str, $arg1, $arg2, $arg3 );
 
 			return $result;
 		}

Modified: plog/trunk/class/net/http/session/sessionmanager.class.php
===================================================================
--- plog/trunk/class/net/http/session/sessionmanager.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/net/http/session/sessionmanager.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -37,6 +37,7 @@
 			
 				// this needs to be done before the session is started
 	            $sessionPath   = SessionManager::setSessionCookiePath();
+				//$sessionPath = "/";
 	            $sessionDomain = SessionManager::setSessionCookieDomain();
 			
 				session_cache_limiter( "" );
@@ -70,15 +71,19 @@
 		 * @return nothing
 		 */
 		function setSessionCookiePath()
-		{			
-			// get the right url for the script... somehow $_SERVER["REQUEST_URI"]
-			// is returning things like "http://83.102.183.10.in-addr.arpa/plog/test.php"
-			// in my case which are correct but probably not what we're expecting!
-			$scriptUrl = HttpVars::getBaseUrl();
+		{
+			// get the current base url and fetch it dynamically according to the values
+			// returned by Apache/PHP if not set yet in the config settings
+			$config =& Config::getConfig();
+			$scriptUrl = $config->getValue( "base_url" );
+			if( $scriptUrl == "" )
+				$scriptUrl = HttpVars::getBaseUrl();
+				
 			$url = new Url( $scriptUrl );
 			$path = dirname($url->getPath());
+
 			if( $path == "" || $path == "\\" ) 
-				$path = "/";
+				$path = "/";			
 		
 			return $path;
 		}
@@ -91,15 +96,21 @@
 		 */
 		function setSessionCookieDomain()
 		{
-			$scriptUrl = HttpVars::getBaseUrl();
+			// get the current base url and fetch it dynamically according to the values
+			// returned by Apache/PHP if not set yet in the config settings
+			$config =& Config::getConfig();
+			$scriptUrl = $config->getValue( "base_url" );
+			if( $scriptUrl == "" )
+				$scriptUrl = HttpVars::getBaseUrl();
+							
 			$url = new Url( $scriptUrl );
-			$domain = $url->getHost();
+			$domain = preg_replace("/^www\./", ".", $url->getHost());
 			
 			// this won't work for top level domains and domains such as
 			// 'localhost' or internal domains for obvious security reasons...
 			// See comments in http://fi.php.net/manual/en/function.session-set-cookie-params.php
 			if( count(explode('.', $domain)) > 1 ) {
-				return $domain;
+				return $domain;				
 			}
 		}
 		

Modified: plog/trunk/class/net/rawrequestgenerator.class.php
===================================================================
--- plog/trunk/class/net/rawrequestgenerator.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/net/rawrequestgenerator.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -427,7 +427,7 @@
 			else
 				$amp = "&";
 		
-			$url = $this->getIndexUrl()."?op=Default&";
+			$url = $this->getIndexUrl()."?op=Default{$amp}blogId=".$this->_blogInfo->getId()."{$amp}";
 			$params = "";
 			
 			if( $category )

Modified: plog/trunk/class/summary/action/doblogregistration.class.php
===================================================================
--- plog/trunk/class/summary/action/doblogregistration.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/summary/action/doblogregistration.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -3,13 +3,14 @@
 	lt_include( PLOG_CLASS_PATH."class/summary/action/registeraction.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
+    lt_include( PLOG_CLASS_PATH."class/data/validator/blognamevalidator.class.php" );
     lt_include( PLOG_CLASS_PATH."class/dao/articlecategories.class.php" );	 		
 	lt_include( PLOG_CLASS_PATH."class/summary/view/doblogregistrationview.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/summary/view/blogtemplatechooserview.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/locale/locales.class.php" );
     lt_include( PLOG_CLASS_PATH."class/data/validator/domainvalidator.class.php" );
 	lt_include( PLOG_CLASS_PATH."class/net/http/subdomains.class.php" );
-	include_once( PLOG_CLASS_PATH."class/config/config.class.php" );	
+	lt_include( PLOG_CLASS_PATH."class/config/config.class.php" );	
 
 	/**
 	 * registers a blog
@@ -23,7 +24,7 @@
 	    	
 	    	// data validation
 	    	//$this->registerFieldValidator( "userId", new IntegerValidator());
-	    	$this->registerFieldValidator( "blogName", new StringValidator());
+	    	$this->registerFieldValidator( "blogName", new BlogNameValidator());
 	    	$this->registerFieldValidator( "blogCategoryId", new IntegerValidator());
 	    	$this->registerFieldValidator( "blogLocale", new StringValidator());
 			$config =& Config::getConfig();

Modified: plog/trunk/class/summary/dao/summarystats.class.php
===================================================================
--- plog/trunk/class/summary/dao/summarystats.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/summary/dao/summarystats.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -179,15 +179,18 @@
 			lt_include( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
 		 
 			$prefix = $this->getPrefix();
-            $query = "SELECT COUNT(a.id) as t, SUM((num_reads / (TO_DAYS(NOW()) - TO_DAYS(a.date) + 1)) ) as rank, b.id AS blog_id
-                      FROM {$prefix}articles AS a
-                      INNER JOIN {$prefix}blogs AS b 
-                      ON b.id = a.blog_id AND b.status = ".BLOG_STATUS_ACTIVE."
-                      WHERE a.date >= ".$this->_startTime." AND a.date <= ".$this->_now." 
-					  AND in_summary_page = '1' 
-					  AND b.show_in_summary = '1'
-					  GROUP BY a.id
-                      ORDER BY rank DESC";
+			
+			$query = "SELECT SUM(((a.num_reads + a.num_comments/5) / (TO_DAYS(NOW()) - TO_DAYS(a.date) + 1)) )/COUNT(a.id) as rank,
+			           b.id AS blog_id
+			           FROM {$prefix}articles AS a
+			           INNER JOIN {$prefix}blogs AS b
+			           ON b.id = a.blog_id AND b.status =  ".BLOG_STATUS_ACTIVE."
+                       WHERE a.date >= ".$this->_startTime." 
+                       AND a.date <= ".$this->_now."
+					   AND a.in_summary_page = '1'
+			           AND b.show_in_summary = '1'
+			           GROUP BY b.id
+			           ORDER BY rank DESC";			
 
             if( $maxBlogs > 0 )
             	$query .= " LIMIT 0,".$maxBlogs;

Modified: plog/trunk/class/template/templatesets/templatefinder.class.php
===================================================================
--- plog/trunk/class/template/templatesets/templatefinder.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/template/templatesets/templatefinder.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -44,7 +44,7 @@
 			// regular expression that determines which files should be ignored. This should
 			// be updated every time we add a new folder to the templates/ folder that shoulnd't
 			// be considered an additional template!!
-			$ignoreRegexp = '/(rss|wizard|summary|misc|admin|blog_[0-9]*|^\..+)$/i';
+			$ignoreRegexp = '/(default|rss|wizard|summary|misc|admin|blog_[0-9]*|^\..+)$/i';
 			
 			// get base name from the current full path
 			$fileKey = basename( $fileName );
@@ -74,4 +74,4 @@
 			return( $this->getNew());
 		}
 	}
-?>
\ No newline at end of file
+?>

Copied: plog/trunk/class/test/tests/dao/userinfo_test.class.php (from rev 4709, plog/branches/lifetype-1.2/class/test/tests/dao/userinfo_test.class.php)
===================================================================
--- plog/trunk/class/test/tests/dao/userinfo_test.class.php	                        (rev 0)
+++ plog/trunk/class/test/tests/dao/userinfo_test.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,37 @@
+<?php
+
+	include_once( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
+	include_once( PLOG_CLASS_PATH."class/test/helpers/testtools.class.php" );	
+	include_once( PLOG_CLASS_PATH."class/dao/userinfo.class.php" );
+	include_once( PLOG_CLASS_PATH."class/dao/users.class.php" );	
+
+	class UserInfo_Test extends LifeTypeTestCase
+	{
+		/**
+		 * Test case for Mantis issue 1139 (http://bugs.lifetype.net/view.php?id=1139):
+		 * "confirmation code is invalid"
+		 *
+		 * This test case will make sure that empty values of UserInfo::_siteAdmin() will always be loaded
+		 * and mapped to '0' when saving to the database. It should also check that when 'false' is used
+		 * in addition to '0' for this attribute, the class behaves in exactly the same way
+		 */
+		function testConfirmationCodeIsInvalid()
+		{
+			// user1, let's not set the isSiteAdmin flag and check that we return a zero and a false
+			$user1 = new UserInfo( md5(rand()), "user1pwd", "user1 at test.com", "", "User One" );
+			$this->assertEquals( 0, $user1->isSiteAdmin(), "UserInfo::isSiteAdmin() did not return zero!" );
+			$this->assertFalse( $user1->isSiteAdmin(), "UserInfo::isSiteAdmin() did not return false!" );
+			
+			// save this user to the database and make sure that the flag was saved as expected
+			$users = new Users();
+			$users->addUser( $user1 );
+			// load the user
+			$newUser1 = $users->getUserInfoFromId( $user1->getId());
+			$this->assertEquals( 0, $newUser1->isSiteAdmin(), "UserInfo::isSiteAdmin() did not return zero after saving the user!" );
+			$this->assertFalse( $newUser1->isSiteAdmin(), "UserInfo::isSiteAdmin() did not return false after saving the user!" );		
+		
+			// delete the test data
+			TestTools::deleteDaoTestData( Array( $user1 ));
+		}
+	}
+?>
\ No newline at end of file

Copied: plog/trunk/class/test/tests/data/validator/blognamevalidator_test.class.php (from rev 4709, plog/branches/lifetype-1.2/class/test/tests/data/validator/blognamevalidator_test.class.php)
===================================================================
--- plog/trunk/class/test/tests/data/validator/blognamevalidator_test.class.php	                        (rev 0)
+++ plog/trunk/class/test/tests/data/validator/blognamevalidator_test.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,67 @@
+<?php
+
+	lt_include( PLOG_CLASS_PATH."class/test/helpers/lifetypetestcase.class.php" );
+	lt_include( PLOG_CLASS_PATH."class/data/validator/blognamevalidator.class.php" );
+
+	/**
+	 * \ingroup Test
+	 *
+	 * Test case for the BlogNameValidator class
+	 */
+	class BlogNameValidator_Test extends LifeTypeTestCase
+	{
+		function setUp()
+		{
+			// create a username validator
+			$this->b = new BlogNameValidator();
+		}
+		
+		/**
+		 * tests that an empty username does not validate
+		 */
+		function testEmptyBlogname()
+		{
+			$this->assertFalse( $this->b->validate( "" ), "An empty blogname did not generate an error!" );
+		}
+		
+		/**
+		 * tests that a forbidden username does not validate
+		 */
+		function testForbiddenBlognameRegexps()
+		{
+			// get the list of forbidden words, based on our configuration settings
+			lt_include( PLOG_CLASS_PATH."class/config/config.class.php" );
+			$config =& Config::getConfig();
+			
+			// blog names starting with 'a' and ending with 'b'
+			$forbiddenBlognames = $config->setValue( "forbidden_blognames", "^a.*" );
+			
+			$this->assertFalse( $this->b->validate( "a-this should not work" ), "A forbidden blogname should not be accepted as valid!" );
+			$this->assertTrue( $this->b->validate( "-this should work" ), "A valid blogname was not accepted as valid!" );
+		}
+		
+		/**
+		 * tests a valid username
+		 */
+		function testValidBlogname()
+		{
+			$this->assertTrue( $this->b->validate( "whatever" ), "A valid blogname was not accepted!" );
+		}
+		
+		/**
+		 * test a blog name that one domainized will return empty
+		 */
+		function testInvalidBlogName()
+		{
+			$this->assertFalse( $this->b->validate( "//::--", "The domainized() version of the blog name returned empty but the name was accepted as valid" ));
+		}
+		
+		/**
+		 * Test a blog name whose contents if pure HTML
+		 */
+		function testHTMLBlogNameOnly()
+		{
+			$this->assertFalse( $this->b->validate( "<h1></h1>", "A blog name containing HTML code only was accepted as valid" ));
+		}
+	}
+?>
\ No newline at end of file

Modified: plog/trunk/class/view/blogview.class.php
===================================================================
--- plog/trunk/class/view/blogview.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/view/blogview.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -19,6 +19,7 @@
 	{
 
         var $_pm;
+		var $_pageTitle;
 
 		/**
 		 * @see SmartyView
@@ -34,6 +35,9 @@
 			// set the character set in the request based on the blog locale
 			$locale = $this->_blogInfo->getLocale();
 			$this->setCharset( $locale->getCharset());			
+			
+			// set the initial page title
+			$this->_pageTitle = $blogInfo->getBlog();
         }
 
         /**
@@ -209,6 +213,29 @@
 		}		
 		
 		/**
+		 * This method must be implemented by child classes and it is meant
+		 * to return the title for the current page, to make it easier for template
+		 * designers to automatically provide meaningful page titles
+		 *
+		 * @return A string containing the appropriate page title
+		 */
+		function getPageTitle()
+		{
+			return( $this->_pageTitle );
+		}
+		
+		/**
+		 * This method sets the page title and can be called by action classes
+		 * instantiating this view to set a meaningful page title.
+		 *
+		 * @param title A string containing the appropriate page title
+		 */		
+		function setPageTitle( $title )
+		{
+			$this->_pageTitle = $title;
+		}
+		
+		/**
 		 * Sets some  in this case, we leave it all up to the child classes to reimplement
 		 * this and by default call View::render()
 		 *
@@ -236,6 +263,9 @@
 				$this->setValue( 'version', Version::getVersion());
 				$this->setValue( 'now', new Timestamp());
 				
+				// page title
+				$this->setValue( "pageTitle", $this->getPageTitle());
+				
 				// also, let's not forget about the plugins...
 				// put the plugins in the context
 				$plugins = $this->_pm->getPlugins();

Modified: plog/trunk/class/view/defaultview.class.php
===================================================================
--- plog/trunk/class/view/defaultview.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/view/defaultview.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -53,6 +53,26 @@
             $this->_params->setValue( 'posts', $modifPosts );
         }
 
+		/** 
+		 * Provides a meaningful page title. The format here will depend on whether we're browsing the main
+		 * blog page, or a page from the archives or a category page
+		 *
+		 * @return a page title
+		 */
+		function getPageTitle()
+		{
+			$title = $this->_blogInfo->getBlog(); 
+			if(($date = $this->getValue( "date" ))) {
+				$locale = $this->_blogInfo->getLocale();
+				$title .= " | ".$locale->formatDate( $date, "%B %Y" );
+			}
+			elseif(( $category = $this->getValue( "category" ))) {
+				$title .= " | ".$category->getName();
+			}
+			
+			return( $title );
+		}		
+
     	/**
 		 * This view shows a list of the posts for the blog.
          *

Modified: plog/trunk/class/view/errorview.class.php
===================================================================
--- plog/trunk/class/view/errorview.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/view/errorview.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -35,6 +35,15 @@
 			
 			return( parent::setErrorMessage( $message ));
 		}
+		
+		/**
+		 * Provides the page title
+		 */
+		function getPageTitle()
+		{
+			$locale = $this->_blogInfo->getLocale();
+			return( $this->_blogInfo->getBlog()." | ".$locale->tr("error"));
+		}		
 
         /** 
          * renders the error message

Modified: plog/trunk/class/view/viewarticleview.class.php
===================================================================
--- plog/trunk/class/view/viewarticleview.class.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/class/view/viewarticleview.class.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -36,6 +36,17 @@
 			return true;
 		}
 		
+		/** 
+		 * Provides a meaningful page title. The pre-defined format is "blog name | post title"
+		 *
+		 * @return a page title
+		 */
+		function getPageTitle()
+		{
+			$article = $this->getValue( "post" );
+			return( $this->_blogInfo->getBlog()." | ".$article->getTopic());
+		}		
+		
 		/**
 		 * renders this view
 		 *

Modified: plog/trunk/config/logging.properties.php
===================================================================
--- plog/trunk/config/logging.properties.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/config/logging.properties.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -4,10 +4,11 @@
 # too much logs for your tatest, set "appender" to "null". This will
 # be disabled once the final version is out anyway...
 #
+
 $config["default"] = Array( 
     "layout"   => "%d %N - [%f:%l (%c:%F)] %m%n", 
     "appender" => "file",
-	"file"     => "tmp/lifetype.log",
+	"file"     => PLOG_CLASS_PATH."tmp/lifetype.log",
     "prio"     => "debug"
   );
 
@@ -16,7 +17,7 @@
 $config["debug"] = Array( 
     "layout"   => "%t%n%d %N - [%f:%l (%c:%F)] %m%n", 
     "appender" => "null",
-	"file"     => "tmp/debug.log",
+	"file"     => PLOG_CLASS_PATH."tmp/debug.log",
     "prio"     => "info"  
   );
 #
@@ -27,7 +28,7 @@
 $config["sqlerr"] = Array( 
     "layout" => "%S%n %d %N - %m%n", 
     "appender" => "file",
-	"file" => "tmp/sql_error.log",
+	"file" => PLOG_CLASS_PATH."tmp/sql_error.log",
     "prio" => "error"
   );
   
@@ -38,7 +39,7 @@
 $config["trackback"] = Array(
     "layout" => "%d %N - [%f:%l (%c:%F)] %m%n", 
     "appender" => "null",
-	"file" => "tmp/trackback.log",
+	"file" => PLOG_CLASS_PATH."tmp/trackback.log",
     "prio" => "debug"
   );
   
@@ -59,8 +60,8 @@
 #
 $config["metricslog"] = Array(
     "layout" => "%m%n", 
-    "appender" => "null",
-	"file" => "tmp/metrics.log",
+    "appender" => "file",
+	"file" => PLOG_CLASS_PATH."tmp/metrics.log",
     "prio" => "debug"
   );  
 

Modified: plog/trunk/index.php
===================================================================
--- plog/trunk/index.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/index.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -51,5 +51,5 @@
     $controller->process( HttpVars::getRequest(), "op");	
 
     // log statistics, only for debugging purposes
-    //Info::logMetrics();
+    Info::logMetrics();
 ?>

Copied: plog/trunk/js/editor/lifetypeeditor.css (from rev 4709, plog/branches/lifetype-1.2/js/editor/lifetypeeditor.css)
===================================================================
--- plog/trunk/js/editor/lifetypeeditor.css	                        (rev 0)
+++ plog/trunk/js/editor/lifetypeeditor.css	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,61 @@
+.textEditorToolbar {
+  cursor: default;
+  background: ButtonFace;
+  padding: 1px 1px 1px 1px;
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+  width: 100%;
+  height: 20px;
+}
+
+.pressedButton {
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+  margin-left:2px;
+  margin-bottom: 2px;
+  color: ButtonText;  
+  padding: 0px;  
+  width: 18px;
+  height: 18px;
+}
+
+.normalButton {
+  border: 1px ButtonFace solid;
+  margin-left:3px;
+  margin-bottom: 3px;  		
+  color: ButtonText;  
+  padding: 0px;
+  width: 18px;
+  height: 18px;    
+}
+
+.buttonHover {
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+  margin-left:3px;
+  margin-bottom: 3px;  
+  padding: 0px;
+  width: 18px;
+  height: 18px;    
+}
+
+.separator {
+  margin-bottom: 3px;
+  margin-left: 3px;
+  margin-right: 3px;
+  margin-top: 0px;
+  border-left: 1px solid ButtonShadow;
+  border-right: 1px solid ButtonHighlight;
+  width: 0px;
+  height: 16px;
+  padding: 0px;
+  position:relative;
+  top: -9px;
+}
+
+.editorDropDownList {
+ position: relative;
+ top: -9px;
+ padding: 0px;
+ margin: 0px;
+}

Copied: plog/trunk/js/editor/lifetypeeditor.js (from rev 4709, plog/branches/lifetype-1.2/js/editor/lifetypeeditor.js)
===================================================================
--- plog/trunk/js/editor/lifetypeeditor.js	                        (rev 0)
+++ plog/trunk/js/editor/lifetypeeditor.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,824 @@
+/**
+ * LifetypeEditor.js
+ *
+ * Non-wysiwyg javascript-based editor for textarea controls in browsers. It works in
+ * exactly the same as HTMLArea control but instead of graphically showing the contents
+ * of the post, works based on raw html code. It does not offer as many features as
+ * htmlarea but it does offer some other things as customizable toolbars, support
+ * for text selections and ranges, etc. It should work in every major browser with
+ * some support for DOM and DHTML.
+ *
+ * This code is licensed under the terms of the GPL license.
+ *
+ * -- Installation and usage --
+ *
+ * Place this file somewhere in your web server tree and from your html files, call it like
+ * <html>
+ *  <head>
+ *   <link rel="stylesheet" href="plogeditor.css" type="text/css">
+ *   <script type="text/javascript" src="lifetypeeditor.js"></script>
+ *  </head>
+ *  <body>
+ *   <h1>Lifetype Javascript Sample</h1>
+ *   <form name="textEditor" id="textEditor">
+ *    text1:<br/>
+ *    <script type="text/javascript">ed1 = new Lifetype.UI.Editor('text1', 'ed1');</script>
+ *    <textarea id="text1" name="text1" rows="8" cols="60"></textarea>
+ *    <br/>text2:<br/>
+ *    <script type="text/javascript">ed2 = new Lifetype.UI.Editor('text2', 'ed2');</script>
+ *    <textarea id="text2" name="text1" rows="8" cols="60"></textarea>
+ *   </form>
+ *  </body>
+ * </html>
+ *
+ * Create a new pLogEditor object in the place where you would like to show the 
+ * toolbar of the editor. The first paramter for the constructor is the value of the 'id'
+ * attribute of the textarea that will be the content area for the toolbar. The second parameter
+ * is the name of the object itself, so if you are creating an editor called 'myEditor', the second
+ * parameter will be 'myEditor.
+ */
+ 
+/**
+ * main class
+ *
+ */
+Lifetype.UI.Editor = function(txtId, objName) 
+{
+
+  // class attributes	
+  this.txtId = txtId;
+  this.objName = objName;
+  
+  // array with all the open tags that haven't been closed
+  this.tagStack = new Array();
+  
+  this.debug = false;
+
+  this.setToolbar = function()
+  {
+	  // --
+	  // our very own toolbar
+	  // --
+	  this.toolBar = new Array();
+	  options = new Array();
+	  options['8'] = '8 pt';
+	  options['10'] = '10 pt';
+	  options['12'] = '12 pt';
+	  options['14'] = '14 pt';
+	  options['18'] = '18 pt';
+	  options['24'] = '24 pt';  
+	  options['36'] = '36 pt';
+	  this.toolBar['list_font_size'] = new Lifetype.UI.Editor.List.FontSize( 'list_font_size', options );
+	  this.toolBar['1_but_b']  = new Lifetype.UI.Editor.Button( '1_but_b', 'bold', '<strong>', '</strong>', 'ed_format_bold.gif', 1 );
+	  this.toolBar['2_but_i']  = new Lifetype.UI.Editor.Button( '2_but_i', 'italics', '<em>', '</em>', 'ed_format_italic.gif', 1 );
+	  this.toolBar['3_but_u']  = new Lifetype.UI.Editor.Button( '3_but_u', 'underline', '<span style="text-decoration:underline">', '</span>', 'ed_format_underline.gif', 1 );
+	  this.toolBar['4_but_strikethrough'] = new Lifetype.UI.Editor.Button( '4_but_strikethrough', 'strikethrough', '<span style="text-decoration: line-through;">', '</span>', 'ed_format_strike.gif', 1 );
+	  this.toolBar['but_sep1'] =  new Lifetype.UI.Editor.Button.Separator();
+	  this.toolBar['but_align_left'] = new Lifetype.UI.Editor.Button( 'but_align_left', 'align left', '<div style="text-align: left;">', '</div>', 'ed_align_left.gif' );
+	  this.toolBar['but_align_center'] = new Lifetype.UI.Editor.Button( 'but_align_center', 'align center', '<div style="text-align: center;">', '</div>', 'ed_align_center.gif' );
+	  this.toolBar['but_align_right'] = new Lifetype.UI.Editor.Button( 'but_align_right', 'align right', '<div style="text-align: right;">', '</div>', 'ed_align_right.gif' );
+	  this.toolBar['but_align_justify'] = new Lifetype.UI.Editor.Button( 'but_align_justify', 'align justify', '<div style="text-align: justify;">', '</div>', 'ed_align_justify.gif' );
+	  this.toolBar['but_sep2'] =  new Lifetype.UI.Editor.Button.Separator();
+	  this.toolBar['but_ordered_list'] = new Lifetype.UI.Editor.Button( 'but_ordered_list', 'ordered list', '<ol><li></li></ol>', '', 'ed_list_num.gif', -1 );
+	  this.toolBar['but_unordered_list'] = new Lifetype.UI.Editor.Button( 'but_unordered_list', 'unordered list', '<ul><li></li></ul>', '', 'ed_list_bullet.gif', -1 );  
+	  this.toolBar['5_but_a']  = new Lifetype.UI.Editor.Button.Link( '5_but_a', 'anchor', 'ed_link.gif' );
+	  this.toolBar['6_but_img']= new Lifetype.UI.Editor.Button.Image( '6_but_img', 'image', 'ed_image.gif' );
+	  this.toolBar['7_but_res']= new Lifetype.UI.Editor.Button.Resource ('7_but_res', 'resource', 'ed_resource.gif' );
+	  this.toolBar['8_but_more']= new Lifetype.UI.Editor.Button.More ('8_but_more', 'more', 'ed_more.gif' );  
+  }
+  
+  /**
+   * returns whether our browser supports the features that we are going
+   * to use or not
+   *
+   * @return true if supported, false if not
+   */
+  this.isSupportedBrowser = function()
+  {
+	 return( document.getElementById || document.all );
+  }
+
+  /**
+   * draws the buttons. Takes no parameters
+   *
+   * @return nothing
+   */
+  this.init = function() 
+  {
+	  // generate the toolbar
+	  this.setToolbar();
+	
+	  // load the editor stylesheet dynamically
+	  link = document.createElement( "link" );
+	  link.rel  = "stylesheet";
+	  link.type = "text/css";
+	  link.href = Lifetype.getBaseURL() + "/js/editor/lifetypeeditor.css";
+	  head = document.getElementsByTagName('head').item( 0 );
+	  head.appendChild( link );
+	  
+	  // first of all, check for unsupported browsers. If the browser
+	  // is not supported, we will silently not do anything... since we won't
+	  // even print the toolbar! (and nothing will happen without a toolbar)
+	  if( !this.isSupportedBrowser())
+	  	return;
+		
+	  markup = '';
+	  
+	  document.write('<div class="textEditorToolbar" id="textEditorToolbar">');
+	  for( var buttonId in this.toolBar ) {
+          if ( Lifetype.prototypeCompatibabilityCheck( buttonId ) )
+	          continue;
+	      button = this.toolBar[buttonId];
+	      markup += button.show(this.txtId, this.objName);
+	  }
+	  document.write(markup);
+	  document.write('</div>');
+	  
+	  if( this.debug ) {
+		document.write('<textarea>'+markup+'</textarea>');
+	  }
+  }
+  
+  // after initializing the buttons, we can generate the toolbar
+  // we can't call this method after defining it!! :)
+  this.init();    
+  
+  /**
+   * calls the edButton.execute() callback
+   *
+   * @param txtId
+   * @param buttonId
+   * @return nothing
+   */
+  this.execute = function( txtId, buttonId, param )
+  {
+	  // get the button from the array
+	  var edButton = this.toolBar[buttonId];
+	  
+	  // execute the button
+	  if( !this.selectionExists()) {
+	  	result = edButton.execute( txtId, param );
+		if( result != 'undefined' )
+			this.insertText( result );
+  	  }
+  	  else {
+	  	 surroundInfo = edButton.surround( txtId, param ); 
+	     this.surroundText( surroundInfo['start'], surroundInfo['end'] );	  
+      }
+  }
+  
+  /**
+   * returns the textarea object associated to this editor
+   *
+   * @return a textarea object
+   */
+  this.getTextArea = function()
+  {
+	  textArea = document.getElementById( this.txtId );
+	  return textArea;
+  }
+  
+  /** 
+   * calls the onMouseOver handler for this button
+   *
+   * @param txtId
+   * @param buttonId
+   */
+  this.mouseOver = function( txtId, buttonId )
+  {
+	  var edButton = this.toolBar[buttonId];
+	  edButton.mouseOver();
+  }
+  
+  /**
+   * calls the onMouseOut handler for this button
+   *
+   * @param txtId
+   * @param buttonId
+   */
+  this.mouseOut = function( txtId, buttonId )
+  {
+	  var edButton = this.toolBar[buttonId];
+	  edButton.mouseOut();	  
+  }
+  
+	/**
+ 	 * inserts text where the cursor is
+ 	 * 
+ 	 * @param myField
+ 	 * @param myValue
+ 	 * @return nothing
+ 	 */
+	this.insertText = function(myValue) 
+	{
+		myField = this.getTextArea();
+		
+		//IE support
+		if (document.selection) {
+			myField.focus();
+			sel = document.selection.createRange();
+			sel.text = myValue;
+			myField.focus();
+		}
+		//MOZILLA/NETSCAPE support
+		else if (myField.selectionStart || myField.selectionStart == '0') {
+			var startPos = myField.selectionStart;
+			var endPos = myField.selectionEnd;
+			myField.value = myField.value.substring(0, startPos)
+		    	          + myValue 
+                	      + myField.value.substring(endPos, myField.value.length);
+			myField.focus();
+			myField.selectionStart = startPos + myValue.length;
+			myField.selectionEnd = startPos + myValue.length;
+		} else {
+			myField.value += myValue;
+			myField.focus();
+		}
+	}  
+	
+	/**
+	 * surrounds the current selection with the given opening and closing texts
+	 *
+	 * @param myValueOpen
+	 * @param myValueClose
+	 */
+	this.surroundText = function( myValueOpen, myValueClose )
+  	{
+		myField = this.getTextArea();
+		if (document.selection) {
+			myField.focus();
+			sel = document.selection.createRange();
+			sel.text = myValueOpen + sel.text + myValueClose;
+			myField.focus();
+		}
+		else if (myField.selectionStart || myField.selectionStart == '0') {
+			var startPos = myField.selectionStart;
+			var endPos = myField.selectionEnd;
+			var cursorPos = endPos;		
+			myField.value = myField.value.substring(0, startPos)
+		              + myValueOpen
+		              + myField.value.substring(startPos, endPos)
+		              + myValueClose
+                      + myField.value.substring(endPos, myField.value.length);
+			cursorPos += myValueOpen.length + myValueClose.length;		
+			myField.selectionStart = cursorPos;
+			myField.selectionEnd = cursorPos;
+			myField.focus();		
+		} 
+		else {
+			myField.value += myValueOpen;
+			myField.focus();
+		}	  
+  	}
+  
+  /**
+   * returns whether there is a user selection in the given editor
+   *
+   * @return True if there is a selection or false otherwise
+   */
+  this.selectionExists = function()
+  {
+	var selection = false;
+	var myField = this.getTextArea();
+	  
+	if (document.selection) {
+		// for IE
+		myField.focus();
+		sel = document.selection.createRange();
+		selection = (sel.text != '' );
+		myField.focus();
+	}
+	else if (myField.selectionStart || myField.selectionStart == '0') {
+		// for Mozilla
+		selection = (myField.selectionEnd > myField.selectionStart)
+	}
+	else {
+		// for everybody else...
+		selection = false;
+	}
+
+	return selection;
+  }
+}
+
+/**
+ * represents a button from our toolbar
+ *
+ * @param id
+ * @param display
+ * @param tagStart
+ * @param tagEnd
+ * @param icon
+ * @param open
+ */
+Lifetype.UI.Editor.Button = function(id, display, tagStart, tagEnd, icon, open) 
+{
+	this.id = id;				// used to name the toolbar button
+	this.display = display;		// label on button
+	this.tagStart = tagStart; 	// open tag
+	this.tagEnd = tagEnd;		// close tag
+	this.open = open;			// set to -1 if tag does not need to be closed
+	this.isOpen = false;
+	this.icon = icon;
+	this.htmlId = '';
+	this.currentStatus = 'normalButton';
+	
+	/**
+	 * renders the button
+	 *
+	 * @param txtId
+	 * @return nothing
+	 */
+	this.show = function(txtId, objName)
+	{
+		// a very simple document.write...
+		this.htmlId = txtId + '_' + this.id;
+		var buttonText = '<img src="' + Lifetype.getBaseURL() + "/js/editor/images"+'/'+this.icon+'" id="' + txtId + '_' + this.id + '" class="normalButton" onmouseout="'+objName+'.mouseOut(\'' + txtId + '\', \'' + this.id + '\');" onmouseover="'+objName+'.mouseOver(\'' + txtId + '\', \'' + this.id + '\');" onclick="'+objName+'.execute(\'' + txtId + '\', \'' + this.id + '\', null );" alt = "' + this.display + '" />';
+		
+		return(buttonText);
+	}
+		
+	/**
+	 * returns the html element to which this button is associated
+	 *
+	 * @return an html element
+	 */
+	this.getHtmlButton = function()
+	{
+		return document.getElementById( this.htmlId );	
+	}
+	
+	/**
+	 * whether this button needs to be closed or not
+	 *
+	 * @return True whether it needs to be closed or false otherwise
+	 */
+	this.needsClose = function()
+	{
+		return( this.open != -1 );
+	}
+	
+	/**
+	 * handler for the onMouseOver event, changes the colour of the borders
+	 */
+	this.mouseOver = function()
+	{
+		htmlButton = this.getHtmlButton();
+		htmlButton.className = 'buttonHover';
+	}
+	
+	/** 
+	 * handler for the onMouseOut event, returns the button to its original state
+	 */
+	this.mouseOut = function()
+	{
+		htmlButton = htmlButton = this.getHtmlButton();		
+		htmlButton.className = this.currentStatus;
+	}
+	
+	/**
+	 * checks/unchecks the button
+	 */
+	this.toggle = function()
+	{
+		htmlButton = this.getHtmlButton();
+
+	 	// change its class and save it for later use...
+	 	if( this.currentStatus == 'pressedButton' )
+	 		this.currentStatus = 'normalButton';
+	 	else
+	 		this.currentStatus = 'pressedButton';
+	 		
+	 	htmlButton.className = this.currentStatus;
+	}
+	
+	/**
+	 * performs the button's action
+	 *
+	 * @param txtId
+	 * @return nothing
+	 */
+	this.execute = function( txtId, param )
+	{
+		var text = '';
+		
+		// check if the tag needs a closing tag
+		if( this.open == -1 ) {
+			// it doesnt...
+			text = this.tagStart;
+		}
+		else {
+			// it does...
+			if( this.isOpen )
+				text = this.tagEnd;
+			else
+				text = this.tagStart;
+			
+			// change the status of the button
+			this.isOpen = !this.isOpen;			
+		}
+		
+		// change the look of the button
+		if( this.open != -1 ) {
+		    this.toggle();
+		}
+
+		// return the text to be added
+		return text;
+	}
+
+	/**
+	 * special callback function that is executed when the main editor would like to 
+	 * surround the current selection in the browser
+	 *
+	 * @param txtId the textarea id
+	 */	
+	this.surround = function( txtId, param )
+	{
+		surroundInfo = Array()
+		surroundInfo['start'] = this.tagStart;
+		surroundInfo['end'] = this.tagEnd;
+		
+		return surroundInfo;
+	}
+	
+	this.toString = function()
+	{
+		objSignature = this.id + ' Button';
+		return( objSignature );
+	}
+}
+
+/**
+ * visual separators for the toolbar are also implemented as buttons, but they do
+ * do nothing and only show a vertical bar anyway with some margin on both sides...
+ */ 
+Lifetype.UI.Editor.Button.Separator = function()
+{
+	this.prototype = new Lifetype.UI.Editor.Button('separator', '', '', '', '', -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.superclass('separator', '', '', '', '', -1 );
+	
+	/**
+	 * draws a vertical line
+	 */
+	this.show = function( txtId, objName )
+	{
+		separatorCode = '<span class="separator"></span>';
+		
+		return( separatorCode );
+	}
+}
+
+/**
+ * special button that only adds a link
+ *
+ * @param id
+ * @param display
+ * @param icon
+ */
+Lifetype.UI.Editor.Button.Link = function(id, display, icon) 
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.Button(id, display, '', '', icon, -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.superclass(id, display, '', '', icon, -1 );
+
+	/**
+	 * function redefined from above so that users can type links
+	 *
+	 * @param txtId
+	 */
+	this.execute = function( txtId, param )
+	{		
+		this.toggle();
+		
+		linkText = prompt('Enter the link text: ');
+		if( linkText == null ) {
+			this.toggle();
+			return '';
+		}
+		
+		linkDest = prompt('Enter the destination for the link:');
+		if( linkDest == null ) {
+			this.toggle();
+			return '';
+		}
+
+		this.toggle();		
+
+		// if everything went fine, add the link and return
+		var linkTag = '<a href="' + linkDest + '">' + linkText + '</a>'; 
+		return linkTag;
+	}
+	
+	/**
+	 * special behaviour for this function... It will only ask for the link destination
+	 * and surround the current selection with the user's input
+	 *
+	 * @param txtId
+	 */
+	this.surround = function( txtId, param )
+	{
+		surroundInfo = Array();
+		surroundInfo['start'] = '';
+		surroundInfo['end'] = '';		
+		
+		this.toggle();
+		linkDest = prompt('Enter the destination for the link:');
+		if( linkDest == null ) {
+			this.toggle();
+			return surroundInfo;
+		}
+		
+		surroundInfo['start'] = '<a href="' + linkDest + '">';
+		surroundInfo['end'] = '</a>';
+		
+		this.toggle();
+		
+		return surroundInfo;
+	}
+}
+
+/**
+ * special button that only adds a link
+ *
+ * @param id
+ * @param display
+ * @param icon
+ */
+Lifetype.UI.Editor.Button.BR = function(id, display, icon) 
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.Button(id, display, '', '', icon, -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.superclass(id, display, '<br />', '', icon, -1 );
+
+	/**
+	 * special behaviour for this function... It will only ask for the link destination
+	 * and surround the current selection with the user's input
+	 *
+	 * @param txtId
+	 */
+	this.surround = function( txtId, param )
+	{
+		surroundInfo = Array();
+		surroundInfo['start'] = '<p>';
+		surroundInfo['end'] = '</p>';
+		this.toggle();
+		
+		return surroundInfo;
+	}
+}
+
+/**
+ * special button that adds/removes the "[@more@]" separator
+ *
+ * @param id
+ * @param display
+ * @param icon
+ */
+Lifetype.UI.Editor.Button.More = function(id, display, icon) 
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.Button(id, display, '', '', icon, -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.superclass(id, display, '', '', icon, -1 );
+	
+	/**
+	 * @private
+	 */
+	this._getMoreTag = function()
+	{
+		return( "[@more@]" );
+	}
+	
+	this.execute = function( txtId, param ) 
+	{
+		var txtArea = document.getElementById( txtId );
+		var content = txtArea.value;
+	    var bFound = 0;
+		var startPos = 0;
+		var returnValue = '';
+	    
+		// Parse all img tags and remove any 'more' tags
+		while((startPos = content.indexOf(this._getMoreTag(), startPos)) != -1) {
+	       var contentAfter = content.substring(startPos + this._getMoreTag().length);
+	       content = content.substring(0, startPos) + contentAfter;
+	       startPos++;
+	       bFound = 1;
+		}
+		
+	    if(bFound ) {
+			// the tag is already there and should be removed, we can use a regular expression
+			// to easily remove it
+			returnValue = '';
+			txtArea.value = content;
+	     }
+	     else {
+			// the tag is not there and can be safely added
+			returnValue = '\n' + this._getMoreTag() + '\n'; 
+	    }
+	
+		return( returnValue );
+	}
+}
+
+/**
+ * special button that only adds an image
+ *
+ * @param id
+ * @param display
+ * @param icon
+ */
+Lifetype.UI.Editor.Button.Image = function(id, display, icon) 
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.Button(id, display, '', '', icon, -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.superclass(id, display, '', '', icon, -1 );
+
+	/**
+	 * reimplemented from edButton so that we can ask for an image url and a description
+	 *
+	 * @param txtId
+	 */
+	this.execute = function( txtId, param )
+	{
+		textArea = document.getElementById(txtId);
+		
+		this.toggle();
+		
+		imgSrc = prompt('Enter the image source: ');
+		if( imgSrc == null ) {
+			this.toggle();
+			return '';
+		}
+		
+		imgAlt = prompt('Enter an image description:');
+		if( imgAlt == null ) {
+			this.toggle();
+			return '';
+		}
+		
+		this.toggle();
+
+		// if everything went fine, add the link and return
+		var imgTag = '<img src="' + imgSrc + '" alt="' + imgAlt + '" />';
+		return imgTag;
+	}
+}
+
+/**
+ * special button that only adds an resource
+ *
+ * @param id
+ * @param display
+ * @param icon
+ */
+Lifetype.UI.Editor.Button.Resource = function(id, display, icon)
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.Button(id, display, '', '', icon, -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.superclass(id, display, '', '', icon, -1 );
+
+	/**
+	 * reimplemented from edButton so that we can ask for an image url and a description
+	 *
+	 * @param txtId
+	 */
+	this.execute = function( txtId, param )
+	{
+		if ( txtId == 'postText' )
+			resource_list_window(1);
+		else
+		    resource_list_window(2);
+		return '';
+	}
+}
+
+/**
+ * implements drop-down lists
+ */
+Lifetype.UI.Editor.List = function( id, options )
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.Button(id, '', '', '', '', -1 );
+	this.prototype.constructor = Lifetype.UI.Editor.Button;
+	this.superclass = Lifetype.UI.Editor.Button;
+	
+	this.options = options;
+	
+	this.superclass(id, '', '', '', '', -1 );
+	
+	/**
+	 * renders the button. In our case, creates a drop-down list with the available options
+	 *
+	 * @param txtId
+	 * @returns the markup that is going to be written to the document
+	 */
+	this.show = function(txtId, objName)
+	{
+		selectBox = '<select class="editorDropDownList" name=\''+this.id+'\' onChange="'+objName+'.execute(\'' + txtId + '\', \'' + this.id + '\', this);">';
+		for( var key in this.options ) {
+            if ( Lifetype.prototypeCompatibabilityCheck( key ) )
+	            continue;			
+			selectBox += '<option value=\''+key+'\'>'+this.options[key]+'</option>';
+		}
+		selectBox += '</select>';
+		
+		return( selectBox );
+	}
+	
+	/**
+	 * reimplement this method for lists that should behave in a particular way when an option
+	 * is selected
+	 */
+	this.execute = function( txtId, param )
+	{
+		// param is the drop-down list that generated the event, so we can easily learn
+		// more about what was selected by 
+		opt = param.selectedIndex;
+	
+		return( param.options[opt].value );
+	}
+	
+	/**
+	 * does nothing
+	 */
+	this.surround = function( txtId, param )
+	{
+		surroundInfo = Array();
+		return( surroundInfo );
+	}
+
+}
+
+/**
+ * button that shows a list with different font sizes
+ */
+Lifetype.UI.Editor.List.FontSize = function( id, options )
+{
+	//
+	// strange javascript thingies used for object inheritance...
+	//
+	this.prototype = new Lifetype.UI.Editor.List(id, options );
+	this.prototype.constructor = Lifetype.UI.Editor.List;
+	this.superclass = Lifetype.UI.Editor.List;
+	
+	this.superclass(id, options );
+	
+	/**
+	 * returns the right <span style=...></span> markup
+	 */
+	this.execute = function( txtId, param )
+	{
+		// param is the drop-down list that generated the event, so we can easily learn
+		// more about what was selected in the dropdown list
+		opt = param.selectedIndex;
+		fontSizePt = param.options[opt].value;
+		
+		spanCode = '<span style="font-size: '+fontSizePt+'pt;"></span>';
+	
+		return( spanCode );
+	}
+	
+	/**
+	 * surrouns the selected text with the right <span>...</span> tags
+	 */
+	this.surround = function( txtId, param )
+	{
+		opt = param.selectedIndex;
+		fontSizePt = param.options[opt].value;	
+	
+		surroundInfo = Array();
+		surroundInfo['start'] = '<span style="font-size: '+fontSizePt+'pt;">';
+		surroundInfo['end'] = '</span>';
+		return( surroundInfo );
+	}
+}
\ No newline at end of file

Deleted: plog/trunk/js/editor/plogeditor.css
===================================================================
--- plog/trunk/js/editor/plogeditor.css	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/editor/plogeditor.css	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,61 +0,0 @@
-.textEditorToolbar {
-  cursor: default;
-  background: ButtonFace;
-  padding: 1px 1px 1px 1px;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-  width: 100%;
-  height: 20px;
-}
-
-.pressedButton {
-  border: 1px solid;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-  margin-left:2px;
-  margin-bottom: 2px;
-  color: ButtonText;  
-  padding: 0px;  
-  width: 18px;
-  height: 18px;
-}
-
-.normalButton {
-  border: 1px ButtonFace solid;
-  margin-left:3px;
-  margin-bottom: 3px;  		
-  color: ButtonText;  
-  padding: 0px;
-  width: 18px;
-  height: 18px;    
-}
-
-.buttonHover {
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-  margin-left:3px;
-  margin-bottom: 3px;  
-  padding: 0px;
-  width: 18px;
-  height: 18px;    
-}
-
-.separator {
-  margin-bottom: 3px;
-  margin-left: 3px;
-  margin-right: 3px;
-  margin-top: 0px;
-  border-left: 1px solid ButtonShadow;
-  border-right: 1px solid ButtonHighlight;
-  width: 0px;
-  height: 16px;
-  padding: 0px;
-  position:relative;
-  top: -9px;
-}
-
-.editorDropDownList {
- position: relative;
- top: -9px;
- padding: 0px;
- margin: 0px;
-}

Deleted: plog/trunk/js/editor/plogeditor.js
===================================================================
--- plog/trunk/js/editor/plogeditor.js	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/editor/plogeditor.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,872 +0,0 @@
-/**
- * pLogEditor.js
- *
- * Non-wysiwyg javascript-based editor for textarea controls in browsers. It works in
- * exactly the same as HTMLArea control but instead of graphically showing the contents
- * of the post, works based on raw html code. It does not offer as many features as
- * htmlarea but it does offer some other things as customizable toolbars, support
- * for text selections and ranges, etc. It should work in every major browser with
- * some support for DOM and DHTML.
- * It is very loosely based on Alex King's js_quicktags.js which is also used in Wordpress.
- * However, js_quicktags has the limitation that it can only work with one textarea per page
- * and plog for example needs two in the "new post" page. The code is javascript with OOP
- * so it might look a bit weird at first...
- * This code is licensed under the terms of the GPL license.
- *
- * -- Installation and usage --
- *
- * Place this file somewhere in your web server tree and from your html files, call it like
- * <html>
- *  <head>
- *   <link rel="stylesheet" href="plogeditor.css" type="text/css">
- *   <script type="text/javascript" src="plogeditor.js"></script>
- *   <script type="text/javascript">
- *    // define where your images are...
- *    var baseImageFolder='/js/editor/images';
- *   </script>
- *  </head>
- *  <body>
- *   <h1>pLogEditor Javascript Sample</h1>
- *   <form name="textEditor" id="textEditor">
- *    text1:<br/>
- *    <script type="text/javascript">ed1 = new pLogEditor('text1', 'ed1');</script>
- *    <textarea id="text1" name="text1" rows="8" cols="60"></textarea>
- *    <br/>text2:<br/>
- *    <script type="text/javascript">ed2 = new pLogEditor('text2', 'ed2');</script>
- *    <textarea id="text2" name="text1" rows="8" cols="60"></textarea>
- *   </form>
- *  </body>
- * </html>
- *
- * Create a new pLogEditor object in the place where you would like to show the 
- * toolbar of the editor. The first paramter for the constructor is the value of the 'id'
- * attribute of the textarea that will be the content area for the toolbar. The second parameter
- * is the name of the object itself, so if you are creating an editor called 'myEditor', the second
- * parameter will be 'myEditor'
- *
- * Please set the value of baseImageFolder to the base path where your icons are stored.
- */
- 
- 
-/**
- * please change this if your icons are somewhere else!
- */
-var baseImageFolder = 'js/editor/images/';
-
-/**
- * represents a button from our toolbar
- *
- * @param id
- * @param display
- * @param tagStart
- * @param tagEnd
- * @param icon
- * @param open
- */
-edButton = function(id, display, tagStart, tagEnd, icon, open) 
-{
-	this.id = id;				// used to name the toolbar button
-	this.display = display;		// label on button
-	this.tagStart = tagStart; 	// open tag
-	this.tagEnd = tagEnd;		// close tag
-	this.open = open;			// set to -1 if tag does not need to be closed
-	this.isOpen = false;
-	this.icon = icon;
-	this.htmlId = '';
-	this.currentStatus = 'normalButton';
-	
-	/**
-	 * renders the button
-	 *
-	 * @param txtId
-	 * @return nothing
-	 */
-	this.show = function(txtId, objName)
-	{
-		// a very simple document.write...
-		this.htmlId = txtId + '_' + this.id;
-		var buttonText = '<img src="'+baseImageFolder+'/'+this.icon+'" id="' + txtId + '_' + this.id + '" class="normalButton" onmouseout="'+objName+'.mouseOut(\'' + txtId + '\', \'' + this.id + '\');" onmouseover="'+objName+'.mouseOver(\'' + txtId + '\', \'' + this.id + '\');" onclick="'+objName+'.execute(\'' + txtId + '\', \'' + this.id + '\', null );" alt = "' + this.display + '" />';
-		
-		return(buttonText);
-	}
-	
-	/**
-	 * returns the html element to which this button is associated
-	 *
-	 * @return an html element
-	 */
-	this.getHtmlButton = function()
-	{
-		return document.getElementById( this.htmlId );	
-	}
-	
-	/**
-	 * whether this button needs to be closed or not
-	 *
-	 * @return True whether it needs to be closed or false otherwise
-	 */
-	this.needsClose = function()
-	{
-		return( this.open != -1 );
-	}
-	
-	/**
-	 * handler for the onMouseOver event, changes the colour of the borders
-	 */
-	this.mouseOver = function()
-	{
-		htmlButton = this.getHtmlButton();
-		htmlButton.className = 'buttonHover';
-	}
-	
-	/** 
-	 * handler for the onMouseOut event, returns the button to its original state
-	 */
-	this.mouseOut = function()
-	{
-		htmlButton = htmlButton = this.getHtmlButton();		
-		htmlButton.className = this.currentStatus;
-	}
-	
-	/**
-	 * checks/unchecks the button
-	 */
-	this.toggle = function()
-	{
-		htmlButton = this.getHtmlButton();
-
-	 	// change its class and save it for later use...
-	 	if( this.currentStatus == 'pressedButton' )
-	 		this.currentStatus = 'normalButton';
-	 	else
-	 		this.currentStatus = 'pressedButton';
-	 		
-	 	htmlButton.className = this.currentStatus;
-	}
-	
-	/**
-	 * performs the button's action
-	 *
-	 * @param txtId
-	 * @return nothing
-	 */
-	this.execute = function( txtId, param )
-	{
-		var text = '';
-		
-		// check if the tag needs a closing tag
-		if( this.open == -1 ) {
-			// it doesnt...
-			text = this.tagStart;
-		}
-		else {
-			// it does...
-			if( this.isOpen )
-				text = this.tagEnd;
-			else
-				text = this.tagStart;
-			
-			// change the status of the button
-			this.isOpen = !this.isOpen;			
-		}
-		
-		// change the look of the button
-		if( this.open != -1 ) {
-		    this.toggle();
-		}
-
-		// return the text to be added
-		return text;
-	}
-
-	/**
-	 * special callback function that is executed when the main editor would like to 
-	 * surround the current selection in the browser
-	 *
-	 * @param txtId the textarea id
-	 */	
-	this.surround = function( txtId, param )
-	{
-		surroundInfo = Array()
-		surroundInfo['start'] = this.tagStart;
-		surroundInfo['end'] = this.tagEnd;
-		
-		return surroundInfo;
-	}
-	
-	this.toString = function()
-	{
-		objSignature = this.id + ' Button';
-		return( objSignature );
-	}
-}
-
-/**
- * visual separators for the toolbar are also implemented as buttons, but they do
- * do nothing and only show a vertical bar anyway with some margin on both sides...
- */ 
-edButtonSeparator = function()
-{
-	this.prototype = new edButton('separator', '', '', '', '', -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.superclass('separator', '', '', '', '', -1 );
-	
-	/**
-	 * draws a vertical line
-	 */
-	this.show = function( txtId, objName )
-	{
-		separatorCode = '<span class="separator"></span>';
-		
-		return( separatorCode );
-	}
-}
-
-/**
- * special button that only adds a link
- *
- * @param id
- * @param display
- * @param icon
- */
-edButtonLink = function(id, display, icon) 
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButton(id, display, '', '', icon, -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.superclass(id, display, '', '', icon, -1 );
-
-	/**
-	 * function redefined from above so that users can type links
-	 *
-	 * @param txtId
-	 */
-	this.execute = function( txtId, param )
-	{		
-		this.toggle();
-		
-		linkText = prompt('Enter the link text: ');
-		if( linkText == null ) {
-			this.toggle();
-			return '';
-		}
-		
-		linkDest = prompt('Enter the destination for the link:');
-		if( linkDest == null ) {
-			this.toggle();
-			return '';
-		}
-
-		this.toggle();		
-
-		// if everything went fine, add the link and return
-		var linkTag = '<a href="' + linkDest + '">' + linkText + '</a>'; 
-		return linkTag;
-	}
-	
-	/**
-	 * special behaviour for this function... It will only ask for the link destination
-	 * and surround the current selection with the user's input
-	 *
-	 * @param txtId
-	 */
-	this.surround = function( txtId, param )
-	{
-		surroundInfo = Array();
-		surroundInfo['start'] = '';
-		surroundInfo['end'] = '';		
-		
-		this.toggle();
-		linkDest = prompt('Enter the destination for the link:');
-		if( linkDest == null ) {
-			this.toggle();
-			return surroundInfo;
-		}
-		
-		surroundInfo['start'] = '<a href="' + linkDest + '">';
-		surroundInfo['end'] = '</a>';
-		
-		this.toggle();
-		
-		return surroundInfo;
-	}
-}
-
-/**
- * special button that only adds a link
- *
- * @param id
- * @param display
- * @param icon
- */
-edButtonBr = function(id, display, icon) 
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButton(id, display, '', '', icon, -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.superclass(id, display, '<br />', '', icon, -1 );
-
-	/**
-	 * special behaviour for this function... It will only ask for the link destination
-	 * and surround the current selection with the user's input
-	 *
-	 * @param txtId
-	 */
-	this.surround = function( txtId, param )
-	{
-		surroundInfo = Array();
-		surroundInfo['start'] = '<p>';
-		surroundInfo['end'] = '</p>';
-		this.toggle();
-		
-		return surroundInfo;
-	}
-}
-
-/**
- * special button that adds/removes the "[@more@]" separator
- *
- * @param id
- * @param display
- * @param icon
- */
-edButtonMore = function(id, display, icon) 
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButton(id, display, '', '', icon, -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.superclass(id, display, '', '', icon, -1 );
-	
-	/**
-	 * @private
-	 */
-	this._getMoreTag = function()
-	{
-		return( "[@more@]" );
-	}
-	
-	this.execute = function( txtId, param ) 
-	{
-		var txtArea = document.getElementById( txtId );
-		var content = txtArea.value;
-	    var bFound = 0;
-		var startPos = 0;
-		var returnValue = '';
-	    
-		// Parse all img tags and remove any 'more' tags
-		while((startPos = content.indexOf(this._getMoreTag(), startPos)) != -1) {
-	       var contentAfter = content.substring(startPos + this._getMoreTag().length);
-	       content = content.substring(0, startPos) + contentAfter;
-	       startPos++;
-	       bFound = 1;
-		}
-		
-	    if(bFound ) {
-			// the tag is already there and should be removed, we can use a regular expression
-			// to easily remove it
-			returnValue = '';
-			txtArea.value = content;
-	     }
-	     else {
-			// the tag is not there and can be safely added
-			returnValue = '\n' + this._getMoreTag() + '\n'; 
-	    }
-	
-		return( returnValue );
-	}
-}
-
-/**
- * special button that only adds an image
- *
- * @param id
- * @param display
- * @param icon
- */
-edButtonImage = function(id, display, icon) 
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButton(id, display, '', '', icon, -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.superclass(id, display, '', '', icon, -1 );
-
-	/**
-	 * reimplemented from edButton so that we can ask for an image url and a description
-	 *
-	 * @param txtId
-	 */
-	this.execute = function( txtId, param )
-	{
-		textArea = document.getElementById(txtId);
-		
-		this.toggle();
-		
-		imgSrc = prompt('Enter the image source: ');
-		if( imgSrc == null ) {
-			this.toggle();
-			return '';
-		}
-		
-		imgAlt = prompt('Enter an image description:');
-		if( imgAlt == null ) {
-			this.toggle();
-			return '';
-		}
-		
-		this.toggle();
-
-		// if everything went fine, add the link and return
-		var imgTag = '<img src="' + imgSrc + '" alt="' + imgAlt + '" />';
-		return imgTag;
-	}
-}
-
-/**
- * special button that only adds an resource
- *
- * @param id
- * @param display
- * @param icon
- */
-edButtonResource = function(id, display, icon)
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButton(id, display, '', '', icon, -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.superclass(id, display, '', '', icon, -1 );
-
-	/**
-	 * reimplemented from edButton so that we can ask for an image url and a description
-	 *
-	 * @param txtId
-	 */
-	this.execute = function( txtId, param )
-	{
-		if ( txtId == 'postText' )
-			resource_list_window(1);
-		else
-		    resource_list_window(2);
-		return '';
-	}
-}
-
-/**
- * implements drop-down lists
- */
-edButtonList = function( id, options )
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButton(id, '', '', '', '', -1 );
-	this.prototype.constructor = edButton;
-	this.superclass = edButton;
-	
-	this.options = options;
-	
-	this.superclass(id, '', '', '', '', -1 );
-	
-	/**
-	 * renders the button. In our case, creates a drop-down list with the available options
-	 *
-	 * @param txtId
-	 * @returns the markup that is going to be written to the document
-	 */
-	this.show = function(txtId, objName)
-	{
-		selectBox = '<select class="editorDropDownList" name=\''+this.id+'\' onChange="'+objName+'.execute(\'' + txtId + '\', \'' + this.id + '\', this);">';
-		for( var key in this.options ) {
-            if ( prototypeCompatibabilityCheck( key ) )
-	            continue;			
-			selectBox += '<option value=\''+key+'\'>'+this.options[key]+'</option>';
-		}
-		selectBox += '</select>';
-		
-		return( selectBox );
-	}
-	
-	/**
-	 * reimplement this method for lists that should behave in a particular way when an option
-	 * is selected
-	 */
-	this.execute = function( txtId, param )
-	{
-		// param is the drop-down list that generated the event, so we can easily learn
-		// more about what was selected by 
-		opt = param.selectedIndex;
-	
-		return( param.options[opt].value );
-	}
-	
-	/**
-	 * does nothing
-	 */
-	this.surround = function( txtId, param )
-	{
-		surroundInfo = Array();
-		return( surroundInfo );
-	}
-
-}
-
-/**
- * button that shows a list with different font sizes
- */
-edFontSizeList = function( id, options )
-{
-	//
-	// strange javascript thingies used for object inheritance...
-	//
-	this.prototype = new edButtonList(id, options );
-	this.prototype.constructor = edButtonList;
-	this.superclass = edButtonList;
-	
-	this.superclass(id, options );
-	
-	/**
-	 * returns the right <span style=...></span> markup
-	 */
-	this.execute = function( txtId, param )
-	{
-		// param is the drop-down list that generated the event, so we can easily learn
-		// more about what was selected in the dropdown list
-		opt = param.selectedIndex;
-		fontSizePt = param.options[opt].value;
-		
-		spanCode = '<span style="font-size: '+fontSizePt+'pt;"></span>';
-	
-		return( spanCode );
-	}
-	
-	/**
-	 * surrouns the selected text with the right <span>...</span> tags
-	 */
-	this.surround = function( txtId, param )
-	{
-		opt = param.selectedIndex;
-		fontSizePt = param.options[opt].value;	
-	
-		surroundInfo = Array();
-		surroundInfo['start'] = '<span style="font-size: '+fontSizePt+'pt;">';
-		surroundInfo['end'] = '</span>';
-		return( surroundInfo );
-	}
-}
-
-
-/**
- * main class
- *
- */
-pLogEditor = function(txtId, objName) 
-{
-
-  // class attributes	
-  this.txtId = txtId;
-  this.objName = objName;
-  
-  // array with all the open tags that haven't been closed
-  this.tagStack = new Array();
-  
-  this.debug = false;
-  
-  // --
-  // our very own toolbar
-  // --
-  this.toolBar = new Array();
-  options = new Array();
-  options['8'] = '8 pt';
-  options['10'] = '10 pt';
-  options['12'] = '12 pt';
-  options['14'] = '14 pt';
-  options['18'] = '18 pt';
-  options['24'] = '24 pt';  
-  options['36'] = '36 pt';
-  this.toolBar['list_font_size'] = new edFontSizeList( 'list_font_size', options );
-  this.toolBar['1_but_b']  = new edButton( '1_but_b', 'bold', '<strong>', '</strong>', 'ed_format_bold.gif', 1 );
-  this.toolBar['2_but_i']  = new edButton( '2_but_i', 'italics', '<em>', '</em>', 'ed_format_italic.gif', 1 );
-  this.toolBar['3_but_u']  = new edButton( '3_but_u', 'underline', '<span style="text-decoration:underline">', '</span>', 'ed_format_underline.gif', 1 );
-  this.toolBar['4_but_strikethrough'] = new edButton( '4_but_strikethrough', 'strikethrough', '<span style="text-decoration: line-through;">', '</span>', 'ed_format_strike.gif', 1 );
-  this.toolBar['but_sep1'] =  new edButtonSeparator();
-  this.toolBar['but_align_left'] = new edButton( 'but_align_left', 'align left', '<div style="text-align: left;">', '</div>', 'ed_align_left.gif' );
-  this.toolBar['but_align_center'] = new edButton( 'but_align_center', 'align center', '<div style="text-align: center;">', '</div>', 'ed_align_center.gif' );
-  this.toolBar['but_align_right'] = new edButton( 'but_align_right', 'align right', '<div style="text-align: right;">', '</div>', 'ed_align_right.gif' );
-  this.toolBar['but_align_justify'] = new edButton( 'but_align_justify', 'align justify', '<div style="text-align: justify;">', '</div>', 'ed_align_justify.gif' );
-  this.toolBar['but_sep2'] =  new edButtonSeparator();
-  this.toolBar['but_ordered_list'] = new edButton( 'but_ordered_list', 'ordered list', '<ol><li></li></ol>', '', 'ed_list_num.gif', -1 );
-  this.toolBar['but_unordered_list'] = new edButton( 'but_unordered_list', 'unordered list', '<ul><li></li></ul>', '', 'ed_list_bullet.gif', -1 );  
-  this.toolBar['5_but_a']  = new edButtonLink( '5_but_a', 'anchor', 'ed_link.gif' );
-  this.toolBar['6_but_img']= new edButtonImage( '6_but_img', 'image', 'ed_image.gif' );
-  this.toolBar['7_but_res']= new edButtonResource ('7_but_res', 'resource', 'ed_resource.gif' );
-  this.toolBar['8_but_more']= new edButtonMore ('8_but_more', 'more', 'ed_more.gif' );
-  
-  /**
-   * returns whether our browser supports the features that we are going
-   * to use or not
-   *
-   * @return true if supported, false if not
-   */
-  this.isSupportedBrowser = function()
-  {
-	 return( document.getElementById || document.all );
-  }
-  
-  /**
-   * draws the buttons. Takes no parameters
-   *
-   * @return nothing
-   */
-  this.showToolbar = function() {
-	  
-	  // first of all, check for unsupported browsers. If the browser
-	  // is not supported, we will silently not do anything... since we won't
-	  // even print the toolbar! (and nothing will happen without a toolbar)
-	  if( !this.isSupportedBrowser())
-	  	return;
-		
-	  markup = '';
-	  
-	  document.write('<div class="textEditorToolbar" id="textEditorToolbar">');
-	  for( var buttonId in this.toolBar ) {
-          if ( prototypeCompatibabilityCheck( buttonId ) )
-	          continue;
-	      button = this.toolBar[buttonId];
-	      markup += button.show(this.txtId, this.objName);
-	  }
-	  document.write(markup);
-	  document.write('</div>');
-	  
-	  if( this.debug ) {
-		document.write('<textarea>'+markup+'</textarea>');
-	  }
-  }
-  
-  // after initializing the buttons, we can generate the toolbar
-  // we can't call this method after defining it!! :)
-  this.showToolbar();    
-  
-  /**
-   * calls the edButton.execute() callback
-   *
-   * @param txtId
-   * @param buttonId
-   * @return nothing
-   */
-  this.execute = function( txtId, buttonId, param )
-  {
-	  // get the button from the array
-	  var edButton = this.toolBar[buttonId];
-	  
-	  // execute the button
-	  if( !this.selectionExists()) {
-	  	result = edButton.execute( txtId, param );
-		if( result != 'undefined' )
-			this.insertText( result );
-  	  }
-  	  else {
-	  	 surroundInfo = edButton.surround( txtId, param ); 
-	     this.surroundText( surroundInfo['start'], surroundInfo['end'] );	  
-      }
-  }
-  
-  /**
-   * returns the textarea object associated to this editor
-   *
-   * @return a textarea object
-   */
-  this.getTextArea = function()
-  {
-	  textArea = document.getElementById( this.txtId );
-	  return textArea;
-  }
-  
-  /** 
-   * calls the onMouseOver handler for this button
-   *
-   * @param txtId
-   * @param buttonId
-   */
-  this.mouseOver = function( txtId, buttonId )
-  {
-	  var edButton = this.toolBar[buttonId];
-	  edButton.mouseOver();
-  }
-  
-  /**
-   * calls the onMouseOut handler for this button
-   *
-   * @param txtId
-   * @param buttonId
-   */
-  this.mouseOut = function( txtId, buttonId )
-  {
-	  var edButton = this.toolBar[buttonId];
-	  edButton.mouseOut();	  
-  }
-  
-	/**
- 	 * inserts text where the cursor is
- 	 * 
- 	 * @param myField
- 	 * @param myValue
- 	 * @return nothing
- 	 */
-	this.insertText = function(myValue) 
-	{
-		myField = this.getTextArea();
-		
-		//IE support
-		if (document.selection) {
-			myField.focus();
-			sel = document.selection.createRange();
-			sel.text = myValue;
-			myField.focus();
-		}
-		//MOZILLA/NETSCAPE support
-		else if (myField.selectionStart || myField.selectionStart == '0') {
-			var startPos = myField.selectionStart;
-			var endPos = myField.selectionEnd;
-			myField.value = myField.value.substring(0, startPos)
-		    	          + myValue 
-                	      + myField.value.substring(endPos, myField.value.length);
-			myField.focus();
-			myField.selectionStart = startPos + myValue.length;
-			myField.selectionEnd = startPos + myValue.length;
-		} else {
-			myField.value += myValue;
-			myField.focus();
-		}
-	}  
-	
-	/**
-	 * surrounds the current selection with the given opening and closing texts
-	 *
-	 * @param myValueOpen
-	 * @param myValueClose
-	 */
-	this.surroundText = function( myValueOpen, myValueClose )
-  	{
-		myField = this.getTextArea();
-		if (document.selection) {
-			myField.focus();
-			sel = document.selection.createRange();
-			sel.text = myValueOpen + sel.text + myValueClose;
-			myField.focus();
-		}
-		else if (myField.selectionStart || myField.selectionStart == '0') {
-			var startPos = myField.selectionStart;
-			var endPos = myField.selectionEnd;
-			var cursorPos = endPos;		
-			myField.value = myField.value.substring(0, startPos)
-		              + myValueOpen
-		              + myField.value.substring(startPos, endPos)
-		              + myValueClose
-                      + myField.value.substring(endPos, myField.value.length);
-			cursorPos += myValueOpen.length + myValueClose.length;		
-			myField.selectionStart = cursorPos;
-			myField.selectionEnd = cursorPos;
-			myField.focus();		
-		} 
-		else {
-			myField.value += myValueOpen;
-			myField.focus();
-		}	  
-  	}
-  
-  /**
-   * returns whether there is a user selection in the given editor
-   *
-   * @return True if there is a selection or false otherwise
-   */
-  this.selectionExists = function()
-  {
-	var selection = false;
-	var myField = this.getTextArea();
-	  
-	if (document.selection) {
-		// for IE
-		myField.focus();
-		sel = document.selection.createRange();
-		selection = (sel.text != '' );
-		myField.focus();
-	}
-	else if (myField.selectionStart || myField.selectionStart == '0') {
-		// for Mozilla
-		selection = (myField.selectionEnd > myField.selectionStart)
-	}
-	else {
-		// for everybody else...
-		selection = false;
-	}
-
-	return selection;
-  }
-}
-
-// Add this function to Prototype Lib Compatibability Check
-function prototypeCompatibabilityCheck( str )
-{
-    if ( str == '_each' ||
-	  	 str == '_reverse' ||
-         str == 'all' ||
-         str == 'any' ||
-         str == 'clear' ||
-         str == 'collect' ||
-         str == 'compact' ||
-         str == 'detect' ||
-         str == 'each' ||
-         str == 'entries' ||
-         str == 'extend' ||
-         str == 'find' ||
-         str == 'findAll' ||
-         str == 'first' ||
-         str == 'flatten' ||
-         str == 'grep' ||
-         str == 'include' ||
-         str == 'indices' ||
-         str == 'indexOf' ||
-         str == 'inject' ||
-         str == 'inspect' ||
-         str == 'invoke' ||
-         str == 'last' ||
-         str == 'map' ||
-         str == 'max' ||
-         str == 'member' ||
-         str == 'min' ||
-         str == 'partition' ||
-         str == 'pluck' ||
-         str == 'reject' ||
-         str == 'remove' ||
-         str == 'removeItem' ||
-         str == 'select' ||
-         str == 'shift' ||
-         str == 'sortBy' ||
-         str == 'toArray' ||
-         str == 'without' ||
-         str == 'zip')
-        return true;
-    else
-    	return false;
-}

Modified: plog/trunk/js/tinymce/plugins/insertvideo/css/content.css
===================================================================
--- plog/trunk/js/tinymce/plugins/insertvideo/css/content.css	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/tinymce/plugins/insertvideo/css/content.css	2007-02-10 18:49:29 UTC (rev 4710)
@@ -32,4 +32,11 @@
 	background-position: center;
 	background-repeat: no-repeat;
 	background-color: #ffffcc;
+	}
+.ltVideoGrouper {
+	border: 1px dotted #cc0000;
+	background-image: url('../images/grouper.png');
+	background-position: center;
+	background-repeat: no-repeat;
+	background-color: #ffffcc;
 	}
\ No newline at end of file

Modified: plog/trunk/js/tinymce/plugins/insertvideo/editor_plugin.js
===================================================================
--- plog/trunk/js/tinymce/plugins/insertvideo/editor_plugin.js	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/tinymce/plugins/insertvideo/editor_plugin.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,298 +1,303 @@
-/* Import plugin specific language pack */
-tinyMCE.importPluginLanguagePack('insertvideo', 'en,tr,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl'); // <- Add a comma separated list of all supported languages
-
-// Singleton class
-var TinyMCE_insertvideoPlugin = {
-	getInfo : function() {
-		return {
-			longname : 'insertvideo plugin',
-			author : 'The LifeType Project',
-			authorurl : 'http://www.lifetype.net',
-			infourl : 'http://www.lifetype.net',
-			version : "1.0"
-		};
-	},
-
-	initInstance : function(inst) {
-		tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/insertvideo/css/content.css");	
-	},
-
-	getControlHTML : function(cn) {
-		switch (cn) {
-			case "insertvideo":
-				return tinyMCE.getButtonHTML(cn, 'lang_insertvideo_desc', '{$pluginurl}/images/youtube.png', 'mceinsertvideo', true);
-		}
-
-		return "";
-	},
-
-	/**
-	 * Executes a specific command, this function handles plugin commands.
-	 *
-	 * @param {string} editor_id TinyMCE editor instance id that issued the command.
-	 * @param {HTMLElement} element Body or root element for the editor instance.
-	 * @param {string} command Command name to be executed.
-	 * @param {string} user_interface True/false if a user interface should be presented.
-	 * @param {mixed} value Custom value argument, can be anything.
-	 * @return true/false if the command was executed by this plugin or not.
-	 * @type
-	 */
-	execCommand : function(editor_id, element, command, user_interface, value) {
-		// Handle commands		
-		switch (command) {
-			// Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.
-			case "mceinsertvideo":
-				// Show UI/Popup
-				if (user_interface) {
-					// Open a popup window and send in some custom data in a window argument
-					var insertvideo = new Array();
-
-					insertvideo['file'] = '../../plugins/insertvideo/videoinput.html'; // Relative to theme
-					insertvideo['width'] = 500;
-					insertvideo['height'] = 260;
-
-					tinyMCE.openWindow(insertvideo, {editor_id : editor_id, resizable : "no", scrollbars : "no", inline : "yes"});
-				}
-				return true;
-		}
-
-	   // Pass to next handler in chain
-	   return false;
-	},
-
-	cleanup : function(type, content) {
-		switch (type) {
-			case "insert_to_editor_dom":
-				// Force relative/absolute
-				if (tinyMCE.getParam('convert_urls')) {
-					var imgs = content.getElementsByTagName("img");
-					for (var i=0; i<imgs.length; i++) {
-						//if (tinyMCE.getAttrib(imgs[i], "class")== "ltVideoYouTube") {
-						if (tinyMCE.getAttrib(imgs[i], "class").substr(0,6) == "ltVideo") {							
-							var src = tinyMCE.getAttrib(imgs[i], "alt");
-
-							if (tinyMCE.getParam('convert_urls'))
-								src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");
-
-							imgs[i].setAttribute('alt', src);
-							imgs[i].setAttribute('title', src);
-						}
-					}
-				}
-				break;
-
-			case "get_from_editor_dom":
-				var imgs = content.getElementsByTagName("img");
-				for (var i=0; i<imgs.length; i++) {
-					if (tinyMCE.getAttrib(imgs[i], "class").substr(0,6) == "ltVideo") {
-						var src = tinyMCE.getAttrib(imgs[i], "alt");
-
-						if (tinyMCE.getParam('convert_urls'))
-							src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");
-
-						imgs[i].setAttribute('alt', src);
-						imgs[i].setAttribute('title', src);
-					}
-				}
-				break;
-
-			case "insert_to_editor":
-				var startPos = 0;
-				var embedList = new Array();			
-
-				// Fix the embed and object elements
-				content = content.replace(new RegExp('<[ ]*object','gi'),'<object');
-				content = content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');			
-				
-				// Parse all object tags and replace them with images from the embed data
-				var index = 0;
-				while ((startPos = content.indexOf('<object', startPos)) != -1) {
-
-					// Find end of object
-					endPos = content.indexOf('</object>', startPos);
-					endPos += 9;
-					
-					objectTag = content.substring(startPos,endPos);
-					attribs = TinyMCE_insertvideoPlugin._parseAttributes( objectTag );
-					
-					var cssClass = "";					
-					if( attribs["data"] == undefined ) {
-						startPos++;
-						continue;
-					}
-					else {
-						var videoType = getVideoType( attribs["data"] );
-						if( videoType == 1 ) {
-							cssClass = "ltVideoGoogleVideo";
-						}
-						else if( videoType == 2 ) {
-							cssClass = "ltVideoYouTube";
-						}
-						else if( videoType == 3 ) {
-							cssClass = "ltVideoMetacafe";
-						}
-						else if( videoType == 4 ) {
-							cssClass = "ltVideoIfilm";
-						}
-						else if( videoType == 5 ) {
-							cssClass = "ltVideoGoear";
-						}
-						else {
-							// ignore it, it's not a youtube or googlevideo video
-							startPos++;
-							continue;
-						}
-					}
-					
-
-					// Insert image
-					var contentAfter = content.substring(endPos);
-					content = content.substring(0, startPos);
-					content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';
-					content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["data"] + '"';
-					content += ' alt="' + attribs["data"] + '" class="'+cssClass+'" />' + content.substring(endPos);
-					content += contentAfter;
-					index++;
-
-					startPos++;
-				}
-				
-				break;
-
-			case "get_from_editor":
-				// Parse all img tags and replace them with object+embed
-				var startPos = -1;
-
-				while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
-					var endPos = content.indexOf('/>', startPos);
-					var attribs = TinyMCE_insertvideoPlugin._parseAttributes(content.substring(startPos + 4, endPos));
-
-					// Is not flash, skip it
-					if (attribs['class'] != "ltVideoYouTube" && attribs['class'] != "ltVideoGoogleVideo" && attribs['class'] != "ltVideoMetacafe" && attribs['class'] != "ltVideoIfilm" && attribs['class'] != "ltVideoGoear" )
-						continue;
-
-					type = attribs['class'];
-
-					endPos += 2;
-
-					var embedHTML = '';
-					var wmode = tinyMCE.getParam("flash_wmode", "transparent");
-					var quality = tinyMCE.getParam("flash_quality", "high");
-					var menu = tinyMCE.getParam("flash_menu", "false");
-					
-					embedHTML = getVideoFlashHTML( attribs["title"], attribs["width"], attribs["height"] , type );
-
-					// Insert embed/object chunk
-					chunkBefore = content.substring(0, startPos);
-					chunkAfter = content.substring(endPos);
-					content = chunkBefore + embedHTML + chunkAfter;
-				}
-				break;
-		}
-
-		// Pass through to next handler in chain
-		return content;
-	},
-
-	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
-		if (node == null)
-			return;
-
-		do {
-			if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('ltVideo') == 0) {
-				tinyMCE.switchClass(editor_id + '_flash', 'mceButtonSelected');
-				return true;
-			}
-		} while ((node = node.parentNode));
-
-		tinyMCE.switchClass(editor_id + '_flash', 'mceButtonNormal');
-
-		return true;
-	},
-
-	// Private plugin internal functions
-
-	_parseAttributes : function(attribute_string) {
-		var attributeName = "";
-		var attributeValue = "";
-		var withInName;
-		var withInValue;
-		var attributes = new Array();
-		var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
-
-		if (attribute_string == null || attribute_string.length < 2)
-			return null;
-
-		withInName = withInValue = false;
-
-		for (var i=0; i<attribute_string.length; i++) {
-			var chr = attribute_string.charAt(i);
-
-			if ((chr == '"' || chr == "'") && !withInValue)
-				withInValue = true;
-			else if ((chr == '"' || chr == "'") && withInValue) {
-				withInValue = false;
-
-				var pos = attributeName.lastIndexOf(' ');
-				if (pos != -1)
-					attributeName = attributeName.substring(pos+1);
-
-				attributes[attributeName.toLowerCase()] = attributeValue.substring(1);
-
-				attributeName = "";
-				attributeValue = "";
-			} else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
-				withInName = true;
-
-			if (chr == '=' && withInName)
-				withInName = false;
-
-			if (withInName)
-				attributeName += chr;
-
-			if (withInValue)
-				attributeValue += chr;
-		}
-
-		return attributes;
-	}
-};
-
-function getVideoFlashHTML( url, width, height , type )
-{
-	html = "<object type=\"application/x-shockwave-flash\" width=\""+width+"\" height=\""+height+"\" data=\""+url+"\" id=\""+type+"\">"+
-		"<param name=\"movie\" value=\""+url+"\" />"+
-		"<param name=\"wmode\" value=\"transparent\" />"+
-		"<param name=\"allowScriptAcess\" value=\"sameDomain\" />"+
-		"<param name=\"quality\" value=\"best\" />"+
-		"<param name=\"bgcolor\" value=\"#FFFFFF\" />";
-//		"<param name=\"scale\" value=\"noScale\" />";
-  if (type=='ltVideoGoear') {
-		html= html + "<param name=\"FlashVars\" value=\""+url.substring( 43, url.length ) + "\" />";
-	}	else {
-	   html = html + "<param name=\"FlashVars\" value=\"playerMode=embedded\" />";
-	}
-	
-	html = html + "</object>";
-	
-	return( html );
-}
-
-
-function getVideoType( url )
-{
-	if( url.substring( 0, 24 ) == "http://video.google.com/" )
-		return 1;
-	else if( url.substring( 0, 23 ) == "http://www.youtube.com/" )
-		return 2;
-	else if( url.substring( 0, 24 ) == "http://www.metacafe.com/" )
-		return 3;
-	else if( url.substring( 0, 21 ) == "http://www.ifilm.com/" )
-		return 4;
-	else if( url.substring( 0, 21 ) == "http://www.goear.com/" )
-		return 5;
-	else
-		return 0;
-}
-
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('insertvideo', 'en,tr,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl'); // <- Add a comma separated list of all supported languages
+
+// Singleton class
+var TinyMCE_insertvideoPlugin = {
+	getInfo : function() {
+		return {
+			longname : 'insertvideo plugin',
+			author : 'The LifeType Project',
+			authorurl : 'http://www.lifetype.net',
+			infourl : 'http://www.lifetype.net',
+			version : "1.0"
+		};
+	},
+
+	initInstance : function(inst) {
+		tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/insertvideo/css/content.css");	
+	},
+
+	getControlHTML : function(cn) {
+		switch (cn) {
+			case "insertvideo":
+				return tinyMCE.getButtonHTML(cn, 'lang_insertvideo_desc', '{$pluginurl}/images/youtube.png', 'mceinsertvideo', true);
+		}
+
+		return "";
+	},
+
+	/**
+	 * Executes a specific command, this function handles plugin commands.
+	 *
+	 * @param {string} editor_id TinyMCE editor instance id that issued the command.
+	 * @param {HTMLElement} element Body or root element for the editor instance.
+	 * @param {string} command Command name to be executed.
+	 * @param {string} user_interface True/false if a user interface should be presented.
+	 * @param {mixed} value Custom value argument, can be anything.
+	 * @return true/false if the command was executed by this plugin or not.
+	 * @type
+	 */
+	execCommand : function(editor_id, element, command, user_interface, value) {
+		// Handle commands		
+		switch (command) {
+			// Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.
+			case "mceinsertvideo":
+				// Show UI/Popup
+				if (user_interface) {
+					// Open a popup window and send in some custom data in a window argument
+					var insertvideo = new Array();
+
+					insertvideo['file'] = '../../plugins/insertvideo/videoinput.html'; // Relative to theme
+					insertvideo['width'] = 500;
+					insertvideo['height'] = 260;
+
+					tinyMCE.openWindow(insertvideo, {editor_id : editor_id, resizable : "no", scrollbars : "no", inline : "yes"});
+				}
+				return true;
+		}
+
+	   // Pass to next handler in chain
+	   return false;
+	},
+
+	cleanup : function(type, content) {
+		switch (type) {
+			case "insert_to_editor_dom":
+				// Force relative/absolute
+				if (tinyMCE.getParam('convert_urls')) {
+					var imgs = content.getElementsByTagName("img");
+					for (var i=0; i<imgs.length; i++) {
+						//if (tinyMCE.getAttrib(imgs[i], "class")== "ltVideoYouTube") {
+						if (tinyMCE.getAttrib(imgs[i], "class").substr(0,6) == "ltVideo") {							
+							var src = tinyMCE.getAttrib(imgs[i], "alt");
+
+							if (tinyMCE.getParam('convert_urls'))
+								src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");
+
+							imgs[i].setAttribute('alt', src);
+							imgs[i].setAttribute('title', src);
+						}
+					}
+				}
+				break;
+
+			case "get_from_editor_dom":
+				var imgs = content.getElementsByTagName("img");
+				for (var i=0; i<imgs.length; i++) {
+					if (tinyMCE.getAttrib(imgs[i], "class").substr(0,6) == "ltVideo") {
+						var src = tinyMCE.getAttrib(imgs[i], "alt");
+
+						if (tinyMCE.getParam('convert_urls'))
+							src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");
+
+						imgs[i].setAttribute('alt', src);
+						imgs[i].setAttribute('title', src);
+					}
+				}
+				break;
+
+			case "insert_to_editor":
+				var startPos = 0;
+				var embedList = new Array();			
+
+				// Fix the embed and object elements
+				content = content.replace(new RegExp('<[ ]*object','gi'),'<object');
+				content = content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');			
+				
+				// Parse all object tags and replace them with images from the embed data
+				var index = 0;
+				while ((startPos = content.indexOf('<object', startPos)) != -1) {
+
+					// Find end of object
+					endPos = content.indexOf('</object>', startPos);
+					endPos += 9;
+					
+					objectTag = content.substring(startPos,endPos);
+					attribs = TinyMCE_insertvideoPlugin._parseAttributes( objectTag );
+					
+					var cssClass = "";					
+					if( attribs["data"] == undefined ) {
+						startPos++;
+						continue;
+					}
+					else {
+						var videoType = getVideoType( attribs["data"] );
+						if( videoType == 1 ) {
+							cssClass = "ltVideoGoogleVideo";
+						}
+						else if( videoType == 2 ) {
+							cssClass = "ltVideoYouTube";
+						}
+						else if( videoType == 3 ) {
+							cssClass = "ltVideoMetacafe";
+						}
+						else if( videoType == 4 ) {
+							cssClass = "ltVideoIfilm";
+						}
+						else if( videoType == 5 ) {
+							cssClass = "ltVideoGoear";
+						}
+						else if( videoType == 6 ) {
+							cssClass = "ltVideoGrouper";
+						}
+						else {
+							// ignore it, it's not a youtube or googlevideo video
+							startPos++;
+							continue;
+						}
+					}
+					
+
+					// Insert image
+					var contentAfter = content.substring(endPos);
+					content = content.substring(0, startPos);
+					content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';
+					content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["data"] + '"';
+					content += ' alt="' + attribs["data"] + '" class="'+cssClass+'" />' + content.substring(endPos);
+					content += contentAfter;
+					index++;
+
+					startPos++;
+				}
+				
+				break;
+
+			case "get_from_editor":
+				// Parse all img tags and replace them with object+embed
+				var startPos = -1;
+
+				while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
+					var endPos = content.indexOf('/>', startPos);
+					var attribs = TinyMCE_insertvideoPlugin._parseAttributes(content.substring(startPos + 4, endPos));
+
+					// Is not flash, skip it
+					if (attribs['class'] != "ltVideoYouTube" && attribs['class'] != "ltVideoGoogleVideo" && attribs['class'] != "ltVideoMetacafe" && attribs['class'] != "ltVideoIfilm" && attribs['class'] != "ltVideoGoear" && attribs['class'] != "ltVideoGrouper")
+						continue;
+
+					type = attribs['class'];
+
+					endPos += 2;
+
+					var embedHTML = '';
+					var wmode = tinyMCE.getParam("flash_wmode", "transparent");
+					var quality = tinyMCE.getParam("flash_quality", "high");
+					var menu = tinyMCE.getParam("flash_menu", "false");
+					
+					embedHTML = getVideoFlashHTML( attribs["title"], attribs["width"], attribs["height"] , type );
+
+					// Insert embed/object chunk
+					chunkBefore = content.substring(0, startPos);
+					chunkAfter = content.substring(endPos);
+					content = chunkBefore + embedHTML + chunkAfter;
+				}
+				break;
+		}
+
+		// Pass through to next handler in chain
+		return content;
+	},
+
+	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+		if (node == null)
+			return;
+
+		do {
+			if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('ltVideo') == 0) {
+				tinyMCE.switchClass(editor_id + '_flash', 'mceButtonSelected');
+				return true;
+			}
+		} while ((node = node.parentNode));
+
+		tinyMCE.switchClass(editor_id + '_flash', 'mceButtonNormal');
+
+		return true;
+	},
+
+	// Private plugin internal functions
+
+	_parseAttributes : function(attribute_string) {
+		var attributeName = "";
+		var attributeValue = "";
+		var withInName;
+		var withInValue;
+		var attributes = new Array();
+		var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
+
+		if (attribute_string == null || attribute_string.length < 2)
+			return null;
+
+		withInName = withInValue = false;
+
+		for (var i=0; i<attribute_string.length; i++) {
+			var chr = attribute_string.charAt(i);
+
+			if ((chr == '"' || chr == "'") && !withInValue)
+				withInValue = true;
+			else if ((chr == '"' || chr == "'") && withInValue) {
+				withInValue = false;
+
+				var pos = attributeName.lastIndexOf(' ');
+				if (pos != -1)
+					attributeName = attributeName.substring(pos+1);
+
+				attributes[attributeName.toLowerCase()] = attributeValue.substring(1);
+
+				attributeName = "";
+				attributeValue = "";
+			} else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
+				withInName = true;
+
+			if (chr == '=' && withInName)
+				withInName = false;
+
+			if (withInName)
+				attributeName += chr;
+
+			if (withInValue)
+				attributeValue += chr;
+		}
+
+		return attributes;
+	}
+};
+
+function getVideoFlashHTML( url, width, height , type )
+{
+	html = "<object type=\"application/x-shockwave-flash\" width=\""+width+"\" height=\""+height+"\" data=\""+url+"\" id=\""+type+"\">"+
+		"<param name=\"movie\" value=\""+url+"\" />"+
+		"<param name=\"wmode\" value=\"transparent\" />"+
+		"<param name=\"allowScriptAcess\" value=\"sameDomain\" />"+
+		"<param name=\"quality\" value=\"best\" />"+
+		"<param name=\"bgcolor\" value=\"#FFFFFF\" />";
+//		"<param name=\"scale\" value=\"noScale\" />";
+  if (type=='ltVideoGoear') {
+		html= html + "<param name=\"FlashVars\" value=\""+url.substring( 43, url.length ) + "\" />";
+	}	else {
+	   html = html + "<param name=\"FlashVars\" value=\"playerMode=embedded\" />";
+	}
+	
+	html = html + "</object>";
+	
+	return( html );
+}
+
+
+function getVideoType( url )
+{
+	if( url.substring( 0, 24 ) == "http://video.google.com/" )
+		return 1;
+	else if( url.substring( 0, 23 ) == "http://www.youtube.com/" )
+		return 2;
+	else if( url.substring( 0, 24 ) == "http://www.metacafe.com/" )
+		return 3;
+	else if( url.substring( 0, 21 ) == "http://www.ifilm.com/" )
+		return 4;
+	else if( url.substring( 0, 21 ) == "http://www.goear.com/" )
+		return 5;
+	else if( url.substring( 0, 21 ) == "http://www.grouper.com/" )
+		return 6;
+	else
+		return 0;
+}
+
 tinyMCE.addPlugin("insertvideo", TinyMCE_insertvideoPlugin );
\ No newline at end of file

Modified: plog/trunk/js/tinymce/plugins/insertvideo/functions.js
===================================================================
--- plog/trunk/js/tinymce/plugins/insertvideo/functions.js	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/tinymce/plugins/insertvideo/functions.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -107,6 +107,26 @@
 	return( url );
 }
 
+function getGrouperVideoLink( url )
+{
+	// check if it's a link to a video page or a link to the video player
+	if( url.substring( 0, 46 ) == "http://grouper.com/video/MediaDetails.aspx?id=" ) {
+		// if it's a link to a video page, generate the right one
+		var regexp = /http:\/\/www.grouper.com\/video\/MediaDetails.aspx.*?id=([\-0-9a-zA-z_]*).*/i;
+		result = regexp.exec( url );
+		if( result ) {
+			videoId = result[1];
+		}
+		else {		
+			videoId = url.substring( 46, url.length );
+		}		
+		
+		url = "http://grouper.com/mtg/mtgPlayer.swf?gvars=vurl~http%3a%2f%2fgrouper.com%2frss%2fflv.ashx%3fid%3d" + videoId + "_rf%7e-9_vfver~8_ap~1_extid~-1";
+	}
+
+	return( url );
+}
+
 function insertVideoCode()
 {
 	// get and check the URL
@@ -123,11 +143,13 @@
 //	dalealplay = document.getElementById("dalealplay");
 	metacafe = document.getElementById("metacafe");
 	ifilm = document.getElementById("ifilm");
-  goear = document.getElementById("goear");
+      goear = document.getElementById("goear");
+      grouper = document.getElementById("grouper");
+
 //	bolt = document.getElementById("bolt");
 
-	if( youtube.checked==false && gvideo.checked==false && metacafe.checked==false && ifilm.checked==false && goear.checked==false ) {
-		window.alert( "Debes seleccionar el tipo de video." );
+	if( youtube.checked==false && gvideo.checked==false && metacafe.checked==false && ifilm.checked==false && goear.checked==false && grouper.checked==false ) {
+		window.alert( "You must select the right video site." );
 		return( false );	
 	}
 	
@@ -161,7 +183,12 @@
 		width=366;
 		height=75;		
 	}	
-
+	if( grouper.checked == true ) {
+		link = getGrouperVideoLink( url );	
+		css="ltVideoGrouper";
+		width=496;
+		height=398;		
+	}	
 	insertFlash( link, css, width, height );
 }
 

Copied: plog/trunk/js/tinymce/plugins/insertvideo/images/grouper.png (from rev 4709, plog/branches/lifetype-1.2/js/tinymce/plugins/insertvideo/images/grouper.png)
===================================================================
(Binary files differ)

Modified: plog/trunk/js/tinymce/plugins/insertvideo/videoinput.html
===================================================================
--- plog/trunk/js/tinymce/plugins/insertvideo/videoinput.html	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/tinymce/plugins/insertvideo/videoinput.html	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,48 +1,50 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>Insert Video</title>
-	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
-	<script language="javascript" type="text/javascript" src="functions.js"></script>	
-	<base target="_self" />
-</head>
-<body style="display: none">
-	<form name="video" id="video" method="post" action="#">
-	<div class="tabs">
-	  <ul>
-	   <li id="general_tab" class="current"><span>Insert Video</span></li>
-	  </ul>
-	</div>
-	<div class="panel_wrapper">
-	  <div id="general_panel" class="panel_current">
-	     <legend>Please provide a link to a video file or a link to a video page.</legend>	     	     
-	     <table border="0" cellpadding="4" cellspacing="0">
-	      <tr>
-	       <td nowrap="nowrap">Video URL:</td>
-	       <td><input type="text" id="url" name="url" value="" style="width:350px" /></td>
-	      </tr>
-	      <tr>
-	       <td nowrap="nowrap">Source:</td>
-	       <td>
-		    <input type="radio" id="youtube" style="border:0px" name="type" value="1"><img src="images/youtube.png" alt="YouTube" /> YouTube<br />
-		    <input type="radio" id="gvideo" style="border:0px"name="type" value="2"><img src="images/gvideo.png" alt="Google Video" /> Google Video<br />
-		    <input type="radio" id="metacafe" style="border:0px"name="type" value="3"><img src="images/metacafe.png" alt="Metacafe" /> Metacafe<br />
-		    <input type="radio" id="ifilm" style="border:0px"name="type" value="4"><img src="images/ifilm.png" alt="iFilm" /> iFilm<br />
-		    <input type="radio" id="goear" style="border:0px"name="type" value="5"><img src="images/goear.png" alt="Goear" /> Goear<br />
-		   </td>
-		  </tr> 			
-		 </table>		    
-		</div>
-		</div>
-		<div class="mceActionPanel">
-		  <div style="float:left">		
-			<input type="button" name="insert" value="Insert Code" onClick="insertVideoCode()" id="insert" />
-		  </div>
-		  <div style="float:right">
-		    <input type="button" name="cancel" value="Close" onclick="tinyMCEPopup.close();" id="cancel" />
-		  </div>
-		</div>
-	 </div>
-	</div>				
-	 </form>
-</body>
-</html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>Insert Video</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="functions.js"></script>	
+	<base target="_self" />
+</head>
+<body style="display: none">
+	<form name="video" id="video" method="post" action="#">
+	<div class="tabs">
+	  <ul>
+	   <li id="general_tab" class="current"><span>Insert Video</span></li>
+	  </ul>
+	</div>
+	<div class="panel_wrapper">
+	  <div id="general_panel" class="panel_current">
+	     <legend>Please provide a link to a video file.</legend>	     	     
+	     <table border="0" cellpadding="4" cellspacing="0">
+	      <tr>
+	       <td nowrap="nowrap">Video URL:</td>
+	       <td><input type="text" id="url" name="url" value="" style="width:350px" /></td>
+	      </tr>
+	      <tr>
+	       <td nowrap="nowrap">Select Source:</td>
+	       <td>
+		    <input type="radio" id="youtube" style="border:0px" name="type" value="1"><img src="images/youtube.png" alt="YouTube" /> YouTube<br />
+		    <input type="radio" id="gvideo" style="border:0px"name="type" value="2"><img src="images/gvideo.png" alt="Google Video" /> Google Video<br />
+		    <input type="radio" id="metacafe" style="border:0px"name="type" value="3"><img src="images/metacafe.png" alt="Metacafe" /> Metacafe<br />
+		    <input type="radio" id="ifilm" style="border:0px"name="type" value="4"><img src="images/ifilm.png" alt="iFilm" /> iFilm<br />
+		    <input type="radio" id="goear" style="border:0px"name="type" value="5"><img src="images/goear.png" alt="Goear" /> Goear<br />
+		    <input type="radio" id="grouper" style="border:0px"name="type" value="6"><img src="images/grouper.png" alt="Grouper" /> Grouper<br />
+
+		   </td>
+		  </tr> 			
+		 </table>		    
+		</div>
+		</div>
+		<div class="mceActionPanel">
+		  <div style="float:left">		
+			<input type="button" name="insert" value="Insert Code" onClick="insertVideoCode()" id="insert" />
+		  </div>
+		  <div style="float:right">
+		    <input type="button" name="cancel" value="Close" onclick="tinyMCEPopup.close();" id="cancel" />
+		  </div>
+		</div>
+	 </div>
+	</div>				
+	 </form>
+</body>
+</html>

Copied: plog/trunk/js/ui/core.js (from rev 4709, plog/branches/lifetype-1.2/js/ui/core.js)
===================================================================
--- plog/trunk/js/ui/core.js	                        (rev 0)
+++ plog/trunk/js/ui/core.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,87 @@
+/** 
+ * This will be the base class for all Lifetype Javascript code. Right 
+ * now only the TableEffects class extends this, but in the future all code
+ * will be moved to this framework.
+ */
+
+/**
+ * Base Lifetype class 
+ */
+Lifetype = function() 
+{
+	// nothing yet
+}
+
+/**
+ * Compatibility check
+ */
+Lifetype.prototypeCompatibabilityCheck = function( str )
+{
+    if ( str == '_each' ||
+	  	 str == '_reverse' ||
+         str == 'all' ||
+         str == 'any' ||
+         str == 'clear' ||
+         str == 'collect' ||
+         str == 'compact' ||
+         str == 'detect' ||
+         str == 'each' ||
+         str == 'entries' ||
+         str == 'extend' ||
+         str == 'find' ||
+         str == 'findAll' ||
+         str == 'first' ||
+         str == 'flatten' ||
+         str == 'grep' ||
+         str == 'include' ||
+         str == 'indices' ||
+         str == 'indexOf' ||
+         str == 'inject' ||
+         str == 'inspect' ||
+         str == 'invoke' ||
+         str == 'last' ||
+         str == 'map' ||
+         str == 'max' ||
+         str == 'member' ||
+         str == 'min' ||
+         str == 'partition' ||
+         str == 'pluck' ||
+         str == 'reject' ||
+         str == 'remove' ||
+         str == 'removeItem' ||
+         str == 'select' ||
+         str == 'shift' ||
+         str == 'sortBy' ||
+         str == 'toArray' ||
+         str == 'without' ||
+         str == 'zip')
+        return true;
+    else
+    	return false;
+}
+
+/**
+ * Return the base URL of the script
+ *
+ * @return Base URL
+ */
+Lifetype.getBaseURL = function()
+{
+	// Get document base path
+	documentBasePath = document.location.href;
+	if (documentBasePath.indexOf('?') != -1)
+		documentBasePath = documentBasePath.substring(0, documentBasePath.indexOf('?'));
+		
+	documentBasePath = documentBasePath.substring(0, documentBasePath.lastIndexOf('/'));
+
+	return( documentBasePath );
+}
+
+
+/**
+ * Base UI class
+ */
+Lifetype.UI = function() 
+{
+	// nothing yet
+}
\ No newline at end of file

Modified: plog/trunk/js/ui/summary.js
===================================================================
--- plog/trunk/js/ui/summary.js	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/js/ui/summary.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,7 +1,7 @@
 function checkUserNameAjax()
 {
 	var userName = $F('userName');
-	userName = userName.toLowerCase();
+	//userName = userName.toLowerCase();
 	if (userName != '')
 	{
 		var url = plogSummaryBaseUrl;

Copied: plog/trunk/js/ui/tableeffects.js (from rev 4709, plog/branches/lifetype-1.2/js/ui/tableeffects.js)
===================================================================
--- plog/trunk/js/ui/tableeffects.js	                        (rev 0)
+++ plog/trunk/js/ui/tableeffects.js	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,74 @@
+/**
+ * TableEffects class
+ *
+ * @param id The id of the table to which we'd like to apply the effects. If no id is provided (i.e. the constructor
+ * is called without parameters), then all tables in the page will be processed
+ */
+Lifetype.UI.TableEffects = function( id )
+{
+	this.id = id;
+	this.table = document.getElementById( id );	
+}
+
+/**
+ * Given a table id, use stripes for its rows
+ *
+ * @param cssClass CSS class to be applied to odd rows. If none is provided, a class called
+ * "odd" will be used.
+ */
+Lifetype.UI.TableEffects.prototype.stripe = function( cssClass )
+{
+	if( this.table ) 
+		var tbodies = this.table.getElementsByTagName("tbody");
+	else
+		var tbodies = document.getElementsByTagName("tbody");
+		
+	if( !cssClass ) 
+		cssClass = "odd";
+		
+	for (var i=0; i<tbodies.length; i++) {
+		var odd = true;
+		var rows = tbodies[i].getElementsByTagName("tr");
+		for (var j=0; j<rows.length; j++) {
+			if (odd == false) {
+				odd = true;
+			} 
+			else {
+				YAHOO.util.Dom.addClass( rows[j], cssClass );
+				odd = false;
+			}
+		}
+	}
+}
+
+/**
+ * Highlights the row where the mouse is
+ *
+ * @param cssClass The name of the CSS cssClass to be applied to highlighted rows. If none is provided,
+ * a class called "highlightClass" will be used
+ */
+Lifetype.UI.TableEffects.prototype.highlightRows = function( cssClass )
+{
+	if(!document.getElementsByTagName) 
+		return false;
+	
+	if( !cssClass )
+		cssClass = "highlightClass";
+	
+	if( this.table )
+		var tbodies = this.table.getElementsByTagName("tbody");
+	else
+		var tbodies = document.getElementsByTagName("tbody");
+	
+	for (var j=0; j<tbodies.length; j++) {
+		var rows = tbodies[j].getElementsByTagName("tr");
+	  	for (var i=0; i<rows.length; i++) {
+			rows[i].onmouseover = function() {				
+				YAHOO.util.Dom.addClass( this, cssClass );
+			}
+			rows[i].onmouseout = function() {
+				YAHOO.util.Dom.removeClass( this, cssClass );
+			}
+		}
+	}
+}
\ No newline at end of file

Modified: plog/trunk/locale/locale_en_UK.php
===================================================================
--- plog/trunk/locale/locale_en_UK.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/locale/locale_en_UK.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -207,7 +207,7 @@
 $messages['extended_text'] = 'Extended Text';
 $messages['extended_text_help'] = 'Extended text of the post. This part can optionally appear only in the post page or in the main page. See the blog settings for more information.';
 $messages['trackback_urls'] = 'Real Trackback Urls';
-$messages['trackback_urls_help'] = 'If the article, you want to send the trackback to, does not support Trackback Auto-Discover mechanism, you may put its real trackback url here and use new a line for each url.';
+$messages['trackback_urls_help'] = 'If the article you want to send the trackback to does not support Trackback Auto-Discover mechanism, you may put its real trackback url here and use new a line for each url.';
 $messages['post_slug'] = 'Slug';
 $messages['post_slug_help'] = 'The slug will be used to generate nice permanent links.';
 $messages['date'] = 'Date';
@@ -1144,13 +1144,13 @@
 $messages['login_perm_desc'] = 'User is allowed to log in';
 // admin permissions
 $messages['add_blog_category_desc'] = 'User can add blog categories';
-$messages['add_global_article_category_desc'] = 'User can add global blog categories';
+$messages['add_global_article_category_desc'] = 'User can add global article categories';
 $messages['add_locale_desc'] = 'User can add new locales';
 $messages['add_permission_desc'] = 'User can add new permissions';
 $messages['add_site_blog_desc'] = 'User can add new blogs';
 $messages['add_template_desc'] = 'User can add new templates';
 $messages['add_user_desc'] = 'User can add new users';
-$messages['edit_blog_admin_mode_desc'] = 'User can administrate other blogs';
+$messages['edit_blog_admin_mode_desc'] = 'User can administrate other blogs (admin mode)';
 $messages['purge_data_desc'] = 'User can purge data';
 $messages['update_blog_category_desc'] = 'User can update and delete blog categories';
 $messages['update_global_article_category_desc'] = 'User can update and delete global article categories';
@@ -1213,8 +1213,8 @@
 $messages['comment_only_auth_users'] = 'Only authenticated users can comment';
 $messages['comment_only_auth_users_help'] = 'Only those users who have a valid user name and password and have logged in will be allowed to leave comments';
 $messages['show_comments_max'] = 'Comments per page';
-$messages['show_comments_max_help'] = 'Maximum number of comments per page';
-$messages['hard_show_comments_max_help'] = 'Hard limit for the number of comments per page';
+$messages['show_comments_max_help'] = 'Maximum number of comments per page [ Default = 20 ]';
+$messages['hard_show_comments_max_help'] = 'Hard limit for the number of comments per page [ Default = 50 ]';
 
 $messages['error_resource_not_whitelisted_extension'] = 'The type of the file is not one of the allowed ones.';
 $messages['help_upload_allowed_files'] = 'Space-separated list of file types that are allowed to be uploaded. Usage of \'*\' and \'?\' is allowed. If both upload_forbidden_file and this option are set, the whitelist (upload_allowed_files) takes precedence over the blacklist [Default = None]';
@@ -1225,7 +1225,7 @@
 
 $messages['editBlogUser'] = 'Edit Blog User';
 
-$messages['help_summary_service_name'] = 'Name of your site/service that will appear in several places in the front page as well as in the RSS feeds';
+$messages['help_summary_service_name'] = 'Name of your site/service that will appear in several places in the front page as well as in the RSS feeds [ Default = empty ]';
 
 $messages['register_step2_help'] = 'Please provide now the required information in order to create a blog.';
 
@@ -1237,4 +1237,18 @@
 $messages['posted_in'] = 'Posted in';
 
 $messages['purging_please_wait'] = 'Please wait while data is being purged. This page will keep refreshing itself until all data has been processed, please do not attempt to stop this process';
-?>
\ No newline at end of file
+
+$messages['error_cannot_delete_last_blog_category'] = 'You cannot delete the last blog category.';
+
+$messages['help_logout_destination_url'] = 'URL where users will be forwarded when logging out of the service, instead of the login page of the admin interface [ Default Value = empty ]';
+$messages['help_default_global_article_category_id'] = 'Identifier of the default global article category [ Default = empty ]';
+$messages['help_blog_does_not_exist_url'] = 'URL where users will be forwarded when they attempt to reach a blog that does not exist in this site, instead of being forwarded to the site\'s default blog [ Default = empty ]';
+
+$messages['error_invalid_blog_name'] = 'The blog name is not valid';
+$messages['bookmark_it_to_lifetype'] = 'Bookmark it to LifeType!';
+
+/* strings for /default/ templates */
+$messages['form_authenticated'] = 'Authenticated';
+
+$messages['help_forbidden_blognames'] = 'List of strings separated by a blank space that are not allowed to be used as blog names. It is possible to use regular expressions instead of plain strings. [ Default = (empty) ]';
+?>

Copied: plog/trunk/locale/locale_es_ES.php (from rev 4709, plog/branches/lifetype-1.2/locale/locale_es_ES.php)
===================================================================
--- plog/trunk/locale/locale_es_ES.php	                        (rev 0)
+++ plog/trunk/locale/locale_es_ES.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,1249 @@
+<?php
+// set this to the encoding that should be used to display the pages correctly
+$messages['encoding'] = 'iso-8859-1';
+$messages['locale_description'] = 'Traducción al español de LifeType';
+// locale format, see Locale::formatDate for more information
+$messages['date_format'] = '%d/%m/%Y %H:%M';
+
+// days of the week
+$messages['days'] = Array( 'Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado' );
+// -- compatibility, do not touch -- //
+$messages['Monday'] = $messages['days'][1];
+$messages['Tuesday'] = $messages['days'][2];
+$messages['Wednesday'] = $messages['days'][3];
+$messages['Thursday'] = $messages['days'][4];
+$messages['Friday'] = $messages['days'][5];
+$messages['Saturday'] = $messages['days'][6];
+$messages['Sunday'] = $messages['days'][0];
+
+// abbreviations
+$messages['daysshort'] = Array( 'Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa' );
+// -- compatibility, do not touch -- //
+$messages['Mo'] = $messages['daysshort'][1];
+$messages['Tu'] = $messages['daysshort'][2];
+$messages['We'] = $messages['daysshort'][3];
+$messages['Th'] = $messages['daysshort'][4];
+$messages['Fr'] = $messages['daysshort'][5];
+$messages['Sa'] = $messages['daysshort'][6];
+$messages['Su'] = $messages['daysshort'][0];
+
+// months of the year
+$messages['months'] = Array( 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' );
+// -- compatibility, do not touch -- //
+$messages['January'] = $messages['months'][0];
+$messages['February'] = $messages['months'][1];
+$messages['March'] = $messages['months'][2];
+$messages['April'] = $messages['months'][3];
+$messages['May'] = $messages['months'][4];
+$messages['June'] = $messages['months'][5];
+$messages['July'] = $messages['months'][6];
+$messages['August'] = $messages['months'][7];
+$messages['September'] = $messages['months'][8];
+$messages['October'] = $messages['months'][9];
+$messages['November'] = $messages['months'][10];
+$messages['December'] = $messages['months'][11];
+$messages['message'] = 'Mensaje';
+$messages['error'] = 'Error';
+$messages['date'] = 'Fecha';
+
+// miscellaneous texts
+$messages['of'] = 'de';
+$messages['recently'] = 'recientemente...';
+$messages['comments'] = 'comentarios';
+$messages['comment on this'] = 'Comentario';
+$messages['my_links'] = 'mis enlaces';
+$messages['archives'] = 'archivos';
+$messages['search'] = 'buscar';
+$messages['calendar'] = 'calendario';
+$messages['search_s'] = 'Buscar';
+$messages['search_this_blog'] = 'Buscar en esta bitácora:';
+$messages['about_myself'] = 'Quién soy?';
+$messages['permalink_title'] = 'Enlace permanente a los archivos';
+$messages['permalink'] = 'Enlace';
+$messages['posted_by'] = 'Escrito por';
+$messages['reply'] = 'Responder';
+
+// add comment form
+$messages['add_comment'] = 'Añadir comentario';
+$messages['comment_topic'] = 'Título';
+$messages['comment_text'] = 'Texto';
+$messages['comment_username'] = 'Tu nombre';
+$messages['comment_email'] = 'Dirección de correo (opcional)';
+$messages['comment_url'] = 'Página personal (opcional)';
+$messages['comment_send'] = 'Enviar';
+$messages['comment_added'] = 'Comentario añadido!';
+$messages['comment_add_error'] = 'Hubo un error añadiendo el comentario';
+$messages['article_does_not_exist'] = 'El artículo no existe';
+$messages['no_posts_found'] = 'No se encontraron artículos';
+$messages['user_has_no_posts_yet'] = 'El usuario todavía no ha escrito ningun artículo';
+$messages['back'] = 'Atrás';
+$messages['post'] = 'artículo';
+$messages['trackbacks_for_article'] = 'Retroenlaces del artículo: ';
+$messages['trackback_excerpt'] = 'Fragmento';
+$messages['trackback_weblog'] = 'Bitácora';
+$messages['search_results'] = 'Resultados de la búsqueda';
+$messages['search_matching_results'] = 'Los siguientes artículos han sido encontrados: ';
+$messages['search_no_matching_posts'] = 'No se encontraron artículos';
+$messages['read_more'] = '(Más)';
+$messages['syndicate'] = 'Agregar';
+$messages['main'] = 'Principal';
+$messages['about'] = 'Acerca de';
+$messages['download'] = 'Descargar';
+
+////// error messages /////
+$messages['error_fetching_article'] = 'El artículo especificado no existe.';
+$messages['error_fetching_articles'] = 'No se encontraron artículos';
+$messages['error_trackback_no_trackback'] = 'El artículo no ha recibido ningun retroenlace';
+$messages['error_incorrect_article_id'] = 'El identificador del artículo no es correcto';
+$messages['error_incorrect_blog_id'] = 'El identificador de la bitácora no es correcto';
+$messages['error_comment_without_text'] = 'El texto del comentario está vacío.';
+$messages['error_comment_without_name'] = 'Es necesario que dé su nombre o apodo.';
+$messages['error_adding_comment'] = 'Hubo un error añadiendo el comentario.';
+$messages['error_incorrect_parameter'] = 'Parámetro incorrecto.';
+$messages['error_parameter_missing'] = 'Falta un parámetro.';
+$messages['error_comments_not_enabled'] = 'Los comentarios han sido desactivados en esta bitácora.';
+$messages['error_incorrect_search_terms'] = 'Los términos de la búsqueda son incorrectos.';
+$messages['error_no_search_results'] = 'No se encontraros artículos que se correspondan con los términos de la búsqueda.';
+$messages['error_no_albums_defined'] = 'No hay ningun álbum disponible en esta bitácora.';
+
+/////////////////                                          //////////////////
+///////////////// STRINGS FOR THE ADMINISTRATION INTERFACE //////////////////
+/////////////////                                          //////////////////
+
+// login page
+$messages['login'] = 'Entrar';
+$messages['welcome_message'] = 'Bienvenido a LifeType';
+$messages['error_incorrect_username_or_password'] = 'El nombre de usuario o password es incorrecto.';
+$messages['error_dont_belong_to_any_blog'] = 'Su usuario no pertenece a ninguna bitácora todavía.';
+$messages['logout_message'] = 'Ha sido desconectado correctamente';
+$messages['logout_message_2'] = 'Haga clic <a href="%1$s">aquí</a> para ir a %2$s</a>.';
+$messages['error_access_forbidden'] = 'Acceso no permitido. Debe primero verificar su usuario aquí';
+$messages['username'] = 'Usuario';
+$messages['password'] = 'Password';
+
+// dashboard
+$messages['dashboard'] = 'Perspectiva';
+$messages['recent_articles'] = 'Artículos recientes';
+$messages['recent_comments'] = 'Comentarios recientes';
+$messages['recent_trackbacks'] = 'Retroenlaces recientes';
+$messages['blog_statistics'] = 'Estadísticas';
+$messages['total_posts'] = 'Número de artículos';
+$messages['total_comments'] = 'Número de comentarios';
+$messages['total_trackbacks'] = 'Número de trackbacks';
+$messages['total_viewed'] = 'Artículos leídos';
+$messages['in'] = 'En';
+
+// menu options
+$messages['newPost'] = 'Nuevo Artículo';
+$messages['Manage'] = 'Contenido';
+$messages['managePosts'] = 'Artículos';
+$messages['editPosts'] = 'Artículos';
+$messages['editArticleCategories'] = 'Categorias';
+$messages['newArticleCategory'] = 'Nueva Categoria';
+$messages['manageLinks'] = 'Enlaces';
+$messages['editLinks'] = 'Enlaces';
+$messages['newLink'] = 'Nuevo Enlace';
+$messages['editLink'] = 'Editar Enlace';
+$messages['editLinkCategories'] = 'Editar Categorías de Enlaces';
+$messages['newLinkCategory'] = 'Nueva Categoría de Enlaces';
+$messages['editLinkCategory'] = 'Editar Categoría de Enlace';
+$messages['manageCustomFields'] = 'Campos';
+$messages['blogCustomFields'] = 'Campos';
+$messages['newCustomField'] = 'Nuevo Campo';
+$messages['resourceCenter'] = 'Ficheros';
+$messages['resources'] = 'Ficheros';
+$messages['newResourceAlbum'] = 'Nuevo Álbum';
+$messages['newResource'] = 'Nuevo Fichero';
+$messages['controlCenter'] = 'Configuración';
+$messages['manageSettings'] = 'Configuración';
+$messages['blogSettings'] = 'Configuración de la Bitácora';
+$messages['userSettings'] = 'Configuración del Usuario';
+$messages['pluginCenter'] = 'Plugins';
+$messages['Stats'] = 'Estadísticas';
+$messages['manageBlogUsers'] = 'Usuarios de la Bitácora';
+$messages['newBlogUser'] = 'Invitar Usuario';
+$messages['showBlogUsers'] = 'Usuarios de la Bitácora';
+$messages['manageBlogTemplates'] = 'Plantillas';
+$messages['newBlogTemplate'] = 'Añadir Plantilla';
+$messages['blogTemplates'] = 'Plantillas de la Bitácora';
+$messages['adminSettings'] = 'Administración';
+$messages['Users'] = 'Usuarios';
+$messages['createUser'] = 'Nuevo Usuario';
+$messages['editSiteUsers'] = 'Usuarios';
+$messages['Blogs'] = 'Bitácoras';
+$messages['createBlog'] = 'Nueva Bitácora';
+$messages['editSiteBlogs'] = 'Bitácoras';
+$messages['Locales'] = 'Traducciones';
+$messages['newLocale'] = 'Nueva Traducción';
+$messages['siteLocales'] = 'Traducciones';
+$messages['Templates'] = 'Plantillas';
+$messages['newTemplate'] = 'Añadir Plantilla';
+$messages['siteTemplates'] = 'Plantillas';
+$messages['GlobalSettings'] = 'Configuración General';
+$messages['editSiteSettings'] = 'General';
+$messages['summarySettings'] = 'Portal';
+$messages['templateSettings'] = 'Plantillas';
+$messages['urlSettings'] = 'Direcciones';
+$messages['emailSettings'] = 'Email';
+$messages['uploadSettings'] = 'Transferencias';
+$messages['helpersSettings'] = 'Herramientas';
+$messages['interfacesSettings'] = 'Interfaces';
+$messages['securitySettings'] = 'Seguridad';
+$messages['bayesianSettings'] = 'Filtro Bayesiano';
+$messages['resourcesSettings'] = 'Ficheros';
+$messages['searchSettings'] = 'Búsquedas';
+$messages['cleanUpSection'] = 'Limpieza';
+$messages['cleanUp'] = 'Limpieza';
+$messages['editResourceAlbum'] = 'Editar Álbum';
+$messages['resourceInfo'] = 'Editar Fichero';
+$messages['editBlog'] = 'Editar Plantilla';
+$messages['Logout'] = 'Salir';
+
+// new post
+$messages['topic'] = 'Título';
+$messages['topic_help'] = 'Título del artículo';
+$messages['text'] = 'Texto';
+$messages['text_help'] = 'Texto del artículo. Esta parte siempre aparecerá en la página principal de la bitácora';
+$messages['extended_text'] = 'Texto extra';
+$messages['extended_text_help'] = 'Texto extra del artículo. Esta parte puede aparecer o bien siempre en la primera página o en la página del artículo. Esto es configurable en la página de configuración de la bitácora';
+$messages['post_slug'] = 'Título URL';
+$messages['post_slug_help'] = 'El título URL será usado para generar enlaces permanentes con un mayor significado semántico';
+$messages['date'] = 'Fecha';
+$messages['post_date_help'] = 'Fecha cuando este artículo debería ser publicado';
+$messages['status'] = 'Estado';
+$messages['post_status_help'] = 'Elija uno de los siguientes estados';
+$messages['post_status_published'] = 'Publicado';
+$messages['post_status_draft'] = 'Borrador';
+$messages['post_status_deleted'] = 'Eliminado';
+$messages['categories'] = 'Categorías';
+$messages['post_categories_help'] = 'Seleccione una o más categorías';
+$messages['post_comments_enabled_help'] = 'Activar comentarios';
+$messages['send_notification_help'] = 'Enviar una notificación cuando se reciban nuevos comentarios o retroenlaces';
+$messages['send_trackback_pings_help'] = 'Envíar retroenlaces';
+$messages['send_xmlrpc_pings_help'] = 'Enviar pings vía XMLRPC';
+$messages['save_draft_and_continue'] = 'Guardar Borrador';
+$messages['preview'] = 'Vista Previa';
+$messages['add_post'] = 'Añadir!';
+$messages['error_saving_draft'] = 'Hubo un error guardando el borrador';
+$messages['draft_saved_ok'] = 'Borrador guardado correctamente';
+$messages['error_sending_request'] = 'Hubo un error enviando la petición';
+$messages['error_no_category_selected'] = 'Debe seleccionar por lo menos una categoría';
+$messages['error_missing_post_topic'] = 'El título del artículo está vacío';
+$messages['error_missing_post_text'] = 'El texto del artículo está vacío';
+$messages['error_adding_post'] = 'Hubo un error guardando el artículo';
+$messages['post_added_not_published'] = 'El artículo ha sido guardado correctamente pero no aparecerá en la página principal';
+$messages['post_added_ok'] = 'El artículo ha sido guardado correctamente.';
+$messages['send_notifications_ok'] = 'Se enviará un mensaje cada vez que se reciba un comentario o retroenlace';
+
+// send trackbacks
+$messages['error_sending_trackbacks'] = 'Hubo un error enviando un retroenlace a los siguientes sitios';
+$messages['send_trackbacks_help'] = 'Seleccione las direcciones a las que quiere enviar un retroenlace. Asegúrese de que las direcciones soportan retroenlaces.';
+$messages['send_trackbacks'] = 'Enviar retroenlaces';
+$messages['ping_selected'] = 'Enviar retroenlaces';
+$messages['trackbacks_sent_ok'] = 'Los retroenlaces fueron enviados correctamente a las direcciones seleccionadas';
+
+// posts page
+$messages['show_by'] = 'Mostrar';
+$messages['category'] = 'Categoría';
+$messages['author'] = 'Autor';
+$messages['post_status_all'] = 'Todos';
+$messages['author_all'] = 'Todos';
+$messages['search_terms'] = 'Búsqueda';
+$messages['show'] = 'Mostrar';
+$messages['delete'] = 'Eliminar';
+$messages['actions'] = 'Acciones';
+$messages['all'] = 'Todos';
+$messages['category_all'] = 'Todas';
+$messages['error_incorrect_article_id'] = 'El identificador de artículo es incorrecto.';
+$messages['error_deleting_article'] = 'Hubo un error eliminando el artículo "%s"';
+$messages['article_deleted_ok'] = 'El artículo "%s" fue eliminado correctamente';
+$messages['articles_deleted_ok'] = '%s articulos fueron eliminados correctamente';
+$messages['error_deleting_article2'] = 'Hubo un error eliminando el artículo cuyo identificador es "%s"';
+
+// edit post page
+$messages['update'] = 'Actualizar';
+$messages['editPost'] = 'Editar Artículo';
+$messages['error_fetching_post'] = 'Hubo un error cargando el artículo';
+$messages['post_updated_ok'] = 'El artículo "%s" fue actualizado corrrectamente';
+$messages['error_updating_post'] = 'Hubo un error actualizando el artículo';
+$messages['notification_added'] = 'Se enviará un mensaje cada vez que se reciba un comentario o retroenlace';
+$messages['notification_removed'] = 'No se enviarán mensajes en caso de comentarios o retroenlaces';
+
+// post comments
+$messages['url'] = 'Dirección';
+$messages['comment_status_all'] = 'Todos';
+$messages['comment_status_spam'] = 'Spam';
+$messages['comment_status_nonspam'] = 'No Spam';
+$messages['error_fetching_comments'] = 'Hubo un error cargando los artículos del comentario';
+$messages['error_deleting_comments'] = 'Hubo un error eliminando los comentarios o no se seleccionó ningún comentario a eliminar';
+$messages['comment_deleted_ok'] = 'El comentario "%s" fue eliminado correctamente';
+$messages['comments_deleted_ok'] = '%s comentarios eliminados correctamente';
+$messages['error_deleting_comment'] = 'Hubo un error eliminando el comentario "%s"';
+$messages['error_deleting_comment2'] = 'Hubo un error eliminando el comentario cuyo identificador es %s';
+$messages['editComments'] = 'Comentarios';
+$messages['mark_as_spam'] = 'Marcar como spam';
+$messages['mark_as_no_spam'] = 'Marcar como no spam';
+$messages['error_incorrect_comment_id'] = 'El identificador del comentario no es correcto';
+$messages['error_marking_comment_as_spam'] = 'Hubo un error marcando el comentario como spam';
+$messages['comment_marked_as_spam_ok'] = 'El comentario fue marcado como spam correctamente';
+$messages['error_marking_comment_as_nonspam'] = 'Hubo un error marcando el comentario como no spam';
+$messages['comment_marked_as_nonspam_ok'] = 'El comentario fue marcado como no spam correctamente';
+
+// post trackbacks
+$messages['blog'] = 'Bitácora';
+$messages['excerpt'] = 'Fragmento';
+$messages['error_fetching_trackbacks'] = 'Hubo un error cargando los retroenlaces recibidos';
+$messages['error_deleting_trackbacks'] = 'Hubo un error eliminando los retroenlaces o no se seleccionó ningún retroenlace a eliminar';
+$messages['error_deleting_trackback'] = 'Hubo un error borrando el retroenlace "%s"';
+$messages['error_deleting_trackback2'] = 'Hubo un error eliminando el retroenlace cuyo identificador es "%s"';
+$messages['trackback_deleted_ok'] = 'Retroenlace "%s" eliminado correctamente';
+$messages['trackbacks_deleted_ok'] = '%s retroenlaces eliminados correctamente';
+$messages['editTrackbacks'] = 'Retroenlaces';
+
+// post statistics
+$messages['referrer'] = 'Referencia';
+$messages['hits'] = 'Hits';
+$messages['error_no_items_selected'] = 'No se seleccionaron referencias a eliminar';
+$messages['error_deleting_referrer'] = 'Hubo un error eliminando la referencia "%s"';
+$messages['error_deleting_referrer2'] = 'Hubo un error eliminando la referencia cuyo identificador es "%s"';
+$messages['referrer_deleted_ok'] = 'La referencia "%s" fue eliminada correctamente';
+$messages['referrers_deleted_ok'] = '%s referencias eliminadas correctamente';
+
+// categories
+$messages['posts'] = 'Artículos';
+$messages['show_in_main_page'] = 'Incluir en la página principal';
+$messages['error_incorrect_category_id'] = 'El identificador de la categoría no es correcto o no se seleccionaron categorías a borrar';
+$messages['error_category_has_articles'] = 'La categoría "%s" no se puede borrar porque está siendo usada por algunos artículos. Edite primero los artículos y vuelva a intentar eliminar la categoría.';
+$messages['category_deleted_ok'] = 'La categoría "%s" fue eliminada correctamente';
+$messages['categories_deleted_ok'] = '%s categorías eliminadas correctamente';
+$messages['error_deleting_category'] = 'Hubo un error eliminando la categoría "%s"';
+$messages['error_deleting_category2'] = 'Hubo un error eliminando la categoría cuyo identificador es "%s"';
+$messages['yes'] = 'Sí';
+$messages['no'] = 'No';
+
+// new category
+$messages['name'] = 'Nombre';
+$messages['category_name_help'] = 'Nombre de la categoría tal y como aparecerá en la bitácora';
+$messages['description'] = 'Descripción';
+$messages['category_description_help'] = 'Descripción de la categoría';
+$messages['show_in_main_page_help'] = 'Si se desactiva, los artículos categorizados bajo esta categoría no serán mostrados en la página principal y solo serán visibles en la página propia de la categoría';
+$messages['error_empty_name'] = 'El nombre no puede estar vacío';
+$messages['error_empty_description'] = 'La descripción no puede estar vacía';
+$messages['error_adding_article_category'] = 'Hubo un error añadiendo la categoría. Verifique los datos y vuélvalo a intentar';
+$messages['category_added_ok'] = 'La categoría "%s" fue añadida correctamente a la bitácora';
+$messages['add'] = 'Añadir';
+$messages['reset'] = 'Limpiar';
+
+// update category
+$messages['error_updating_article_category'] = 'Hubo un error actualizando la categoría';
+$messages['error_fetching_category'] = 'Hubo un error cargando la categoría';
+$messages['article_category_updated_ok'] = 'La categoría "%s" fue actualizada correctamente';
+
+// links
+$messages['feed'] = 'Contenidos RSS';
+$messages['error_no_links_selected'] = 'El identificador del enlace no es correcto o no se seleccionaron enlaces a eliminar';
+$messages['error_incorrect_link_id'] = 'El identificador del enlace no es correcto';
+$messages['error_removing_link'] = 'Hubo un error eliminando el enlace "%s"';
+$messages['error_removing_link2'] = 'Hubo un error eliminando el enlace cuyo identificador es "%s"';
+$messages['link_deleted_ok'] = 'El enlace "%s" fue eliminado correctamente';
+$messages['links_deleted_ok'] = '%s enlaces fueron eliminados correctamente';
+
+// new link
+$messages['link_name_help'] = 'Nombre para el enlace';
+$messages['link_url_help'] = 'Dirección del enlace';
+$messages['link_description_help'] = 'Breve descripción sobre el enlace';
+$messages['link_feed_help'] = 'Enlace a una fuende de contenidos RSS o Atom del enlace';
+$messages['link_category_help'] = 'Elija una de las categorías de enlace disponibles';
+$messages['error_adding_link'] = 'Se produjo un error añadiendo el enlace. Verifique los datos y vuélvalo a intentar';
+$messages['error_invalid_url'] = 'La dirección no es correcta';
+$messages['link_added_ok'] = 'El enlace "%s" fue añadido correctamente';
+
+// update link
+$messages['error_updating_link'] = 'Se produjo un error actualizando el enlace. Verifique los datos y vuélvalo a intentar';
+$messages['error_fetching_link'] = 'Se produjo un error al cargar en enlace';
+$messages['link_updated_ok'] = 'El enlace "%s" fue actualizado correctamente';
+
+// link categories
+$messages['links'] = 'Enlaces';
+$messages['error_invalid_link_category_id'] = 'El identificador de la categoría de enlaces no es correcto o no se eligió ninguna categoría de enlaces';
+$messages['error_links_in_link_category'] = 'Hay algunos enlaces clasificados bajo la categoría "%s". Modifique los enlaces primero y vuélvalo a intentar.';
+$messages['error_removing_link_category'] = 'Hubo un error eliminando la categoría de enlaces "%s"';
+$messages['link_category_deleted_ok'] = 'La categoría de enlaces "%s" fue eliminada correctamente';
+$messages['link_categories_deleted_ok'] = '%s categorías de enlaces fueron eliminadas correctamente';
+$messages['error_removing_link_category2'] = 'Hubo un error eliminando la categoría de enlaces cuyo identificador es "%s"';
+
+// new link category
+$messages['link_category_name_help'] = 'Nombre dado a esta categoría de enlaces';
+$messages['error_adding_link_category'] = 'Hubo un error añadiendo la nueva categoría de enlaces';
+$messages['link_category_added_ok'] = 'La categoría de enlaces "%s" fue añadida correctamente';
+
+// edit link category
+$messages['error_updating_link_category'] = 'Hubo un error actualizando la categoría de enlace. Compruebe los datos y vuélvalo a intentar.';
+$messages['link_category_updated_ok'] = 'La categoría de enlaces "%s" fue actualizada correctamente';
+$messages['error_fetching_link_category'] = 'Se produjo un error cargando la categoría de enlaces';
+
+// custom fields
+$messages['type'] = 'Tipo';
+$messages['hidden'] = 'Oculto';
+$messages['fields_deleted_ok'] = '%s campos eliminados correctamente';
+$messages['field_deleted_ok'] = 'El campo "%s" fue borrado correctamente';
+$messages['error_deleting_field'] = 'Hubo un error eliminando el campo "%s"';
+$messages['error_deleting_field2'] = 'Hubo un error eliminando el campo cuyo identificador es "%s"';
+$messages['error_incorrect_field_id'] = 'El identificador del campo no es correcto';
+
+// new custom field
+$messages['field_name_help'] = 'Nombre del campo que será usado para obtener su valor en los artículos';
+$messages['field_description_help'] = 'Descripción del campo que será mostrada al añadir o editar un artículo';
+$messages['field_type_help'] = 'Elija uno de los siguientes tipos de campo';
+$messages['field_hidden_help'] = 'Si el campo está marcado como oculto, no será mostrado en las pantallas de edición o nuevo artículo. Este atributo es usado casi únicamente por plugins que añaden nuevos campos para su uso';
+$messages['error_adding_custom_field'] = 'Hubo un error añadiendo el campo. Compruebe los datos y vuélvalo a intentar';
+$messages['custom_field_added_ok'] = 'El campo "%s" fue añadido correctamente';
+$messages['text_field'] = 'Campo de texto';
+$messages['text_area'] = 'Caja de texto';
+$messages['checkbox'] = 'Casilla';
+$messages['date_field'] = 'Campo de fecha';
+
+// edit custom field
+$messages['error_fetching_custom_field'] = 'Hubo un error cargando el campo';
+$messages['error_updating_custom_field'] = 'Hubo un error actualizando el capmo. Compruebe los datos y vuélvalo a intentar';
+$messages['custom_field_updated_ok'] = 'El campo "%s" fue actualizado correctamente';
+
+// resources
+$messages['root_album'] = 'Álbum raíz';
+$messages['num_resources'] = 'Número de ficheros';
+$messages['total_size'] = 'Tamaño total';
+$messages['album'] = 'Álbum';
+$messages['error_incorrect_album_id'] = 'El identificador del álbum no es válido';
+$messages['error_base_storage_folder_missing_or_unreadable'] = 'No fue posible crear los directorios necesarios donde los ficheros van a ser guardados. Esto puede ser debido a varias razones, como por ejemplo que el "safe mode" esté activado en su configuración del PHP or que el usuario usado para ejecutar PHP no tenga suficientes permisos. También puede intentar crear los siguientes directorios manualmente: <br/><br/>%s<br/><br/>Si los directorios ya existen, asegúrese de que pueden ser leídos y escritos por el usuario que se está usando para ejecutar el servidor de web/PHP';
+$messages['items_deleted_ok'] = '%s ficheros eliminados correctamente';
+$messages['error_album_has_children'] = 'El álbum "%s" tiene subálbums. Modifique primero los subálbums y vuélvalo a intentar';
+$messages['item_deleted_ok'] = 'El fichero "%s" fue borrado correctamente';
+$messages['error_deleting_album'] = 'Hubo un error eliminando el campo "%s"';
+$messages['error_deleting_album2'] = 'Hubo un error eliminando el campo cuyo identificador es "%s"';
+$messages['error_deleting_resource'] = 'Hubo un error eliminando el fichero "%s"';
+$messages['error_deleting_resource2'] = 'Hubo un error eliminando el fichero cuyo identificador es "%s"';
+$messages['error_no_resources_selected'] = 'No se seleccionaron ficheros o álbums para eliminar';
+$messages['resource_deleted_ok'] = 'El fichero "%s" fue eliminado correctamente';
+$messages['album_deleted_ok'] = 'El álbum "%s" fue eliminado correctamente';
+$messages['add_resource'] = 'Añadir fichero';
+$messages['add_resource_preview'] = 'Añadir vista previa';
+$messages['add_resource_medium'] = 'Add vista mediana';
+$messages['add_album'] = 'Añadir álbum';
+
+// new album
+$messages['album_name_help'] = 'Nombre del nuevo álbum';
+$messages['parent'] = 'Padre';
+$messages['no_parent'] = 'Álbum raíz';
+$messages['parent_album_help'] = 'Álbums pueden contener subálbums de forma que pueda organizar sus contenidos mejor';
+$messages['album_description_help'] = 'Descripción de los contenidos del álbum';
+$messages['error_adding_album'] = 'Hubo un error añadiendo el nuevo álbum. Compruebe los datos y vuélvalo a intentar';
+$messages['album_added_ok'] = 'El álbum "%s" fue añadido correctamente';
+
+// edit album
+$messages['error_incorrect_album_id'] = 'El identificador del álbum no es correcto';
+$messages['error_fetching_album'] = 'Hubo un error cargando el álbum';
+$messages['error_updating_album'] = 'Hubo un error actualizando el álbum. Compruebe los datos y vuélvalo a intentar';
+$messages['album_updated_ok'] = 'El álbum "%s" fue actualizado correctamente';
+$messages['show_album_help'] = 'Si esta casilla está desactivada, el álbum y los ficheros que estén incluídos en él no aparecerán en la parte pública del blog';
+
+// new resource
+$messages['file'] = 'Fichero';
+$messages['resource_file_help'] = 'Fichero que desea añadir. Use el enlace "Añadir Otro" para añadir más de un fichero al mismo tiempo (aunque tardará más rato en terminar la operación)';
+$messages['add_field'] = 'Añadir otro';
+$messages['resource_description_help'] = 'Descripción sobre los contenidos del fichero';
+$messages['resource_album_help'] = 'Seleccione el álbum al que se añadirá el fichero';
+$messages['error_no_resource_uploaded'] = 'No seleccionó ningún fichero para añadir';
+$messages['resource_added_ok'] = 'El fichero "%s" fue añadido correctamente';
+$messages['error_resource_forbidden_extension'] = 'El fichero no fue añadido porque es de un tipo no permitido por el administrador';
+$messages['error_resource_too_big'] = 'El fichero no fue añadido porque es demasiado grande';
+$messages['error_uploads_disabled'] = 'El fichero no fue añadido porque la posibilidad de añadir ficheros ha sido desactivada por el administrador';
+$messages['error_quota_exceeded'] = 'El fichero no fue añadido porque se ha superado el tamaño máximo total de ficheros permitido para nuestra bitácora';
+$messages['error_adding_resource'] = 'Hubo un error añadiendo el fichero';
+
+// edit resource
+$messages['editResource'] = 'Editar fichero';
+$messages['resource_information_help'] = 'Información sobre el fichero';
+$messages['information'] = 'Información';
+$messages['size'] = 'Tamaño';
+$messages['format'] = 'Formato';
+$messages['dimensions'] = 'Dimensiones';
+$messages['bits_per_sample'] = 'Bits por muestra';
+$messages['sample_rate'] = 'Frecuencia de muestreo';
+$messages['number_of_channels'] = 'Número de canales';
+$messages['legnth'] = 'Duración';
+$messages['thumbnail_format'] = 'Formato de la vista previa';
+$messages['regenerate_preview'] = 'Regenerar vista previa';
+$messages['error_fetching_resource'] = 'Hubo un error cargando el fichero';
+$messages['error_updating_resource'] = 'Hubo un error actualizando el fichero';
+$messages['resource_updated_ok'] = 'El fichero "%s" fue actualizado correctamente';
+
+// blog settings
+$messages['blog_link'] = 'Dirección';
+$messages['blog_link_help'] = 'Enlace permanente a esta bitácora';
+$messages['blog_name_help'] = 'Título de esta bitácora';
+$messages['blog_description_help'] = 'Descripción de los contenidos de esta bitácora';
+$messages['language'] = 'Idioma';
+$messages['blog_language_help'] = 'Idioma usado para mostrar los textos de tanto la parte pública como la parte privada de la bitácora';
+$messages['max_main_page_items'] = 'Artículos mostrados en la página principal';
+$messages['max_main_page_items_help'] = 'Máximo número de artículos que deben ser mostrados en la página principal de la bitácora';
+$messages['max_recent_items'] = 'Número de artículos recientes';
+$messages['max_recent_items_help'] = 'Máximo número de artículos recientes que deben ser mostrados';
+$messages['template'] = 'Plantilla';
+$messages['choose'] = 'Elegir';
+$messages['blog_template_help'] = 'Plantilla que será usada para mostrar los contenidos de la bitácora. Esta lista incluye las plantillas globales además de las plantillas que han sido instaladas exclusivamente para esta bitácora';
+$messages['use_read_more'] = 'Añadir el enlace "Más..." a los artículos';
+$messages['use_read_more_help'] = 'Si se activa, sólo el texto que se introdució en la caja de texto marcada como "Texto" en la página de edición de artículos se mostrará en la página principal y se añadirá un enlace titulado "Más..." al final del texto. El resto del artículo se mostrará en la página propia del artículo. Si se desactiva, el artículo entero se mostrará siempre en la página principal';
+$messages['enable_wysiwyg'] = 'Activar el editor visual de artículos';
+$messages['enable_wysiwyg_help'] = 'Activa el editor visual de código HTML, que muestra el contenido del artículo tal cual aparecerá en la bitácora. Esta funcionalidad requiere Internet Explorer 5.5 o Mozilla 1.3 o superiores';
+$messages['enable_comments'] = 'Permitir comentarios por defecto';
+$messages['enable_comments_help'] = 'Permite comentarios en todos los artículos por defecto, aunque los comentarios se pueden activar o desactivar a voluntad específicamente para cada artículo';
+$messages['show_future_posts'] = 'Mostrar los artículos con fecha en el futuro';
+$messages['show_future_posts_help'] = 'Muestra los artículos que tengan fetcha futura en el calendario y en la página principal';
+$messages['comments_order'] = 'Ordern de los comentarios';
+$messages['comments_order_help'] = 'Orden en que los comentarios de un artículo deben ser mostrados';
+$messages['oldest_first'] = 'Los antiguos primero';
+$messages['newest_first'] = 'Los nuevos primero';
+$messages['categories_order'] = 'Orden de las categorías';
+$messages['categories_order_help'] = 'Orden en que las categorías deben ser mostradas en la página principal';
+$messages['most_recent_updated_first'] = 'Las categorías que se hayan actualizado más recientemente primero';
+$messages['alphabetical_order'] = 'Orden alfabético';
+$messages['reverse_alphabetical_order'] = 'Orden alfabético inverso';
+$messages['most_articles_first'] = 'Las que tengan más artículos primero';
+$messages['link_categories_order'] = 'Orden de las categorías de enlaces';
+$messages['link_categories_order_help'] = 'Orden en que las categorías de enlaces deben ser mostradas en la página principal';
+$messages['most_links_first'] = 'Las que tengan más enlaces primero';
+$messages['most_links_last'] = 'Las que tengan menos enlaces primero';
+$messages['time_offset'] = 'Diferencia horaria';
+$messages['time_offset_help'] = 'Diferencia horaria en número de horas que será añadida dinámicamente a cada fecha y hora mostrada en la bitácora';
+$messages['close'] = 'Cerrar';
+$messages['select'] = 'Seleccionar';
+$messages['error_updating_settings'] = 'Hubo un error actualizando la configuración de la bitácora. Compruebe los datos y vuélvalo a intentar';
+$messages['error_invalid_number'] = 'El valor no es correcto';
+$messages['error_incorrect_time_offset'] = 'El valor de la diferencia horaria no es correcto';
+$messages['blog_settings_updated_ok'] = 'La configuración de la bitácora fue guardada correctamente';
+$messages['hours'] = 'Horas';
+
+// user settings
+$messages['username_help'] = 'Nombre de usuario, no puede ser cambiado';
+$messages['full_name'] = 'Nombre completo';
+$messages['full_name_help'] = 'Nombre completo, opcional';
+$messages['password_help'] = 'Cambie el password y confírmelo, o deje los campos vacíos si no desea hacer ningun cambio.';
+$messages['confirm_password'] = 'Confirmar el password';
+$messages['email'] = 'Direccion de correo';
+$messages['email_help'] = 'Dirección de correo donde las notificaciones serán enviadas';
+$messages['bio'] = 'Descripción personal';
+$messages['bio_help'] = 'Descripción personal, opcional';
+$messages['picture'] = 'Foto';
+$messages['user_picture_help'] = 'Puede elegir una foto de las disponibles en esta bitácora como fichero para que sea su foto personal';
+$messages['error_invalid_password'] = 'El password no es correcto o por ejemplo, es demasiado corto';
+$messages['error_passwords_dont_match'] = 'El password y la confirmación no son iguales';
+$messages['error_incorrect_email_address'] = 'La dirección de correo no es válida';
+$messages['error_updating_user_settings'] = 'Hubo un error guardando sus datos. Compruebe los datos y vuélvalo a intentar';
+$messages['user_settings_updated_ok'] = 'Los datos de usuario fueron guardados correctamente';
+$messages['resource'] = 'Fichero';
+
+// plugin centre
+$messages['identifier'] = 'Identificador';
+$messages['error_plugins_disabled'] = 'La funcionalidad de plugins ha sido desactivada por el administrador.';
+
+// blog users
+$messages['revoke_permissions'] = 'Quitar permisos';
+$messages['error_no_users_selected'] = 'No se seleccionó ningun usuario';
+$messages['user_removed_from_blog_ok'] = 'El usuario "%s" ya no tiene permisos para acceder a esta bitácora';
+$messages['users_removed_from_blog_ok'] = '%s usuarios ya no tienen acceso a esta bitácora';
+$messages['error_removing_user_from_blog'] = 'Hubo un error eliminando el acceso a esta bitácora del usuario "%s"';
+$messages['error_removing_user_from_blog2'] = 'Hubo un error eliminando el acceso a esta bitácora del usuario cuyo identificador es "%s"';
+
+// new blog user
+$messages['new_blog_username_help'] = 'Nombre del usuario al que se quiere dar acceso a esta bitácora. El usuario solo tendrá acceso a las secciones "Contenido" y "Ficheros"';
+$messages['send_notification'] = 'Enviar notificación';
+$messages['send_user_notification_help'] = 'Enviar un mensaje de notificación a este usuario';
+$messages['notification_text'] = 'Texto';
+$messages['notification_text_help'] = 'Texto que será incluido en la notificación enviada a este usuario';
+$messages['error_adding_user'] = 'Hubo un error dando acceso al usuario. Compruebe los datos y vuélvalo a intentar';
+$messages['error_empty_text'] = 'El texto de la notificación no puede estar vacío';
+$messages['error_invalid_user'] = 'El usuario "%s" no es válido o no existe';
+$messages['user_added_to_blog_ok'] = 'El usuario "%s" ya puede acceder a esta bitácora';
+
+// blog templates
+$messages['error_no_templates_selected'] = 'No se selecciaron plantillas';
+$messages['error_template_is_current'] = 'La plantilla "%s" no se puede eliminar porque es la que está usando la bitácora';
+$messages['error_removing_template'] = 'Hubo un error borrando la plantilla "%s"';
+$messages['template_removed_ok'] = 'La plantilla "%s" fue eliminada correctamente';
+$messages['templates_removed_ok'] = '%s plantillas fueron eliminadas correctamente';
+
+// new blog template
+$messages['template_installed_ok'] = 'La plantilla "%s" fue añadida correctamente';
+$messages['error_installing_template'] = 'Hubo un error añadiendo la plantilla "%s"';
+$messages['error_missing_base_files'] = 'La plantilla no pudo ser añadida porque algunos de los ficheros básicos de la plantilla no están disponibles';
+$messages['error_add_template_disabled'] = 'No se pueden añadir nuevas plantillas porque esta posibilidad ha sido desactivada por el administrador';
+$messages['error_must_upload_file'] = 'No se envió ningun fichero con datos de una plantilla';
+$messages['error_uploads_disabled'] = 'La posibilidad de enviar ficheros al servidor ha sido desactivada por el administrador';
+$messages['error_no_new_templates_found'] = 'No se encontraron nuevas plantillas';
+$messages['error_template_not_inside_folder'] = 'Los ficheros de la plantilla se deben guardar dentro de un directorio cuyo nombre debe ser el mismo que el de la plantilla';
+$messages['error_unpacking'] = 'Hubo un error descomprimiendo el fichero de la plantilla';
+$messages['error_forbidden_extensions'] = 'Algunos de los ficheros de la plantilla contenían una extensión no permitida en este sitio';
+$messages['error_creating_working_folder'] = 'Hubo un error creando un directorio temporal para descomprimir la plantilla';
+$messages['error_checking_template'] = 'Hubo un error comprobando que la plantilla es correcta: %s';
+$messages['template_package'] = 'Plantilla';
+$messages['blog_template_package_help']  = 'Use este formulario para enviar nuevas plantillas al servidor. Éstas plantillas solo estarán disponibles para esta bitácora. Si no es posible enviar ficheros, use por ejemplo un cliente de FTP para subir los ficheros y colóquelos en el directorio <b>%s</b> y luego use el botón "<b>Actualizar plantillas</b>" para añadir cualquier plantilla nueva. LifeType comprobará el contenido del directorio y añadirá automáticamente todas las plantillas nuevas';
+$messages['scan_templates'] = 'Actualizar plantillas';
+
+// site users
+$messages['user_status_active'] = 'Activo';
+$messages['user_status_disabled'] = 'Desactivado';
+$messages['user_status_all'] = 'Todos';
+$messages['user_status_unconfirmed'] = 'Sin confirmar';
+$messages['error_invalid_user2'] = 'El usuario cuyo identificador es "%s" no existe';
+$messages['error_deleting_user'] = 'Hubo un error desactivando el usuario "%s"';
+$messages['user_deleted_ok'] = 'El usuario "%s" fue desactivado correctamente';
+$messages['users_deleted_ok'] = '%s usuarios fueron desactivados correctamente';
+
+// create user
+$messages['user_added_ok'] = 'El usuario "%s" fue añadido correctamente';
+$messages['user_status_help'] = 'Estado del usuario';
+$messages['user_blog_help'] = 'Bitácora a la que este usuario será asignado inicialmente';
+$messages['none'] = 'Ninguno';
+
+// edit user
+$messages['error_invalid_user'] = 'El nombre de usuario no es correcto o no existe';
+$messages['error_updating_user'] = 'Hubo un error actualizando el usuario. Compruebe los datos y vuélvalo a intentar';
+$messages['blogs'] = 'Bitácoras';
+$messages['user_blogs_help'] = 'Bitácoras a las que el usuario tiene acceso como usuario o como propietario de la bitácora';
+$messages['site_admin'] = 'Administrador';
+$messages['site_admin_help'] = 'Dar permisos de administrador a este usuario de forma que pueda acceder a la sección de "Administración"';
+$messages['user_updated_ok'] = 'El usuario "%s" fue actualizado correctamente';
+
+// site blogs
+$messages['blog_status_all'] = 'Todas';
+$messages['blog_status_active'] = 'Activas';
+$messages['blog_status_disabled'] = 'Desactivada';
+$messages['blog_status_unconfirmed'] = 'Sin confirmar';
+$messages['owner'] = 'Propietario';
+$messages['quota'] = 'Cuota';
+$messages['bytes'] = 'bytes';
+$messages['error_no_blogs_selected'] = 'No se seleccionaron bitácoras para desactivar';
+$messages['error_blog_is_default_blog'] = 'La bitácora "%s" no se puede desactivar porque es la bitácora por defecto';
+$messages['blog_deleted_ok'] = 'La bitácora "%s" fue desactivada correctamente';
+$messages['blogs_deleted_ok'] = '%s fueron desactivadas correctamente';
+$messages['error_deleting_blog'] = 'Hubo un error desactivando la bitácora "%s"';
+$messages['error_deleting_blog2'] = 'Hubo un error desactivando la bitácora cuyo identificador es "%s"';
+
+// create blog
+$messages['error_adding_blog'] = 'Hubo un error añadiendo la bitácora. Compruebe los datos y vuélvalo a intentar';
+$messages['blog_added_ok'] = 'La bitácora "%s" fue añadida correctamente';
+
+// edit blog
+$messages['blog_status_help'] = 'Estado de la bitácora';
+$messages['blog_owner_help'] = 'Propietario de la bitácora, que tendrá control sobre su configuración';
+$messages['users'] = 'Usuarios';
+$messages['blog_quota_help'] = 'Cuota de ficheros en bytes. Use un valor de 0 para otorgar espacio ilimitado';
+$messages['blog_users_help'] = 'Usuarios que pueden acceder a esta bitácora, pero sin acceso a su configuración. Asigne los usuarios de la izquierda a la lista de la derecha para añadir nuevos usuarios, o viceversa para eliminar usuarios existentes';
+$messages['edit_blog_settings_updated_ok'] = 'La bitácora "%s" fue actualizada correctamente';
+$messages['error_updating_blog_settings'] = 'Hubo un error actualizando la bitácora "%s"';
+$messages['error_incorrect_blog_owner'] = 'El usuario seleccionado como propietario de la bitácora no es correcto';
+$messages['error_fetching_blog'] = 'Hubo un error cargando la bitácora';
+$messages['error_updating_blog_settings2'] = 'Hubo un error actualizando la bitácora. Compruebe los datos e inténtelo de nuevo';
+$messages['add_or_remove'] = 'Añadir o eliminar usuarios';
+
+// site locales
+$messages['locale'] = 'Traducción';
+$messages['locale_encoding'] = 'Condificación';
+$messages['locale_deleted_ok'] = 'La traducción "%s" fue eliminada correctamente';
+$messages['error_no_locales_selected'] = 'No se seleccionaron traducciones para eliminar';
+$messages['error_deleting_only_locale'] = 'La traducción no pudo ser eliminada porque es la única que queda en el sistema';
+$messages['locales_deleted_ok']= '%s traducciones fueron eliminadas correctamente';
+$messages['error_deleting_locale'] = 'Hubo un error borrando la traducción "%s"';
+$messages['error_locale_is_default'] = 'La traducción "%s" no pudo ser eliminada porque es la que se está usando por defecto para las nuevas bitácoras';
+
+// add locale
+$messages['error_invalid_locale_file'] = 'El fichero con la traducción no es válido';
+$messages['error_no_new_locales_found'] = 'No se encontraron nuevos ficheros con traducciones';
+$messages['locale_added_ok'] = 'La traducción "%s" fue añadida correctamente';
+$messages['error_saving_locale'] = 'Hubo un error guardando la nueva traducción';
+$messages['scan_locales'] = 'Actualizar traducciones';
+$messages['add_locale_help'] = 'Use este formulario para añadir nuevas traducciones. Si no es posible enviar ficheros al servidor, suba el fichero al servidor manualmente mediante por ejemplo FTP, guárdelo en el directorio <b>./locales/</b> y use el botón "<b>Actualizar traducciones</b>". LifeType leerá el directorio y añadirá automáticamente cualquier nueva traducción';
+
+// site templates
+$messages['error_template_is_default'] = 'La plantilla "%s" no pudo ser eliminada porque es la que se está usando por defecto para nuevas bitácoras';
+
+// add template
+$messages['global_template_package_help'] = 'Use este formulario para enviar nuevas plantillas al servidor. Éstas plantillas estarán disponibles para todas las bitácoras del servidor. Si no es posible enviar ficheros, use por ejemplo un cliente de FTP para subir los ficheros y colóquelos en el directorio <b>%s</b> y luego use el botón "<b>Actualizar plantillas</b>" para añadir cualquier plantilla nueva. LifeType comprobará el contenido del directorio y añadirá automáticamente todas las plantillas nuevas';
+
+// global settings
+$messages['site_config_saved_ok'] = 'La configuración general fue guardada correctamente';
+$messages['error_saving_site_config'] = 'Hubo un error guardando la configuración general';
+/// general settings
+$messages['help_comments_enabled'] = 'Activar los comentarios en nuevas bitácoras por defecto [Valor por defecto = Sí]';
+$messages['help_beautify_comments_text'] = 'Si se activa, los comentarios enviados por los usuarios serán formateados automáticamente añadiendo párrafos y generando enlaces automáticamente a partir de direcciones [Valor por defecto = Sí]';
+$messages['help_temp_folder'] = 'Carpeta donde el LifeType puede escribir sus ficheros temporales de uso interno. Use una carpeta fuera del árbol de directorios del servidor de web para mayor seguridad [Valor por defecto = ./tmp]';
+$messages['help_base_url'] = 'Dirección base donde el LifeType está instalado';
+$messages['help_subdomains_enabled'] = 'Activar el soporte para subdominios. Vea la sección de la documentación sobre subdominios para más información [Valor por defecto = No]';
+$messages['help_subdomains_base_url'] = 'Cuando los subdominios estan activados, se usará está URL base en lugar de base_url. Use {blogname} para obtener el nombre de la bitácora y {username} para obtener el nombre del usuario, para generar un enlace permanente a la bitácora (p. ej. "http://{blogname}.sudominio.com")';
+$messages['help_include_blog_id_in_url'] = 'Cuando los subdominions están activados conjuntamente con las URLs "normales", esto forzará al LifeType a no incluir el parámetro "blogId". No debería alterar este valor si no sabe lo que está haciendo [Valor por defecto = Sí]';
+$messages['help_script_name'] = 'Configure este parámetro si por alguna razón tiene que renombrar index.php [Valor por defecto = index.php]';
+$messages['help_show_posts_max'] = 'Número máximo de artículos en la página principal para nuevas bitácoras [Valor por defecto = 15]';
+$messages['help_recent_posts_max'] = 'Número máximo de artículos recientes mostrados en la página principal para nuevas bitácoras [Valor por defecto = 10]';
+$messages['help_save_drafts_via_xmlhttprequest_enabled'] = 'Activar el soporte para XmlHttpRequest de forma que se puedan guardar borradores de artículos sin tener que refrescar la página de edición [Valor por defecto = Sí]';
+$messages['help_locale_folder'] = 'Carpeta donde están guardadas las traducciones. Use una carpeta fuera del árbol de directorios del servidor de web para mayor seguridad [Valor por defecto = ./locale]';
+$messages['help_default_locale'] = 'Idioma por defecto para las nuevas bitácoras [Valor por defecto = en_UK]';
+$messages['help_default_blog_id'] = 'Bitácora por defecto que será mostrada si no especifica una bitácora en particular [Valor por defecto = 1]';
+$messages['help_default_time_offset'] = 'Diferencia horaria por defecto de las nuevas bitácoras [Valor por defecto = 0]';
+$messages['help_html_allowed_tags_in_comments'] = 'Lista de entidades HTML, separadas por espacios en blanco, que están permitidas en los comentarios [Valor por defecto = &lt;a&gt;&lt;i&gt;&lt;br&gt;&lt;br/&gt;&lt;b&gt;]';
+$messages['help_referer_tracker_enabled'] = 'Guardar los "referrers" en la base de datos [Valor por defecto = Sí]';
+$messages['help_show_more_enabled'] = 'Activar el enlace "Más..." por defecto para nuevas bitácoras [Valor por defecto = Sí]';
+$messages['help_update_article_reads'] = 'LifeType actualizará el contador de veces que un artículo ha sido leído si se activa [Valor por defecto = Sí]';
+$messages['help_update_cached_article_reads'] = 'Igual que update_article_reads, pero además se actualizará el contador aunque la caché esté activada [Valor por defecto = Sí]';
+$messages['help_xmlrpc_ping_enabled'] = 'Activar la posibilidad de enviar pings mediante XMLRPC a los sitios que lo soporten [Valor por defecto = Sí]';
+$messages['help_send_xmlrpc_pings_enabled_by_default'] = 'Activar el soporte para pings XMLRPC por defecto en nuevos artículos [Valor por defecto = Sí]';
+$messages['help_xmlrpc_ping_hosts'] = 'URLs de servicios que implementen soporte para pings XMLRPC. Ponga cada dirección en una línea nueva [Valor por defecto = http://rpc.weblogs.com/RPC2]';
+$messages['help_trackback_server_enabled'] = 'Activar el soporte para recibir retroenlaces [Valor por defecto = Sí]';
+$messages['help_htmlarea_enabled'] = 'Activar por defecto el editor visual de artículos para las nuevas bitácoras [Valor por defecto = Sí';
+$messages['help_plugin_manager_enabled'] = 'Activar los plugins [Valor por defecto = Sí]';
+$messages['help_minimum_password_length'] = 'Tamaño mínimo, en carácteres, que un password debe tener [Valor por defecto = 4]';
+$messages['help_xhtml_converter_enabled'] = 'Activa un filtro que intentará convertir el texto de los artículos a XHTML válido automáticamente [Valor por defecto = Sí]';
+$messages['help_xhtml_converter_aggressive_mode_enabled'] = 'LifeType intetará corregir casi todo lo que pueda para asegurar que nuestros artículos sean XHTML válido, aunque activando este modo es posible que se cometan más errores [Valor por defecto = No]';
+$messages['help_session_save_path'] = 'Carpeta donde el LifeType guarda sus sesiones, mediante la función session_save_path() del PHP. Deje este campo vació para usar el valor por defecto del PHP. Si usa otra carpeta que no sea la por defecto, asegúrese de que puede ser escrita por el usuario ejecutando el servidor de web [Valor por defecto = (vacío)]';
+// summary settings
+$messages['help_summary_page_show_max'] = 'Número de artículos que se mostrarán en el portal. Este parámetro controla todas las listas del portal (artículos más recientes, bitácoras más activas, etc) [Valor por defecto = 10]';
+$messages['help_summary_items_per_page'] = 'Número de bitácoras por página en la sección "Bitácoras" del portal [Valor por defecto = 25]';
+$messages['help_forbidden_usernames'] = 'Lista de nombres de usuario que no se pueden registrar [Valor por defecto = admin www blog ftp]';
+$messages['help_force_one_blog_per_email_account'] = 'No permitir más de una bitácora por dirección de correo [Valor por defecto = No]';
+$messages['help_summary_show_agreement'] = 'Mostrar un texto/licencia con el cual los usuarios tienen que estar de acuerdo antes de continuar con el proceso de registro [Valor por defecto = Sí]';
+$messages['help_need_email_confirm_registration'] = 'Enviar un email a los nuevos usuarios con un enlace al que tienen que acceder, para confirmar el registro de una nueva bitácora [Valor por defecto = Sí]';
+$messages['help_summary_disable_registration'] = 'No permitir el registro de nuevas bitácoras [Valor por defecto = No]';
+// templates
+$messages['help_template_folder'] = 'Carpeta donde se guardan las plantillas [Valor por defecto = ./templates]';
+$messages['help_default_template'] = 'Plantilla por defecto para las nuevas bitácoras [Valor por defecto = standard]';
+$messages['help_users_can_add_templates'] = 'Permitir que los usuarios añadan sus propias plantillas [Valor por defecto = Sí]';
+$messages['help_template_compile_check'] = 'Si se activa, Smarty comprobará si los ficheros de las plantillas han cambiado y si es así, las recompilará [Valor por defecto = Sí]';
+$messages['help_template_cache_enabled'] = 'Activa la cache de plantillas. Si está activada, las páginas de las bitácoras solo se generarán una vez y se usarán hasta que haya algun cambio. De esta forma, no será necesario traer los datos desde la base de datos cada vez [Valor por defecto = Sí]';
+$messages['help_template_cache_lifetime'] = 'Tiempo en segundos de vida de la caché. Asigne -1 para que la caché nucna expire';
+$messages['help_template_http_cache_enabled'] = 'Activar el soporte para las peticiones condicionales vía HTTP. Si se activa, LifeType tendrá en cuenta el valor de la cabecera HTTP "If-Modified-Since" y solo enviará los datos en caso de que sea necesario para ahorrar ancho de banda [Valor por defecto = No]';
+$messages['help_allow_php_code_in_templates'] = 'Permite incluir código PHP en las plantillas de Smarty vía {php}...{/php} [Valor por defecto = No]';
+// urls
+$messages['help_request_format_mode'] = 'Elija uno de los siguientes formatos de URLs. Si piensa usar "URLs Personales", configure los formatos de las URLs si es necesario [Valor por defecto = Plain]';
+$messages['plain'] = 'Normal';
+$messages['search_engine_friendly'] = 'Search engine friendly';
+$messages['custom_url_format'] = 'URLs Personales';
+$messages['help_permalink_format'] = 'Formato de los enlaces permanentes a artículos cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/{catname}/{year}/{month}/{day}/{postname}$]';
+$messages['help_category_link_format'] = 'Formato de los enlaces a categorías de artículos cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/{catname}$]';
+$messages['help_blog_link_format'] = 'Formato de los enlaces permanentes a bitácoras cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}$]';
+$messages['help_archive_link_format'] = 'Formato de los enlaces a los archivos cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/archives/{year}/?{month}/?{day}]';
+$messages['help_user_posts_link_format'] = 'Formato de los enlaces permanentes a los artículos de un autor en particular cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/user/{username}$]';
+$messages['help_post_trackbacks_link_format'] = 'Formato de los enlaces a las páginas con los retroenlaces recibidos cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/post/trackbacks/{postname}$]';
+$messages['help_template_link_format'] = 'Formato de los enlaces a páginas personales cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/page/{templatename}$]';
+$messages['help_album_link_format'] = 'Formato de los enlaces a álbums de ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/album/{albumname}$]';
+$messages['help_resource_link_format'] = 'Formato de los enlaces a ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/{resourcename}$]';
+$messages['help_resource_preview_link_format'] = 'Formato de los enlaces a las vistas previas de ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/preview/{resourcename}$]';
+$messages['help_resource_medium_size_preview_link_format'] = 'Formato de los enlaces a las vistas previas de tamaño medio cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/preview-med/{resourcename}$]';
+$messages['help_resource_download_link_format'] = 'Formato de los enlaces para descargar ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/download/{resourcename}$]';
+// email
+$messages['help_check_email_address_validity'] = 'Si se activa, LifeType contactará con el servidor de correo especificado en el registro MX del especificado por el servidor DNS del dominio y comprobará si el usuario es válido [Valor por defecto = No]';
+$messages['help_email_service_enabled'] = 'Activar el soporte para enviar mensajes [Valor por defecto = Sí]';
+$messages['help_post_notification_source_address'] = 'Dirección que aparecerá en el campo "From:" cuando se envíen mensajes a través del LifeType [Valor por defecto = noreply at your.host.com]';
+$messages['help_email_service_type'] = 'Sistema que se usará para enviar mensajes [Valor por defecto = PHP]';
+$messages['help_smtp_host'] = 'Si se desea usar un servidor SMTP para enviar mensajes, especifique aquí el nombre del servidor [Valor por defecto = (vacío)]';
+$messages['help_smtp_port'] = 'Si el servidor de SMTP está configurado en un puerto distinto al 25 [Valor por defecto = (vacío)]';
+$messages['help_smtp_use_authentication'] = 'Active este parámetro si el servidor requiere autentificación  [Valor por defecto = No]';
+$messages['help_smtp_username'] = 'Nombre de usuario en caso de que el servidor SMTP necesite autentificación [Valor por defecto = (vacío)]';
+$messages['help_smtp_password'] = 'Password en caso de que el servidor SMTP necesite autentificación [Valor por defecto = (vacío)]';
+// helpers
+$messages['help_path_to_tar'] = 'Ruta completa al binario "tar", necesario para descomprimir plantillas en formato .tar.gz o tar.bz2 [Valor por defecto = /bin/tar]';
+$messages['help_path_to_gzip'] = 'Ruta completa al binario "gzip", necesario para descomprimir plantillas en formato .tar.gz [Valor por defecto = /bin/gzip]';
+$messages['help_path_to_bz2'] = 'Ruta completa al binario "bz2", necesario para descomprimir plantillas en formato tar.bz2 [Valor por defecto = /usr/bin/bzip2]';
+$messages['help_path_to_unzip'] = 'Ruta completa al binario "unzip", necesario para descomprimir plantillas en formato .zip [Valor por defecto = /usr/bin/unzip]';
+$messages['help_unzip_use_native_version'] = 'Usar una versión nativa en PHP para descomprimir ficheros .zip, de forma que el binario "unzip" no sea necesario [Valor por defecto = No]';
+// uploads
+$messages['help_uploads_enabled'] = 'Permite a los usuarios enviar ficheros al servidor. Este parámetro afecta por ejemplo a las plantillas personalizadas [Valor por defecto = Sí]';
+$messages['help_maximum_file_upload_size'] = 'Tamaño máximo de los ficheros en bytes. Por razones obvias, este límite nunca será más alto que el valor configurado en la configuración del PHP [Valor por defecto = 2000000]';
+$messages['help_upload_forbidden_files'] = 'Lista separada por espacios en blancos de nombres de ficheros no permitidos en este servidor. Puede usar \'*\' y \'?\' para especificar nombres de ficheros más complejos [Valor por defecto = *.php *.php3 *.php4 *.phtml]';
+// interfaces
+$messages['help_xmlrpc_api_enabled'] = 'Activar el acceso a las bitácoras mediante XMLRPC [Valor por defecto = Sí]';
+$messages['help_rdf_enabled'] = 'Activar la generación de contenidos mediante RSS o Atom [Valor por defecto = Sí]';
+$messages['help_default_rss_profile'] = 'Formato por defecto de los contenidos [Valor por defecto = RSS 1.0]';
+// security
+$messages['security_pipeline_enabled'] = 'Activar el filtro de seguridad, que es necesario para el filtro Bayesiano y por otros plugins que lo usen [Valor por defecto = Sí]';
+$messages['help_maximum_comment_size'] = 'Tamaño máximo de un comentario en bytes, o use un valor de "0" para permitir un tamaño ilimitado [Valor por defecto = 0]';
+// baSíian filter
+$messages['help_baSíian_filter_enabled'] = 'Activar el filtro Bayesiano anti-spam [Valor por defecto = Sí]';
+$messages['help_baSíian_filter_spam_probability_treshold'] = 'Puntuación máxima para que un comentario sea considerado spam [Valor por defecto = 0.9]';
+$messages['help_baSíian_filter_nonspam_probability_treshold'] = 'Puntuación mínima para que un comentari no sea considerado spam [Valor por defecto = 0.2]';
+$messages['help_baSíian_filter_min_length_token'] = 'Tamaño mínimo en carácteres de un token [Valor por defecto = 3]';
+$messages['help_baSíian_filter_max_length_token'] = 'Tamaño máximo de un token [Valor por defecto = 100]';
+$messages['help_baSíian_filter_number_significant_tokens'] = 'Número mínimo de tokens [Valor por defecto = 15]';
+$messages['help_baSíian_filter_spam_comments_action'] = 'Qué hacer con los comentarios que sean spam. Use "Eliminar" cuando su filtro Bayesiando haya sido entrenado correctamente. Manténgalos en la base de datos si cree que su filtro puede cometer todavía algun error [Valor por defecto = Guardar]';
+$messages['keep_spam_comments'] = 'Guardarlos en la base de datos, pero marcados como "Spam"';
+$messages['throw_away_spam_comments'] = 'Eliminarlos directamente';
+// resources
+$messages['help_resources_enabled'] = 'Activar la sección de "Ficheros" [Valor por defecto = Sí]';
+$messages['help_resources_folder'] = 'Carpeta donde los ficheros serán almacenados. Use una carpeta fuera del árbol del servidor de web para mayor seguridad [Valor por defecto = ./gallery]';
+$messages['help_thumbnail_method'] = 'Método para generar las previsualizaciones. Se requiere soporte para GD si se selecciona PHP como el método por defecto  [Valor por defecto = PHP]';
+$messages['help_path_to_convert'] = 'Ruta completa al binario "convert" del paquete "ImageMagick". Es obligatorio si el método para generar las previsualizaciones es "ImageMagick" [Valor por defecto = /usr/bin/convert]';
+$messages['help_thumbnail_format'] = 'Formato de las previsualizaciones [Valor por defecto = El mismo que la imágen]';
+$messages['help_thumbnail_height'] = 'Altura de las previsualizaciones en pixels [Valor por defecto = 120]';
+$messages['help_thumbnail_width'] = 'Anchura de las previsualizaciones en pixels [Valor por defecto = 120]';
+$messages['help_medium_size_thumbnail_height'] = 'Altura de las previsualizaciones de tamaño medio en pixels [Valor por defecto = 480]';
+$messages['help_medium_size_thumbnail_width'] = 'Anchura de las previsualizaciones de tamaño medio en pixels [Valor por defecto = 640]';
+$messages['help_thumbnails_keep_aspect_ratio'] = 'Generar las previsualizaciones manteniendo un aspecto proporcional [Valor por defecto = Sí]';
+$messages['help_thumbnail_generator_force_use_gd1'] = 'Usar solo GD1 en lugar de GD2 [Valor por defecto = No]';
+$messages['help_thumbnail_generator_user_smoothing_algorithm'] = 'Método usado para suavizar las vistas previas. Solo disponible si se está usando PHP para generar las vistas previas [Valor por defecto = PHP ImageCopyResampled]';
+$messages['help_resources_quota'] = 'Cuota de ficheros en bytes para las bitácoras (i.e. 5242880 Bytes = 5MB), o use "0" para dar cuota ilimitada [Valor por defecto = 0]';
+$messages['help_resource_server_http_cache_enabled'] = 'Activa el soporte para la cabecera HTTP "If-Modified-Since" cuando se hagan peticiones para ficheros. Active este parámetro para ahorrar ancho de banda [Valor por defecto = No]';
+$messages['help_resource_server_http_cache_lifetime'] = 'Tiempo en milisegundos durante el cual el cliente puede usar la versión cacheada de un fichero. Solo válido cuándo el parámetro anterior esté activado [Valor por defecto = 9999999]';
+$messages['same_as_image'] = 'El mismo que la imágen original';
+// search
+$messages['help_search_engine_enabled'] = 'Activar el motor de búsqueda  [Valor por defecto = Sí]';
+$messages['help_search_in_custom_fields'] = 'Buscar también en los campos personales [Valor por defecto = Sí]';
+$messages['help_search_in_comments'] = 'Buscar también en los comentarios [Valor por defecto = Sí]';
+
+// cleanup
+$messages['purge'] = 'Limpiar';
+$messages['cleanup_spam'] = 'Limpiar Spam';
+$messages['cleanup_spam_help'] = 'Esto eliminara físicamente de la base de datos todos aquellos comentarios que hayan sido marcados como spam por los usuario. No será posible recuperarlos una vez hayan sido eliminados';
+$messages['spam_comments_purged_ok'] = 'Spam eliminado correctamente';
+$messages['cleanup_posts'] = 'Limpiar Artículos';
+$messages['cleanup_posts_help'] = 'Esto eliminará físicamente de la base de datos todos aquellos artículos que hayan sido marcados como "Borrados". No será posible recuperarlos una vez hayan sido eliminados';
+$messages['posts_purged_ok'] = 'Artículos eliminados correctamente';
+
+/// summary ///
+// front page
+$messages['summary'] = 'Portal';
+$messages['register'] = 'Registrarse';
+$messages['summary_welcome'] = 'Bienvenido!';
+$messages['summary_most_active_blogs'] = 'Las Bitácoras más activas';
+$messages['summary_most_commented_articles'] = 'Los más comentados';
+$messages['summary_most_read_articles'] = 'Los mas leídos';
+$messages['password_forgotten'] = 'Olvidaste el password?';
+$messages['summary_newest_blogs'] = 'Bitácoras nuevas';
+$messages['summary_latest_posts'] = 'Los más nuevos';
+$messages['summary_search_blogs'] = 'Buscar';
+
+// blog list
+$messages['updated'] = 'Actualizada';
+$messages['total_reads'] = 'total';
+
+// blog profile
+$messages['blog'] = 'Bitácora';
+$messages['latest_posts'] = 'Los más nuevos';
+
+// registration
+$messages['register_step0_title'] = 'Términos de Uso';
+$messages['decline'] = 'No estoy de acuerdo';
+$messages['accept'] = 'Aceptar';
+$messages['read_service_agreement'] = 'Lea atentamente los términos de uso y pulse el botón "Aceptar" si está de acuerdo';
+$messages['register_step1_title'] = 'Crear el usuario [1/4]';
+$messages['register_step1_help'] = 'Primero hay que crear un usuario para la bitácora. Este usuario será el propietario de la bitácora i tendrá acceso a todas sus funcionalidades';
+$messages['register_next'] = 'Siguiente';
+$messages['register_back'] = 'Atrás';
+$messages['register_step2_title'] = 'Crear la bitácora [2/4]';
+$messages['register_blog_name_help'] = 'Nombre de la bitácora';
+$messages['register_step3_title'] = 'Elegir una plantilla [3/4]';
+$messages['step1'] = 'Paso 1';
+$messages['step2'] = 'Paso 2';
+$messages['step3'] = 'Paso 3';
+$messages['register_step3_help'] = 'Elija una de las plantillas disponibles para su nueva bitácora. Si más tarde no le gusta, siempre la puede cambiar';
+$messages['error_must_choose_template'] = 'Elija una plantilla';
+$messages['select_template'] = 'Seleccionar esta';
+$messages['register_step5_title'] = 'Felicidades! [4/4]';
+$messages['finish'] = 'Terminar';
+$messages['register_need_confirmation'] = 'Un mensaje incluyendo el enlace para su confirmación ha sido enviado a su dirección de correo. En cuanto reciba el mensaje, haga clic en la direción para empezar a usar su bitácora!';
+$messages['register_step5_help'] = 'Felicidades, su nueva bitácora ha sido creada!';
+$messages['register_blog_link'] = 'Si quiere, puede ir directamente a su nueva bitácora: <a href="%2$s">%1$s</a>';
+$messages['register_blog_admin_link'] = 'O si lo desea, puede empezar a añadir artículos a través de la <a href="admin.php">interfaz de administración</a>';
+$messages['register_error'] = 'Hubo un error durante el proceso';
+$messages['error_registration_disabled'] = 'No se pueden registrar bitácoras en este sitio';
+// registration article topic and text
+$messages['register_default_article_topic'] = 'Felicidades!';
+$messages['register_default_article_text'] = 'Si puede leer esto, su bitácora está lista para empezar a escribir.';
+$messages['register_default_category'] = 'General';
+// confirmation email
+$messages['register_confirmation_email_text'] = 'Visite el siguiente enlace para activar su nueva bitácora:
+
+%s
+
+Que tenga un buen día.';
+$messages['error_invalid_activation_code'] = 'El enlace de activación no es correcto';
+$messages['blog_activated_ok'] = 'Felicidades, su nueva bitácora ha sido activada!';
+// forgot your password?
+$messages['reset_password'] = 'Cambiar el password';
+$messages['reset_password_username_help'] = 'Nombre del usuario cuyo password desea cambiar';
+$messages['reset_password_email_help'] = 'Dirección de correo que se usó para registrar este usuario';
+$messages['reset_password_help'] = 'Use este formulario para cambiar el password de su usuario, en caso de que no lo recuerde. Por favor escriba el nombre del usuario cuyo password desea cambiar, así como la dirección de correo con la que se registró este usuario';
+$messages['error_resetting_password'] = 'Hubo un error cambiando el password del usuario. Compruebe los datos y vuélvalo a intentar';
+$messages['reset_password_error_incorrect_email_address'] = 'La dirección de correo no es correcta o no es la dirección que se usó para registrar este usuario';
+$messages['password_reset_message_sent_ok'] = 'Un mensaje de correo ha sido enviado a la dirección de correo. Por favor haga clic en la dirección incluida en el mensaje para cambiar el password';
+$messages['error_incorrect_request'] = 'Los parámetros de la dirección no son correctos';
+$messages['change_password'] = 'Nuevo password';
+$messages['change_password_help'] = 'Por favor de un nuevo password y a continuación, confírmelo';
+$messages['new_password'] = 'Nuevo password';
+$messages['new_password_help'] = 'Escriba aquí su nuevo password';
+$messages['password_updated_ok'] = 'Su password ha sido cambiado correctamente!';
+
+// Suggested by BCSE, some useful messages that not available in official locale
+$messages['upgrade_information'] = 'This page looks plain and unstyled because you\'re using a non-standard compliant browser. To see it in its best form, please <a href="http://www.webstandards.org/upgrade/" title="The Web Standards Project\'s Browser Upgrade initiative">upgrade</a> to a browser that supports web standards. It\'s free and painless.';
+$messages['jump_to_navigation'] = 'Ir al menú';
+$messages['comment_email_never_display'] = 'El comentario será formateado automáticamente. La dirección de correo no será mostrada en público.';
+$messages['comment_html_allowed'] = '<acronym title="Hypertext Markup Language">HTML</acronym> allowed: &lt;<acronym title="Hyperlink">a</acronym> href=&quot;&quot; title=&quot;&quot; rel=&quot;&quot;&gt; &lt;<acronym title="Acronym Description">acronym</acronym> title=&quot;&quot;&gt; &lt;<acronym title="Quote">blockquote</acronym> cite=&quot;&quot;&gt; &lt;<acronym title="Strike">del</acronym>&gt; &lt;<acronym title="Italic">em</acronym>&gt; &lt;<acronym title="Underline">ins</acronym>&gt; &lt;<acronym title="Bold">strong</acronym>&gt;';
+$messages['trackback_uri'] = 'El URI <acronym title="Identificador de Recurso Uniforme (URI)">URI</acronym> para enviar retroenlaces a este artículo es: ';
+$messages['previous_post'] = 'Anterior';
+$messages['next_post'] = 'Siguiente';
+$messages['comment_default_title'] = '(Sin título)';
+$messages['guestbook'] = 'Libro de visitas';
+$messages['trackbacks'] = 'Retroenlaces';
+$messages['menu'] = 'Menú';
+$messages['albums'] = 'Albums';
+$messages['admin'] = 'Administración';
+$messages['xmlrpc_ping_ok'] = 'Ping XMLRPC enviado correctamente: ';
+$messages['error_sending_xmlrpc_ping'] = 'Hubo un error enviando el ping XMLRPC a: ';
+$messages['error_sending_xmlrpc_ping_message'] = 'Hubo un error enviando el ping XMLRPC: ';
+
+// textos nuevos para LT 1.1
+
+$messages['error_incorrect_trackback_id'] = 'El identificador del retroenlace no es válido';
+$messages['error_marking_trackback_as_spam'] = 'Hubo un error marcando el retroenlace como spam';
+$messages['trackback_marked_as_spam_ok'] = 'El retroenlace fue marcado como spam';
+$messages['error_marking_trackback_as_nonspam'] = 'Hubo un error marcando el retroenlace como no spam';
+$messages['trackback_marked_as_nonspam_ok'] = 'El retroenlace fue marcado como no spam';
+$messages['upload_here'] = 'Añadir fichero aquí';
+$messages['reply_string'] = 'Re: ';
+$messages['cleanup_users'] = 'Limpieza de usuarios';
+$messages['cleanup_users_help'] = 'Esta función eliminará todos los usuarios que hayan sido marcados como "Borrados", incluyendo cualquier
+bitácora que pertenezca al usuario y todo el contenido de la bitácora. Si el usuario tiene acceso a otra bitácora, todos los artículos publicados por el usuario también serán eliminados. Una vez el usuario y sus datos han sido eliminados no será posible recuperarlos.';
+$messages['users_purged_ok'] = 'Limpieza de usuarios ejecutada correctamente';
+$messages['cleanup_blogs'] = 'Limpieza de blogs';
+$messages['cleanup_blogs_help'] = 'Esta función eliminará todos las bitácoras que hayan sio marcadas como "Borradas" por un administrador, incluyendo todo el contenido de la bitácora. Una vez la bitácora y sus datos han sido eliminados no será posible recuperarlos.';
+$messages['blogs_purged_ok'] = 'Limpieza de blogs ejecutada correctamente';
+$messages['help_use_http_accept_language_detection'] = 'Activa la detección del lenguaje preferido por el usuario basándose en la información que envia el navegador en cada petición';
+$messages['error_invalid_blog_category'] = 'Categoría de bitácora incorrecta';
+$messages['error_adding_blog_category'] = 'Hubo un error añadiendo la categoría de bitácora';
+$messages['newBlogCategory'] = 'Nueva categoría de bitácoras';
+$messages['editBlogCategories'] = 'Categoría de bitácoras';
+$messages['blog_category_added_ok'] = 'Categoría de bitácoras añadida correctamente';
+$messages['error_blog_category_has_blogs'] = 'Hay algunas bitácoras asignadas a la categoría de bitácoras "%s. Por favor modifique primero las bitácoras e inténtelo de nuevo.';
+$messages['error_deleting_blog_category'] = 'Hubo un error borrando la categoría de bitácoras "%s"';
+$messages['blog_category_deleted_ok'] = 'La categoría de bitácoras "%s" fue borrada correctamente';
+$messages['blog_categories_deleted_ok'] = '%s categorías de blog fueron eliminadas correctamente';
+$messages['error_deleting_blog_category2'] = 'Hubo un error eliminando la categoría de bitácora cuyo identificador es %s';
+$messages['blog_category'] = 'Categoría de bitácoras';
+$messages['blog_category_help'] = 'Categoría de bitácoras a cuya esta bitácora pertenece';
+$messages['help_use_captcha_auth'] = 'Requerir la inserción de un código numérico mostrado en una imágen al iniciar el proceso de registro de una nueva bitácora y así evitar registros de nuevos usuarios mediante scripts';
+$messages['help_skip_dashboard'] = 'Desactivar la página de "perspectiva" como página mostrada al iniciar una sesión, y en su lugar enviar al usuario a su primer blog';
+$messages['manageGlobalArticleCategory'] = 'Categorías Globales';
+$messages['newGlobalArticleCategory'] = 'Nueva categoría Global';
+$messages['editGlobalArticleCategories'] = 'Categorías Globales';
+$messages['global_category_name_help'] = 'Nombre de la nueva categoría global';
+$messages['global_category_description_help'] = 'Descripción de la nueva categoría global';
+$messages['error_incorrect_global_category_id'] = 'Categoría global incorrecta';
+$messages['global_category_deleted_ok'] = 'La categoría global "%s" fue eliminada correctamente';
+$messages['global_category_added_ok'] = 'La categoría global "%s" fue añadida correctamente';
+$messages['error_deleting_global_category2'] = 'Hubo un error eliminando la categoría global cuyo identificador es %s';
+
+$messages['help_page_suffix_format'] = 'Sufijo que se añadirá a las URLs de de las secciones que soportan paginación [ Valor por defecto = /page/{page} ]';
+
+$messages['help_final_size_thumbnail_width'] = 'Anchura final en píxels de las imágenes subidas por usuarios. Dejar este valor como 0 para usar el tamaño real de la imágen [ Valor por defecto = 0 ]';
+$messages['help_final_size_thumbnail_height'] = 'Altura final en píxels de las imágenes subidas por usuarios. Dejar este valor como 0 para usar el tamaño real de la imágen [ Valor por defecto = 0 ]';
+$messages['error_comment_too_big'] = 'El comentario es demasiado largo';
+$messages['error_you_have_been_blocked'] = 'Proceso interrumpido: la petición no fue procesada.';
+$messages['created'] = 'Creado';
+$messages['view'] = 'Ver';
+$messages['editUser'] = 'Editar Usuario';
+$messages['help_urlize_word_separator'] = 'Carácter que será usado como separador de palabras en lugar del espacio en blanco en las direcciones generadas por LifeType. Este parámetro también afecta los nombres de host que serán generados cuando el soporte para subdominios está activado [ Valor por defecto = _ ]';
+$messages['help_summary_template_cache_lifetime'] = 'Duración en segundos de las páginas pregeneradas y guardadas en la caché de la portada. Si se usa un valor mayor que 0, la versión disponible de cada página en la caché será usada durante tantos segundos en lugar de regenerarla cada vez que se produzca un cambio en los datos. Active esta opción para mejorar el rendimiento de la página de portada. [ Valor por defecto = 0 ]';
+$messages['register_default_album_name'] = 'General';
+$messages['register_default_album_description'] = 'Suba aquí sus imágenes y ficheros';
+$messages['show_in_summary'] = 'Mostrar en la portada';
+$messages['show_in_summary_help'] = 'Mostrar esta bitácora en la portada';
+
+$messages['saving_message'] = 'Guardando...';
+$messages['show_option_panel'] = 'Mostrar Opciones';
+$messages['hide_option_panel'] = 'Ocultar opciones';
+
+$messages['quick_launches'] = 'Acceso rápido';
+
+$messages['confirmation_message_resent_ok'] = 'El mensaje de confirmación fue reenviado correctamente.';
+
+$messages['goto_blog_page'] = 'Ir a %s';
+
+$messages['help_num_blogs_per_user'] = 'Número máximo de blogs que cada usuario puede crear mediante el enlace disponible en la página de perspectiva. Si el valor es 0, el link no aparecerá [ Valor por defecto = 0 ]';
+
+$messages['massive_change_option'] = 'Edición múltiple';
+$messages['show_massive_change_option'] = 'Mostrar edición múltiple';
+$messages['hide_massive_change_option'] = 'Ocultar edición múltiple';
+$messages['change_status'] = 'Modificar estado';
+$messages['change_category'] = 'Modificar categoría';
+
+$messages['error_post_status'] = 'Elija un estado';
+$messages['error_comment_status'] = 'Elija un estado';
+$messages['admin_mode'] = 'Modo Administrador';
+$messages['administrate_user_blog'] = 'Administrar esta bitácora';
+$messages['trackbacks_updated_ok'] = '%s retroenlaces actualizados correctamente';
+$messages['trackback_updated_ok'] = 'Retroenlace modificado correctamente';
+$messages['error_trackback_status'] = 'Elija un estado válido';
+$messages['error_incorrect_user'] = 'El usuario no es válido';
+$messages['select'] = 'Seleccionar';
+$messages['remove_selected'] = 'Eliminar selección';
+
+$messages['notification_subject'] = 'Mensaje desde LifeType';
+$messages['error_no_trackback_links_sent'] = 'No se envió ningún retroenlace';
+
+$messages['logout_destination_url'] = 'Dirección donde los usuarios serán redireccionados al salir de la interfaz de administración de LifeType. Puede por ejemplo usar la dirección de la página principal de su servicio [ Valor por defecto = nada ]';
+
+$messages['help_http_cache_lifetime'] = 'Tiempo de vida en segundos de la caché del navegador. Se informará al navegador de los usuarios sobre cuánto tiempo deben usar la versión actual de la página en lugar de obligar al servidor a enviar la misma versión cada vez. Este parámetro ayuda a ahorrar ancho de banda y a aligerar la carga en el servidor, aunque los usuarios podrían recibir versiones desfasadas de las páginas en caso de que este valor sera demasiado alto. [ Valor por defecto = 1800 ]';
+
+$messages['trackbacks_no_trackback'] = 'No se pudo enviar un retroenlace a la siguiente dirección: ';
+
+$messages['error_comment_spam_throw_away'] = 'El filtro anti-spam ha rechazado su mensaje.';
+$messages['error_comment_spam_keep'] = 'El filtro anti-spam ha marcado su comentario como dudoso y deberá ser reviasado por el autor de esta bitácora.';
+
+$messages['blog_categories'] = 'Categorías de Bitácoras';
+$messages['global_article_categories'] = 'Categorías Globales';
+
+$messages['help_force_posturl_unique'] = 'Obligar que todos los enlaces a artículos sean únicos. Este parámetro solo es necesario si el formato de las direcciones ha cambiado y no está incluyendo la fecha en su nuevo formato';
+
+$messages['default_send_notification'] = 'Enviar notificación';
+
+$messages['enable_pull_down_menu'] = 'Menú desplegable';
+$messages['enable_pull_down_menu_help'] = 'Activar o desactivar el menú desplegable';
+
+$messages['change_album'] = 'Cambiar álbum';
+
+$messages['warning_autosave_message'] = '<img src="imgs/admin/icon_warning-16.png" alt="Error" class="InfoIcon"/><p class="ErrorText">Parece que su sesión anterior terminó sin grabar su nuevo artículo. Si es así, <a href="#" onclick="restoreAutoSave();">haga click aquí para recuperarlo</a> o si lo prefiere, <a href="#" onclick="eraseAutoSave();">haga click aquí para borrarlo</a>.</p>';
+
+$messages['check_username'] = 'Nombre de usuario';
+$messages['check_username_ok'] = 'El nombre de usuario está disponible!';
+$messages['error_username_exist'] = 'El nombre de usuario no está disponible, inténtelo con otro.';
+
+$messages['error_rule_email_dns_server_temp_fail'] = 'Problema temporal - inténtelo más tarde.';
+$messages['error_rule_email_dns_server_unreachable'] = 'No se pudo conectar con el servidor de correo.';
+$messages['error_rule_email_dns_not_permitted'] = 'La dirección de correo no es válida.';
+
+$messages['blog_users_help'] = 'Usuarios que pueden acceder a esta bitácora.';
+
+$messages['summary_welcome_paragraph'] = 'Incluya aquí el mensaje que aparecerá en la configuración por defecto de la portada de su servicio. Puede cambiar este mensaje en el fichero locales/locale_es_ES.php, o bien eliminarlo por completo editando los ficheros .template disponibles en el directorio templates/summary/';
+
+$messages['first_day_of_week'] = 1;
+$messages['first_day_of_week_label'] = 'Primer día de la semana';
+$messages['first_day_of_week_help'] = 'Primer día de la semana en el calendario';
+
+$messages['help_subdomains_base_url'] = 'Cuando el soporte para subdominios está activado, se usa URL como la base para construir el resto de URLs en lugar de base_url. Use {blogname} para incluir el nombre de la bitácora, {username} para incluir el nombre del usuario a quien la bitácora pertenece, y {blogdomain} para permitir a los usuarios introducir su propio subdominio [ Valor por defecto = nada ]';
+
+$messages['registration_default_subject'] = 'Confirmación de registro de LifeType';
+
+$messages['error_invalid_subdomain'] = 'El subdominio no es válido o ya se está usando';
+
+$messages['register_blog_domain_help'] = 'Nombre y subdominio que desea usar para su nueva bitácora';
+$messages['domain'] = 'Dominio';
+$messages['help_subdomains_available_domains'] = 'Introduzca una lista con los nombres de los dominios disponibles, separada por espacios en blanco. Los usuarios podrán elegir cualquiera de estos mediante una lista desplegable, y podrán introducir cualquier subdominio que deseen. Esta opción solo estará disponible si el soporte para subdominios está activado e incluyó {blogdomain} como parte del parámetro subdomains_base_url. También puede usar \'?\' para permitir cualquier dominio y subdominio [ Valor por defecto = nada ]';
+
+$messages['subdomains_any_domain'] = '<- El soporte para múltiple dominios está activado, introduzca el nombre del dominio completo';
+$messages['error_updating_blog_subdomain'] = 'Hubo un error actualizando el subdominio, compruebe los datos e inténtelo de nuevo.';
+$messages['error_updating_blog_main_domain'] = 'Hubo un error actualizando el dominio principal. Probablemente el administrador haya configurado algo incorrectamente';
+
+$messages['monthsshort'] = Array( 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic' );
+$messages['weekdaysshort'] = Array( 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom' );
+
+$messages['search_type'] = 'Buscar en';
+$messages['posts'] = 'Artículos';
+$messages['blogs'] = 'Bitácoras';
+$messages['resources'] = 'Ficheros';
+$messages['error_incorrect_username'] = 'El nombre de usuario no es correcto, o ya está asignado o es demasiado largo (máximo 15 carácteres)';
+$messages['upload_in_progress'] = 'Enviando datos. Espere por favor...';
+
+$messages['auth_img'] = 'Código de seguridad';
+$messages['auth_img_help'] = 'Por favor introduzca el código que aparece en la imágen.';
+
+$messages['global_category'] = 'Categoría global';
+$messages['global_article_category_help'] = 'Categoría global de esta comunidad para este artículo';
+
+$messages['password_reset_subject'] = 'Cambio de password en LifeType';
+
+//
+// new strings for LifeType 1.2
+//
+$messages['auth'] = 'Autenticación';
+$messages['authenticated'] = 'Autenticado';
+$messages['dropdown_list_field'] = 'Lista desplegable';
+$messages['values'] = 'Valores';
+$messages['field_values'] = 'Valores que aparecerán como opciones en este nuevo campo. El primer valor será usado como la opción por defecto en la lista.';
+
+$messages['permission_added_ok'] = 'Permiso añadido correctamente';
+$messages['core_perm'] = 'Permiso base';
+$messages['admin_only'] = 'Permiso de administrador';
+$messages['permissionsList'] = 'Permisos';
+$messages['newPermission'] = 'Añadir permiso';
+$messages['permission_name_help'] = 'Nombre identificador del permiso';
+$messages['permission_description_help'] = 'Descripción del permiso';
+$messages['core_perm_help'] = 'Si este permiso es marcado como \'permiso base\' no será posible eliminarlo.';
+$messages['admin_only_help'] = 'Activar si este permiso solo debe ser asignado por usuarios con permisos de administración';
+$messages['error_adding_new_permission'] = 'Hubo un error añadiendo el nuevo permiso, por favor compruebe los datos e inténtelo de nuevo.';
+$messages['error_incorrect_permission_id'] = 'El identificador del permiso no es correcto';
+$messages['error_permission_cannot_be_deleted'] = 'El permiso "%s" no puede ser eliminador porque ha sido asignado a por lo menos un usuario o es un permiso base.';
+$messages['error_deleting_permission'] = 'Hubo un error eliminando el permiso "%s"';
+$messages['permission_deleted_ok'] = 'El permiso "%s" fue eliminado correctamente';
+$messages['permissions_deleted_ok'] = '%s permisos eliminados correctamente';
+$messages['error_deleting_permission2'] = 'Hubo un error eliminando el permiso cuyo nombre es "%s"';
+
+$messages['help_hard_show_posts_max'] = 'Límite superior para el parámetro show_posts_max que controla el número de artículos que se muestran por página por blog. Si el usuario configura un valor superior a éste, el valor definido aquí será usado en su lugar. [ Valor por defecto = 50 ]';
+$messages['hard_recent_posts_max_help'] = 'Límite superior para el parámetro recent_posts_max que controla el número de artículos que se muestran en la lista de artículos recientes. Si el usuario configura un valor superior a éste, el valor definido aquí será usado en su lugar. [ Valor por defecto = 25 ]';
+
+$messages['error_permission_required'] = 'Debe disponer de más permisos para acceder a esta funcionalidad.';
+$messages['user_permissions_updated_ok'] = 'Permisos del usuario actualizados correctamente';
+
+// blog permissions
+$messages['add_album_desc'] = 'Añadir álbums';
+$messages['add_blog_template_desc'] = 'Añadir plantillas a la bitácora';
+$messages['add_blog_user_desc'] = 'Añadir usuarios a la bitácora';
+$messages['add_category_desc'] = 'Añadir categorias';
+$messages['add_custom_field_desc'] = 'Añadir campos';
+$messages['add_link_desc'] = 'Añadir enlaces';
+$messages['add_link_category_desc'] = 'Añadir categorías de enlace';
+$messages['add_post_desc'] = 'Añadir artículos';
+$messages['add_resource_desc'] = 'Añadir ficheros';
+$messages['blog_access_desc'] = 'Permiso para acceder a esta bitácora';
+$messages['update_album_desc'] = 'Actualizar álbums';
+$messages['update_blog_desc'] = 'Actualizar la configúración de la bitácora';
+$messages['update_blog_template_desc'] = 'Actualizar plantillas';
+$messages['update_blog_user_desc'] = 'Actualizar usuarios de la bitácora';
+$messages['update_category_desc'] = 'Actualizar categorias';
+$messages['update_comment_desc'] = 'Actualizar comentarios';
+$messages['update_custom_field_desc'] = 'Actualizar campos';
+$messages['update_link_desc'] = 'Actualizar enlaces';
+$messages['update_link_category_desc'] = 'Actualizar categorías de enlaces';
+$messages['update_post_desc'] = 'Actualizar artículos';
+$messages['update_resource_desc'] = 'Actualizar ficheros';
+$messages['update_trackback_desc'] = 'Actualizar retroenlaces';
+$messages['view_blog_templates_desc'] = 'Ver las plantillas de la bitácora';
+$messages['view_blog_users_desc'] = 'Ver los usuarios de la bitácora';
+$messages['view_categories_desc'] = 'Ver las categorías';
+$messages['view_comments_desc'] = 'Ver los comentarios';
+$messages['view_custom_fields_desc'] = 'Ver los campos';
+$messages['view_links_desc'] = 'Ver los enlaces';
+$messages['view_link_categories_desc'] = 'Ver las categorías de enlace';
+$messages['view_posts_desc'] = 'Ver los artículos';
+$messages['view_resources_desc'] = 'Ver lo ficheros';
+$messages['view_trackbacks_desc'] = 'Ver los retroenlaces';
+// admin permissions
+$messages['login_perm_desc'] = 'El usuario puede acceder a la interfaz de administración';
+$messages['add_blog_category_desc'] = 'Añadir categorías de bitácora';
+$messages['add_global_article_category_desc'] = 'Añadir categorías globales de artículos';
+$messages['add_locale_desc'] = 'Añadir nuevas traducciones';
+$messages['add_permission_desc'] = 'Añadir nuevos permisos';
+$messages['add_site_blog_desc'] = 'Añadir nuevas bitácoras';
+$messages['add_template_desc'] = 'Añadir nuevas plantillas';
+$messages['add_user_desc'] = 'Añadir nuevos usuarios';
+$messages['edit_blog_admin_mode_desc'] = 'El usuario puede administrar otras bitácoras';
+$messages['purge_data_desc'] = 'El usuario puede usar la función de "Limpieza"';
+$messages['update_blog_category_desc'] = 'Actualizar categorías de bitácora';
+$messages['update_global_article_category_desc'] = 'Actualizar categorías globales de artículos';
+$messages['update_global_settings_desc'] = 'Actualizar la configuración global';
+$messages['update_locale_desc'] = 'Actualizar las traducciones';
+$messages['update_permission_desc'] = 'Actualizar permissions';
+$messages['update_plugin_settings_desc'] = 'Actualizar la configuración de plugins';
+$messages['update_site_blog_desc'] = 'Actualizar bitácoras';
+$messages['update_template_desc'] = 'Actualizar plantillas';
+$messages['update_user_desc'] = 'Actualizar usuarios';
+$messages['view_blog_categories'] = 'Ver las categorías de bitácora';
+$messages['view_global_article_categories_desc'] = 'Ver las categorías de artículo';
+$messages['view_global_settings_desc'] = 'Ver la configuración global';
+$messages['view_locales_desc'] = 'Ver las traducciones';
+$messages['view_permissions_desc'] = 'Ver los permisos';
+$messages['view_plugins_desc'] = 'Ver los plugins';
+$messages['view_site_blogs_desc'] = 'Ver las bitácoras';
+$messages['view_templates_desc'] = 'Ver las plantillas';
+$messages['view_users_desc'] = 'Ver los usuarios';
+$messages['update_blog_stats_desc'] = 'Actualizar referencias ("referrers")';
+$messages['manage_admin_plugins_desc'] = 'Administrar plugins a nivel de administrador';
+
+$messages['summary_welcome_msg'] = 'Bienvenido, %s!';
+$messages['summary_go_to_admin'] = 'Ir a la administración';
+
+$messages['error_can_only_update_own_articles'] = 'Los permisos asignados actualmente solo permiten modificar sus propios artículos.';
+$messages['update_all_user_articles_desc'] = 'Permitir la modificación de artículos de otros usuarios';
+$messages['error_can_only_view_own_articles'] = 'Los permisos asignados actualmente solo permiten ver sus propios artículos.';
+$messages['view_all_user_articles_desc'] = 'Permitir ver los artículos de otros usuarios';
+$messages['error_fetching_permission'] = 'Hubo un error cargando el permiso';
+$messages['editPermission'] = 'Editar permiso';
+$messages['error_updating_permission'] = 'Hubo un error actualizando el permiso';
+$messages['permission_updated_ok'] = 'Permiso actualizado correctamente';
+$messages['error_adding_permission'] = 'Hubo un error añadiendo el permiso';
+$messages['error_cannot_login'] = 'Lo sentimos, pero sus permisos no le permiten acceder a la interfaz de administración';
+$messages['admin_user_permissions_help'] = 'Permisos globales asignados a este usuario';
+
+$messages['permissions'] = 'Permisos';
+$messages['blog_user_permissions_help'] = 'Permisos asignados a este usuario en esta bitácora';
+$messages['pluginSettings'] = 'Configuración del plugin';
+$messages['user_can_override'] = 'Usuarios pueden modificar';
+$messages['user_cannot_override'] = 'Usuarios no pueden modificar';
+$messages['global_plugin_settings_saved_ok'] = 'Configuración global de plugins guardada correctamente';
+$messages['error_updating_global_plugin_settings'] = 'Hubo un error guardando la configuración global de los plugins';
+$messages['error_incorrect_value'] = 'El valor no es correcto';
+$messages['parameter'] = 'Parámetro';
+$messages['value'] = 'Valor';
+$messages['override'] = 'Sobreescribir';
+$messages['editCustomField'] = 'Editar campo';
+$messages['view_blog_stats_desc'] = 'Ver las estadísticas de la bitácora';
+$messages['manage_plugins_desc'] = 'Administrar los plugins de la bitácora';
+
+$messages['error_global_category_has_articles'] = 'La categoría global de artículos no puede ser eliminada porque todavía tiene artículos.';
+$messages['error_adding_global_article_category'] = 'Hubo un error añadiendo la categoría global de artículos';
+
+$messages['temp_folder_reset_ok'] = 'El directorio temporal fue vaciado correctamente.';
+$messages['cleanup_temp_help'] = 'Esto forzará que el directorio temporal usado por LifeType se vacíe. Como resultado las cachés de plantillas y datos también serán reinicializadas.';
+$messages['cleanup_temp'] = 'Vaciar el directorio temporal';
+
+$messages['comment_only_auth_users'] = 'Solo los usuarios autentificados pueden comentar';
+$messages['comment_only_auth_users_help'] = 'Solo los usuarios que tengan un usuario y password válido pueden dejar sus comentarios';
+$messages['show_comments_max'] = 'Comentarios por página';
+$messages['show_comments_max_help'] = 'Número máximo de comentarios por página [ Valor por defecto = 20 ]';
+$messages['hard_show_comments_max_help'] = 'Valor máximo para el parámetro show_comments_max [ Valor por defecto = 50 ]';
+
+$messages['error_resource_not_whitelisted_extension'] = 'Este tipo de fichero no está permitido.';
+$messages['help_upload_allowed_files'] = 'Lista de tipos de ficheros permitidos, separados por espacios en blanco. El uso de \'*\' y \'?\' está permitido. Si ambos upload_forbidden_file y está opción están activadas, esta lista (upload_allowed_files) siempre tendrá más prioridad [ Valor por defecto = None]';
+
+$messages['help_template_load_order'] = 'Define el orden en que las plantillas son cargadas. Usando \'Cargar primero las plantillas por defecto\', LifeType intentará encontrar las plantillas en el directorio templates/default/ y si no están disponibles allí, entonces se buscará la misma plantilla en el directorio del usuario. Si la misma plantilla existe en ambos lugares, la plantilla por defecto en templates/default/ siempre tendrá prioridad. Si se selecciona \'Cagar primero las plantillas de usuario\', las plantillas de usuario siempre serán cargadas primero y si no están disponibles, se buscará en dlrectorio de las plantillas por defecto. Si la misma plantilla existe en ambos lugares, la plantilla del usuario siempre tendrá prioridad';
+$messages['template_load_order_user_first'] = 'Cargar primero las plantillas por defecto';
+$messages['template_load_order_default_first'] = 'Cargar primero las plantillas de usuario';
+
+$messages['editBlogUser'] = 'Editar usuario de la bitácora';
+
+$messages['help_summary_service_name'] = 'Nombre del servicio, aparecerá en distintos sitios en la página princiap y en todas las fuentes RSS generadas [ Valor por defecto = vacío]';
+
+$messages['register_step2_help'] = 'Por favor introduzca los datos necesarios para registrar una bitácora.';
+
+$messages['create_date'] = 'Fecha creada';
+
+$messages['insert_media'] = 'Añadir fichero';
+$messages['insert_more'] = 'Añadir el enlace "Más..."';
+
+$messages['posted_in'] = 'Publicado en';
+
+$messages['purging_please_wait'] = 'Por favor espere mientras sus datos son procesados. Esta página se refrescará automáticamente mientras sus datos son procesados, por favor no interrumpa este proceso.';
+
+$messages['error_cannot_delete_last_blog_category'] = 'No es posible eliminar la última categoría de bitácoras.';
+
+$messages['help_logout_destination_url'] = 'Dirección donde los usuarios serán dirigidos cuando terminen su sesión en la interfaz de administración, en lugar de la página de acceso a la interfaz de administración [ Valor por defecto = vacío ]';
+$messages['help_default_global_article_category_id'] = 'Identificador de la categoría global de artículo por defecto [ Valor por defecto = vacío ]';
+$messages['help_blog_does_not_exist_url'] = 'URL donde los usuarios serán enviados cuando intenten acceder a una bitácora que no existe, en lugar de ser enviados a la bitácora configurada como la bitácora por defecto en este servidor [ Valor por defecto = vacío ]';
+
+$messages['help_bayesian_filter_enabled'] = 'Activar el filtro de comentarios basado en técnicas Bayesianas [ Valor por defecto = Sí ]';
+$messages['help_bayesian_filter_spam_probability_treshold'] = 'Puntuación máxima para que un comentario pueda ser considerado spam. [ Valor por defecto = 0.9]';
+$messages['help_bayesian_filter_nonspam_probability_treshold'] = 'Puntuación mínima para que un artículo pueda ser considerado no spam. [ Valor por defecto = 0.2]';
+$messages['help_bayesian_filter_min_length_token'] = 'Longitud mínima de una palabra para que pueda ser tenida en cuenta por el filtro bayesiano. [ Valor por defecto = 3]';
+$messages['help_bayesian_filter_max_length_token'] = 'Longitud máxima de una palabra para que pueda ser tenida en cuenta por el filtro bayesiano. [ Valor por defecto = 100]';
+$messages['help_bayesian_filter_number_significant_tokens'] = 'Número de partes significantes. [ Valor por defecto = 15]';
+$messages['help_bayesian_filter_spam_comments_action'] = 'Acción a ejecutar con los comentarios que son marcados como spam por el filtro. [ Valor por defecto = Keep]';
+
+$messages['trackback_urls'] = 'Retroenlaces';
+$messages['trackback_urls_help'] = 'LifeType puede encontrar las direcciones donde enviar retroenlaces automáticamente si el enlace de destino lo soporta. 
+Si los enlaces que forman parte del texto del artículo no incluyen esta característica, por favor añada cada una de las direcciones de retroenlaces "reales" (una por línea)';
+
+$messages['error_invalid_blog_name'] = 'El nombre de la bitácora no es válido';
+
+/* strings for /default/ templates */
+$messages['form_authenticated'] = 'Autentificado';
+
+$messages['help_forbidden_blognames'] = 'Lista de cadenas separadas por un espacio en blanco que no se pueden usar como nombres de bitácora. Es posible usar una expresión regular en lugar de una simple cadena. [ Valor por defecto = (vacío) ]';
+
+$messages['bookmark_it_to_lifetype'] = 'Añadir como favorito en LifeType!';
+?>
\ No newline at end of file

Deleted: plog/trunk/locale/unported/locale_es_ES.php
===================================================================
--- plog/trunk/locale/unported/locale_es_ES.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/locale/unported/locale_es_ES.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,1060 +0,0 @@
-<?php
-// set this to the encoding that should be used to display the pages correctly
-$messages['encoding'] = 'iso-8859-1';
-$messages['locale_description'] = 'Traducción al español de LifeType';
-// locale format, see Locale::formatDate for more information
-$messages['date_format'] = '%d/%m/%Y %H:%M';
-
-// days of the week
-$messages['days'] = Array( 'Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado' );
-// -- compatibility, do not touch -- //
-$messages['Monday'] = $messages['days'][1];
-$messages['Tuesday'] = $messages['days'][2];
-$messages['Wednesday'] = $messages['days'][3];
-$messages['Thursday'] = $messages['days'][4];
-$messages['Friday'] = $messages['days'][5];
-$messages['Saturday'] = $messages['days'][6];
-$messages['Sunday'] = $messages['days'][0];
-
-// abbreviations
-$messages['daysshort'] = Array( 'Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa' );
-// -- compatibility, do not touch -- //
-$messages['Mo'] = $messages['daysshort'][1];
-$messages['Tu'] = $messages['daysshort'][2];
-$messages['We'] = $messages['daysshort'][3];
-$messages['Th'] = $messages['daysshort'][4];
-$messages['Fr'] = $messages['daysshort'][5];
-$messages['Sa'] = $messages['daysshort'][6];
-$messages['Su'] = $messages['daysshort'][0];
-
-// months of the year
-$messages['months'] = Array( 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre' );
-// -- compatibility, do not touch -- //
-$messages['January'] = $messages['months'][0];
-$messages['February'] = $messages['months'][1];
-$messages['March'] = $messages['months'][2];
-$messages['April'] = $messages['months'][3];
-$messages['May'] = $messages['months'][4];
-$messages['June'] = $messages['months'][5];
-$messages['July'] = $messages['months'][6];
-$messages['August'] = $messages['months'][7];
-$messages['September'] = $messages['months'][8];
-$messages['October'] = $messages['months'][9];
-$messages['November'] = $messages['months'][10];
-$messages['December'] = $messages['months'][11];
-$messages['message'] = 'Mensaje';
-$messages['error'] = 'Error';
-$messages['date'] = 'Fecha';
-
-// miscellaneous texts
-$messages['of'] = 'de';
-$messages['recently'] = 'recientemente...';
-$messages['comments'] = 'comentarios';
-$messages['comment on this'] = 'Comentario';
-$messages['my_links'] = 'mis enlaces';
-$messages['archives'] = 'archivos';
-$messages['search'] = 'buscar';
-$messages['calendar'] = 'calendario';
-$messages['search_s'] = 'Buscar';
-$messages['search_this_blog'] = 'Buscar en esta bitácora:';
-$messages['about_myself'] = 'Quién soy?';
-$messages['permalink_title'] = 'Enlace permanente a los archivos';
-$messages['permalink'] = 'Enlace';
-$messages['posted_by'] = 'Escrito por';
-$messages['reply'] = 'Responder';
-
-// add comment form
-$messages['add_comment'] = 'Añadir comentario';
-$messages['comment_topic'] = 'Título';
-$messages['comment_text'] = 'Texto';
-$messages['comment_username'] = 'Tu nombre';
-$messages['comment_email'] = 'Dirección de correo (opcional)';
-$messages['comment_url'] = 'Página personal (opcional)';
-$messages['comment_send'] = 'Enviar';
-$messages['comment_added'] = 'Comentario añadido!';
-$messages['comment_add_error'] = 'Hubo un error añadiendo el comentario';
-$messages['article_does_not_exist'] = 'El artículo no existe';
-$messages['no_posts_found'] = 'No se encontraron artículos';
-$messages['user_has_no_posts_yet'] = 'El usuario todavía no ha escrito ningun artículo';
-$messages['back'] = 'Atrás';
-$messages['post'] = 'artículo';
-$messages['trackbacks_for_article'] = 'Retroenlaces del artículo: ';
-$messages['trackback_excerpt'] = 'Fragmento';
-$messages['trackback_weblog'] = 'Bitácora';
-$messages['search_results'] = 'Resultados de la búsqueda';
-$messages['search_matching_results'] = 'Los siguientes artículos han sido encontrados: ';
-$messages['search_no_matching_posts'] = 'No se encontraron artículos';
-$messages['read_more'] = '(Más)';
-$messages['syndicate'] = 'Agregar';
-$messages['main'] = 'Principal';
-$messages['about'] = 'Acerca de';
-$messages['download'] = 'Descargar';
-
-////// error messages /////
-$messages['error_fetching_article'] = 'El artículo especificado no existe.';
-$messages['error_fetching_articles'] = 'No se encontraron artículos';
-$messages['error_trackback_no_trackback'] = 'El artículo no ha recibido ningun retroenlace';
-$messages['error_incorrect_article_id'] = 'El identificador del artículo no es correcto';
-$messages['error_incorrect_blog_id'] = 'El identificador de la bitácora no es correcto';
-$messages['error_comment_without_text'] = 'El texto del comentario está vacío.';
-$messages['error_comment_without_name'] = 'Es necesario que dé su nombre o apodo.';
-$messages['error_adding_comment'] = 'Hubo un error añadiendo el comentario.';
-$messages['error_incorrect_parameter'] = 'Parámetro incorrecto.';
-$messages['error_parameter_missing'] = 'Falta un parámetro.';
-$messages['error_comments_not_enabled'] = 'Los comentarios han sido desactivados en esta bitácora.';
-$messages['error_incorrect_search_terms'] = 'Los términos de la búsqueda son incorrectos.';
-$messages['error_no_search_results'] = 'No se encontraros artículos que se correspondan con los términos de la búsqueda.';
-$messages['error_no_albums_defined'] = 'No hay ningun álbum disponible en esta bitácora.';
-
-/////////////////                                          //////////////////
-///////////////// STRINGS FOR THE ADMINISTRATION INTERFACE //////////////////
-/////////////////                                          //////////////////
-
-// login page
-$messages['login'] = 'Entrar';
-$messages['welcome_message'] = 'Bienvenido a LifeType';
-$messages['error_incorrect_username_or_password'] = 'El nombre de usuario o password es incorrecto.';
-$messages['error_dont_belong_to_any_blog'] = 'Su usuario no pertenece a ninguna bitácora todavía.';
-$messages['logout_message'] = 'Ha sido desconectado correctamente';
-$messages['logout_message_2'] = 'Haga clic <a href="%1$s">aquí</a> para ir a %2$s</a>.';
-$messages['error_access_forbidden'] = 'Acceso no permitido. Debe primero verificar su usuario aquí';
-$messages['username'] = 'Usuario';
-$messages['password'] = 'Password';
-
-// dashboard
-$messages['dashboard'] = 'Perspectiva';
-$messages['recent_articles'] = 'Artículos recientes';
-$messages['recent_comments'] = 'Comentarios recientes';
-$messages['recent_trackbacks'] = 'Retroenlaces recientes';
-$messages['blog_statistics'] = 'Estadísticas';
-$messages['total_posts'] = 'Número de artículos';
-$messages['total_comments'] = 'Número de comentarios';
-$messages['total_trackbacks'] = 'Número de trackbacks';
-$messages['total_viewed'] = 'Artículos leídos';
-$messages['in'] = 'En';
-
-// menu options
-$messages['newPost'] = 'Nuevo Artículo';
-$messages['Manage'] = 'Contenido';
-$messages['managePosts'] = 'Artículos';
-$messages['editPosts'] = 'Artículos';
-$messages['editArticleCategories'] = 'Categorias';
-$messages['newArticleCategory'] = 'Nueva Categoria';
-$messages['manageLinks'] = 'Enlaces';
-$messages['editLinks'] = 'Enlaces';
-$messages['newLink'] = 'Nuevo Enlace';
-$messages['editLink'] = 'Editar Enlace';
-$messages['editLinkCategories'] = 'Editar Categorías de Enlaces';
-$messages['newLinkCategory'] = 'Nueva Categoría de Enlaces';
-$messages['editLinkCategory'] = 'Editar Categoría de Enlace';
-$messages['manageCustomFields'] = 'Campos';
-$messages['blogCustomFields'] = 'Campos';
-$messages['newCustomField'] = 'Nuevo Campo';
-$messages['resourceCenter'] = 'Ficheros';
-$messages['resources'] = 'Ficheros';
-$messages['newResourceAlbum'] = 'Nuevo Álbum';
-$messages['newResource'] = 'Nuevo Fichero';
-$messages['controlCenter'] = 'Configuración';
-$messages['manageSettings'] = 'Configuración';
-$messages['blogSettings'] = 'Configuración de la Bitácora';
-$messages['userSettings'] = 'Configuración del Usuario';
-$messages['pluginCenter'] = 'Plugins';
-$messages['Stats'] = 'Estadísticas';
-$messages['manageBlogUsers'] = 'Usuarios de la Bitácora';
-$messages['newBlogUser'] = 'Invitar Usuario';
-$messages['showBlogUsers'] = 'Usuarios de la Bitácora';
-$messages['manageBlogTemplates'] = 'Plantillas';
-$messages['newBlogTemplate'] = 'Añadir Plantilla';
-$messages['blogTemplates'] = 'Plantillas de la Bitácora';
-$messages['adminSettings'] = 'Administración';
-$messages['Users'] = 'Usuarios';
-$messages['createUser'] = 'Nuevo Usuario';
-$messages['editSiteUsers'] = 'Usuarios';
-$messages['Blogs'] = 'Bitácoras';
-$messages['createBlog'] = 'Nueva Bitácora';
-$messages['editSiteBlogs'] = 'Bitácoras';
-$messages['Locales'] = 'Traducciones';
-$messages['newLocale'] = 'Nueva Traducción';
-$messages['siteLocales'] = 'Traducciones';
-$messages['Templates'] = 'Plantillas';
-$messages['newTemplate'] = 'Añadir Plantilla';
-$messages['siteTemplates'] = 'Plantillas';
-$messages['GlobalSettings'] = 'Configuración General';
-$messages['editSiteSettings'] = 'General';
-$messages['summarySettings'] = 'Portal';
-$messages['templateSettings'] = 'Plantillas';
-$messages['urlSettings'] = 'Direcciones';
-$messages['emailSettings'] = 'Email';
-$messages['uploadSettings'] = 'Transferencias';
-$messages['helpersSettings'] = 'Herramientas';
-$messages['interfacesSettings'] = 'Interfaces';
-$messages['securitySettings'] = 'Seguridad';
-$messages['bayesianSettings'] = 'Filtro Bayesiano';
-$messages['resourcesSettings'] = 'Ficheros';
-$messages['searchSettings'] = 'Búsquedas';
-$messages['cleanUpSection'] = 'Limpieza';
-$messages['cleanUp'] = 'Limpieza';
-$messages['editResourceAlbum'] = 'Editar Álbum';
-$messages['resourceInfo'] = 'Editar Fichero';
-$messages['editBlog'] = 'Editar Plantilla';
-$messages['Logout'] = 'Salir';
-
-// new post
-$messages['topic'] = 'Título';
-$messages['topic_help'] = 'Título del artículo';
-$messages['text'] = 'Texto';
-$messages['text_help'] = 'Texto del artículo. Esta parte siempre aparecerá en la página principal de la bitácora';
-$messages['extended_text'] = 'Texto extra';
-$messages['extended_text_help'] = 'Texto extra del artículo. Esta parte puede aparecer o bien siempre en la primera página o en la página del artículo. Esto es configurable en la página de configuración de la bitácora';
-$messages['post_slug'] = 'Título URL';
-$messages['post_slug_help'] = 'El título URL será usado para generar enlaces permanentes con un mayor significado semántico';
-$messages['date'] = 'Fecha';
-$messages['post_date_help'] = 'Fecha cuando este artículo debería ser publicado';
-$messages['status'] = 'Estado';
-$messages['post_status_help'] = 'Elija uno de los siguientes estados';
-$messages['post_status_published'] = 'Publicado';
-$messages['post_status_draft'] = 'Borrador';
-$messages['post_status_deleted'] = 'Eliminado';
-$messages['categories'] = 'Categorías';
-$messages['post_categories_help'] = 'Seleccione una o más categorías';
-$messages['post_comments_enabled_help'] = 'Activar comentarios';
-$messages['send_notification_help'] = 'Enviar una notificación cuando se reciban nuevos comentarios o retroenlaces';
-$messages['send_trackback_pings_help'] = 'Envíar retroenlaces';
-$messages['send_xmlrpc_pings_help'] = 'Enviar pings vía XMLRPC';
-$messages['save_draft_and_continue'] = 'Guardar Borrador';
-$messages['preview'] = 'Vista Previa';
-$messages['add_post'] = 'Añadir!';
-$messages['error_saving_draft'] = 'Hubo un error guardando el borrador';
-$messages['draft_saved_ok'] = 'Borrador guardado correctamente';
-$messages['error_sending_request'] = 'Hubo un error enviando la petición';
-$messages['error_no_category_selected'] = 'Debe seleccionar por lo menos una categoría';
-$messages['error_missing_post_topic'] = 'El título del artículo está vacío';
-$messages['error_missing_post_text'] = 'El texto del artículo está vacío';
-$messages['error_adding_post'] = 'Hubo un error guardando el artículo';
-$messages['post_added_not_published'] = 'El artículo ha sido guardado correctamente pero no aparecerá en la página principal';
-$messages['post_added_ok'] = 'El artículo ha sido guardado correctamente.';
-$messages['send_notifications_ok'] = 'Se enviará un mensaje cada vez que se reciba un comentario o retroenlace';
-
-// send trackbacks
-$messages['error_sending_trackbacks'] = 'Hubo un error enviando un retroenlace a los siguientes sitios';
-$messages['send_trackbacks_help'] = 'Seleccione las direcciones a las que quiere enviar un retroenlace. Asegúrese de que las direcciones soportan retroenlaces.';
-$messages['send_trackbacks'] = 'Enviar retroenlaces';
-$messages['ping_selected'] = 'Enviar retroenlaces';
-$messages['trackbacks_sent_ok'] = 'Los retroenlaces fueron enviados correctamente a las direcciones seleccionadas';
-
-// posts page
-$messages['show_by'] = 'Mostrar';
-$messages['category'] = 'Categoría';
-$messages['author'] = 'Autor';
-$messages['post_status_all'] = 'Todos';
-$messages['author_all'] = 'Todos';
-$messages['search_terms'] = 'Búsqueda';
-$messages['show'] = 'Mostrar';
-$messages['delete'] = 'Eliminar';
-$messages['actions'] = 'Acciones';
-$messages['all'] = 'Todos';
-$messages['category_all'] = 'Todas';
-$messages['error_incorrect_article_id'] = 'El identificador de artículo es incorrecto.';
-$messages['error_deleting_article'] = 'Hubo un error eliminando el artículo "%s"';
-$messages['article_deleted_ok'] = 'El artículo "%s" fue eliminado correctamente';
-$messages['articles_deleted_ok'] = '%s articulos fueron eliminados correctamente';
-$messages['error_deleting_article2'] = 'Hubo un error eliminando el artículo cuyo identificador es "%s"';
-
-// edit post page
-$messages['update'] = 'Actualizar';
-$messages['editPost'] = 'Editar Artículo';
-$messages['error_fetching_post'] = 'Hubo un error cargando el artículo';
-$messages['post_updated_ok'] = 'El artículo "%s" fue actualizado corrrectamente';
-$messages['error_updating_post'] = 'Hubo un error actualizando el artículo';
-$messages['notification_added'] = 'Se enviará un mensaje cada vez que se reciba un comentario o retroenlace';
-$messages['notification_removed'] = 'No se enviarán mensajes en caso de comentarios o retroenlaces';
-
-// post comments
-$messages['url'] = 'Dirección';
-$messages['comment_status_all'] = 'Todos';
-$messages['comment_status_spam'] = 'Spam';
-$messages['comment_status_nonspam'] = 'No Spam';
-$messages['error_fetching_comments'] = 'Hubo un error cargando los artículos del comentario';
-$messages['error_deleting_comments'] = 'Hubo un error eliminando los comentarios o no se seleccionó ningún comentario a eliminar';
-$messages['comment_deleted_ok'] = 'El comentario "%s" fue eliminado correctamente';
-$messages['comments_deleted_ok'] = '%s comentarios eliminados correctamente';
-$messages['error_deleting_comment'] = 'Hubo un error eliminando el comentario "%s"';
-$messages['error_deleting_comment2'] = 'Hubo un error eliminando el comentario cuyo identificador es %s';
-$messages['editComments'] = 'Comentarios';
-$messages['mark_as_spam'] = 'Marcar como spam';
-$messages['mark_as_no_spam'] = 'Marcar como no spam';
-$messages['error_incorrect_comment_id'] = 'El identificador del comentario no es correcto';
-$messages['error_marking_comment_as_spam'] = 'Hubo un error marcando el comentario como spam';
-$messages['comment_marked_as_spam_ok'] = 'El comentario fue marcado como spam correctamente';
-$messages['error_marking_comment_as_nonspam'] = 'Hubo un error marcando el comentario como no spam';
-$messages['comment_marked_as_nonspam_ok'] = 'El comentario fue marcado como no spam correctamente';
-
-// post trackbacks
-$messages['blog'] = 'Bitácora';
-$messages['excerpt'] = 'Fragmento';
-$messages['error_fetching_trackbacks'] = 'Hubo un error cargando los retroenlaces recibidos';
-$messages['error_deleting_trackbacks'] = 'Hubo un error eliminando los retroenlaces o no se seleccionó ningún retroenlace a eliminar';
-$messages['error_deleting_trackback'] = 'Hubo un error borrando el retroenlace "%s"';
-$messages['error_deleting_trackback2'] = 'Hubo un error eliminando el retroenlace cuyo identificador es "%s"';
-$messages['trackback_deleted_ok'] = 'Retroenlace "%s" eliminado correctamente';
-$messages['trackbacks_deleted_ok'] = '%s retroenlaces eliminados correctamente';
-$messages['editTrackbacks'] = 'Retroenlaces';
-
-// post statistics
-$messages['referrer'] = 'Referencia';
-$messages['hits'] = 'Hits';
-$messages['error_no_items_selected'] = 'No se seleccionaron referencias a eliminar';
-$messages['error_deleting_referrer'] = 'Hubo un error eliminando la referencia "%s"';
-$messages['error_deleting_referrer2'] = 'Hubo un error eliminando la referencia cuyo identificador es "%s"';
-$messages['referrer_deleted_ok'] = 'La referencia "%s" fue eliminada correctamente';
-$messages['referrers_deleted_ok'] = '%s referencias eliminadas correctamente';
-
-// categories
-$messages['posts'] = 'Artículos';
-$messages['show_in_main_page'] = 'Incluir en la página principal';
-$messages['error_incorrect_category_id'] = 'El identificador de la categoría no es correcto o no se seleccionaron categorías a borrar';
-$messages['error_category_has_articles'] = 'La categoría "%s" no se puede borrar porque está siendo usada por algunos artículos. Edite primero los artículos y vuelva a intentar eliminar la categoría.';
-$messages['category_deleted_ok'] = 'La categoría "%s" fue eliminada correctamente';
-$messages['categories_deleted_ok'] = '%s categorías eliminadas correctamente';
-$messages['error_deleting_category'] = 'Hubo un error eliminando la categoría "%s"';
-$messages['error_deleting_category2'] = 'Hubo un error eliminando la categoría cuyo identificador es "%s"';
-$messages['yes'] = 'Sí';
-$messages['no'] = 'No';
-
-// new category
-$messages['name'] = 'Nombre';
-$messages['category_name_help'] = 'Nombre de la categoría tal y como aparecerá en la bitácora';
-$messages['description'] = 'Descripción';
-$messages['category_description_help'] = 'Descripción de la categoría';
-$messages['show_in_main_page_help'] = 'Si se desactiva, los artículos categorizados bajo esta categoría no serán mostrados en la página principal y solo serán visibles en la página propia de la categoría';
-$messages['error_empty_name'] = 'El nombre no puede estar vacío';
-$messages['error_empty_description'] = 'La descripción no puede estar vacía';
-$messages['error_adding_article_category'] = 'Hubo un error añadiendo la categoría. Verifique los datos y vuélvalo a intentar';
-$messages['category_added_ok'] = 'La categoría "%s" fue añadida correctamente a la bitácora';
-$messages['add'] = 'Añadir';
-$messages['reset'] = 'Limpiar';
-
-// update category
-$messages['error_updating_article_category'] = 'Hubo un error actualizando la categoría';
-$messages['error_fetching_category'] = 'Hubo un error cargando la categoría';
-$messages['article_category_updated_ok'] = 'La categoría "%s" fue actualizada correctamente';
-
-// links
-$messages['feed'] = 'Contenidos RSS';
-$messages['error_no_links_selected'] = 'El identificador del enlace no es correcto o no se seleccionaron enlaces a eliminar';
-$messages['error_incorrect_link_id'] = 'El identificador del enlace no es correcto';
-$messages['error_removing_link'] = 'Hubo un error eliminando el enlace "%s"';
-$messages['error_removing_link2'] = 'Hubo un error eliminando el enlace cuyo identificador es "%s"';
-$messages['link_deleted_ok'] = 'El enlace "%s" fue eliminado correctamente';
-$messages['links_deleted_ok'] = '%s enlaces fueron eliminados correctamente';
-
-// new link
-$messages['link_name_help'] = 'Nombre para el enlace';
-$messages['link_url_help'] = 'Dirección del enlace';
-$messages['link_description_help'] = 'Breve descripción sobre el enlace';
-$messages['link_feed_help'] = 'Enlace a una fuende de contenidos RSS o Atom del enlace';
-$messages['link_category_help'] = 'Elija una de las categorías de enlace disponibles';
-$messages['error_adding_link'] = 'Se produjo un error añadiendo el enlace. Verifique los datos y vuélvalo a intentar';
-$messages['error_invalid_url'] = 'La dirección no es correcta';
-$messages['link_added_ok'] = 'El enlace "%s" fue añadido correctamente';
-
-// update link
-$messages['error_updating_link'] = 'Se produjo un error actualizando el enlace. Verifique los datos y vuélvalo a intentar';
-$messages['error_fetching_link'] = 'Se produjo un error al cargar en enlace';
-$messages['link_updated_ok'] = 'El enlace "%s" fue actualizado correctamente';
-
-// link categories
-$messages['links'] = 'Enlaces';
-$messages['error_invalid_link_category_id'] = 'El identificador de la categoría de enlaces no es correcto o no se eligió ninguna categoría de enlaces';
-$messages['error_links_in_link_category'] = 'Hay algunos enlaces clasificados bajo la categoría "%s". Modifique los enlaces primero y vuélvalo a intentar.';
-$messages['error_removing_link_category'] = 'Hubo un error eliminando la categoría de enlaces "%s"';
-$messages['link_category_deleted_ok'] = 'La categoría de enlaces "%s" fue eliminada correctamente';
-$messages['link_categories_deleted_ok'] = '%s categorías de enlaces fueron eliminadas correctamente';
-$messages['error_removing_link_category2'] = 'Hubo un error eliminando la categoría de enlaces cuyo identificador es "%s"';
-
-// new link category
-$messages['link_category_name_help'] = 'Nombre dado a esta categoría de enlaces';
-$messages['error_adding_link_category'] = 'Hubo un error añadiendo la nueva categoría de enlaces';
-$messages['link_category_added_ok'] = 'La categoría de enlaces "%s" fue añadida correctamente';
-
-// edit link category
-$messages['error_updating_link_category'] = 'Hubo un error actualizando la categoría de enlace. Compruebe los datos y vuélvalo a intentar.';
-$messages['link_category_updated_ok'] = 'La categoría de enlaces "%s" fue actualizada correctamente';
-$messages['error_fetching_link_category'] = 'Se produjo un error cargando la categoría de enlaces';
-
-// custom fields
-$messages['type'] = 'Tipo';
-$messages['hidden'] = 'Oculto';
-$messages['fields_deleted_ok'] = '%s campos eliminados correctamente';
-$messages['field_deleted_ok'] = 'El campo "%s" fue borrado correctamente';
-$messages['error_deleting_field'] = 'Hubo un error eliminando el campo "%s"';
-$messages['error_deleting_field2'] = 'Hubo un error eliminando el campo cuyo identificador es "%s"';
-$messages['error_incorrect_field_id'] = 'El identificador del campo no es correcto';
-
-// new custom field
-$messages['field_name_help'] = 'Nombre del campo que será usado para obtener su valor en los artículos';
-$messages['field_description_help'] = 'Descripción del campo que será mostrada al añadir o editar un artículo';
-$messages['field_type_help'] = 'Elija uno de los siguientes tipos de campo';
-$messages['field_hidden_help'] = 'Si el campo está marcado como oculto, no será mostrado en las pantallas de edición o nuevo artículo. Este atributo es usado casi únicamente por plugins que añaden nuevos campos para su uso';
-$messages['error_adding_custom_field'] = 'Hubo un error añadiendo el campo. Compruebe los datos y vuélvalo a intentar';
-$messages['custom_field_added_ok'] = 'El campo "%s" fue añadido correctamente';
-$messages['text_field'] = 'Campo de texto';
-$messages['text_area'] = 'Caja de texto';
-$messages['checkbox'] = 'Casilla';
-$messages['date_field'] = 'Campo de fecha';
-
-// edit custom field
-$messages['error_fetching_custom_field'] = 'Hubo un error cargando el campo';
-$messages['error_updating_custom_field'] = 'Hubo un error actualizando el capmo. Compruebe los datos y vuélvalo a intentar';
-$messages['custom_field_updated_ok'] = 'El campo "%s" fue actualizado correctamente';
-
-// resources
-$messages['root_album'] = 'Álbum raíz';
-$messages['num_resources'] = 'Número de ficheros';
-$messages['total_size'] = 'Tamaño total';
-$messages['album'] = 'Álbjum';
-$messages['error_incorrect_album_id'] = 'El identificador del álbum no es válido';
-$messages['error_base_storage_folder_missing_or_unreadable'] = 'No fue posible crear los directorios necesarios donde los ficheros van a ser guardados. Esto puede ser debido a varias razones, como por ejemplo que el "safe mode" esté activado en su configuración del PHP or que el usuario usado para ejecutar PHP no tenga suficientes permisos. También puede intentar crear los siguientes directorios manualmente: <br/><br/>%s<br/><br/>Si los directorios ya existen, asegúrese de que pueden ser leídos y escritos por el usuario que se está usando para ejecutar el servidor de web/PHP';
-$messages['items_deleted_ok'] = '%s ficheros eliminados correctamente';
-$messages['error_album_has_children'] = 'El álbum "%s" tiene subálbums. Modifique primero los subálbums y vuélvalo a intentar';
-$messages['item_deleted_ok'] = 'El fichero "%s" fue borrado correctamente';
-$messages['error_deleting_album'] = 'Hubo un error eliminando el campo "%s"';
-$messages['error_deleting_album2'] = 'Hubo un error eliminando el campo cuyo identificador es "%s"';
-$messages['error_deleting_resource'] = 'Hubo un error eliminando el fichero "%s"';
-$messages['error_deleting_resource2'] = 'Hubo un error eliminando el fichero cuyo identificador es "%s"';
-$messages['error_no_resources_selected'] = 'No se seleccionaron ficheros o álbums para eliminar';
-$messages['resource_deleted_ok'] = 'El fichero "%s" fue eliminado correctamente';
-$messages['album_deleted_ok'] = 'El álbum "%s" fue eliminado correctamente';
-$messages['add_resource'] = 'Añadir fichero';
-$messages['add_resource_preview'] = 'Añadir vista previa';
-$messages['add_resource_medium'] = 'Add vista mediana';
-$messages['add_album'] = 'Añadir álbum';
-
-// new album
-$messages['album_name_help'] = 'Nombre del nuevo álbum';
-$messages['parent'] = 'Padre';
-$messages['no_parent'] = 'Álbum raíz';
-$messages['parent_album_help'] = 'Álbums pueden contener subálbums de forma que pueda organizar sus contenidos mejor';
-$messages['album_description_help'] = 'Descripción de los contenidos del álbum';
-$messages['error_adding_album'] = 'Hubo un error añadiendo el nuevo álbum. Compruebe los datos y vuélvalo a intentar';
-$messages['album_added_ok'] = 'El álbum "%s" fue añadido correctamente';
-
-// edit album
-$messages['error_incorrect_album_id'] = 'El identificador del álbum no es correcto';
-$messages['error_fetching_album'] = 'Hubo un error cargando el álbum';
-$messages['error_updating_album'] = 'Hubo un error actualizando el álbum. Compruebe los datos y vuélvalo a intentar';
-$messages['album_updated_ok'] = 'El álbum "%s" fue actualizado correctamente';
-$messages['show_album_help'] = 'Si esta casilla está desactivada, el álbum y los ficheros que estén incluídos en él no aparecerán en la parte pública del blog';
-
-// new resource
-$messages['file'] = 'Fichero';
-$messages['resource_file_help'] = 'Fichero que desea añadir. Use el enlace "Añadir Otro" para añadir más de un fichero al mismo tiempo (aunque tardará más rato en terminar la operación)';
-$messages['add_field'] = 'Añadir otro';
-$messages['resource_description_help'] = 'Descripción sobre los contenidos del fichero';
-$messages['resource_album_help'] = 'Seleccione el álbum al que se añadirá el fichero';
-$messages['error_no_resource_uploaded'] = 'No seleccionó ningún fichero para añadir';
-$messages['resource_added_ok'] = 'El fichero "%s" fue añadido correctamente';
-$messages['error_resource_forbidden_extension'] = 'El fichero no fue añadido porque es de un tipo no permitido por el administrador';
-$messages['error_resource_too_big'] = 'El fichero no fue añadido porque es demasiado grande';
-$messages['error_uploads_disabled'] = 'El fichero no fue añadido porque la posibilidad de añadir ficheros ha sido desactivada por el administrador';
-$messages['error_quota_exceeded'] = 'El fichero no fue añadido porque se ha superado el tamaño máximo total de ficheros permitido para nuestra bitácora';
-$messages['error_adding_resource'] = 'Hubo un error añadiendo el fichero';
-
-// edit resource
-$messages['editResource'] = 'Editar fichero';
-$messages['resource_information_help'] = 'Información sobre el fichero';
-$messages['information'] = 'Información';
-$messages['size'] = 'Tamaño';
-$messages['format'] = 'Formato';
-$messages['dimensions'] = 'Dimensiones';
-$messages['bits_per_sample'] = 'Bits por muestra';
-$messages['sample_rate'] = 'Frecuencia de muestreo';
-$messages['number_of_channels'] = 'Número de canales';
-$messages['legnth'] = 'Duración';
-$messages['thumbnail_format'] = 'Formato de la vista previa';
-$messages['regenerate_preview'] = 'Regenerar vista previa';
-$messages['error_fetching_resource'] = 'Hubo un error cargando el fichero';
-$messages['error_updating_resource'] = 'Hubo un error actualizando el fichero';
-$messages['resource_updated_ok'] = 'El fichero "%s" fue actualizado correctamente';
-
-// blog settings
-$messages['blog_link'] = 'Dirección';
-$messages['blog_link_help'] = 'Enlace permanente a esta bitácora';
-$messages['blog_name_help'] = 'Título de esta bitácora';
-$messages['blog_description_help'] = 'Descripción de los contenidos de esta bitácora';
-$messages['language'] = 'Idioma';
-$messages['blog_language_help'] = 'Idioma usado para mostrar los textos de tanto la parte pública como la parte privada de la bitácora';
-$messages['max_main_page_items'] = 'Artículos mostrados en la página principal';
-$messages['max_main_page_items_help'] = 'Máximo número de artículos que deben ser mostrados en la página principal de la bitácora';
-$messages['max_recent_items'] = 'Número de artículos recientes';
-$messages['max_recent_items_help'] = 'Máximo número de artículos recientes que deben ser mostrados';
-$messages['template'] = 'Plantilla';
-$messages['choose'] = 'Elegir';
-$messages['blog_template_help'] = 'Plantilla que será usada para mostrar los contenidos de la bitácora. Esta lista incluye las plantillas globales además de las plantillas que han sido instaladas exclusivamente para esta bitácora';
-$messages['use_read_more'] = 'Añadir el enlace "Más..." a los artículos';
-$messages['use_read_more_help'] = 'Si se activa, sólo el texto que se introdució en la caja de texto marcada como "Texto" en la página de edición de artículos se mostrará en la página principal y se añadirá un enlace titulado "Más..." al final del texto. El resto del artículo se mostrará en la página propia del artículo. Si se desactiva, el artículo entero se mostrará siempre en la página principal';
-$messages['enable_wysiwyg'] = 'Activar el editor visual de artículos';
-$messages['enable_wysiwyg_help'] = 'Activa el editor visual de código HTML, que muestra el contenido del artículo tal cual aparecerá en la bitácora. Esta funcionalidad requiere Internet Explorer 5.5 o Mozilla 1.3 o superiores';
-$messages['enable_comments'] = 'Permitir comentarios por defecto';
-$messages['enable_comments_help'] = 'Permite comentarios en todos los artículos por defecto, aunque los comentarios se pueden activar o desactivar a voluntad específicamente para cada artículo';
-$messages['show_future_posts'] = 'Mostrar los artículos con fecha en el futuro';
-$messages['show_future_posts_help'] = 'Muestra los artículos que tengan fetcha futura en el calendario y en la página principal';
-$messages['comments_order'] = 'Ordern de los comentarios';
-$messages['comments_order_help'] = 'Orden en que los comentarios de un artículo deben ser mostrados';
-$messages['oldest_first'] = 'Los antiguos primero';
-$messages['newest_first'] = 'Los nuevos primero';
-$messages['categories_order'] = 'Orden de las categorías';
-$messages['categories_order_help'] = 'Orden en que las categorías deben ser mostradas en la página principal';
-$messages['most_recent_updated_first'] = 'Las categorías que se hayan actualizado más recientemente primero';
-$messages['alphabetical_order'] = 'Orden alfabético';
-$messages['reverse_alphabetical_order'] = 'Orden alfabético inverso';
-$messages['most_articles_first'] = 'Las que tengan más artículos primero';
-$messages['link_categories_order'] = 'Orden de las categorías de enlaces';
-$messages['link_categories_order_help'] = 'Orden en que las categorías de enlaces deben ser mostradas en la página principal';
-$messages['most_links_first'] = 'Las que tengan más enlaces primero';
-$messages['most_links_last'] = 'Las que tengan menos enlaces primero';
-$messages['time_offset'] = 'Diferencia horaria';
-$messages['time_offset_help'] = 'Diferencia horaria en número de horas que será añadida dinámicamente a cada fecha y hora mostrada en la bitácora';
-$messages['close'] = 'Cerrar';
-$messages['select'] = 'Seleccionar';
-$messages['error_updating_settings'] = 'Hubo un error actualizando la configuración de la bitácora. Compruebe los datos y vuélvalo a intentar';
-$messages['error_invalid_number'] = 'El valor no es correcto';
-$messages['error_incorrect_time_offset'] = 'El valor de la diferencia horaria no es correcto';
-$messages['blog_settings_updated_ok'] = 'La configuración de la bitácora fue guardada correctamente';
-$messages['hours'] = 'Horas';
-
-// user settings
-$messages['username_help'] = 'Nombre de usuario, no puede ser cambiado';
-$messages['full_name'] = 'Nombre completo';
-$messages['full_name_help'] = 'Nombre completo, opcional';
-$messages['password_help'] = 'Cambie el password y confírmelo, o deje los campos vacíos si no desea hacer ningun cambio.';
-$messages['confirm_password'] = 'Confirmar el password';
-$messages['email'] = 'Direccion de correo';
-$messages['email_help'] = 'Dirección de correo donde las notificaciones serán enviadas';
-$messages['bio'] = 'Descripción personal';
-$messages['bio_help'] = 'Descripción personal, opcional';
-$messages['picture'] = 'Foto';
-$messages['user_picture_help'] = 'Puede elegir una foto de las disponibles en esta bitácora como fichero para que sea su foto personal';
-$messages['error_invalid_password'] = 'El password no es correcto o por ejemplo, es demasiado corto';
-$messages['error_passwords_dont_match'] = 'El password y la confirmación no son iguales';
-$messages['error_incorrect_email_address'] = 'La dirección de correo no es válida';
-$messages['error_updating_user_settings'] = 'Hubo un error guardando sus datos. Compruebe los datos y vuélvalo a intentar';
-$messages['user_settings_updated_ok'] = 'Los datos de usuario fueron guardados correctamente';
-$messages['resource'] = 'Fichero';
-
-// plugin centre
-$messages['identifier'] = 'Identificador';
-$messages['error_plugins_disabled'] = 'La funcionalidad de plugins ha sido desactivada por el administrador.';
-
-// blog users
-$messages['revoke_permissions'] = 'Quitar permisos';
-$messages['error_no_users_selected'] = 'No se seleccionó ningun usuario';
-$messages['user_removed_from_blog_ok'] = 'El usuario "%s" ya no tiene permisos para acceder a esta bitácora';
-$messages['users_removed_from_blog_ok'] = '%s usuarios ya no tienen acceso a esta bitácora';
-$messages['error_removing_user_from_blog'] = 'Hubo un error eliminando el acceso a esta bitácora del usuario "%s"';
-$messages['error_removing_user_from_blog2'] = 'Hubo un error eliminando el acceso a esta bitácora del usuario cuyo identificador es "%s"';
-
-// new blog user
-$messages['new_blog_username_help'] = 'Nombre del usuario al que se quiere dar acceso a esta bitácora. El usuario solo tendrá acceso a las secciones "Contenido" y "Ficheros"';
-$messages['send_notification'] = 'Enviar notificación';
-$messages['send_user_notification_help'] = 'Enviar un mensaje de notificación a este usuario';
-$messages['notification_text'] = 'Texto';
-$messages['notification_text_help'] = 'Texto que será incluido en la notificación enviada a este usuario';
-$messages['error_adding_user'] = 'Hubo un error dando acceso al usuario. Compruebe los datos y vuélvalo a intentar';
-$messages['error_empty_text'] = 'El texto de la notificación no puede estar vacío';
-$messages['error_invalid_user'] = 'El usuario "%s" no es válido o no existe';
-$messages['user_added_to_blog_ok'] = 'El usuario "%s" ya puede acceder a esta bitácora';
-
-// blog templates
-$messages['error_no_templates_selected'] = 'No se selecciaron plantillas';
-$messages['error_template_is_current'] = 'La plantilla "%s" no se puede eliminar porque es la que está usando la bitácora';
-$messages['error_removing_template'] = 'Hubo un error borrando la plantilla "%s"';
-$messages['template_removed_ok'] = 'La plantilla "%s" fue eliminada correctamente';
-$messages['templates_removed_ok'] = '%s plantillas fueron eliminadas correctamente';
-
-// new blog template
-$messages['template_installed_ok'] = 'La plantilla "%s" fue añadida correctamente';
-$messages['error_installing_template'] = 'Hubo un error añadiendo la plantilla "%s"';
-$messages['error_missing_base_files'] = 'La plantilla no pudo ser añadida porque algunos de los ficheros básicos de la plantilla no están disponibles';
-$messages['error_add_template_disabled'] = 'No se pueden añadir nuevas plantillas porque esta posibilidad ha sido desactivada por el administrador';
-$messages['error_must_upload_file'] = 'No se envió ningun fichero con datos de una plantilla';
-$messages['error_uploads_disabled'] = 'La posibilidad de enviar ficheros al servidor ha sido desactivada por el administrador';
-$messages['error_no_new_templates_found'] = 'No se encontraron nuevas plantillas';
-$messages['error_template_not_inside_folder'] = 'Los ficheros de la plantilla se deben guardar dentro de un directorio cuyo nombre debe ser el mismo que el de la plantilla';
-$messages['error_unpacking'] = 'Hubo un error descomprimiendo el fichero de la plantilla';
-$messages['error_forbidden_extensions'] = 'Algunos de los ficheros de la plantilla contenían una extensión no permitida en este sitio';
-$messages['error_creating_working_folder'] = 'Hubo un error creando un directorio temporal para descomprimir la plantilla';
-$messages['error_checking_template'] = 'Hubo un error comprobando que la plantilla es correcta: %s';
-$messages['template_package'] = 'Plantilla';
-$messages['blog_template_package_help']  = 'Use este formulario para enviar nuevas plantillas al servidor. Éstas plantillas solo estarán disponibles para esta bitácora. Si no es posible enviar ficheros, use por ejemplo un cliente de FTP para subir los ficheros y colóquelos en el directorio <b>%s</b> y luego use el botón "<b>Actualizar plantillas</b>" para añadir cualquier plantilla nueva. LifeType comprobará el contenido del directorio y añadirá automáticamente todas las plantillas nuevas';
-$messages['scan_templates'] = 'Actualizar plantillas';
-
-// site users
-$messages['user_status_active'] = 'Activo';
-$messages['user_status_disabled'] = 'Desactivado';
-$messages['user_status_all'] = 'Todos';
-$messages['user_status_unconfirmed'] = 'Sin confirmar';
-$messages['error_invalid_user2'] = 'El usuario cuyo identificador es "%s" no existe';
-$messages['error_deleting_user'] = 'Hubo un error desactivando el usuario "%s"';
-$messages['user_deleted_ok'] = 'El usuario "%s" fue desactivado correctamente';
-$messages['users_deleted_ok'] = '%s usuarios fueron desactivados correctamente';
-
-// create user
-$messages['user_added_ok'] = 'El usuario "%s" fue añadido correctamente';
-$messages['user_status_help'] = 'Estado del usuario';
-$messages['user_blog_help'] = 'Bitácora a la que este usuario será asignado inicialmente';
-$messages['none'] = 'Ninguno';
-
-// edit user
-$messages['error_invalid_user'] = 'El nombre de usuario no es correcto o no existe';
-$messages['error_updating_user'] = 'Hubo un error actualizando el usuario. Compruebe los datos y vuélvalo a intentar';
-$messages['blogs'] = 'Bitácoras';
-$messages['user_blogs_help'] = 'Bitácoras a las que el usuario tiene acceso como usuario o como propietario de la bitácora';
-$messages['site_admin'] = 'Administrador';
-$messages['site_admin_help'] = 'Dar permisos de administrador a este usuario de forma que pueda acceder a la sección de "Administración"';
-$messages['user_updated_ok'] = 'El usuario "%s" fue actualizado correctamente';
-
-// site blogs
-$messages['blog_status_all'] = 'Todas';
-$messages['blog_status_active'] = 'Activas';
-$messages['blog_status_disabled'] = 'Desactivada';
-$messages['blog_status_unconfirmed'] = 'Sin confirmar';
-$messages['owner'] = 'Propietario';
-$messages['quota'] = 'Cuota';
-$messages['bytes'] = 'bytes';
-$messages['error_no_blogs_selected'] = 'No se seleccionaron bitácoras para desactivar';
-$messages['error_blog_is_default_blog'] = 'La bitácora "%s" no se puede desactivar porque es la bitácora por defecto';
-$messages['blog_deleted_ok'] = 'La bitácora "%s" fue desactivada correctamente';
-$messages['blogs_deleted_ok'] = '%s fueron desactivadas correctamente';
-$messages['error_deleting_blog'] = 'Hubo un error desactivando la bitácora "%s"';
-$messages['error_deleting_blog2'] = 'Hubo un error desactivando la bitácora cuyo identificador es "%s"';
-
-// create blog
-$messages['error_adding_blog'] = 'Hubo un error añadiendo la bitácora. Compruebe los datos y vuélvalo a intentar';
-$messages['blog_added_ok'] = 'La bitácora "%s" fue añadida correctamente';
-
-// edit blog
-$messages['blog_status_help'] = 'Estado de la bitácora';
-$messages['blog_owner_help'] = 'Propietario de la bitácora, que tendrá control sobre su configuración';
-$messages['users'] = 'Usuarios';
-$messages['blog_quota_help'] = 'Cuota de ficheros en bytes. Use un valor de 0 para otorgar espacio ilimitado';
-$messages['blog_users_help'] = 'Usuarios que pueden acceder a esta bitácora, pero sin acceso a su configuración. Asigne los usuarios de la izquierda a la lista de la derecha para añadir nuevos usuarios, o viceversa para eliminar usuarios existentes';
-$messages['edit_blog_settings_updated_ok'] = 'La bitácora "%s" fue actualizada correctamente';
-$messages['error_updating_blog_settings'] = 'Hubo un error actualizando la bitácora "%s"';
-$messages['error_incorrect_blog_owner'] = 'El usuario seleccionado como propietario de la bitácora no es correcto';
-$messages['error_fetching_blog'] = 'Hubo un error cargando la bitácora';
-$messages['error_updating_blog_settings2'] = 'Hubo un error actualizando la bitácora. Compruebe los datos e inténtelo de nuevo';
-$messages['add_or_remove'] = 'Añadir o eliminar usuarios';
-
-// site locales
-$messages['locale'] = 'Traducción';
-$messages['locale_encoding'] = 'Condificación';
-$messages['locale_deleted_ok'] = 'La traducción "%s" fue eliminada correctamente';
-$messages['error_no_locales_selected'] = 'No se seleccionaron traducciones para eliminar';
-$messages['error_deleting_only_locale'] = 'La traducción no pudo ser eliminada porque es la única que queda en el sistema';
-$messages['locales_deleted_ok']= '%s traducciones fueron eliminadas correctamente';
-$messages['error_deleting_locale'] = 'Hubo un error borrando la traducción "%s"';
-$messages['error_locale_is_default'] = 'La traducción "%s" no pudo ser eliminada porque es la que se está usando por defecto para las nuevas bitácoras';
-
-// add locale
-$messages['error_invalid_locale_file'] = 'El fichero con la traducción no es válido';
-$messages['error_no_new_locales_found'] = 'No se encontraron nuevos ficheros con traducciones';
-$messages['locale_added_ok'] = 'La traducción "%s" fue añadida correctamente';
-$messages['error_saving_locale'] = 'Hubo un error guardando la nueva traducción';
-$messages['scan_locales'] = 'Actualizar traducciones';
-$messages['add_locale_help'] = 'Use este formulario para añadir nuevas traducciones. Si no es posible enviar ficheros al servidor, suba el fichero al servidor manualmente mediante por ejemplo FTP, guárdelo en el directorio <b>./locales/</b> y use el botón "<b>Actualizar traducciones</b>". LifeType leerá el directorio y añadirá automáticamente cualquier nueva traducción';
-
-// site templates
-$messages['error_template_is_default'] = 'La plantilla "%s" no pudo ser eliminada porque es la que se está usando por defecto para nuevas bitácoras';
-
-// add template
-$messages['global_template_package_help'] = 'Use este formulario para enviar nuevas plantillas al servidor. Éstas plantillas estarán disponibles para todas las bitácoras del servidor. Si no es posible enviar ficheros, use por ejemplo un cliente de FTP para subir los ficheros y colóquelos en el directorio <b>%s</b> y luego use el botón "<b>Actualizar plantillas</b>" para añadir cualquier plantilla nueva. LifeType comprobará el contenido del directorio y añadirá automáticamente todas las plantillas nuevas';
-
-// global settings
-$messages['site_config_saved_ok'] = 'La configuración general fue guardada correctamente';
-$messages['error_saving_site_config'] = 'Hubo un error guardando la configuración general';
-/// general settings
-$messages['help_comments_enabled'] = 'Activar los comentarios en nuevas bitácoras por defecto [Valor por defecto = Sí]';
-$messages['help_beautify_comments_text'] = 'Si se activa, los comentarios enviados por los usuarios serán formateados automáticamente añadiendo párrafos y generando enlaces automáticamente a partir de direcciones [Valor por defecto = Sí]';
-$messages['help_temp_folder'] = 'Carpeta donde el LifeType puede escribir sus ficheros temporales de uso interno. Use una carpeta fuera del árbol de directorios del servidor de web para mayor seguridad [Valor por defecto = ./tmp]';
-$messages['help_base_url'] = 'Dirección base donde el LifeType está instalado';
-$messages['help_subdomains_enabled'] = 'Activar el soporte para subdominios. Vea la sección de la documentación sobre subdominios para más información [Valor por defecto = No]';
-$messages['help_subdomains_base_url'] = 'Cuando los subdominios estan activados, se usará está URL base en lugar de base_url. Use {blogname} para obtener el nombre de la bitácora y {username} para obtener el nombre del usuario, para generar un enlace permanente a la bitácora (p. ej. "http://{blogname}.sudominio.com")';
-$messages['help_include_blog_id_in_url'] = 'Cuando los subdominions están activados conjuntamente con las URLs "normales", esto forzará al LifeType a no incluir el parámetro "blogId". No debería alterar este valor si no sabe lo que está haciendo [Valor por defecto = Sí]';
-$messages['help_script_name'] = 'Configure este parámetro si por alguna razón tiene que renombrar index.php [Valor por defecto = index.php]';
-$messages['help_show_posts_max'] = 'Número máximo de artículos en la página principal para nuevas bitácoras [Valor por defecto = 15]';
-$messages['help_recent_posts_max'] = 'Número máximo de artículos recientes mostrados en la página principal para nuevas bitácoras [Valor por defecto = 10]';
-$messages['help_save_drafts_via_xmlhttprequest_enabled'] = 'Activar el soporte para XmlHttpRequest de forma que se puedan guardar borradores de artículos sin tener que refrescar la página de edición [Valor por defecto = Sí]';
-$messages['help_locale_folder'] = 'Carpeta donde están guardadas las traducciones. Use una carpeta fuera del árbol de directorios del servidor de web para mayor seguridad [Valor por defecto = ./locale]';
-$messages['help_default_locale'] = 'Idioma por defecto para las nuevas bitácoras [Valor por defecto = en_UK]';
-$messages['help_default_blog_id'] = 'Bitácora por defecto que será mostrada si no especifica una bitácora en particular [Valor por defecto = 1]';
-$messages['help_default_time_offset'] = 'Diferencia horaria por defecto de las nuevas bitácoras [Valor por defecto = 0]';
-$messages['help_html_allowed_tags_in_comments'] = 'Lista de entidades HTML, separadas por espacios en blanco, que están permitidas en los comentarios [Valor por defecto = &lt;a&gt;&lt;i&gt;&lt;br&gt;&lt;br/&gt;&lt;b&gt;]';
-$messages['help_referer_tracker_enabled'] = 'Guardar los "referrers" en la base de datos [Valor por defecto = Sí]';
-$messages['help_show_more_enabled'] = 'Activar el enlace "Más..." por defecto para nuevas bitácoras [Valor por defecto = Sí]';
-$messages['help_update_article_reads'] = 'LifeType actualizará el contador de veces que un artículo ha sido leído si se activa [Valor por defecto = Sí]';
-$messages['help_update_cached_article_reads'] = 'Igual que update_article_reads, pero además se actualizará el contador aunque la caché esté activada [Valor por defecto = Sí]';
-$messages['help_xmlrpc_ping_enabled'] = 'Activar la posibilidad de enviar pings mediante XMLRPC a los sitios que lo soporten [Valor por defecto = Sí]';
-$messages['help_send_xmlrpc_pings_enabled_by_default'] = 'Activar el soporte para pings XMLRPC por defecto en nuevos artículos [Valor por defecto = Sí]';
-$messages['help_xmlrpc_ping_hosts'] = 'URLs de servicios que implementen soporte para pings XMLRPC. Ponga cada dirección en una línea nueva [Valor por defecto = http://rpc.weblogs.com/RPC2]';
-$messages['help_trackback_server_enabled'] = 'Activar el soporte para recibir retroenlaces [Valor por defecto = Sí]';
-$messages['help_htmlarea_enabled'] = 'Activar por defecto el editor visual de artículos para las nuevas bitácoras [Valor por defecto = Sí';
-$messages['help_plugin_manager_enabled'] = 'Activar los plugins [Valor por defecto = Sí]';
-$messages['help_minimum_password_length'] = 'Tamaño mínimo, en carácteres, que un password debe tener [Valor por defecto = 4]';
-$messages['help_xhtml_converter_enabled'] = 'Activa un filtro que intentará convertir el texto de los artículos a XHTML válido automáticamente [Valor por defecto = Sí]';
-$messages['help_xhtml_converter_aggressive_mode_enabled'] = 'LifeType intetará corregir casi todo lo que pueda para asegurar que nuestros artículos sean XHTML válido, aunque activando este modo es posible que se cometan más errores [Valor por defecto = No]';
-$messages['help_session_save_path'] = 'Carpeta donde el LifeType guarda sus sesiones, mediante la función session_save_path() del PHP. Deje este campo vació para usar el valor por defecto del PHP. Si usa otra carpeta que no sea la por defecto, asegúrese de que puede ser escrita por el usuario ejecutando el servidor de web [Valor por defecto = (vacío)]';
-// summary settings
-$messages['help_summary_page_show_max'] = 'Número de artículos que se mostrarán en el portal. Este parámetro controla todas las listas del portal (artículos más recientes, bitácoras más activas, etc) [Valor por defecto = 10]';
-$messages['help_summary_items_per_page'] = 'Número de bitácoras por página en la sección "Bitácoras" del portal [Valor por defecto = 25]';
-$messages['help_forbidden_usernames'] = 'Lista de nombres de usuario que no se pueden registrar [Valor por defecto = admin www blog ftp]';
-$messages['help_force_one_blog_per_email_account'] = 'No permitir más de una bitácora por dirección de correo [Valor por defecto = No]';
-$messages['help_summary_show_agreement'] = 'Mostrar un texto/licencia con el cual los usuarios tienen que estar de acuerdo antes de continuar con el proceso de registro [Valor por defecto = Sí]';
-$messages['help_need_email_confirm_registration'] = 'Enviar un email a los nuevos usuarios con un enlace al que tienen que acceder, para confirmar el registro de una nueva bitácora [Valor por defecto = Sí]';
-$messages['help_summary_disable_registration'] = 'No permitir el registro de nuevas bitácoras [Valor por defecto = No]';
-// templates
-$messages['help_template_folder'] = 'Carpeta donde se guardan las plantillas [Valor por defecto = ./templates]';
-$messages['help_default_template'] = 'Plantilla por defecto para las nuevas bitácoras [Valor por defecto = standard]';
-$messages['help_users_can_add_templates'] = 'Permitir que los usuarios añadan sus propias plantillas [Valor por defecto = Sí]';
-$messages['help_template_compile_check'] = 'Si se activa, Smarty comprobará si los ficheros de las plantillas han cambiado y si es así, las recompilará [Valor por defecto = Sí]';
-$messages['help_template_cache_enabled'] = 'Activa la cache de plantillas. Si está activada, las páginas de las bitácoras solo se generarán una vez y se usarán hasta que haya algun cambio. De esta forma, no será necesario traer los datos desde la base de datos cada vez [Valor por defecto = Sí]';
-$messages['help_template_cache_lifetime'] = 'Tiempo en segundos de vida de la caché. Asigne -1 para que la caché nucna expire';
-$messages['help_template_http_cache_enabled'] = 'Activar el soporte para las peticiones condicionales vía HTTP. Si se activa, LifeType tendrá en cuenta el valor de la cabecera HTTP "If-Modified-Since" y solo enviará los datos en caso de que sea necesario para ahorrar ancho de banda [Valor por defecto = No]';
-$messages['help_allow_php_code_in_templates'] = 'Permite incluir código PHP en las plantillas de Smarty vía {php}...{/php} [Valor por defecto = No]';
-// urls
-$messages['help_request_format_mode'] = 'Elija uno de los siguientes formatos de URLs. Si piensa usar "URLs Personales", configure los formatos de las URLs si es necesario [Valor por defecto = Plain]';
-$messages['plain'] = 'Normal';
-$messages['search_engine_friendly'] = 'Search engine friendly';
-$messages['custom_url_format'] = 'URLs Personales';
-$messages['help_permalink_format'] = 'Formato de los enlaces permanentes a artículos cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/{catname}/{year}/{month}/{day}/{postname}$]';
-$messages['help_category_link_format'] = 'Formato de los enlaces a categorías de artículos cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/{catname}$]';
-$messages['help_blog_link_format'] = 'Formato de los enlaces permanentes a bitácoras cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}$]';
-$messages['help_archive_link_format'] = 'Formato de los enlaces a los archivos cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/archives/{year}/?{month}/?{day}]';
-$messages['help_user_posts_link_format'] = 'Formato de los enlaces permanentes a los artículos de un autor en particular cuando las URLs personales están activadas [Valor por defecto = /blog/{blogname}/user/{username}$]';
-$messages['help_post_trackbacks_link_format'] = 'Formato de los enlaces a las páginas con los retroenlaces recibidos cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/post/trackbacks/{postname}$]';
-$messages['help_template_link_format'] = 'Formato de los enlaces a páginas personales cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/page/{templatename}$]';
-$messages['help_album_link_format'] = 'Formato de los enlaces a álbums de ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/album/{albumname}$]';
-$messages['help_resource_link_format'] = 'Formato de los enlaces a ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/{resourcename}$]';
-$messages['help_resource_preview_link_format'] = 'Formato de los enlaces a las vistas previas de ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/preview/{resourcename}$]';
-$messages['help_resource_medium_size_preview_link_format'] = 'Formato de los enlaces a las vistas previas de tamaño medio cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/preview-med/{resourcename}$]';
-$messages['help_resource_download_link_format'] = 'Formato de los enlaces para descargar ficheros cuando las URLs personales están activadas  [Valor por defecto = /blog/{blogname}/resource/{albumname}/download/{resourcename}$]';
-// email
-$messages['help_check_email_address_validity'] = 'Si se activa, LifeType contactará con el servidor de correo especificado en el registro MX del especificado por el servidor DNS del dominio y comprobará si el usuario es válido [Valor por defecto = No]';
-$messages['help_email_service_enabled'] = 'Activar el soporte para enviar mensajes [Valor por defecto = Sí]';
-$messages['help_post_notification_source_address'] = 'Dirección que aparecerá en el campo "From:" cuando se envíen mensajes a través del LifeType [Valor por defecto = noreply at your.host.com]';
-$messages['help_email_service_type'] = 'Sistema que se usará para enviar mensajes [Valor por defecto = PHP]';
-$messages['help_smtp_host'] = 'Si se desea usar un servidor SMTP para enviar mensajes, especifique aquí el nombre del servidor [Valor por defecto = (vacío)]';
-$messages['help_smtp_port'] = 'Si el servidor de SMTP está configurado en un puerto distinto al 25 [Valor por defecto = (vacío)]';
-$messages['help_smtp_use_authentication'] = 'Active este parámetro si el servidor requiere autentificación  [Valor por defecto = No]';
-$messages['help_smtp_username'] = 'Nombre de usuario en caso de que el servidor SMTP necesite autentificación [Valor por defecto = (vacío)]';
-$messages['help_smtp_password'] = 'Password en caso de que el servidor SMTP necesite autentificación [Valor por defecto = (vacío)]';
-// helpers
-$messages['help_path_to_tar'] = 'Ruta completa al binario "tar", necesario para descomprimir plantillas en formato .tar.gz o tar.bz2 [Valor por defecto = /bin/tar]';
-$messages['help_path_to_gzip'] = 'Ruta completa al binario "gzip", necesario para descomprimir plantillas en formato .tar.gz [Valor por defecto = /bin/gzip]';
-$messages['help_path_to_bz2'] = 'Ruta completa al binario "bz2", necesario para descomprimir plantillas en formato tar.bz2 [Valor por defecto = /usr/bin/bzip2]';
-$messages['help_path_to_unzip'] = 'Ruta completa al binario "unzip", necesario para descomprimir plantillas en formato .zip [Valor por defecto = /usr/bin/unzip]';
-$messages['help_unzip_use_native_version'] = 'Usar una versión nativa en PHP para descomprimir ficheros .zip, de forma que el binario "unzip" no sea necesario [Valor por defecto = No]';
-// uploads
-$messages['help_uploads_enabled'] = 'Permite a los usuarios enviar ficheros al servidor. Este parámetro afecta por ejemplo a las plantillas personalizadas [Valor por defecto = Sí]';
-$messages['help_maximum_file_upload_size'] = 'Tamaño máximo de los ficheros en bytes. Por razones obvias, este límite nunca será más alto que el valor configurado en la configuración del PHP [Valor por defecto = 2000000]';
-$messages['help_upload_forbidden_files'] = 'Lista separada por espacios en blancos de nombres de ficheros no permitidos en este servidor. Puede usar \'*\' y \'?\' para especificar nombres de ficheros más complejos [Valor por defecto = *.php *.php3 *.php4 *.phtml]';
-// interfaces
-$messages['help_xmlrpc_api_enabled'] = 'Activar el acceso a las bitácoras mediante XMLRPC [Valor por defecto = Sí]';
-$messages['help_rdf_enabled'] = 'Activar la generación de contenidos mediante RSS o Atom [Valor por defecto = Sí]';
-$messages['help_default_rss_profile'] = 'Formato por defecto de los contenidos [Valor por defecto = RSS 1.0]';
-// security
-$messages['security_pipeline_enabled'] = 'Activar el filtro de seguridad, que es necesario para el filtro Bayesiano y por otros plugins que lo usen [Valor por defecto = Sí]';
-$messages['help_maximum_comment_size'] = 'Tamaño máximo de un comentario en bytes, o use un valor de "0" para permitir un tamaño ilimitado [Valor por defecto = 0]';
-// baSíian filter
-$messages['help_baSíian_filter_enabled'] = 'Activar el filtro Bayesiano anti-spam [Valor por defecto = Sí]';
-$messages['help_baSíian_filter_spam_probability_treshold'] = 'Puntuación máxima para que un comentario sea considerado spam [Valor por defecto = 0.9]';
-$messages['help_baSíian_filter_nonspam_probability_treshold'] = 'Puntuación mínima para que un comentari no sea considerado spam [Valor por defecto = 0.2]';
-$messages['help_baSíian_filter_min_length_token'] = 'Tamaño mínimo en carácteres de un token [Valor por defecto = 3]';
-$messages['help_baSíian_filter_max_length_token'] = 'Tamaño máximo de un token [Valor por defecto = 100]';
-$messages['help_baSíian_filter_number_significant_tokens'] = 'Número mínimo de tokens [Valor por defecto = 15]';
-$messages['help_baSíian_filter_spam_comments_action'] = 'Qué hacer con los comentarios que sean spam. Use "Eliminar" cuando su filtro Bayesiando haya sido entrenado correctamente. Manténgalos en la base de datos si cree que su filtro puede cometer todavía algun error [Valor por defecto = Guardar]';
-$messages['keep_spam_comments'] = 'Guardarlos en la base de datos, pero marcados como "Spam"';
-$messages['throw_away_spam_comments'] = 'Eliminarlos directamente';
-// resources
-$messages['help_resources_enabled'] = 'Activar la sección de "Ficheros" [Valor por defecto = Sí]';
-$messages['help_resources_folder'] = 'Carpeta donde los ficheros serán almacenados. Use una carpeta fuera del árbol del servidor de web para mayor seguridad [Valor por defecto = ./gallery]';
-$messages['help_thumbnail_method'] = 'Método para generar las previsualizaciones. Se requiere soporte para GD si se selecciona PHP como el método por defecto  [Valor por defecto = PHP]';
-$messages['help_path_to_convert'] = 'Ruta completa al binario "convert" del paquete "ImageMagick". Es obligatorio si el método para generar las previsualizaciones es "ImageMagick" [Valor por defecto = /usr/bin/convert]';
-$messages['help_thumbnail_format'] = 'Formato de las previsualizaciones [Valor por defecto = El mismo que la imágen]';
-$messages['help_thumbnail_height'] = 'Altura de las previsualizaciones en pixels [Valor por defecto = 120]';
-$messages['help_thumbnail_width'] = 'Anchura de las previsualizaciones en pixels [Valor por defecto = 120]';
-$messages['help_medium_size_thumbnail_height'] = 'Altura de las previsualizaciones de tamaño medio en pixels [Valor por defecto = 480]';
-$messages['help_medium_size_thumbnail_width'] = 'Anchura de las previsualizaciones de tamaño medio en pixels [Valor por defecto = 640]';
-$messages['help_thumbnails_keep_aspect_ratio'] = 'Generar las previsualizaciones manteniendo un aspecto proporcional [Valor por defecto = Sí]';
-$messages['help_thumbnail_generator_force_use_gd1'] = 'Usar solo GD1 en lugar de GD2 [Valor por defecto = No]';
-$messages['help_thumbnail_generator_user_smoothing_algorithm'] = 'Método usado para suavizar las vistas previas. Solo disponible si se está usando PHP para generar las vistas previas [Valor por defecto = PHP ImageCopyResampled]';
-$messages['help_resources_quota'] = 'Cuota de ficheros en bytes para las bitácoras (i.e. 5242880 Bytes = 5MB), o use "0" para dar cuota ilimitada [Valor por defecto = 0]';
-$messages['help_resource_server_http_cache_enabled'] = 'Activa el soporte para la cabecera HTTP "If-Modified-Since" cuando se hagan peticiones para ficheros. Active este parámetro para ahorrar ancho de banda [Valor por defecto = No]';
-$messages['help_resource_server_http_cache_lifetime'] = 'Tiempo en milisegundos durante el cual el cliente puede usar la versión cacheada de un fichero. Solo válido cuándo el parámetro anterior esté activado [Valor por defecto = 9999999]';
-$messages['same_as_image'] = 'El mismo que la imágen original';
-// search
-$messages['help_search_engine_enabled'] = 'Activar el motor de búsqueda  [Valor por defecto = Sí]';
-$messages['help_search_in_custom_fields'] = 'Buscar también en los campos personales [Valor por defecto = Sí]';
-$messages['help_search_in_comments'] = 'Buscar también en los comentarios [Valor por defecto = Sí]';
-
-// cleanup
-$messages['purge'] = 'Limpiar';
-$messages['cleanup_spam'] = 'Limpiar Spam';
-$messages['cleanup_spam_help'] = 'Esto eliminara físicamente de la base de datos todos aquellos comentarios que hayan sido marcados como spam por los usuario. No será posible recuperarlos una vez hayan sido eliminados';
-$messages['spam_comments_purged_ok'] = 'Spam eliminado correctamente';
-$messages['cleanup_posts'] = 'Limpiar Artículos';
-$messages['cleanup_posts_help'] = 'Esto eliminará físicamente de la base de datos todos aquellos artículos que hayan sido marcados como "Borrados". No será posible recuperarlos una vez hayan sido eliminados';
-$messages['posts_purged_ok'] = 'Artículos eliminados correctamente';
-
-/// summary ///
-// front page
-$messages['summary'] = 'Portal';
-$messages['register'] = 'Registrarse';
-$messages['summary_welcome'] = 'Bienvenido!';
-$messages['summary_most_active_blogs'] = 'Las Bitácoras más activas';
-$messages['summary_most_commented_articles'] = 'Los más comentados';
-$messages['summary_most_read_articles'] = 'Los mas leídos';
-$messages['password_forgotten'] = 'Olvidaste el password?';
-$messages['summary_newest_blogs'] = 'Bitácoras nuevas';
-$messages['summary_latest_posts'] = 'Los más nuevos';
-$messages['summary_search_blogs'] = 'Buscar';
-
-// blog list
-$messages['updated'] = 'Actualizada';
-$messages['total_reads'] = 'total';
-
-// blog profile
-$messages['blog'] = 'Bitácora';
-$messages['latest_posts'] = 'Los más nuevos';
-
-// registration
-$messages['register_step0_title'] = 'Términos de Uso';
-$messages['decline'] = 'No estoy de acuerdo';
-$messages['accept'] = 'Aceptar';
-$messages['read_service_agreement'] = 'Lea atentamente los términos de uso y pulse el botón "Aceptar" si está de acuerdo';
-$messages['register_step1_title'] = 'Crear el usuario [1/4]';
-$messages['register_step1_help'] = 'Primero hay que crear un usuario para la bitácora. Este usuario será el propietario de la bitácora i tendrá acceso a todas sus funcionalidades';
-$messages['register_next'] = 'Siguiente';
-$messages['register_back'] = 'Atrás';
-$messages['register_step2_title'] = 'Crear la bitácora [2/4]';
-$messages['register_blog_name_help'] = 'Nombre de la bitácora';
-$messages['register_step3_title'] = 'Elegir una plantilla [3/4]';
-$messages['step1'] = 'Paso 1';
-$messages['step2'] = 'Paso 2';
-$messages['step3'] = 'Paso 3';
-$messages['register_step3_help'] = 'Elija una de las plantillas disponibles para su nueva bitácora. Si más tarde no le gusta, siempre la puede cambiar';
-$messages['error_must_choose_template'] = 'Elija una plantilla';
-$messages['select_template'] = 'Seleccionar esta';
-$messages['register_step5_title'] = 'Felicidades! [4/4]';
-$messages['finish'] = 'Terminar';
-$messages['register_need_confirmation'] = 'Un mensaje incluyendo el enlace para su confirmación ha sido enviado a su dirección de correo. En cuanto reciba el mensaje, haga clic en la direción para empezar a usar su bitácora!';
-$messages['register_step5_help'] = 'Felicidades, su nueva bitácora ha sido creada!';
-$messages['register_blog_link'] = 'Si quiere, puede ir directamente a su nueva bitácora: <a href="%2$s">%1$s</a>';
-$messages['register_blog_admin_link'] = 'O si lo desea, puede empezar a añadir artículos a través de la <a href="admin.php">interfaz de administración</a>';
-$messages['register_error'] = 'Hubo un error durante el proceso';
-$messages['error_registration_disabled'] = 'No se pueden registrar bitácoras en este sitio';
-// registration article topic and text
-$messages['register_default_article_topic'] = 'Felicidades!';
-$messages['register_default_article_text'] = 'Si puede leer esto, su bitácora está lista para empezar a escribir.';
-$messages['register_default_category'] = 'General';
-// confirmation email
-$messages['register_confirmation_email_text'] = 'Visite el siguiente enlace para activar su nueva bitácora:
-
-%s
-
-Que tenga un buen día.';
-$messages['error_invalid_activation_code'] = 'El enlace de activación no es correcto';
-$messages['blog_activated_ok'] = 'Felicidades, su nueva bitácora ha sido activada!';
-// forgot your password?
-$messages['reset_password'] = 'Cambiar el password';
-$messages['reset_password_username_help'] = 'Nombre del usuario cuyo password desea cambiar';
-$messages['reset_password_email_help'] = 'Dirección de correo que se usó para registrar este usuario';
-$messages['reset_password_help'] = 'Use este formulario para cambiar el password de su usuario, en caso de que no lo recuerde. Por favor escriba el nombre del usuario cuyo password desea cambiar, así como la dirección de correo con la que se registró este usuario';
-$messages['error_resetting_password'] = 'Hubo un error cambiando el password del usuario. Compruebe los datos y vuélvalo a intentar';
-$messages['reset_password_error_incorrect_email_address'] = 'La dirección de correo no es correcta o no es la dirección que se usó para registrar este usuario';
-$messages['password_reset_message_sent_ok'] = 'Un mensaje de correo ha sido enviado a la dirección de correo. Por favor haga clic en la dirección incluida en el mensaje para cambiar el password';
-$messages['error_incorrect_request'] = 'Los parámetros de la dirección no son correctos';
-$messages['change_password'] = 'Nuevo password';
-$messages['change_password_help'] = 'Por favor de un nuevo password y a continuación, confírmelo';
-$messages['new_password'] = 'Nuevo password';
-$messages['new_password_help'] = 'Escriba aquí su nuevo password';
-$messages['password_updated_ok'] = 'Su password ha sido cambiado correctamente!';
-
-// Suggested by BCSE, some useful messages that not available in official locale
-$messages['upgrade_information'] = 'This page looks plain and unstyled because you\'re using a non-standard compliant browser. To see it in its best form, please <a href="http://www.webstandards.org/upgrade/" title="The Web Standards Project\'s Browser Upgrade initiative">upgrade</a> to a browser that supports web standards. It\'s free and painless.';
-$messages['jump_to_navigation'] = 'Ir al menú';
-$messages['comment_email_never_display'] = 'El comentario será formateado automáticamente. La dirección de correo no será mostrada en público.';
-$messages['comment_html_allowed'] = '<acronym title="Hypertext Markup Language">HTML</acronym> allowed: &lt;<acronym title="Hyperlink">a</acronym> href=&quot;&quot; title=&quot;&quot; rel=&quot;&quot;&gt; &lt;<acronym title="Acronym Description">acronym</acronym> title=&quot;&quot;&gt; &lt;<acronym title="Quote">blockquote</acronym> cite=&quot;&quot;&gt; &lt;<acronym title="Strike">del</acronym>&gt; &lt;<acronym title="Italic">em</acronym>&gt; &lt;<acronym title="Underline">ins</acronym>&gt; &lt;<acronym title="Bold">strong</acronym>&gt;';
-$messages['trackback_uri'] = 'El URI <acronym title="Identificador de Recurso Uniforme (URI)">URI</acronym> para enviar retroenlaces a este artículo es: ';
-$messages['previous_post'] = 'Anterior';
-$messages['next_post'] = 'Siguiente';
-$messages['comment_default_title'] = '(Sin título)';
-$messages['guestbook'] = 'Libro de visitas';
-$messages['trackbacks'] = 'Retroenlaces';
-$messages['menu'] = 'Menú';
-$messages['albums'] = 'Albums';
-$messages['admin'] = 'Administración';
-$messages['xmlrpc_ping_ok'] = 'Ping XMLRPC enviado correctamente: ';
-$messages['error_sending_xmlrpc_ping'] = 'Hubo un error enviando el ping XMLRPC a: ';
-$messages['error_sending_xmlrpc_ping_message'] = 'Hubo un error enviando el ping XMLRPC: ';
-
-// textos nuevos para LT 1.1
-
-$messages['error_incorrect_trackback_id'] = 'El identificador del retroenlace no es válido';
-$messages['error_marking_trackback_as_spam'] = 'Hubo un error marcando el retroenlace como spam';
-$messages['trackback_marked_as_spam_ok'] = 'El retroenlace fue marcado como spam';
-$messages['error_marking_trackback_as_nonspam'] = 'Hubo un error marcando el retroenlace como no spam';
-$messages['trackback_marked_as_nonspam_ok'] = 'El retroenlace fue marcado como no spam';
-$messages['upload_here'] = 'Subir aquí';
-$messages['reply_string'] = 'Re: ';
-$messages['cleanup_users'] = 'Limpieza de usuarios';
-$messages['cleanup_users_help'] = 'Esta función eliminará todos los usuarios que hayan sido marcados como "Borrados", incluyendo cualquier
-bitácora que pertenezca al usuario y todo el contenido de la bitácora. Si el usuario tiene acceso a otra bitácora, todos los artículos publicados por el usuario también serán eliminados. Una vez el usuario y sus datos han sido eliminados no será posible recuperarlos.';
-$messages['users_purged_ok'] = 'Limpieza de usuarios ejecutada correctamente';
-$messages['cleanup_blogs'] = 'Limpieza de blogs';
-$messages['cleanup_blogs_help'] = 'Esta función eliminará todos las bitácoras que hayan sio marcadas como "Borradas" por un administrador, incluyendo todo el contenido de la bitácora. Una vez la bitácora y sus datos han sido eliminados no será posible recuperarlos.';
-$messages['blogs_purged_ok'] = 'Limpieza de blogs ejecutada correctamente';
-$messages['help_use_http_accept_language_detection'] = 'Activa la detección del lenguaje preferido por el usuario basándose en la información que envia el navegador en cada petición';
-$messages['error_invalid_blog_category'] = 'Categoría de bitácora incorrecta';
-$messages['error_adding_blog_category'] = 'Hubo un error añadiendo la categoría de bitácora';
-$messages['newBlogCategory'] = 'Nueva categoría de bitácoras';
-$messages['editBlogCategories'] = 'Categoría de bitácoras';
-$messages['blog_category_added_ok'] = 'Categoría de bitácoras añadida correctamente';
-$messages['error_blog_category_has_blogs'] = 'Hay algunas bitácoras asignadas a la categoría de bitácoras "%s. Por favor modifique primero las bitácoras e inténtelo de nuevo.';
-$messages['error_deleting_blog_category'] = 'Hubo un error borrando la categoría de bitácoras "%s"';
-$messages['blog_category_deleted_ok'] = 'La categoría de bitácoras "%s" fue borrada correctamente';
-$messages['blog_categories_deleted_ok'] = '%s categorías de blog fueron eliminadas correctamente';
-$messages['error_deleting_blog_category2'] = 'Hubo un error eliminando la categoría de bitácora cuyo identificador es %s';
-$messages['blog_category'] = 'Categoría de bitácoras';
-$messages['blog_category_help'] = 'Categoría de bitácoras a cuya esta bitácora pertenece';
-$messages['help_use_captcha_auth'] = 'Requerir la inserción de un código numérico mostrado en una imágen al iniciar el proceso de registro de una nueva bitácora y así evitar registros de nuevos usuarios mediante scripts';
-$messages['help_skip_dashboard'] = 'Desactivar la página de "perspectiva" como página mostrada al iniciar una sesión, y en su lugar enviar al usuario a su primer blog';
-$messages['manageGlobalArticleCategory'] = 'Categorías Globales';
-$messages['newGlobalArticleCategory'] = 'Nueva categoría Global';
-$messages['editGlobalArticleCategories'] = 'Categorías Globales';
-$messages['global_category_name_help'] = 'Nombre de la nueva categoría global';
-$messages['global_category_description_help'] = 'Descripción de la nueva categoría global';
-$messages['error_incorrect_global_category_id'] = 'Categoría global incorrecta';
-$messages['global_category_deleted_ok'] = 'La categoría global "%s" fue eliminada correctamente';
-$messages['global_category_added_ok'] = 'La categoría global "%s" fue añadida correctamente';
-$messages['error_deleting_global_category2'] = 'Hubo un error eliminando la categoría global cuyo identificador es %s';
-
-$messages['help_page_suffix_format'] = 'Sufijo que se añadirá a las URLs de de las secciones que soportan paginación [ Valor por defecto = /page/{page} ]';
-
-$messages['help_final_size_thumbnail_width'] = 'Anchura final en píxels de las imágenes subidas por usuarios. Dejar este valor como 0 para usar el tamaño real de la imágen [ Valor por defecto = 0 ]';
-$messages['help_final_size_thumbnail_height'] = 'Altura final en píxels de las imágenes subidas por usuarios. Dejar este valor como 0 para usar el tamaño real de la imágen [ Valor por defecto = 0 ]';
-$messages['error_comment_too_big'] = 'El comentario es demasiado largo';
-$messages['error_you_have_been_blocked'] = 'Proceso interrumpido: la petición no fue procesada.';
-$messages['created'] = 'Creado';
-$messages['view'] = 'Ver';
-$messages['editUser'] = 'Editar Usuario';
-$messages['help_urlize_word_separator'] = 'Carácter que será usado como separador de palabras en lugar del espacio en blanco en las direcciones generadas por LifeType. Este parámetro también afecta los nombres de host que serán generados cuando el soporte para subdominios está activado [ Valor por defecto = _ ]';
-$messages['help_summary_template_cache_lifetime'] = 'Duración en segundos de las páginas pregeneradas y guardadas en la caché de la portada. Si se usa un valor mayor que 0, la versión disponible de cada página en la caché será usada durante tantos segundos en lugar de regenerarla cada vez que se produzca un cambio en los datos. Active esta opción para mejorar el rendimiento de la página de portada. [ Valor por defecto = 0 ]';
-$messages['register_default_album_name'] = 'General';
-$messages['register_default_album_description'] = 'Suba aquí sus imágenes y ficheros';
-$messages['show_in_summary'] = 'Mostrar en la portada';
-$messages['show_in_summary_help'] = 'Mostrar esta bitácora en la portada';
-
-$messages['saving_message'] = 'Guardando...';
-$messages['show_option_panel'] = 'Mostrar Opciones';
-$messages['hide_option_panel'] = 'Ocultar opciones';
-
-$messages['quick_launches'] = 'Acceso rápido';
-
-$messages['confirmation_message_resent_ok'] = 'El mensaje de confirmación fue reenviado correctamente.';
-
-$messages['goto_blog_page'] = 'Ir a %s';
-
-$messages['help_num_blogs_per_user'] = 'Número máximo de blogs que cada usuario puede crear mediante el enlace disponible en la página de perspectiva. Si el valor es 0, el link no aparecerá [ Valor por defecto = 0 ]';
-
-$messages['massive_change_option'] = 'Edición múltiple';
-$messages['show_massive_change_option'] = 'Mostrar edición múltiple';
-$messages['hide_massive_change_option'] = 'Ocultar edición múltiple';
-$messages['change_status'] = 'Modificar estado';
-$messages['change_category'] = 'Modificar categoría';
-
-$messages['error_post_status'] = 'Elija un estado';
-$messages['error_comment_status'] = 'Elija un estado';
-$messages['admin_mode'] = 'Modo Administrador';
-$messages['administrate_user_blog'] = 'Administrar esta bitácora';
-$messages['trackbacks_updated_ok'] = '%s retroenlaces actualizados correctamente';
-$messages['trackback_updated_ok'] = 'Retroenlace modificado correctamente';
-$messages['error_trackback_status'] = 'Elija un estado válido';
-$messages['error_incorrect_user'] = 'El usuario no es válido';
-$messages['select'] = 'Seleccionar';
-$messages['remove_selected'] = 'Eliminar selección';
-
-$messages['notification_subject'] = 'Mensaje desde LifeType';
-$messages['error_no_trackback_links_sent'] = 'No se envió ningún retroenlace';
-
-$messages['logout_destination_url'] = 'Dirección donde los usuarios serán redireccionados al salir de la interfaz de administración de LifeType. Puede por ejemplo usar la dirección de la página principal de su servicio [ Valor por defecto = nada ]';
-
-$messages['help_http_cache_lifetime'] = 'Tiempo de vida en segundos de la caché del navegador. Se informará al navegador de los usuarios sobre cuánto tiempo deben usar la versión actual de la página en lugar de obligar al servidor a enviar la misma versión cada vez. Este parámetro ayuda a ahorrar ancho de banda y a aligerar la carga en el servidor, aunque los usuarios podrían recibir versiones desfasadas de las páginas en caso de que este valor sera demasiado alto. [ Valor por defecto = 1800 ]';
-
-$messages['trackbacks_no_trackback'] = 'No se pudo enviar un retroenlace a la siguiente dirección: ';
-
-$messages['error_comment_spam_throw_away'] = 'El filtro anti-spam ha rechazado su mensaje.';
-$messages['error_comment_spam_keep'] = 'El filtro anti-spam ha marcado su comentario como dudoso y deberá ser reviasado por el autor de esta bitácora.';
-
-$messages['blog_categories'] = 'Categorías de Bitácoras';
-$messages['global_article_categories'] = 'Categorías Globales';
-
-$messages['help_force_posturl_unique'] = 'Obligar que todos los enlaces a artículos sean únicos. Este parámetro solo es necesario si el formato de las direcciones ha cambiado y no está incluyendo la fecha en su nuevo formato';
-
-$messages['default_send_notification'] = 'Enviar notificación';
-
-$messages['enable_pull_down_menu'] = 'Menú desplegable';
-$messages['enable_pull_down_menu_help'] = 'Activar o desactivar el menú desplegable';
-
-$messages['change_album'] = 'Cambiar álbum';
-
-$messages['warning_autosave_message'] = '<img src="imgs/admin/icon_warning-16.png" alt="Error" class="InfoIcon"/><p class="ErrorText">Parece que su sesión anterior terminó sin grabar su nuevo artículo. Si es así, <a href="#" onclick="restoreAutoSave();">haga click aquí para recuperarlo</a> o si lo prefiere, <a href="#" onclick="eraseAutoSave();">haga click aquí para borrarlo</a>.</p>';
-
-$messages['check_username'] = 'Nombre de usuario';
-$messages['check_username_ok'] = 'El nombre de usuario está disponible!';
-$messages['error_username_exist'] = 'El nombre de usuario no está disponible, inténtelo con otro.';
-
-$messages['error_rule_email_dns_server_temp_fail'] = 'Problema temporal - inténtelo más tarde.';
-$messages['error_rule_email_dns_server_unreachable'] = 'No se pudo conectar con el servidor de correo.';
-$messages['error_rule_email_dns_not_permitted'] = 'La dirección de correo no es válida.';
-
-$messages['blog_users_help'] = 'Usuarios que pueden acceder a esta bitácora.';
-
-$messages['summary_welcome_paragraph'] = 'Incluya aquí el mensaje que aparecerá en la configuración por defecto de la portada de su servicio. Puede cambiar este mensaje en el fichero locales/locale_es_ES.php, o bien eliminarlo por completo editando los ficheros .template disponibles en el directorio templates/summary/';
-
-$messages['first_day_of_week'] = 1;
-$messages['first_day_of_week_label'] = 'Primer día de la semana';
-$messages['first_day_of_week_help'] = 'Primer día de la semana en el calendario';
-
-$messages['help_subdomains_base_url'] = 'Cuando el soporte para subdominios está activado, se usa URL como la base para construir el resto de URLs en lugar de base_url. Use {blogname} para incluir el nombre de la bitácora, {username} para incluir el nombre del usuario a quien la bitácora pertenece, y {blogdomain} para permitir a los usuarios introducir su propio subdominio [ Valor por defecto = nada ]';
-
-$messages['registration_default_subject'] = 'Confirmación de registro de LifeType';
-
-$messages['error_invalid_subdomain'] = 'El subdominio no es válido o ya se está usando';
-
-$messages['register_blog_domain_help'] = 'Nombre y subdominio que desea usar para su nueva bitácora';
-$messages['domain'] = 'Dominio';
-$messages['help_subdomains_available_domains'] = 'Introduzca una lista con los nombres de los dominios disponibles, separada por espacios en blanco. Los usuarios podrán elegir cualquiera de estos mediante una lista desplegable, y podrán introducir cualquier subdominio que deseen. Esta opción solo estará disponible si el soporte para subdominios está activado e incluyó {blogdomain} como parte del parámetro subdomains_base_url. También puede usar \'?\' para permitir cualquier dominio y subdominio [ Valor por defecto = nada ]';
-
-$messages['subdomains_any_domain'] = '<- El soporte para múltiple dominios está activado, introduzca el nombre del dominio completo';
-$messages['error_updating_blog_subdomain'] = 'Hubo un error actualizando el subdominio, compruebe los datos e inténtelo de nuevo.';
-$messages['error_updating_blog_main_domain'] = 'Hubo un error actualizando el dominio principal. Probablemente el administrador haya configurado algo incorrectamente';
-
-$messages['monthsshort'] = Array( 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic' );
-$messages['weekdaysshort'] = Array( 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb', 'Dom' );
-
-$messages['search_type'] = 'Buscar en';
-$messages['posts'] = 'Artículos';
-$messages['blogs'] = 'Bitácoras';
-$messages['resources'] = 'Ficheros';
-$messages['error_incorrect_username'] = 'El nombre de usuario no es correcto, o ya está asignado o es demasiado largo (máximo 15 carácteres)';
-$messages['upload_in_progress'] = 'Enviando datos. Espere por favor...';
-
-$messages['auth_img'] = 'Código de seguridad';
-$messages['auth_img_help'] = 'Por favor introduzca el código que aparece en la imágen.';
-
-$messages['global_category'] = 'Categoría global';
-$messages['global_article_category_help'] = 'Categoría global de esta comunidad para este artículo';
-
-$messages['password_reset_subject'] = 'Cambio de password en LifeType';
-?>
\ No newline at end of file

Copied: plog/trunk/release/cache.properties.php.dist (from rev 4709, plog/branches/lifetype-1.2/release/cache.properties.php.dist)
===================================================================
--- plog/trunk/release/cache.properties.php.dist	                        (rev 0)
+++ plog/trunk/release/cache.properties.php.dist	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,29 @@
+<?php
+# 
+# Settings for the data cache. If you're unsure what this means,
+# do not modify these settings. If you are planning to use 
+# memcached as your cache system, please take a look below. The only two
+# possible values are cache_lite and memcached
+#
+
+$config["cache_method"] = "cache_lite";
+
+#
+# cache settings for Cache_Lite
+#
+$config["cache_lite_cache_dir"] = "./tmp/";
+$config["cache_lite_life_time"] = 604800;
+$config["cache_lite_read_control"] = false;
+$config["cache_lite_automatic_serialization"] = true;
+$config["cache_lite_hashed_directory_level"] = 2;
+
+#
+# cache settings for Memcached
+#
+$config["memcached_servers"] = array( "127.0.0.1:11211" );
+$config["memcached_life_time"] = 604800;
+$config["memcached_debug"] = false;
+$config["memcached_compress_threshold"] = 10240;
+$config["memcached_persistant"] = true;
+
+?>
\ No newline at end of file

Modified: plog/trunk/release/config.properties.php.dist
===================================================================
--- plog/trunk/release/config.properties.php.dist	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/release/config.properties.php.dist	2007-02-10 18:49:29 UTC (rev 4710)
@@ -41,4 +41,13 @@
 # with the installation wizard, please make sure that you also rename the tables.
 #
 $config["db_prefix"] = "";
-?>
+
+#
+# This array is used to pass driver-specific parameters. Currently the only supported
+# one is enable_fulltext_search, that informs the MySQL driver that FULLTEXT indexes
+# can be used to speed up searches. It's disabled by default as it does not work with
+# languages such as Chinese or Japanese. In all other cases, you probably want to enable
+# this for performance reasons (searches are lot faster if using the FULLTEXT indexes)
+#
+$config["db_options"] = Array( "enable_mysql_fulltext_search" => false );
+?>
\ No newline at end of file

Deleted: plog/trunk/release/config.properties.php.release-0.1.dist
===================================================================
--- plog/trunk/release/config.properties.php.release-0.1.dist	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/release/config.properties.php.release-0.1.dist	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,189 +0,0 @@
-<?php
-#
-# enables or disables comments
-#
-$config["comments_enabled"] = true;
-
-#
-# enables or disables the RDF feed
-#
-$config["rdf_enabled"] = true;
-
-#
-# temporary folder
-#
-$config["temp_folder"] = "./tmp";
-
-#
-# where is our page located
-# (note: so far only used by the RDF engine)
-#
-$config["journal_url"] = "http://your.host/your/url";
-
-#
-# database settings
-#
-$config["db_host"] = "your_db_host";
-$config["db_username"] = "your_db_user";
-$config["db_password"] = "your_db_password";
-$config["db_database"] = "your_database";
-#
-# the database prefix will be appended to the name of each database tables in case you want
-# to have more than one version of plog running at the same time, such as the stable and
-# unstable one for testing. Each one could use a different prefix and therefore they could
-# coexist in the same unique database. If you change this after the initial configuration done
-# with the installation wizard, please make sure that you also rename the tables.
-#
-$config["db_prefix"] = "plog_";
-
-#
-# enables or disables the search feature
-#
-$config["search_enabled"] = "true";
-
-#
-# how many posts we show in the main page
-# (note: using op=see_all will show all the posts)
-# it also affects how many posts will be included in the
-# RDF feed
-#
-$config["show_posts_max"] = "15";
-#
-# how many posts we show in the "recent" list
-#
-$config["recent_posts_max"] = "10";
-
-#
-# sets the default layout
-#
-$config["default_template"] = "grey";
-
-#
-# default folder where layouts can be found
-#
-$config["template_folder"] = "./templates";
-
-#
-# identifier from the database of the default blog we should
-# show if no parameter is specified
-#
-$config["default_blog_id"] = 1;
-
-#
-# default locale used to render the messages
-#
-$config["default_locale"] = "en_UK";
-
-#
-# determines which html tags are allowed in user comments (anything is allowed
-# in posts!!)
-#
-$config["html_allowed_tags_in_comments"] = "<a><i><br><br/><b>";
-
-#
-# enables or disables the referer tracker, so that we can collect some statistics
-# on who is linking to us and when
-#
-$config["referer_tracker_enabled"] = true;
-
-#
-# enables or disables globally the RSS parser used to import RSS/RDF sources
-#
-$config["rss_parser_enabled"] = true;
-
-#
-# determines wether to enable or not the "show more" link, used when an article
-# goes over the 'show_more_threshold' words
-#
-$config["show_more_enabled"] = true;
-
-#
-# after how many **words** we should show the "more..." link
-## NB: the unit is words, not characters!!!
-#
-$config["show_more_threshold"] = 50;
-
-#
-# wether we should keep count on how many times an article has been read or not
-# this of course requires an additional query to be performed on the database
-# every time
-#
-$config["update_article_reads"] = true;
-
-#
-# Enables or disables globally the email notification service. 
-# This only controls the email sending service, which is then used in other places
-# of the blog. For example, the owner of a post can be notified every time there is 
-# a new comment in a post.
-# This extension of course needs PHP to be built with the email functions and those 
-# to be enabled. The smtp server and user used to send emails is configured by the 
-# php.ini file and can therefore not be configured here. Please have a look at 
-# http://www.php.net/manual/en/function.mail.php for more information.
-#
-$config["email_service_enabled"] = true;
-
-#
-# determines which address will appear in the From: field when the system
-# sends a notification email.
-#
-$config["post_notification_source_address"] = "newcomment at noreply.net";
-
-#
-# this setting controls how urls are generated inside the application
-# possible values are:
-# 1: urls are generated like any other normal http url, in the form of:
-#     index.php?op=Default&blogId=2
-# 2: urls are generated in a 'search engine friendly' way:
-#     index.php/op/Default/blogId/2
-# WARNING: support for type number '2' of urls is still a bit buggy... better
-# live with '1' for a while!!
-#
-$config["request_format_mode"] = 1;
-
-#
-# wether the xmlrpc ping to notify services like weblogs.com and blo.gs is enabled
-#
-$config["xmlrpc_ping_enabled"] = false;
-#
-# which sources we want to notify (must include the full url to the xmlrpc
-# interface they're providing!!!) We can add as many as we need to because this is an
-# array. Leave it just as Array() if no hosts are defined.
-#
-$config["xmlrpc_ping_hosts"] = Array( "http://rpc.weblogs.com/RPC2" );
-
-#
-# wether or not to enable the trackback feature in server mode. that is, 
-# wether we should or not accept trackback ping requests.
-#
-$config["trackback_server_enabled"] = true;
-
-#
-# wether to enable or not the htmlarea feature, that allows WYSISWYG edition
-# of textarea fields. It is very handy so by default it is enabled.
-#
-$config["htmlarea_enabled"] = true;
-
-#
-# wether to enable or not the plugin manager
-#
-$config["plugin_manager_enabled"] = true;
-
-#
-# if set to true, the EmailValidator class will do first a basic check on the sintax
-# of the email address and then will proceed to do some MX record checkings and
-# then check if the email address is a valid one doing some interaction with the
-# smtp server. It is recommended to leave this turned on if we are running a
-# site with an open registration process. Email validations are carried everywhere
-# an email address is required, for example when updating the users's own email
-# address in the 'user profile' part.
-# Please set this to 'false' if you are running plog for your own personal use
-# and/or your php installation does not have the networking functions enabled.
-#
-$config["check_email_address_validity"] = false;
-
-#
-# how many posts we would like to show in the summary page. This feature
-# needs the summary.php file available.
-#
-$config["summary_page_show_max"] = 15;
-?>

Deleted: plog/trunk/release/dist.sh
===================================================================
--- plog/trunk/release/dist.sh	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/release/dist.sh	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-files=`cat include_files`
-timestamp=`date +%Y%m%d`
-destdir="plog-devel-$timestamp"
-
-if [ "$1" == "iwebland" ]; then
-	destdir=$destdir"-iwebland"
-fi
-
-echo "Creating distribution folder..."
-mkdir $destdir
-
-echo "Creating version...";
-echo "<?php" > version.php
-echo "\$version = $timestamp;" >> version.php
-echo "?>" >> version.php
-
-for file in $files
-do
-    echo Adding: $file
-    cp -rf $file $destdir
-done
-
-
-echo "Copying configuration files..."
-cp dist/config.properties.php.dist $destdir/config/config.properties.php
-
-echo "Creating temp folder...";
-mkdir $destdir/tmp
-chmod 757 $destdir/tmp
-
-echo "** Process complete **"

Modified: plog/trunk/release/logging.properties.php.dist
===================================================================
--- plog/trunk/release/logging.properties.php.dist	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/release/logging.properties.php.dist	2007-02-10 18:49:29 UTC (rev 4710)
@@ -4,22 +4,31 @@
 # too much logs for your tatest, set "appender" to "null". This will
 # be disabled once the final version is out anyway...
 #
+
 $config["default"] = Array( 
-    "layout" => "%d %N - [%f:%l (%c:%F)] %m%n", 
+    "layout"   => "%d %N - [%f:%l (%c:%F)] %m%n", 
     "appender" => "null",
-	"file" => "tmp/plog.log",
-    "prio" => "debug"
+	"file"     => PLOG_CLASS_PATH."tmp/lifetype.log",
+    "prio"     => "debug"
   );
+
+// debug output sent to debug.log by default. 
   
+$config["debug"] = Array( 
+    "layout"   => "%t%n%d %N - [%f:%l (%c:%F)] %m%n", 
+    "appender" => "null",
+	"file"     => PLOG_CLASS_PATH."tmp/debug.log",
+    "prio"     => "info"  
+  );
 #
 # this logger is the only one enabled by default
 # and it will log all sql queries that generate an error
 # to the file tmp/sql_error.log
 #
 $config["sqlerr"] = Array( 
-    "layout" => "%d %N - %m%n", 
+    "layout" => "%S%n %d %N - %m%n", 
     "appender" => "file",
-	"file" => "tmp/sql_error.log",
+	"file" => PLOG_CLASS_PATH."tmp/sql_error.log",
     "prio" => "error"
   );
   
@@ -30,7 +39,30 @@
 $config["trackback"] = Array(
     "layout" => "%d %N - [%f:%l (%c:%F)] %m%n", 
     "appender" => "null",
-	"file" => "tmp/trackback.log",
+	"file" => PLOG_CLASS_PATH."tmp/trackback.log",
     "prio" => "debug"
   );
+  
+#
+# special logger for metrics and performance statistics. This file is a CSV file and the
+# columns have the following meaning:
+#
+# timestamp (14-digit)
+# memory usage
+# total execution time
+# number of included files
+# number of SQL queries executed
+# total number of cache queries
+# total number of cache hits
+# total number of cache misses
+# script being executed
+# URL being processed
+#
+$config["metricslog"] = Array(
+    "layout" => "%m%n", 
+    "appender" => "null",
+	"file" => PLOG_CLASS_PATH."tmp/metrics.log",
+    "prio" => "debug"
+  );  
+
 ?>

Copied: plog/trunk/release/userdata.properties.php.dist (from rev 4709, plog/branches/lifetype-1.2/release/userdata.properties.php.dist)
===================================================================
--- plog/trunk/release/userdata.properties.php.dist	                        (rev 0)
+++ plog/trunk/release/userdata.properties.php.dist	2007-02-10 18:49:29 UTC (rev 4710)
@@ -0,0 +1,119 @@
+<?php
+####
+# Please do not edit these configuration settings unless you have read
+# and fully understood the documentation for user data providers:
+# http://wiki.lifetype.net/index.php/User_data_providers
+####
+
+#
+# Default user data provider, LifeType's own one
+#
+$config = Array( 
+  "provider" => "LifeTypeUserDataProvider",
+);
+
+#
+# PHPBB2 user data provider
+#
+/*$config = Array( 
+  "provider" => "PhpBB2UserDataProvider",
+  "createBlogIfNotExisting" => true,
+  "database" => "phpbb2",
+  "user" => "root",
+  "password" => "",
+  "prefix" => "phpbb_"
+);*/
+
+#
+# Simple PostNuke user data provider
+#
+/*$config = Array( 
+  // general
+  "provider" => "SimplePostNukeUserDataProvider",
+  "createBlogIfNotExisting" => true,
+  
+  // PostNuke db connection
+  "host" => "localhost",
+  "database" => "postnuke76",
+  "user" => "root",
+  "password" => "",
+  "prefix" => "pn_",
+  
+  // This string gets appended to the username and results
+  // in "Username's Weblog"
+  "blogtitle_postfix" => "'s Weblog"
+);*/
+
+# 
+# VBB3 user data provider 
+# 
+/*$config = Array( 
+  "provider" => "vbb3UserDataProvider", 
+  "createBlogIfNotExisting" => false, 
+  "database" => "bbs",            //vbb database name 
+  "user" => "bbs",               //vbb data base user name 
+  "password" => "",         //vbb data base user password 
+  "prefix" => "",                 //vbb data base prefix 
+  "usesalt" => true,             //use password salt or not , if vbb3 ,plz set to true 
+  "allowgroup" => Array(2,5,6,7), //default set to 2,5,6,7 
+  "denygroup" => Array(3,4),       //default set to 3,4 
+  "admingroup"  => Array(6),      //default set to 6 
+  "adminuser" => Array(1)        //default set to 1 
+);*/
+
+# 
+# WBB2 user data provider 
+# 
+/*$config = Array( 
+  // general 
+  "provider" => "WBBUserDataProvider", 
+  "createBlogIfNotExisting" => true, 
+  
+  // WBB2 connection 
+  "host" => "localhost",                       //database server default: localhost 
+  "database" => "",                            //database name 
+  "user" => "",                                //database user 
+  "password" => "",                            //user-password 
+  "prefix" => "bb1_",                          //wbb2-prefix default: bb1_ 
+  "admingroup"  => Array('1','11','42'),       //groupcombinationIDs for Admin default: 1,11,42 
+  "blogtitle_postfix" => "'s Blog"              // This string gets appended to the username in blogtitle: "Username's Blog" 
+);
+*/
+
+#
+# JOOMLA user data provider
+#
+#
+# Please run the following SQL query in your LifeType database,
+# as it is required by the provider
+#
+# CREATE TABLE `lt_joomla_users` (
+#  `id` int(10) unsigned NOT NULL auto_increment,
+#  `joomla_id` int(10) unsigned NOT NULL,
+#  `about` text,
+#  `properties` text NOT NULL,
+#  `resource_picture_id` int(10) NOT NULL default '0',
+#  `blog_site_admin` int(10) NOT NULL default '0',
+#  PRIMARY KEY  (`id`),
+#  UNIQUE KEY `joomla_id` (`joomla_id`)
+# ) ENGINE=MyISAM AUTO_INCREMENT=1 ;
+/*
+$config = Array( 
+  // general
+  "provider" => "JoomlaUserDataProvider",
+  "createBlogIfNotExisting" => true,
+
+  // Joomla db connection
+  "host" => "mysql_host",
+  "database" => "joomla_db",
+  "user" => "joomla_db_user",
+  "password" => "joomla_db_pass",
+  "prefix" => "jos_",
+
+  // This string gets appended to the username and results
+  // in "Username's Weblog"
+  "blogtitle_postfix" => "'s Weblog"
+);
+*/
+
+?>

Modified: plog/trunk/styles/admin.css
===================================================================
--- plog/trunk/styles/admin.css	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/styles/admin.css	2007-02-10 18:49:29 UTC (rev 4710)
@@ -607,14 +607,14 @@
     text-decoration : none;
 }
 
-.even
+.odd
 {
     background       : #F7F7F7;
 }
 
-.tableHover
+.highlightClass
 {
-   background: #EFEFEF;
+   background       : #E1E1E1;
 }
 
 .info td

Modified: plog/trunk/summary.php
===================================================================
--- plog/trunk/summary.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/summary.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -13,6 +13,9 @@
 	lt_include( PLOG_CLASS_PATH."class/net/http/session/sessionmanager.class.php" );	
 	lt_include( PLOG_CLASS_PATH."class/dao/userinfo.class.php" );	
 
+    // start gathering statistics
+    Info::startMetrics();
+
 	define( "SUMMARY_DEFAULT_BLOGS_PER_PAGE", 25 );
 	
     //

Modified: plog/trunk/templates/LifeType/aboutus.template
===================================================================
--- plog/trunk/templates/LifeType/aboutus.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/aboutus.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,4 @@
-{include file="$blogtemplate/header.template" pageTitle="About Us"}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | About Us"}
 <div class="pagebody">
 
 {#AboutUs#}

Modified: plog/trunk/templates/LifeType/blog.template
===================================================================
--- plog/trunk/templates/LifeType/blog.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/blog.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,9 +1,9 @@
 {include file="$blogtemplate/header.template"}
 <div id="content" class="narrowcolumn">
-{foreach from=$recentposts item=post}
+{foreach from=$posts item=post}
 {include file="$blogtemplate/post.template"}
 {/foreach}
 </div>
 {pager style="links"}
 {include file="$blogtemplate/panel.template"}
-{include file="$blogtemplate/footer.template"}
\ No newline at end of file
+{include file="$blogtemplate/footer.template"}

Deleted: plog/trunk/templates/LifeType/commentform.template
===================================================================
--- plog/trunk/templates/LifeType/commentform.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/commentform.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,22 +0,0 @@
-<div class="postinput">
-<form action="{$url->getIndexUrl()}" method="post">
-<div>
-<input tabindex="1" id="subject" name="commentTopic" />
-<label for="subject"><small>{$locale->tr("comment_topic")}</small></label><br /><br />
-<input tabindex="2" id="author" name="userName" />
-<label for="author"><small>{$locale->tr("comment_username")}</small></label><br /><br />
-<input tabindex="3" id="email" name="userEmail" />
-<label for="email"><small>{$locale->tr("comment_email")}</small></label><br /><br />
-<input tabindex="4" id="url" name="userUrl" />
-<label for="url"><small>{$locale->tr("comment_url")}</small></label><br /><br />
-<textarea tabindex="5" id="text" name="commentText" rows="10" cols="50"></textarea><br /><br />
-<input style="font-weight: bold;" type="submit" name="post" value="&nbsp;{$locale->tr("comment_send")}&nbsp;" /><br /><br />
-<span style="font-style:italic">Note: comments will not be displayed here until a moderator approves them.</span>
-<input type="hidden" name="op" value="AddComment"/>
-<input type="hidden" name="articleId" value="{$post->getId()}"/>
-<input type="hidden" name="blogId" value="{$blog->getId()}"/>
-<input type="hidden" name="parentId" value="{$parentId}"/>
-</div>
-</form>
-</div>
-

Modified: plog/trunk/templates/LifeType/development.template
===================================================================
--- plog/trunk/templates/LifeType/development.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/development.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,4 @@
-{include file="$blogtemplate/header.template" pageTitle="Development"}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | Development"}
 
 <div class="pagebody">
 
@@ -6,4 +6,4 @@
 
 </div>
 
-{include file="$blogtemplate/footer.template"}
\ No newline at end of file
+{include file="$blogtemplate/footer.template"}

Modified: plog/trunk/templates/LifeType/downloads.template
===================================================================
--- plog/trunk/templates/LifeType/downloads.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/downloads.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,4 @@
-{include file="$blogtemplate/header.template" pageTitle="Downloads"}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | Downloads"}
 
 <div class="pagebody">
 
@@ -6,4 +6,4 @@
 
 </div>
 
-{include file="$blogtemplate/footer.template"}
\ No newline at end of file
+{include file="$blogtemplate/footer.template"}

Modified: plog/trunk/templates/LifeType/en_UK/strings.txt
===================================================================
--- plog/trunk/templates/LifeType/en_UK/strings.txt	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/en_UK/strings.txt	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,7 +1,7 @@
 ltTagline = """LifeType is an open-source blogging platform with support for multiple blogs and users
 in a single installation."""
 
-frontPageLeft = """The latest stable version of LifeType is <b>1.1.3</b>. Click the link below to download.<br/>
+frontPageLeft = """The latest stable version of LifeType is <b>1.1.5</b>. Click the link below to download.<br/>
 Take a look at the <a href="http://www.lifetype.net/blog.php/lifetype-development-journal/page/downloads">Downloads</a> section for more download packages,
 additional template sets and plugins."""
 
@@ -253,7 +253,7 @@
 
 <p>If you wish to check out a certain branch or tag, replace /trunk with /branch/branch-name or /tags/tag-name:</p>
 <pre>
-svn checkout http://devel.lifetype.net/svn/plog/plog/tags/lifetype-1.1.3
+svn checkout http://devel.lifetype.net/svn/plog/plog/tags/lifetype-1.1.5
 </pre>
 
 
@@ -299,9 +299,9 @@
 These are the official downloadable packages containing the most recent stable version. Packages
 are available compressed in either .tar.gz or .zip, and are provided via SourceForge.net.
 <br/><br/>
-<a href="http://prdownloads.sourceforge.net/lifetype/lifetype-1.1.3.tar.gz?download">LifeType 1.1.3 (tar.gz format)</a><br/>
-<a href="http://prdownloads.sourceforge.net/lifetype/lifetype-1.1.3.tar.bz2?download">LifeType 1.1.3 (tar.bz2 format)</a><br/>
-<a href="http://prdownloads.sourceforge.net/lifetype/lifetype-1.1.3.zip?download">LifeType 1.1.3 (zip format)</a><br/>
+<a href="http://prdownloads.sourceforge.net/lifetype/lifetype-1.1.5.tar.gz?download">LifeType 1.1.5 (tar.gz format)</a><br/>
+<a href="http://prdownloads.sourceforge.net/lifetype/lifetype-1.1.5.tar.bz2?download">LifeType 1.1.5 (tar.bz2 format)</a><br/>
+<a href="http://prdownloads.sourceforge.net/lifetype/lifetype-1.1.5.zip?download">LifeType 1.1.5 (zip format)</a><br/>
 </p>
 
 <h2>Plugins</h2>
@@ -475,7 +475,7 @@
 early to say how well LifeType 1.1.x will do.
 </p>
 <p>
-The most recent version of LifeType is 1.1.3, which is the third maintenance release the 1.1.x stable branch. LifeType 1.1 was the first major release since April 2005
+The most recent version of LifeType is 1.1.5, which is the fifth maintenance release the 1.1.x stable branch. LifeType 1.1 was the first major release since April 2005
 and includes a major set of new features and improvements specially in the performance and memory
 consumption areas.
 </p>
@@ -526,9 +526,10 @@
 <h4>Partners Sponsors</h4>
 <a name="sponsors"></a>
 <p>
-Current hosting services of all LifeType.net sites is provided by Ferca.<br/>
-<a href="http://www.ferca.com" style="border:0px">
-<img src="http://www.lifetype.net/templates/LifeType/images/partner_ferca.jpg" alt="Ferca" />
+Current hosting services of all LifeType.net sites is provided by
+Limedaley.com.<br/>
+<a href="http://www.limedaley.com" style="border:0px">
+<img src="http://www.lifetype.net/templates/LifeType/images/partner_limedaley.gif" alt="Limedaley" />
 </a>
 </p>
 <p>

Modified: plog/trunk/templates/LifeType/features.template
===================================================================
--- plog/trunk/templates/LifeType/features.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/features.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,4 @@
-{include file="$blogtemplate/header.template" pageTitle="Features"}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | Features"}
 
 <div class="pagebody">
 

Modified: plog/trunk/templates/LifeType/footer.template
===================================================================
--- plog/trunk/templates/LifeType/footer.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/footer.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,43 +1,43 @@
 <table>
-  <tr>
-    <td style="width:100%"></td>
-  </tr>
-  <tr>
-	<td colspan="3" style="width:750px;height:40px"></td>
-	<td style="width:100%"></td>
- </tr>
-</table> 
+<tr>
+<td style="width:100%"></td>
+</tr>
+<tr>
+<td colspan="3" style="width:750px;height:40px"></td>
+<td style="width:100%"></td>
+</tr>
+</table>
 <div id="footer">
-	<table style="border-top: 1px solid #efefef">
-		<tr>
-		<td>&nbsp;</td>
-		<td>&nbsp;</td>
-		<td>&nbsp;</td>
-		</tr>
-		<tr>
-		<td style="width:238px;text-align:left">&copy; 2005 <a href="http://www.lifetype.net" class="black">LifeType</a>. All rights reserved.
-		</td>
-		<td style="width:272;text-align:center"> 
-    		<a href="http://www.lifetype.net/" class="black">International</a> | 
-    		<a href="http://www.lifetype.de/" class="black">Germany</a> | 
-    		<a href="http://www.lifetype.org.tw/" class="black">Taiwan</a>
-    	</td>		
-		<td style="width:240px;text-align:right"> 
-		    {if $locale->getLocaleCode() == "de_DE"}
-		    {** Oscar: I believe that the "impressum" is only needed in Germany, right? **}
-     		<a href="http://www.spreadshirt.de/shop.php?sid=36983" target="blank" class="black">Shop</a> |
-    		<a href="http://www.lifetype.de/blog/index.php?blogId=35" class="black">Spenden</a> | 
-    		<a href="http://www.lifetype.de/blog/index.php?blogId=35" class="black">Impressum</a> | 
-    		{/if}
-    		<a href="{$url->templatePage("sitemap")}">Sitemap</a> |
-    		<a href="{$url->templatePage("aboutus")}#contact" class="black">Contact</a>
-    		{if $locale->getLocaleCode() == "en_UK"}
-    		| <a href="http://www.ferca.com" class="black">Hosting by Ferca</a>
-    		{/if}
-    	</td>
-		</tr>
-	</table>
+<table style="border-top: 1px solid #efefef">
+<tr>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td style="width:238px;text-align:left">&copy; 2005 <a href="http://www.lifetype.net" class="black">LifeType</a>. All rights reserved.
+</td>
+<td style="width:272;text-align:center">
+<a href="http://www.lifetype.net/" class="black">International</a> |
+<a href="http://www.lifetype.de/" class="black">Germany</a> |
+<a href="http://www.lifetype.org.tw/" class="black">Taiwan</a>
+</td>
+<td style="width:240px;text-align:right">
+{if $locale->getLocaleCode() == "de_DE"}
+{** Oscar: I believe that the "impressum" is only needed in Germany, right? **}
+<a href="http://www.spreadshirt.de/shop.php?sid=36983" target="blank" class="black">Shop</a> |
+<a href="http://www.lifetype.de/blog/index.php?blogId=35" class="black">Spenden</a> |
+<a href="http://www.lifetype.de/blog/index.php?blogId=35" class="black">Impressum</a> |
+{/if}
+<a href="{$url->templatePage("sitemap")}">Sitemap</a> |
+<a href="{$url->templatePage("aboutus")}#contact" class="black">Contact</a>
+{if $locale->getLocaleCode() == "en_UK"}
+| <a href="http://www.limedaley.com" class="black">Hosting by Limedaley</a>
+{/if}
+</td>
+</tr>
+</table>
 </div>
 </div>
 </body>
-</html>
+</html>
\ No newline at end of file

Modified: plog/trunk/templates/LifeType/footermain.template
===================================================================
--- plog/trunk/templates/LifeType/footermain.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/footermain.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -35,7 +35,7 @@
 <a href="{$url->templatePage("sitemap")}">Sitemap</a> |
 <a href="{$url->templatePage("aboutus")}#contact" class="black">{$locale->tr("Contact")}</a>
 {if $locale->getLocaleCode() == "en_UK"}
-| <a href="http://www.ferca.com">Hosting by Ferca</a>
+| <a href="http://www.limedaley.com">Hosting by Limedaley</a>
 {/if}
 
 </td>

Modified: plog/trunk/templates/LifeType/header.template
===================================================================
--- plog/trunk/templates/LifeType/header.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/header.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -9,7 +9,7 @@
   <meta http-equiv="Content-Type" content="text/html;charset={$locale->getCharset()}" /> 
   <meta name="generator" content="{$version}" />
   <meta http-equiv="Content-Language" content="{$locale->getLanguageId()}" />
-  <title>{$blog->getBlog()}{if $pageTitle} | {$pageTitle}{/if}</title>
+  <title>{$pageTitle}</title>
   <link rel="stylesheet" title="Default" href="{$url->getTemplateFile("style.css")}" type="text/css" /> 
   <link rel="alternate" type="text/xml" title="RSS 2.0" href="{$url->rssLink("rss20")}" />
   <link rel="alternate" type="text/xml" title="RSS 1.0" href="{$url->rssLink("rss10")}" />
@@ -26,11 +26,11 @@
 <div id="page">
   <div id="header">
     <div id="headerimg">
-    <a href="{$url->blogLink()}"></a>
+    <a href="http://www.lifetype.net/"></a>
   </div>
 </div>
 <table>
 <tr>
-<td colspan="3" style="border:0px;width:750px;padding:0px;"><a href="{$url->templatePage("blog")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image10','','{$url->getTemplateFile("$lang/news-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/news.jpg")}" width="118" height="35" alt="News" /></a><a href="{$url->templatePage("features")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image11','','{$url->getTemplateFile("$lang/features-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/features.jpg")}" width="126" height="35" alt="Features" /></a><a href="{$url->templatePage("downloads")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image12','','{$url->getTemplateFile("$lang/downloads-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/downloads.jpg")}" alt="Downloads" width="118" height="35" /></a><a href="{$url->templatePage("development")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image13','','{$url->getTemplateFile("$lang/development-on.jpg")}',1)"><img alt="Development" src="{$url->getTemplateFile("$lang/development.jpg")}" width="148" height="35" /></a><a href="{$url->templatePage("support")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image14','','{$url->getTemplateFile("$lang/support-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/support.jpg")}" alt="Support" width="121" height="35" /></a><a href="{$url->templatePage("aboutus")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image15','','{$url->getTemplateFile("$lang/aboutus-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/aboutus")}.jpg" alt="About Us" width="119" height="35" /></a></td>
+<td colspan="3" style="border:0px;width:750px;padding:0px;"><a href="{$url->blogLink()}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image10','','{$url->getTemplateFile("$lang/news-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/news.jpg")}" width="118" height="35" alt="News" /></a><a href="{$url->templatePage("features")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image11','','{$url->getTemplateFile("$lang/features-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/features.jpg")}" width="126" height="35" alt="Features" /></a><a href="{$url->templatePage("downloads")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image12','','{$url->getTemplateFile("$lang/downloads-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/downloads.jpg")}" alt="Downloads" width="118" height="35" /></a><a href="{$url->templatePage("development")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image13','','{$url->getTemplateFile("$lang/development-on.jpg")}',1)"><img alt="Development" src="{$url->getTemplateFile("$lang/development.jpg")}" width="148" height="35" /></a><a href="{$url->templatePage("support")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image14','','{$url->getTemplateFile("$lang/support-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/support.jpg")}" alt="Support" width="121" height="35" /></a><a href="{$url->templatePage("aboutus")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image15','','{$url->getTemplateFile("$lang/aboutus-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/aboutus")}.jpg" alt="About Us" width="119" height="35" /></a></td>
 </tr>
 </table>

Modified: plog/trunk/templates/LifeType/headermain.template
===================================================================
--- plog/trunk/templates/LifeType/headermain.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/headermain.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -3,9 +3,9 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html>
 <head>
-<title>LifeType - OpenSource Blogging Platform</title>
+<title>LifeType | Open Source Blogging Platform</title>
     <meta http-equiv="Content-Type" content="text/html; charset={$locale->getCharset()}" />
-	<meta name="description" content="OpenSource Blogging Platform" />
+	<meta name="description" content="Open Source Blogging Platform" />
 	<meta name="keywords" content="lifetype,pLog,blog,blogging,weblog" />
 	<meta name="robots" content="all" />
 	<link rel="stylesheet" href="{$url->getTemplateFile("style.css")}" type="text/css" />
@@ -42,7 +42,7 @@
   
 	<tr>
  		    <td width="265" height="93">
- 		      <a href="{$url->blogLink()}">
+ 		      <a href="http://www.lifetype.net">
  		      <img src="{$url->getTemplateFile("images/LifeType_Logo_left2.gif")}" width="265" height="75" border="0" style="margin-left:-6px; margin-top:20px" alt="" />
  		      </a>
 				</td>
@@ -67,5 +67,5 @@
 			</tr>
 
 	<tr>
-				<td colspan="3" style="border:0px;width:750px;padding:0px;"><a href="{$url->templatePage("blog")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image10','','{$url->getTemplateFile("$lang/news-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/news.jpg")}" width="118" height="35" alt={$locale->tr("News")} /></a><a href="{$url->templatePage("features")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image11','','{$url->getTemplateFile("$lang/features-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/features.jpg")}" width="126" height="35" alt={$locale->tr("Features")} /></a><a href="{$url->templatePage("downloads")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image12','','{$url->getTemplateFile("$lang/downloads-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/downloads.jpg")}" alt={$locale->tr("Downloads")} width="118" height="35" /></a><a href="{$url->templatePage("development")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image13','','{$url->getTemplateFile("$lang/development-on.jpg")}',1)"><img alt={$locale->tr("Development")} src="{$url->getTemplateFile("$lang/development.jpg")}" width="148" height="35" /></a><a href="{$url->templatePage("support")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image14','','{$url->getTemplateFile("$lang/support-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/support.jpg")}" alt={$locale->tr("Support")} width="121" height="35" /></a><a href="{$url->templatePage("aboutus")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image15','','{$url->getTemplateFile("$lang/aboutus-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/aboutus")}.jpg" alt="{$locale->tr("About Us")}" width="119" height="35" /></a></td>
-        </tr>
\ No newline at end of file
+				<td colspan="3" style="border:0px;width:750px;padding:0px;"><a href="{$url->blogLink()}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image10','','{$url->getTemplateFile("$lang/news-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/news.jpg")}" width="118" height="35" alt={$locale->tr("News")} /></a><a href="{$url->templatePage("features")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image11','','{$url->getTemplateFile("$lang/features-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/features.jpg")}" width="126" height="35" alt={$locale->tr("Features")} /></a><a href="{$url->templatePage("downloads")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image12','','{$url->getTemplateFile("$lang/downloads-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/downloads.jpg")}" alt={$locale->tr("Downloads")} width="118" height="35" /></a><a href="{$url->templatePage("development")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image13','','{$url->getTemplateFile("$lang/development-on.jpg")}',1)"><img alt={$locale->tr("Development")} src="{$url->getTemplateFile("$lang/development.jpg")}" width="148" height="35" /></a><a href="{$url->templatePage("support")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image14','','{$url->getTemplateFile("$lang/support-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/support.jpg")}" alt={$locale->tr("Support")} width="121" height="35" /></a><a href="{$url->templatePage("aboutus")}" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image15','','{$url->getTemplateFile("$lang/aboutus-on.jpg")}',1)"><img src="{$url->getTemplateFile("$lang/aboutus")}.jpg" alt="{$locale->tr("About Us")}" width="119" height="35" /></a></td>
+        </tr>

Deleted: plog/trunk/templates/LifeType/images/partner_ferca.jpg
===================================================================
(Binary files differ)

Copied: plog/trunk/templates/LifeType/images/partner_limedaley.gif (from rev 4709, plog/branches/lifetype-1.2/templates/LifeType/images/partner_limedaley.gif)
===================================================================
(Binary files differ)

Modified: plog/trunk/templates/LifeType/main.template
===================================================================
--- plog/trunk/templates/LifeType/main.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/main.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,5 @@
-{if $category || $showAll}
+{if $category || $date || $showAll || $smarty.env.REQUEST_URI != "/" }
   {include file="$blogtemplate/blog.template"}
 {else}
   {include file="$blogtemplate/frontpage.template"}
-{/if}
\ No newline at end of file
+{/if}

Modified: plog/trunk/templates/LifeType/postandcomments.template
===================================================================
--- plog/trunk/templates/LifeType/postandcomments.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/postandcomments.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,8 +1,5 @@
-{assign var="postPageTitle" value=$post->getTopic()}
-{assign var="postPageTitle" value=" | $postPageTitle"}
 {assign var="postDate" value=$post->getDateObject()}
 {assign var="postOwner" value=$post->getUserInfo()}
-
 {include file="$blogtemplate/header.template"}
 <div id="content" class="narrowcolumn">
 <div class="navigation">    

Modified: plog/trunk/templates/LifeType/searchresults.template
===================================================================
--- plog/trunk/templates/LifeType/searchresults.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/searchresults.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -28,6 +28,6 @@
     </div>
   {/foreach}
 </div>
-
+{pager style="links"}
 {include file="$blogtemplate/panel.template"}
 {include file="$blogtemplate/footer.template"}

Modified: plog/trunk/templates/LifeType/style.css
===================================================================
--- plog/trunk/templates/LifeType/style.css	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/style.css	2007-02-10 18:49:29 UTC (rev 4710)
@@ -287,22 +287,6 @@
 	width: 130px;
 	}
 
-#commentform input {
-	width: 170px;
-	padding: 2px;
-	margin: 5px 5px 1px 0;
-	}
-
-#commentform textarea {
-	width: 100%;
-	padding: 2px;
-}
-
-#commentform #submit {
-	margin: 0;
-	float: right;
-}
-
 .alt {
 	margin: 0;
 	padding: 10px;
@@ -434,6 +418,8 @@
 	text-decoration: underline;    
 }
 
+/** form **/
+
 input, textarea {
 	color: inherit;
 	background-color: #FFF;
@@ -442,4 +428,40 @@
 
 input:focus, textarea:focus {
 	border: 1px solid #06c;
+}
+
+#CommentForm fieldset {
+	border: 0px;
+}
+
+#CommentForm legend {
+	display: none;
+}
+
+#CommentForm input {
+	width: 170px;
+	padding: 2px;
+	margin: 5px 5px 1px 0;
+	}
+
+#CommentForm textarea {
+	padding: 2px;
+}
+
+#CommentForm label {
+	width:150px;
+	display:block;
+	clear:both; 
+	float:left;
+	margin-top:8px;
+	margin-bottom:0px;
+}
+
+#CommentForm #Submit {
+       margin: 5px;
+}
+
+#CommentForm #Add {
+	float: right;
+	clear:both;
 }
\ No newline at end of file

Modified: plog/trunk/templates/LifeType/support.template
===================================================================
--- plog/trunk/templates/LifeType/support.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/LifeType/support.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,7 +1,7 @@
-{include file="$blogtemplate/header.template" pageTitle="Support"}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | Support"}
 <div class="pagebody">
 
 {#Support#}
 
 </div>
-{include file="$blogtemplate/footer.template"}
\ No newline at end of file
+{include file="$blogtemplate/footer.template"}

Modified: plog/trunk/templates/admin/blogsettings.template
===================================================================
--- plog/trunk/templates/admin/blogsettings.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/blogsettings.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -12,7 +12,7 @@
       <span class="required">*</span>
       <div class="formHelp">{$locale->tr("blog_name_help")}</div>
       <input type="text" name="blogName" id="blogName" style="width:100%" value="{$blogName}" />
-      {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_empty_name")}
+      {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_invalid_blog_name")}
     </div>
 
     {if $blogDomainsEnabled}

Modified: plog/trunk/templates/admin/blogtemplates.template
===================================================================
--- plog/trunk/templates/admin/blogtemplates.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/blogtemplates.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=blogTemplates title=$locale->tr("blogTemplates")}
-
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
  <form id="editTemplates" method="post" action="admin.php">
  <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -16,7 +24,7 @@
   <tbody>
   {assign var=blogTemplate value=$blog->getTemplateSet()}
   {foreach from=$templates item=sitetemplate}
-   <tr class="{cycle values="odd,even"}">
+   <tr>
     <td>
 	 {if $blogTemplate->getName() != $sitetemplate->getName()}
        <input class="checkbox" type="checkbox" name="templateIds[{counter}]" value="{$sitetemplate->getName()}" />

Modified: plog/trunk/templates/admin/blogusers.template
===================================================================
--- plog/trunk/templates/admin/blogusers.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/blogusers.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=showBlogUsers title=$locale->tr("showBlogUsers")}
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <form id="blogUsers" action="admin.php" method="post">
         <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -16,7 +25,7 @@
                 </thead>
                 <tbody>
                    {foreach from=$blogusers item=bloguser}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="userIds[{$bloguser->getId()}]" id="checks_1" value="{$bloguser->getId()}" />
                         </td>

Modified: plog/trunk/templates/admin/chooser/blogtemplatechooser.template
===================================================================
--- plog/trunk/templates/admin/chooser/blogtemplatechooser.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/chooser/blogtemplatechooser.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -8,7 +8,7 @@
  <tbody>
   {foreach name=template from=$templates item=template}
   {if ($smarty.foreach.template.iteration % 2) != 0} 
-   <tr class="{cycle values="odd,even"}">
+   <tr>
   {/if} 
     <td>
      {assign var=templateName value=$template->getName()}

Modified: plog/trunk/templates/admin/chooser/header.template
===================================================================
--- plog/trunk/templates/admin/chooser/header.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/chooser/header.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -6,6 +6,13 @@
   <meta http-equiv="Content-Type" content="text/html; charset={$locale->getCharset()}"/> 
   <link rel="stylesheet" href="styles/admin.css" type="text/css" />
   <title>LifeType Admin</title>
+  <!-- Yahoo UI Library -->
+  <script type="text/javascript" src="js/yui/yahoo/yahoo-min.js"></script> 
+  <script type="text/javascript" src="js/yui/dom/dom-min.js"></script> 
+  <script type="text/javascript" src="js/yui/event/event-min.js"></script>
+  <!-- LifeType UI Library -->
+  <script type="text/javascript" src="js/ui/core.js"></script>
+  <script type="text/javascript" src="js/ui/tableeffects.js"></script>
   <script type="text/javascript" src="js/ui/common.js"></script>
   <script type="text/javascript" src="js/ui/forms.js"></script>
   <script type="text/javascript">

Modified: plog/trunk/templates/admin/chooser/resourcelist.template
===================================================================
--- plog/trunk/templates/admin/chooser/resourcelist.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/chooser/resourcelist.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -23,6 +23,15 @@
 	var resourcePreviewLink = '{$resourcepreviewlink}';
 	var resourceMediumPreviewLink = '{$resourcemediumpreviewlink}';		
 </script>
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
 <div id="list_nav_bar">
 <div id="list_nav_select"> 
 <form id="resourceListAlbum" action="admin.php" method="post">
@@ -52,28 +61,29 @@
  </div>
  <br style="clear:both" />
  </div>
+
  <div id="container">
   {include file="$admintemplatepath/successmessage.template"}
   {include file="$admintemplatepath/errormessage.template"} 
 <table class="info">
  <thead>
   <tr>
-    <th style="width:270px;">{$locale->tr("resource")}</th>
-    <th style="width:150px;">{$locale->tr("actions")}</th>
+    <th style="width:75%;">{$locale->tr("resource")}</th>
+    <th style="width:25%;">{$locale->tr("actions")}</th>
   </tr>
  </thead>
  <tbody>
   {if $album && $pager->getCurrentPage()==1}
-   <tr class="{cycle values="odd,even"}">
+   <tr>
     <td>
      <a href="admin.php?op=resourceList&amp;albumId={$album->getParentId()}&amp;mode={$destination}&amp;page=1">
      <img src="imgs/admin/icon_folder-72.png" border="0" alt="Parent" />&nbsp;<br/>..</a>
     </td>
-    <td><a onclick="_toggle('resource_list_upload');" href="#upload">{$locale->tr("upload_here")}</a> </td>
+    <td><a onclick="_toggle('resource_list_upload');" href="#upload"><span style="font-size:13px;font-weight:bold">{$locale->tr("upload_here")}</span></a> </td>
    </tr>
   {/if}
   {foreach from=$albums item=resalbum}
-   <tr class="{cycle values="odd,even"}">
+   <tr>
     <td>
      <a href="admin.php?op=resourceList&amp;albumId={$resalbum->getId()}&amp;mode={$destination}&amp;page=1">
      <img src="imgs/admin/icon_folder-72.png" border="0" alt="folder" /><br/>{$resalbum->getName()}</a><br/>
@@ -93,7 +103,7 @@
    </tr>
 {/foreach}
 {foreach from=$resources item=resource}
-<tr class="{cycle values="odd,even"}">
+<tr>
  <td>
   {if $resource->hasPreview()}
    <img src="{$url->resourcePreviewLink($resource)}" alt="Preview" />

Modified: plog/trunk/templates/admin/chooser/siteuserschooser.template
===================================================================
--- plog/trunk/templates/admin/chooser/siteuserschooser.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/chooser/siteuserschooser.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,13 @@
 {include file="$admintemplatepath/chooser/header.template"}
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <div id="list_nav_bar">
             <div id="list_nav_select">             
 <form id="viewUsers" action="admin.php" method="post">
@@ -49,7 +58,7 @@
                 </thead>
                 <tbody>
                    {foreach from=$siteusers item=siteuser}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td class="col_highlighted">
                             {$siteuser->getId()}
                         </td>

Modified: plog/trunk/templates/admin/chooser/userpictureselect.template
===================================================================
--- plog/trunk/templates/admin/chooser/userpictureselect.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/chooser/userpictureselect.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -10,6 +10,15 @@
 }
 </style>
 {/literal}
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
 <div id="list_nav_bar">
 <div id="list_nav_select"> 
 <form id="resourceListAlbum" action="admin.php" method="post">
@@ -50,7 +59,7 @@
  </thead>  
  <tbody>
   {if $album && $pager->getCurrentPage()==1}
-   <tr class="{cycle values="odd,even"}">
+   <tr>
     <td>
      <a href="admin.php?op=userPictureSelect&amp;albumId={$album->getParentId()}&amp;mode={$destination}&amp;page=1">
      <img src="imgs/admin/icon_folder-72.png" border="0" alt="Parent" />&nbsp;<br/>..</a>
@@ -59,7 +68,7 @@
    </tr>
   {/if}
   {foreach from=$albums item=resalbum}
-   <tr class="{cycle values="odd,even"}">
+   <tr>
     <td>
      <a href="admin.php?op=userPictureSelect&amp;albumId={$resalbum->getId()}&amp;mode={$destination}&amp;page=1">
      <img src="imgs/admin/icon_folder-72.png" border="0" alt="folder" /><br/>{$resalbum->getName()}</a><br/>
@@ -69,7 +78,7 @@
    </tr>
 {/foreach}
 {foreach from=$resources item=resource}
-<tr class="{cycle values="odd,even"}">
+<tr>
  <td>
   {if $resource->hasPreview()}
    <a href="javascript:returnResourceInformation('{$resource->getId()}','{$url->resourcePreviewLink($resource)}');window.close();"><img src="{$url->resourcePreviewLink($resource)}" alt="Preview" /></a>

Modified: plog/trunk/templates/admin/createblog.template
===================================================================
--- plog/trunk/templates/admin/createblog.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/createblog.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -9,7 +9,7 @@
        <span class="required">*</span>
        <div class="formHelp">{$locale->tr("blog_name_help")}</div>
        <input type="text" style="width:95%" name="blogName" id="blogName" value="{$blogName}"/>
-       {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_empty_name")}
+       {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_invalid_blog_name")}
      </div>
 	
     {if $blogDomainsEnabled}

Modified: plog/trunk/templates/admin/customfields.template
===================================================================
--- plog/trunk/templates/admin/customfields.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/customfields.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=blogCustomFields title=$locale->tr("blogCustomFields")}
-
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <form id="customFields" action="admin.php" method="post">
         <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -19,7 +27,7 @@
                 </thead>
 				<tbody>
 				 {foreach from=$fields item=field}
-				 <tr class="{cycle values="odd,even"}">
+				 <tr>
 				   <td>
 				     <input class="checkbox" type="checkbox" name="fieldIds[{$field->getId()}]" id="checks_1" value="{$field->getId()}" />				   
 				   </td>

Modified: plog/trunk/templates/admin/dashboard.template
===================================================================
--- plog/trunk/templates/admin/dashboard.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/dashboard.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,4 @@
 {include file="$admintemplatepath/simpleheader.template"}
-
     <div id="nav_bar">
         <div id="section_title">
             <h2>{$locale->tr("dashboard")}</h2>
@@ -13,22 +12,35 @@
     </div>
     <div id="dashboard">
     {foreach from=$userblogs item=blog}
+	<script type="text/javascript">
+	tables_{$blog->getId()} = [ "dashboard_data_table_{$blog->getId()}", "dashboard_recent_comments_{$blog->getId()}", "dashboard_recent_trackbacks_{$blog->getId()}" ];
+	YAHOO.util.Event.addListener( window, "load", function() {literal}{{/literal}
+			for( i = 0; i < tables_{$blog->getId()}.length; i++ ) {literal}{{/literal}
+				var t = new Lifetype.UI.TableEffects( tables_{$blog->getId()}[i] );
+				t.stripe();
+				t.highlightRows();
+			{literal}	
+			}
+		}		
+		{/literal});
+	</script> 
         <div class="dashboard_blog">
         <h2>{$locale->tr("login")}&raquo; <a href="?op=blogSelect&amp;blogId={$blog->getId()}">{$blog->getBlog()}</a></h2>
         <table class="dashboard_blog_layout">
             <tr>
                 <td style="width: 70%; border: 0px solid black;">
                     <h3>{$locale->tr("recent_articles")}</h3>
-                    <table class="dashboard_data_table">
-                        <tr>
+                    <table class="dashboard_data_table" id="dashboard_data_table_{$blog->getId()}">
+                        <thead>
                             <th>{$locale->tr("topic")}</th>
                             <th style="width:60px;">{$locale->tr("actions")}</th>
-                        </tr>
+                        </thead>
                         {assign var=blogId value=$blog->getId()}
                         {assign var=url value=$blog->getBlogRequestGenerator()}
                         {** loop to print out the list of recent posts **}
+						<tbody>
                         {foreach from=$recentposts[$blogId] item=post}
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <td>
                                 <a target="_blank" href="{$url->postPermalink($post)}">{$post->getTopic()|strip_tags}</a><br/>
                             </td>
@@ -40,21 +52,23 @@
                             </td>
                         </tr>
                         {/foreach}
+						</tbody>
                     </table>
 
                     <h3>{$locale->tr("recent_comments")}</h3>
-                    <table class="dashboard_data_table">
-                        <tr>
+                    <table class="dashboard_data_table" id="dashboard_recent_comments_{$blog->getId()}">
+                        <thead>
                             <th>{$locale->tr("topic")}</th>
                             <th>{$locale->tr("posted_by")}</th>
                             <th>{$locale->tr("in")}</th>
                             <th>{$locale->tr("date")}</th>
                             <th style="width:60px;">{$locale->tr("actions")}</th>
-                        </tr>
+                        </thead>
                         {** loop to print out the list of recent comments **}
+						<tbody>
                         {foreach from=$recentcomments[$blogId] item=comment}
                         {assign var=article value=$comment->getArticle()}
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <td>
                                 <a target="_blank" href="{$url->postPermalink($article)}#{$comment->getId()}">
                                 {if $comment->getTopic() == ""}
@@ -99,19 +113,21 @@
                             </td>
                         </tr>
                         {/foreach}
+						</tbody>
                     </table>
 
                     <h3>{$locale->tr("recent_trackbacks")}</h3>
-                    <table class="dashboard_data_table">
-                        <tr>
+                    <table class="dashboard_data_table" id="dashboard_recent_trackbacks_{$blog->getId()}">
+                        <thead>
                             <th>{$locale->tr("topic")}</th>
                             <th>{$locale->tr("in")}</th>
                             <th>{$locale->tr("date")}</th>
                             <th style="width:60px;">{$locale->tr("actions")}</th>
-                        </tr>
+                        </thead>
                         {** loop to print out the list of recent trackbacks **}
+						<tbody>
                         {foreach from=$recenttrackbacks[$blogId] item=trackback}
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <td>
                                 {assign var=article value=$trackback->getArticle()}
                                 <a target="_blank" href="{$url->postTrackbackStatsLink($article)}#{$trackback->getId()}">
@@ -152,13 +168,14 @@
                             </td>
                         </tr>
                     {/foreach}
+					</tbody>
                     </table>
                 </td>
                 <td style="width: 30%; vertical-align: top; border-left: 1px solid #DEDEDE; border-bottom: 0px; padding-left: 4px;">
                     
                     <h3>{$locale->tr("quick_launches")}</h3>
-                    <table class="dashboard_data_quick_launches">
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                    <table class="dashboard_data_quick_launches" id="dashboard_quick_launches_{$blog->getId()}">
+                        <tr>
                             <th>
                                 {$locale->tr("managePosts")}:
                             </th>
@@ -166,7 +183,7 @@
                                 <a href="?op=blogSelect&amp;blogId={$blog->getId()}&amp;action=newPost">{$locale->tr("newPost")}</a>
                             </td>
                         </tr>
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <th>
                                 {$locale->tr("manageLinks")}:
                             </th>
@@ -174,7 +191,7 @@
                                 <a href="?op=blogSelect&amp;blogId={$blog->getId()}&amp;action=newLink">{$locale->tr("newLink")}</a>
                             </td>
                         </tr>
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <th>
                                 {$locale->tr("resourceCenter")}:
                             </th>
@@ -185,8 +202,9 @@
                     </table>
                     
                     <h3>{$locale->tr("blog_statistics")}</h3>
-                    <table class="dashboard_data_table_statistics">
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                    <table class="dashboard_data_table_statistics" id="dashboard_statistics_{$blog->getId()}">
+	 	 			  <tbody>
+                        <tr>
                             <th>
                                 {$locale->tr("total_posts")}:
                             </th>
@@ -194,7 +212,7 @@
                                 {$blog->getTotalPosts()}
                             </td>
                         </tr>
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <th>
                                 {$locale->tr("total_comments")}:
                             </th>
@@ -202,7 +220,7 @@
                                 {$blog->getTotalComments()}
                             </td>
                         </tr>
-                        <tr style="background-color: {cycle values="#FFFFFF,#F7F7F7"};">
+                        <tr>
                             <th>
                                 {$locale->tr("total_trackbacks")}:
                             </th>
@@ -210,6 +228,7 @@
                                 {$blog->getTotalTrackbacks()}
                             </td>
                         </tr>
+						</tbody>
                     </table>
                 </td>
             </tr>

Modified: plog/trunk/templates/admin/editarticlecategories.template
===================================================================
--- plog/trunk/templates/admin/editarticlecategories.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editarticlecategories.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=editArticleCategories title=$locale->tr("editArticleCategories")}
-
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <div id="list_nav_bar">
             <div id="list_nav_select">
             
@@ -29,7 +37,7 @@
  <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
   {include file="$admintemplatepath/errormessage.template"}
- <table class="info">
+ <table class="info" id="info">
   <thead>
    <tr>
     <th><input class="checkbox" type="checkbox" name="all" id="all" value="1" onclick="toggleAllChecks('deleteCategories');" /></th>
@@ -41,7 +49,7 @@
   </thead>
   <tbody> 
   {foreach from=$categories item=category}
-  <tr class="{cycle values="odd, even"}">
+  <tr class="even">
    <td>
       <input class="checkbox" type="checkbox" name="categoryIds[{counter}]" id="checks_{$category->getId()}" value="{$category->getId()}" />
    </td>  

Modified: plog/trunk/templates/admin/editblog.template
===================================================================
--- plog/trunk/templates/admin/editblog.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editblog.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -41,7 +41,7 @@
       <span class="required">*</span>
       <div class="formHelp">{$locale->tr("blog_name_help")}</div>
       <input type="text" name="blogName" style="width:100%" id="blogName" value="{$blogName|escape:"html"}" />
-      {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_empty_name")}
+      {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_invalid_blog_name")}
     </div>
 
     <div class="field">

Modified: plog/trunk/templates/admin/editcomments.template
===================================================================
--- plog/trunk/templates/admin/editcomments.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editcomments.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -6,6 +6,15 @@
 		var showMassiveChangeOption = '{$locale->tr("show_massive_change_option")}';
 		var hideMassiveChangeOption = '{$locale->tr("hide_massive_change_option")}';
 	</script>
+	<script type="text/javascript">
+	{literal}
+	YAHOO.util.Event.addListener( window, "load", function() {
+			var t = new Lifetype.UI.TableEffects();
+			t.stripe();
+			t.highlightRows();
+		});
+	{/literal}
+	</script>	
         <div id="list_nav_bar">
             <div id="list_nav_select">		
 
@@ -66,7 +75,7 @@
                 </thead>
                 <tbody>
                  {foreach from=$comments item=comment}
-                    <tr class="{cycle values="odd, even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="commentIds[{$comment->getId()}]" id="checks_{$comment->getId()}" value="{$comment->getId()}" />
                         </td>

Modified: plog/trunk/templates/admin/editlinkcategories.template
===================================================================
--- plog/trunk/templates/admin/editlinkcategories.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editlinkcategories.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=editLinkCategories title=$locale->tr("editLinkCategories")}
-
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <div id="list_nav_bar">
             <div id="list_nav_select">
 
@@ -40,7 +48,7 @@
   </thead>
   <tbody> 
   {foreach from=$linkcategories item=category}
-  <tr class="{cycle values="odd,even"}">
+  <tr>
    <td align="center"><input class="checkbox" type="checkbox" name="categoryIds[{counter}]" value="{$category->getId()}"/></td>  
    <td class="col_highlighted">
 	 {check_perms perm="update_link_category"}<a href="admin.php?op=editLinkCategory&amp;categoryId={$category->getId()}">{/check_perms}{$category->getName()}{check_perms perm="update_link_category"}</a>{/check_perms}

Modified: plog/trunk/templates/admin/editlinks.template
===================================================================
--- plog/trunk/templates/admin/editlinks.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editlinks.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -5,6 +5,15 @@
     var showMassiveChangeOption = '{$locale->tr("show_massive_change_option")}';
     var hideMassiveChangeOption = '{$locale->tr("hide_massive_change_option")}';
   </script>
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
 <div id="list_nav_bar">
 <div id="list_nav_select">
 <form id="viewLinks" action="admin.php" method="post">
@@ -60,7 +69,7 @@
  </thead>
  <tbody>
  {foreach from=$links item=link}
-  <tr class="{cycle values="odd,even"}">
+  <tr>
    <td><input class="checkbox" type="checkbox" name="linkIds[{counter}]" value="{$link->getId()}"/></td>  
    <td class="col_highlighted">
   	 {check_perms perm="update_link"}<a href="admin.php?op=editLink&amp;linkId={$link->getId()}">{/check_perms}{$link->getName()|utf8_wordwrap:20:"<br/>":false}{check_perms perm="update_link"}</a>{/check_perms}

Modified: plog/trunk/templates/admin/editpost.template
===================================================================
--- plog/trunk/templates/admin/editpost.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editpost.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -11,8 +11,7 @@
   <script type="text/javascript" src="js/tinymce/tiny_mce_gzip.php"></script>
   <script type="text/javascript" src="js/tinymce/tiny_mce-plog.js"></script>
  {else}
-  <link rel="stylesheet" href="js/editor/plogeditor.css" type="text/css" />
-  <script type="text/javascript" src="js/editor/plogeditor.js"></script>
+  <script type="text/javascript" src="js/editor/lifetypeeditor.js"></script>
  {/if} 
 
  <script type="text/javascript">
@@ -71,7 +70,7 @@
 	     <label for="postText">{$locale->tr("text")}</label>
 		 <span class="required">*</span>
 		 <div class="formHelp">{$locale->tr("text_help")}</div>
-	     {if !$htmlarea}<script type="text/javascript">var ed1 = new pLogEditor('postText','ed1');</script>{/if}
+	     {if !$htmlarea}<script type="text/javascript">var ed1 = new Lifetype.UI.Editor('postText','ed1');</script>{/if}
 	     <textarea {if $htmlarea==1}rows="20"{else}rows="15"{/if} id="postText" name="postText" style="width:100%">{$postText}</textarea>
 	     <a href="{if $htmlarea}javascript:tinyMCE.execInstanceCommand('mce_editor_0','mceinsertresource',true);{else}javascript:ed1.execute('postText','7_but_res',''){/if}">{$locale->tr("insert_media")}</a> |
              <a href="{if $htmlarea}javascript:tinyMCE.execInstanceCommand('mce_editor_0','mcemoremore');{else}javascript:ed1.execute('postText','8_but_more',''){/if}">{$locale->tr("insert_more")}</a>

Modified: plog/trunk/templates/admin/editposts.template
===================================================================
--- plog/trunk/templates/admin/editposts.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/editposts.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -6,6 +6,15 @@
 		var showMassiveChangeOption = '{$locale->tr("show_massive_change_option")}';
 		var hideMassiveChangeOption = '{$locale->tr("hide_massive_change_option")}';
 	</script>
+	<script type="text/javascript">
+	{literal}
+	YAHOO.util.Event.addListener( window, "load", function() {
+			var t = new Lifetype.UI.TableEffects();
+			t.stripe();
+			t.highlightRows();
+		});
+	{/literal}
+	</script>	
 		  <div id="list_nav_bar">
             <div id="list_nav_select">
                 <form id="showBy" action="admin.php" method="post">
@@ -18,7 +27,7 @@
                     <select name="showCategory" id="showCategory">
                      <option value="-1">{$locale->tr("category_all")}</option>
                      {foreach from=$categories item=category}
-                     <option value="{$category->getId()}" {if $currentcategory == $category->getId()} selected="selected" {/if}>{$category->getName()}</option>
+                     <option value="{$category->getId()}" {if $currentcategory == $category->getId()} selected="selected" /if}>{$category->getName()}{/if}</option>
                      {/foreach}
                     </select>
                     </div>
@@ -97,7 +106,7 @@
                 </thead>
                 <tbody>
                  {foreach from=$posts item=post}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="postIds[{$post->getId()}]" id="checks_{$post->getId()}" value="{$post->getId()}" />
                         </td>

Modified: plog/trunk/templates/admin/edittrackbacks.template
===================================================================
--- plog/trunk/templates/admin/edittrackbacks.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/edittrackbacks.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -6,6 +6,15 @@
 		var showMassiveChangeOption = '{$locale->tr("show_massive_change_option")}';
 		var hideMassiveChangeOption = '{$locale->tr("hide_massive_change_option")}';
 	</script>
+	<script type="text/javascript">
+	{literal}
+	YAHOO.util.Event.addListener( window, "load", function() {
+			var t = new Lifetype.UI.TableEffects();
+			t.stripe();
+			t.highlightRows();
+		});
+	{/literal}
+	</script>	
         <div id="list_nav_bar">
             <div id="list_nav_select">		
 
@@ -66,7 +75,7 @@
                 </thead>
                 <tbody>
                    {foreach from=$comments item=trackback}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="trackbackIds[{$trackback->getId()}]" id="trackbackIds[{$trackback->getId()}]" value="{$trackback->getId()}" />
                         </td>

Modified: plog/trunk/templates/admin/globalsettings_summary.template
===================================================================
--- plog/trunk/templates/admin/globalsettings_summary.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/globalsettings_summary.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -30,6 +30,12 @@
     <div class="formHelp">{$locale->tr("help_forbidden_usernames")}</div>
     <input style="width:100%" type="text" id="config[forbidden_usernames]" name="config[forbidden_usernames]" value="{$forbidden_usernames}"/>
    </div>
+   <!-- forbidden_blognames -->
+   <div class="field">
+    <label for="config[forbidden_blognames]">forbidden_blognames</label>
+    <div class="formHelp">{$locale->tr("help_forbidden_blognames")}</div>
+    <input style="width:100%" type="text" id="config[forbidden_blognames]" name="config[forbidden_blognames]" value="{$forbidden_blognames}"/>
+   </div>
    <!-- force_one_blog_per_email_account -->
    <div class="field">
     <label for="config[force_one_blog_per_email_account]">force_one_blog_per_email_account</label>

Modified: plog/trunk/templates/admin/header.template
===================================================================
--- plog/trunk/templates/admin/header.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/header.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -24,23 +24,26 @@
 	var plogAdminBaseUrl = "{$url->getBaseUrl(false)}/admin.php";
 	var plogBlogId = "{$blog->getId()}";
 </script>
-<script type="text/javascript" src="js/ui/default.js"></script>
-<script type="text/javascript" src="js/ui/common.js"></script>
 <script type="text/javascript" src="js/cookie/cookie.js"></script>
 <script type="text/javascript" src="js/prototype/prototype.js"></script>
 <script type="text/javascript" src="js/rico/rico.js"></script>
+<!-- LifeType UI Library -->
+<script type="text/javascript" src="js/ui/default.js"></script>
+<script type="text/javascript" src="js/ui/common.js"></script>
 <script type="text/javascript" src="js/ui/forms.js"></script>
 <script type="text/javascript" src="js/ui/overlay.js"></script>
+<script type="text/javascript" src="js/ui/core.js"></script>
+<script type="text/javascript" src="js/ui/tableeffects.js"></script>
+<!-- Yahoo UI Library -->
+<script type="text/javascript" src="js/yui/yahoo/yahoo-min.js"></script> 
+<script type="text/javascript" src="js/yui/dom/dom-min.js"></script> 
+<script type="text/javascript" src="js/yui/event/event-min.js"></script>
+>>>>>>> .merge-right.r4709
 {if $blogEnablePullDownMenu}
   <script type="text/javascript" src="js/JSCookMenu/JSCookMenu.js"></script>
   <link rel="stylesheet" href="js/JSCookMenu/ThemeOffice/theme.css" type="text/css" />
   <script type="text/javascript" src="js/JSCookMenu/ThemeOffice/theme.js"></script>
 {/if}
-<!-- Yahoo UI Library -->
-<script type="text/javascript" src="js/yui/yahoo/yahoo-min.js"></script> 
-<script type="text/javascript" src="js/yui/dom/dom-min.js"></script> 
-<script type="text/javascript" src="js/yui/event/event-min.js"></script>
-<script type="text/javascript" src="js/yui/container/container-min.js"></script>
 </head>
 <body>
 

Modified: plog/trunk/templates/admin/newlink.template
===================================================================
--- plog/trunk/templates/admin/newlink.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/newlink.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -59,7 +59,7 @@
         <div class="field">
         	<label for="bookmarklet">{$locale->tr("bookmarklet")}</label>
         	<div class="formHelp">{$locale->tr("bookmarklet_help")}</div>
-        	<a href="javascript:void(plogbm=window.open('{$url->getAdminUrl()}?op=newLink&linkName='+encodeURIComponent(document.title)+'&linkUrl='+encodeURIComponent(location.href),'plogbm','toolbar=1,status=1,location=1,scrollbars=1,menubar=1,resizable=1'));" onclick="window.alert('{$locale->tr("bookmarklet_help")}');">{$locale->tr("bookmarkit_to_plog")}</a>
+        	<a href="javascript:void(ltbm=window.open('{$url->getAdminUrl()}?op=newLink&linkName='+encodeURIComponent(document.title)+'&linkUrl='+encodeURIComponent(location.href),'ltbm','toolbar=1,status=1,location=1,scrollbars=1,menubar=1,resizable=1'));" onclick="window.alert('{$locale->tr("bookmarklet_help")}');">{$locale->tr("bookmark_it_to_lifetype")}</a>
         </div>
         
         </fieldset>
@@ -71,4 +71,4 @@
         </div> 
 </form>
 {include file="$admintemplatepath/footernavigation.template"}
-{include file="$admintemplatepath/footer.template"}
\ No newline at end of file
+{include file="$admintemplatepath/footer.template"}

Modified: plog/trunk/templates/admin/newpost.template
===================================================================
--- plog/trunk/templates/admin/newpost.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/newpost.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -15,8 +15,7 @@
   <script type="text/javascript" src="js/tinymce/tiny_mce_gzip.php"></script>
   <script type="text/javascript" src="js/tinymce/tiny_mce-plog.js"></script>
  {else}
-  <link rel="stylesheet" href="js/editor/plogeditor.css" type="text/css" />
-  <script type="text/javascript" src="js/editor/plogeditor.js"></script>
+  <script type="text/javascript" src="js/editor/lifetypeeditor.js"></script>
  {/if}
  <script type="text/javascript">
   
@@ -85,7 +84,7 @@
 	     <label for="postText">{$locale->tr("text")}</label>
 		 <span class="required">*</span>
 		 <div class="formHelp">{$locale->tr("text_help")}</div>
-	     {if !$htmlarea}<script type="text/javascript">var ed1 = new pLogEditor('postText','ed1');</script>{/if}
+	     {if !$htmlarea}<script type="text/javascript">var ed1 = new Lifetype.UI.Editor('postText','ed1');</script>{/if}
 	     <textarea {if $htmlarea==1}rows="20"{else}rows="15"{/if} id="postText" name="postText" style="width:100%">{$postText}</textarea>
 	     <a href="{if $htmlarea}javascript:tinyMCE.execInstanceCommand('mce_editor_0','mceinsertresource',true);{else}javascript:ed1.execute('postText','7_but_res',''){/if}">{$locale->tr("insert_media")}</a> |
              <a href="{if $htmlarea}javascript:tinyMCE.execInstanceCommand('mce_editor_0','mcemoremore');{else}javascript:ed1.execute('postText','8_but_more',''){/if}">{$locale->tr("insert_more")}</a>

Modified: plog/trunk/templates/admin/plugincenter.template
===================================================================
--- plog/trunk/templates/admin/plugincenter.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/plugincenter.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=pluginCenter title=$locale->tr("pluginCenter")}
-
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <div id="list">
             <table class="info">
                 <thead>
@@ -12,7 +20,7 @@
                 </thead>
                 <tbody> 
 				  {foreach from=$plugins item=plugin}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td class="col_highlighted">
                             {$plugin->getId()}
                         </td>

Modified: plog/trunk/templates/admin/poststats.template
===================================================================
--- plog/trunk/templates/admin/poststats.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/poststats.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=editPosts title=$locale->tr("editPosts")}
-
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <form id="postStats" action="admin.php" method="post">
         <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -17,7 +25,7 @@
                 </thead>
                 <tbody>
                    {foreach from=$referrers item=referrer}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="referrerIds[{$referrer->getId()}]" id="checks_1" value="{$referrer->getId()}" />
                         </td>

Modified: plog/trunk/templates/admin/registerblog.template
===================================================================
--- plog/trunk/templates/admin/registerblog.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/registerblog.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -18,7 +18,7 @@
      <span class="required">*</span>
      <div class="formHelp">{$locale->tr("register_blog_name_help")}</div>
      <input type="text" name="blogName" value="{$blogName}" id="blogName" />
-     {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_empty_name")}
+     {include file="$admintemplatepath/validate.template" field=blogName message=$locale->tr("error_invalid_blog_name")}
    </div>  
    
     {if $blogDomainsEnabled}

Modified: plog/trunk/templates/admin/resources.template
===================================================================
--- plog/trunk/templates/admin/resources.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/resources.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -5,6 +5,15 @@
     var showMassiveChangeOption = '{$locale->tr("show_massive_change_option")}';
     var hideMassiveChangeOption = '{$locale->tr("hide_massive_change_option")}';
   </script>
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
 <div id="list_nav_bar">
 <div id="list_nav_select">
 <form id="viewResources" action="admin.php" method="post">
@@ -56,7 +65,7 @@
 </thead>
 <tbody> 
 {if $album && $pager->getCurrentPage() == 1}
-<tr class="{cycle values="odd,even"}">
+<tr>
  <td>&nbsp;</td>
  <td>
   <a href="admin.php?op=resources&amp;albumId={$album->getParentId()}&amp;page=1"><img src="imgs/admin/icon_folder-72.png" border="0" alt="Parent" /></a><br/>
@@ -65,7 +74,7 @@
 </tr>
 {/if}
 {foreach from=$albums item=resalbum}
-<tr class="{cycle values="odd,even"}">
+<tr>
  <td>
   <input type="checkbox" class="checkbox" value="{$resalbum->getId()}" name="albumIds[{$resalbum->getId()}]" />
  </td>
@@ -86,7 +95,7 @@
 </tr>
 {/foreach}
 {foreach from=$resources item=resource}
-<tr class="{cycle values="odd,even"}">
+<tr>
  <td>
    <input type="checkbox"  class="checkbox" value="{$resource->getId()}" name="resourceIds[{$resource->getId()}]" />
  </td>

Modified: plog/trunk/templates/admin/simpleheader.template
===================================================================
--- plog/trunk/templates/admin/simpleheader.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/simpleheader.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -14,6 +14,11 @@
 <link rel="stylesheet" href="styles/admin-ie.css" type="text/css" media="screen" />
 <![endif] -->
 <script type="text/javascript" src="js/ui/default.js"></script>
+<script type="text/javascript" src="js/ui/core.js"></script>
+<script type="text/javascript" src="js/ui/tableeffects.js"></script>
+<script type="text/javascript" src="js/yui/yahoo/yahoo-min.js"></script> 
+<script type="text/javascript" src="js/yui/dom/dom-min.js"></script> 
+<script type="text/javascript" src="js/yui/event/event-min.js"></script>
 {if $templatename=="default"}{** only to be used in the login page! **}
 <style>{literal}
 html,body

Modified: plog/trunk/templates/admin/sitelocales.template
===================================================================
--- plog/trunk/templates/admin/sitelocales.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/sitelocales.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=siteLocales title=$locale->tr("siteLocales")}
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
  <form id="editLocales" method="post" action="admin.php">
   <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -16,7 +25,7 @@
     </thead>
     <tbody>
     {foreach from=$locales item=sitelocale}
-     <tr class="{cycle values="odd,even"}">
+     <tr>
       <td>
        <input class="checkbox" type="checkbox" name="localeIds[{counter}]" value="{$sitelocale->getLocaleCode()}"/>
       </td>

Modified: plog/trunk/templates/admin/sitetemplates.template
===================================================================
--- plog/trunk/templates/admin/sitetemplates.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/sitetemplates.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,14 @@
 {include file="$blogtemplate/header.template"}
 {include file="$blogtemplate/navigation.template" showOpt=siteTemplates title=$locale->tr("siteTemplates")}
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
  <form id="siteTemplates" method="post" action="admin.php">
  <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -14,7 +23,7 @@
   </thead>
   <tbody>
   {foreach from=$templates item=sitetemplate}
-   <tr class="{cycle values="odd,even"}">
+   <tr>
     <td>
        <input class="checkbox" type="checkbox" name="templateIds[{counter}]" value="{$sitetemplate->getName()}" />
     </td>

Modified: plog/trunk/templates/admin/siteusers.template
===================================================================
--- plog/trunk/templates/admin/siteusers.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/siteusers.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=editSiteUsers title=$locale->tr("editSiteUsers")} 
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <div id="list_nav_bar">
             <div id="list_nav_select">
             
@@ -51,7 +60,7 @@
                 </thead>
                 <tbody>
                    {foreach from=$siteusers item=siteuser}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="userIds[{$siteuser->getId()}]" id="checks_{$siteuser->getId()}" value="{$siteuser->getId()}" />
                         </td>

Modified: plog/trunk/templates/admin/statistics.template
===================================================================
--- plog/trunk/templates/admin/statistics.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/admin/statistics.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,14 @@
 {include file="$admintemplatepath/header.template"}
 {include file="$admintemplatepath/navigation.template" showOpt=Stats title=$locale->tr("Stats")}
+<script type="text/javascript">
+{literal}
+YAHOO.util.Event.addListener( window, "load", function() {
+		var t = new Lifetype.UI.TableEffects();
+		t.stripe();
+		t.highlightRows();
+	});
+{/literal}
+</script>
         <form id="postStats" action="admin.php" method="post">
         <div id="list">
   {include file="$admintemplatepath/successmessage.template"}
@@ -16,7 +25,7 @@
                 </thead>
                 <tbody>
                    {foreach from=$referrers item=referrer}
-                    <tr class="{cycle values="odd,even"}">
+                    <tr>
                         <td>
                             <input class="checkbox" type="checkbox" name="referrerIds[{$referrer->getId()}]" id="checks_1" value="{$referrer->getId()}" />
                         </td>

Modified: plog/trunk/templates/default/commentform.template
===================================================================
--- plog/trunk/templates/default/commentform.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/default/commentform.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -8,16 +8,16 @@
 <div><label for="commentText">{$locale->pr("comment_text")}</label><textarea rows="10" cols="30" name="commentText" id="commentText"></textarea></div>
 <div><label for="userName">{$locale->pr("comment_username")}</label>
 	{if $authuser}
-	{$authuser->getUsername()} (<b>Authenticated</b>)<br />
-	<input type="hidden" name="userName" id="userName" value="{if $authuser}{$authuser->getUsername()}{/if}" /></div>
+	{$authuser->getUsername()} (<b>{$locale->tr("form_authenticated")}</b>)<br />
+	<input type="hidden" name="userName" id="userNameHidden" value="{if $authuser}{$authuser->getUsername()}{/if}" /></div>
 	{else}
 	<input type="text" name="userName" id="userName" value="" /></div>
 	{/if}
-<div><label for="userEmail">Email</label><input type="text" name="userEmail" id="userEmail" value="" /></div>
-<div><label for="userUrl">Web</label><input type="text" name="userUrl" id="userUrl" value="" /></div>
+<div><label for="userEmail">{$locale->tr("comment_email")}</label><input type="text" name="userEmail" id="userEmail" value="" /></div>
+<div><label for="userUrl">{$locale->tr("comment_url")}</label><input type="text" name="userUrl" id="userUrl" value="" /></div>
 {/dynamic}
 {if $authimage}{if $authimage->isEnabled()}
-<div><label for="authImage">Please type the 6-digit code you can see here:</label><br/>
+<div><label for="authImage">{$locale->tr("authimage_type_code")}</label>
 <input type="text" name="authImage" id="authImage" value="" />&nbsp;{$authimage->show()}</div>
 {/if}{/if}
 <div id="Submit"><input id="Add" type="submit" value="{$locale->pr("comment_send")}" name="Add" />

Modified: plog/trunk/templates/standard/albums.template
===================================================================
--- plog/trunk/templates/standard/albums.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/standard/albums.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,4 @@
-		{include file="$blogtemplate/header.template"} 
+{include file="$blogtemplate/header.template"} 
 
 <h2>{$locale->tr("albums")}</h2>
 
@@ -11,18 +11,17 @@
 		{assign var="counter" value=0}
   		{foreach from=$albums item=album}
 	<div class="album">
-	<a href="{$url->albumLink($album)}"><img src="{$url->getTemplateFile("imgs/folder.gif")}" alt="{$album->getName()}" /></a>
+	<a href="{$url->albumLink($album)}"><img src="{$url->getTemplateFile("imgs/folder.gif")}" alt="{$album->getName()}" /></a>
   	<p>{$album->getName()} ({$album->getNumResources()})</p>
   		{assign var="counter" value="`$counter+1`"}
 		{if $counter%3 == 0}
 		{/if}
 	</div>
 		{/foreach}
-
+
 	<div class="clearer">&nbsp;</div>
 
 </div>
 
 <!-- end of the albums -->
-		
-		{include file="$blogtemplate/footer.template"} 
+{include file="$blogtemplate/footer.template"} 
\ No newline at end of file

Modified: plog/trunk/templates/standard/archives.template
===================================================================
--- plog/trunk/templates/standard/archives.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/standard/archives.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,4 +1,5 @@
-		{include file="$blogtemplate/header.template"} 
+{assign var=title value=$locale->tr("archives")}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | $title"} 
 <h2>{$locale->tr("archives")}</h2>
 
 <div id="Archives">

Modified: plog/trunk/templates/standard/header.template
===================================================================
--- plog/trunk/templates/standard/header.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/standard/header.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -4,7 +4,7 @@
  <meta http-equiv="content-type" content="text/html; charset={$locale->getCharset()}" />
  <meta name="generator" content="{$version}" />
  <meta http-equiv="Content-Language" content="{$locale->getLanguageId()}" />
- <title>{$blog->getBlog()}{$postPageTitle}</title>
+ <title>{$pageTitle|escape:"html"}</title>
  <link rel="stylesheet" type="text/css" title="Style" href="{$url->getTemplateFile("style.css")}" />
  <!--[if IE ]>
 <link rel="stylesheet" type="text/css" title="Style" href="{$url->getTemplateFile("style-ie.css")}" />

Modified: plog/trunk/templates/standard/links.template
===================================================================
--- plog/trunk/templates/standard/links.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/standard/links.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,5 +1,5 @@
-		{include file="$blogtemplate/header.template"} 
-  
+{assign var=title value=$locale->tr("links")}
+{include file="$blogtemplate/header.template" pageTitle="$pageTitle | $title"} 
 <div id="Links">
 	<h2>{$locale->tr("my_links")}</h2>
   		{foreach from=$mylinkscategories item=linkcategory}
@@ -12,6 +12,6 @@
     		{/foreach}
   	</ul>
   		{/foreach}
-  	</div>
+  	</div>
   
 		{include file="$blogtemplate/footer.template"} 
\ No newline at end of file

Modified: plog/trunk/templates/standard/style.css
===================================================================
--- plog/trunk/templates/standard/style.css	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/standard/style.css	2007-02-10 18:49:29 UTC (rev 4710)
@@ -167,7 +167,7 @@
 	}
 
 #CommentForm label {
-	width:6em;
+	width:13em;
 	float:left;
 	display:block;
 	clear:both; 

Modified: plog/trunk/templates/summary/blogprofile.template
===================================================================
--- plog/trunk/templates/summary/blogprofile.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/summary/blogprofile.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -12,7 +12,9 @@
 		 <p>
             {$locale->tr("users")}
 			{assign var=blogUsers value=$blog->getUsersInfo()}
-			<a href="?op=UserProfile&amp;userId={$owner->getId()}">{$owner->getUsername()|strip_tags}</a>{foreach from=$blogUsers item=blogUser name=blogUsersLoop}{if $owner->getId() != $blogUser->getId()}, <a href="?op=UserProfile&amp;userId={$blogUser->getId()}">{$blogUser->getUsername()|strip_tags}</a>{/if}{/foreach}			
+			<a href="?op=UserProfile&amp;userId={$owner->getId()}">{$owner->getUsername()|strip_tags}</a>{foreach from=$blogUsers item=blogUser name=blogUsersLoop}{if $owner->getId() != $blogUser->getId()}, <a href="?op=UserProfile&amp;userId={$blogUser->getId()}">{$blogUser->getUsername()|strip_tags}</a>{/if}{/foreach}<br/>
+			{assign var=lastUpdate value=$blog->getUpdateDateObject()}
+			{$locale->tr("updated")}: {$locale->formatDate($lastUpdate)}
 		  </p>
 		  <h4>&raquo; {$locale->tr("latest_posts")}</h4>
 		  <p>

Modified: plog/trunk/templates/summary/registerstep2.template
===================================================================
--- plog/trunk/templates/summary/registerstep2.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/summary/registerstep2.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -20,7 +20,7 @@
      <label for="blogName">{$locale->tr("name")}</label>
      <div class="formHelp">{$locale->tr("register_blog_name_help")}</div>
      <input type="text" name="blogName" value="{$blogName}" id="blogName" size="40" />
-     {include file="summary/validate.template" field=blogName message=$locale->tr("error_empty_name")}
+     {include file="summary/validate.template" field=blogName message=$locale->tr("error_invalid_blog_name")}
    </div>
 
    {if $blogDomainsEnabled}

Modified: plog/trunk/templates/summary/searchresults.template
===================================================================
--- plog/trunk/templates/summary/searchresults.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/summary/searchresults.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -1,6 +1,6 @@
 {include file="summary/header.template" section=$locale->tr("search_results")}
 <div id="onecolumn">
-    <h2>Resultats de la recerca</h2>
+    <h2>{$locale->tr("search_results")}</h2>
     {if $searchtype == 1}
 	    {foreach from=$searchresults item=result}
 		    {assign var="post" value=$result->getArticle()}

Modified: plog/trunk/templates/wizard/header.template
===================================================================
--- plog/trunk/templates/wizard/header.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/wizard/header.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -41,8 +41,7 @@
 	       <li {if $step==1}class="currentStep"{/if}>1 Checks</li>
            <li {if $step==2}class="currentStep"{/if}>&raquo; 2 Update</li>
            <li {if $step==3}class="currentStep"{/if}>&raquo; 3 Database Changes</li>
-           <li {if $step==4}class="currentStep"{/if}>&raquo; 4 Data changes</li>
-           <li {if $step==5}class="currentStep"{/if}>&raquo; 5 Done!</li>
+           <li {if $step==5}class="currentStep"{/if}>&raquo; 4 Done!</li>
           </ul>
           {/if}
           <br style="clear:both;"/>

Modified: plog/trunk/templates/wizard/update3.template
===================================================================
--- plog/trunk/templates/wizard/update3.template	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/templates/wizard/update3.template	2007-02-10 18:49:29 UTC (rev 4710)
@@ -20,7 +20,7 @@
 </fieldset>
 <div class="buttons">
    {if !$complete}
-   <input type="hidden" name="nextStep" value="Update3"/>
+   <input type="hidden" name="nextStep" value="Update2"/>
    {else}
    {if !$viewIsError}
    <input type="hidden" name="nextStep" value="Update4"/>   
@@ -29,17 +29,28 @@
    {/if}
    {/if}
    {if $viewIsError}
-     <input type="hidden" name="nextStep" value="Update3"/>   
+     <input type="hidden" name="nextStep" value="Update2"/>   
      <input type="submit" name="continue" value="Continue" />
    {/if}   
    <input type="hidden" name="page" value="{$nextStep}" />
    <input type="hidden" name="transformerId" value="{$transformerId}" />
 </div>
+
+<!-- for debugging purposes only
+  <input type="hidden" name="nextStep" value="Update3"/>   
+  <input type="submit" name="continue" value="Continue" />
+  <input type="hidden" name="page" value="{$nextStep}" />
+  <input type="hidden" name="transformerId" value="{$transformerId}" />
+-->
+
+
 </form>
 {if !$complete  && !$viewIsError}
- <!-- let's make the document submit itself -->
+  <!-- let's make the document submit itself but we wait for a second so that we're nice with the server -->
  <script type="text/javascript">
-  document.update3.submit();
+  setTimeout( "document.update3.submit()",1000 ); 
  </script>
 {/if}
+
+
 {include file="wizard/footer.template"}
\ No newline at end of file

Modified: plog/trunk/wizard.php
===================================================================
--- plog/trunk/wizard.php	2007-02-10 10:26:33 UTC (rev 4709)
+++ plog/trunk/wizard.php	2007-02-10 18:49:29 UTC (rev 4710)
@@ -89,7 +89,6 @@
     $_actionMap["Step5"] = "WizardStepFive";
     $_actionMap["Update1"] = "UpdateStepOne";
     $_actionMap["Update2"] = "UpdateStepTwo";
-    $_actionMap["Update3"] = "UpdateStepThree";
 
 
     /**
@@ -1313,223 +1312,6 @@
             $this->setCommonData();
         }
     }
-
-    class UpdateStepTwo extends WizardAction
-    {
-
-        var $_db;
-        var $_dbPrefix;
-
-        function validate()
-        {
-            $configFile = new ConfigFileStorage();
-            $this->_dbPrefix = $configFile->getValue( "db_prefix" );
-
-            return true;
-        }
-
-        
-        function perform()
-        {
-            global $Tables;
-            global $Inserts;
-
-            // connect to the db
-            $this->_db = connectDb();
-
-            // store error messages in this var
-            $message = "";
-
-            if( !$this->_db ) {
-                $this->_view = new WizardView( "update1" );
-                WizardStepTwo::setDbConfigValues( $this->_view );
-                $this->_view->setErrorMessage( "There was an error connecting to the database. Please check your settings." );
-                return false;
-            }
-
-            // ---
-            // make changes to the tables that need changes, but leave it up to the data dictionary
-            // to take care of the changes
-            // ---
-            $dict = NewPDbDataDictionary( $this->_db );            
-            $errors = false;
-            foreach( $Tables as $name => $table ) {
-                $errorMessage = "";
-                $table_errors = false;
-            	$upperName = $dict->upperName;
-            	$tableSchema = $table["schema"];
-            	if ( isset( $table["options"] ) )
-            	{
-            		$tableOptions = $table["options"];
-            		$options = array ( $upperName => $tableOptions );
-            	} else {
-            		$options = array ();
-                }
-               
-                // generate the code with the changes for the table
-                $sqlarray = $dict->ChangeTableSQL( $this->_dbPrefix.$name, $tableSchema, $options );
-                
-                foreach( $sqlarray as $sql ) {
-                    // and run the query
-                    if( !$this->_db->Execute( $sql )) {
-                        $table_errors = true;
-                        $errors = true;
-                        $errorMessage .= $this->_db->ErrorMsg()."<br/>";
-                    }
-                }
-
-                if( !$table_errors )
-                    $message .= "Changes to table <strong>$name</strong> executed successfully.<br/>";
-                else {
-                    $message .= "Error modifying table $name: ".$errorMessage;
-                }
-            }
-
-            if( !$errors ) {
-                $message .= "<br/><b>** Modifications to the database schema carried out successfully **</b><br/><br/>";
-                $message .= "The next step will update some of the data in your database. This process may take a while
-                             depending on the amount of data in your database, and the browser will periodically refresh
-                             to avoid timeout issues. <b>Please do not attempt to interrupt this process.</b>";
-                             
-            }
-
-            // check the configuration and add the new configuration settings that were added for 1.2
-            foreach( $Inserts as $key => $insert ) {
-				$checkKeyQuery = "SELECT * FROM ".$this->_dbPrefix."config WHERE config_key ='".$key."';";
-				$result = $this->_db->Execute($checkKeyQuery);
-                if(!$result){
-                    $message .= "Error executing code: ".$this->_db->ErrorMsg()."<br/>";
-                    $errors = true;
-                }
-				else{
-                    if ($result->RecordCount() == 0){
-                            // try to guess the url where plog is running
-                        $httpProtocol = (array_key_exists("HTTPS", $_SERVER) && $_SERVER["HTTPS"] == "on") ? "https://" : "http://";
-                        $httpHost = $_SERVER["HTTP_HOST"];
-                        $requestUrl = $_SERVER["REQUEST_URI"];
-                        $requestUrl = str_replace( "/wizard.php", "", $requestUrl );
-                        $plogUrl = $httpProtocol.$httpHost.$requestUrl;
-                            // Find some of the tools we are going to need (last one is for os x, with fink installed)
-                            // TBD: support for Windows specific directories
-                        $folders = Array( "/bin/", "/usr/bin/", "/usr/local/bin/", "/sw/bin/" );
-                        $finder = new FileFinder();
-                        $pathToUnzip = $finder->findBinary( "unzip", $folders );
-                        $pathToTar = $finder->findBinary( "tar", $folders);
-                        $pathToGzip = $finder->findBinary( "gzip", $folders);
-                        $pathToBzip2 = $finder->findBinary( "bzip2", $folders);
-                        $pathToConvert = $finder->findBinary( "convert", $folders);
-                            // replace the de prefix and base url
-                        $query = str_replace( "{dbprefix}", $this->_dbPrefix, $insert );
-                        $query = str_replace( "{plog_base_url}", $plogUrl, $query );
-                            // replace also the placeholders for the paths to the tools
-                        $query = str_replace( "{path_to_tar}", $pathToTar, $query );
-                        $query = str_replace( "{path_to_unzip}", $pathToUnzip, $query );
-                        $query = str_replace( "{path_to_bz2}", $pathToBzip2, $query );
-                        $query = str_replace( "{path_to_gzip}", $pathToGzip, $query );
-                        $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
-                        $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
-                        if( !$this->_db->Execute( $query )) {
-                            $message .= "Error executing code: ".$this->_db->ErrorMsg()."<br/>";
-                            $errors = true;
-                        }
-                    }
-                    $result->Close();
-                }
-            }
-                // check to see if we need to remove duplicates and the id index
-            $query = "SELECT id FROM ".$this->_dbPrefix."config LIMIT 1";
-            $result = $this->_db->Execute($query);
-                // if $result is false, id column has already been removed
-            if($result){
-                $result->Close();
-            
-                    // remove all duplicates in plog_config table
-                    
-                    // first create temp table without the duplicates
-                $query = "CREATE TEMPORARY TABLE tmptable ".
-                         "SELECT * FROM ".$this->_dbPrefix."config WHERE 1 GROUP BY config_key";
-                $result = $this->_db->Execute($query);
-                if($result){
-                    //$result->Close();
-                        // Now delete the old table
-                    $query = "DELETE FROM ".$this->_dbPrefix."config";
-                    $result = $this->_db->Execute($query);
-                    if($result){
-                        //$result->Close();
-                        // Insert the unique rows into the old table
-                        $query = "INSERT INTO ".$this->_dbPrefix."config SELECT * FROM tmptable";
-                        $result = $this->_db->Execute($query);
-                    }
-                }
-                if(!$result){
-                    $message .= "Error removing duplicates in config table: ".
-                        $this->_db->ErrorMsg()."<br/>";
-                    $errors = true;
-                }
-
-                if($result){
-
-                    // remove index id field, we don't need it any more!
-                    $query = "ALTER TABLE ".$this->_dbPrefix."config DROP COLUMN id";
-                    $result = $this->_db->Execute($query);
-                    if(!$result){
-                        $message .= "Error removing old id column from config table: ".$this->_db->ErrorMsg()."<br/>";
-                        $errors = true;
-                    }
-                }
-            }
-
-			//
-			// load the new list of permissions
-			//
-			// load the core permissions
-		    include_once( PLOG_CLASS_PATH."install/corepermissions.properties.php" );
-
-		    // process permissions
-		    $total = 0;		
-		    foreach( $permissions as $perm ) {
-			    // check if it already exists
-			    $query = "SELECT * FROM ".Db::getPrefix()."permissions WHERE permission = '".$perm[0]."'";
-			    $result = $this->_db->Execute( $query );
-			    if( !$result || $result->RowCount() < 1 ) {				
-				   	// permission needs to be added
-					$corePerm = ( $perm[2] == true ? 1 : 0 );
-					$adminOnly = ( $perm[3] == true ? 1 : 0 );
-					$query = "INSERT INTO ".Db::getPrefix()."permissions (permission,description,core_perm,admin_only) ".
-					          "VALUES ('".$perm[0]."','".$perm[1]."','".$corePerm."','".$adminOnly."')";
-					$this->_db->Execute( $query );
-					$total++;
-			    }
-		    }
-		
-			//
-			// prepare the users_permissions table for the next step
-			//
-			if( !$this->_db->Execute( "INSERT INTO ".Db::getPrefix()."tmp_users_permissions SELECT * FROM ".Db::getPrefix()."users_permissions WHERE blog_id != 0 AND permission_id != 1" )) {
-				$message .= "Error preparing the users_permissions table for transformation";
-				$errors = true;
-			}
-			else {
-				$this->_db->Execute( "DELETE FROM ".Db::getPrefix()."users_permissions" );
-				$errors = false;
-			}
-            
-            //
-            // there's nothing left to do so we can quit now!!
-            //
-            if( !$errors ) {
-                $this->_view = new WizardView( "update2" );
-                $this->_view->setValue( "message", $message );
-            }
-            else {
-                $this->_view = new WizardView( "update1" );
-                WizardStepTwo::setDbConfigValues( $this->_view );
-                $this->_view->setErrorMessage( $message );
-            }
-
-            return true;
-        }
-    }
     
     /**
      * Generic class that performs data updates on the database
@@ -1626,6 +1408,71 @@
             return((int)($processed / ( $this->getNumSteps() * $this->itemsPerPage ) * 100 ));
         }
     }
+
+	/**
+	 * This step takes care of transforming the database schema, one
+	 * table at a time.
+	 */
+	class DatabaseSchemaDataTransformer extends DatabaseDataTransformer
+	{		
+		function getNumSteps()
+		{
+			global $Tables;			
+			return( count( $Tables ) - 1);
+		}
+		
+		function perform()
+		{
+			global $Tables;
+			
+			$tablesArray = array_keys( $Tables );
+			$curTable = $tablesArray[$this->page-1];
+						
+			//print("Processing page: ".$this->page." - table: ".$curTable."<br/>" );			
+
+			$db =& Db::getDb();
+            $dict = NewPDbDataDictionary( $db );
+            $errors = false;
+
+			$this->message = "Performing changes to the dabase schema, please wait (step 1 of 6)<br/>";
+
+			$errorMessage = "";
+			$table_errors = false;
+			$upperName = $dict->upperName;
+			$tableSchema = $Tables[$curTable]["schema"];
+			if ( isset( $Tables[$curTable]["options"] )) {
+				$tableOptions = $Tables[$curTable]["options"];
+				$options = array ( $upperName => $tableOptions );
+			} 
+			else {
+				$options = array ();
+			}
+
+			// generate the code with the changes for the table
+			$sqlarray = $dict->ChangeTableSQL( $this->getPrefix().$curTable, $tableSchema, $options );
+
+			foreach( $sqlarray as $sql ) {
+				// and run the query
+				//print( "sql: ".$sql."<br/>" );
+				if( !$this->Execute( $sql )) {
+					$table_errors = true;
+					$errors = true;
+					$errorMessage .= $this->_db->ErrorMsg()."<br/>";
+				}
+			}
+
+			if( !$table_errors ) {
+				$this->message .= "Changes to table <strong>$curTable</strong> executed successfully.<br/>";
+				$result = true;
+			}
+			else {
+				$this->message .= "Error modifying table $curTAble: ".$errorMessage;
+				$result = false;
+			}
+
+			return( $result ); 
+		}
+	}
     
     /**
 	 * Processes all users and grants the appropriate permissions
@@ -1639,7 +1486,7 @@
     
         function perform()
         {
-            $this->message = "<b>Updating user permissions (step 1 of 3)</b><br/><br/>";        
+            $this->message = "<b>Updating user permissions (step 4 of 6)</b><br/><br/>";        
         
             $query3 = "SELECT * FROM ".Db::getPrefix()."tmp_users_permissions";
             $res3 = $this->Execute( $query3, $this->page, $this->itemsPerPage );
@@ -1673,11 +1520,164 @@
 				}
             }
         
-            $this->message .= "{$this->updatedRecords} users updated, ".$this->getTotalProcessedRecords()." processed so far (".$this->getPercentProcessed()."%)<br/>";
+            $this->message .= "{$this->updatedRecords} users updated (".$this->getPercentProcessed()."%)<br/>";
             return true;        
         }
     }
 
+	class PermissionLoader extends DatabaseDataTransformer
+	{
+		
+		//
+		// load the new list of permissions
+		//		
+		function getNumSteps()
+		{
+			return( 0 );
+		}
+		
+		function perform()
+		{
+			// initial message, no errors yet
+            $this->message = "<b>Loading new permissions (step 2 of 6)</b><br/><br/>";			
+			$errors = false;
+			
+			// load the core permissions
+		    include_once( PLOG_CLASS_PATH."install/corepermissions.properties.php" );	
+
+		    // process permissions
+		    $total = 0;		
+		    foreach( $permissions as $perm ) {
+			    // check if it already exists
+			    $query = "SELECT * FROM ".$this->dbPrefix."permissions WHERE permission = '".$perm[0]."'";
+			    $result = $this->Execute( $query );
+			    if( !$result || $result->RowCount() < 1 ) {				
+				   	// permission needs to be added
+					$corePerm = ( $perm[2] == true ? 1 : 0 );
+					$adminOnly = ( $perm[3] == true ? 1 : 0 );
+					$query = "INSERT INTO ".$this->dbPrefix."permissions (permission,description,core_perm,admin_only) ".
+					          "VALUES ('".$perm[0]."','".$perm[1]."','".$corePerm."','".$adminOnly."')";
+					$this->_db->Execute( $query );
+					$total++;
+			    }
+		    }
+		
+			//
+			// prepare the users_permissions table for the next step
+			//
+			if( !$this->Execute( "INSERT INTO ".$this->dbPrefix."tmp_users_permissions SELECT * FROM ".$this->dbPrefix."users_permissions WHERE blog_id != 0 AND permission_id != 1" )) {
+				$this->message .= "Error preparing the users_permissions table for transformation";
+				$errors = true;
+			}
+			else {
+				$this->Execute( "DELETE FROM ".$this->dbPrefix."users_permissions" );
+				$this->message .= count($permissions)." permissions successfully loaded";
+				$errors = false;
+			}				
+			
+			return( !$errors );			
+		}	
+	}
+
+	class ConfigDataTransformer extends DatabaseDataTransformer
+	{
+		function getNumSteps()
+		{
+			return( 0 );
+		}
+		
+		function perform()
+		{
+		    global $Inserts;	
+			
+            $this->message = "<b>Adding new configuration parameters (step 4 of 6)</b><br/><br/>";
+			$errors = false;
+			
+            // Find some of the tools we are going to need (last one is for os x, with fink installed), this will be needed later on
+            $folders = Array( "/bin/", "/usr/bin/", "/usr/local/bin/", "/sw/bin/" );
+            $finder = new FileFinder();
+            $pathToUnzip = $finder->findBinary( "unzip", $folders );
+            $pathToTar = $finder->findBinary( "tar", $folders);
+            $pathToGzip = $finder->findBinary( "gzip", $folders);
+            $pathToBzip2 = $finder->findBinary( "bzip2", $folders);
+            $pathToConvert = $finder->findBinary( "convert", $folders);
+
+            // check the configuration and add the new configuration settings that were added for 1.2
+            foreach( $Inserts as $key => $insert ) {
+				$checkKeyQuery = "SELECT * FROM ".$this->dbPrefix."config WHERE config_key ='".$key."';";
+				$result = $this->Execute($checkKeyQuery);
+                if(!$result){
+                    $this->message .= "Error executing code: ".$this->_db->ErrorMsg()."<br/>";
+                    $errors = true;
+                }
+				else{
+                    if ($result->RecordCount() == 0) {	
+                        // replace the prefix
+                        $query = str_replace( "{dbprefix}", $this->dbPrefix, $insert );
+                        // replace also the placeholders for the paths to the tools
+                        $query = str_replace( "{path_to_tar}", $pathToTar, $query );
+                        $query = str_replace( "{path_to_unzip}", $pathToUnzip, $query );
+                        $query = str_replace( "{path_to_bz2}", $pathToBzip2, $query );
+                        $query = str_replace( "{path_to_gzip}", $pathToGzip, $query );
+                        $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
+                        $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
+                        if( !$this->Execute( $query )) {
+                            $this->message .= "Error executing code: ".$this->_db->ErrorMsg()."<br/>";
+                            $errors = true;
+                        }
+                    }
+                    $result->Close();
+                }
+            }
+                // check to see if we need to remove duplicates and the id index
+            $query = "SELECT id FROM ".$this->dbPrefix."config LIMIT 1";
+            $result = $this->Execute($query);
+                // if $result is false, id column has already been removed
+            if($result){
+                $result->Close();           
+                    // remove all duplicates in plog_config table
+                    
+                    // first create temp table without the duplicates
+                $query = "CREATE TEMPORARY TABLE tmptable ".
+                         "SELECT * FROM ".$this->dbPrefix."config WHERE 1 GROUP BY config_key";
+                $result = $this->Execute($query);
+                if($result){
+                    //$result->Close();
+                        // Now delete the old table
+                    $query = "DELETE FROM ".$this->dbPrefix."config";
+                    $result = $this->Execute($query);
+                    if($result) {
+                        //$result->Close();
+                        // Insert the unique rows into the old table
+                        $query = "INSERT INTO ".$this->dbPrefix."config SELECT * FROM tmptable";
+                        $result = $this->Execute($query);
+                    }
+                }
+                /*if(!$result){
+                    $this->message .= "Error removing duplicates in config table<br/>";
+                    $errors = true;
+                }*/
+
+                if($result){
+
+                    // remove index id field, we don't need it any more!
+                    $query = "ALTER TABLE ".$this->dbPrefix."config DROP COLUMN id";
+                    $result = $this->Execute($query);
+                    if(!$result){
+                        $this->message .= "Error removing old id column from config table: ".$this->_db->ErrorMsg()."<br/>";
+                        $errors = true;
+                    }
+                }
+            }			
+
+			if( !$errors ) {
+				$this->message = "Configuration settings updated successfully";
+			}
+			
+			return( !$errors );
+		}		
+	}
+
     /**
 	 * Processes all admin users and grants the appropriate permissions
      */
@@ -1690,7 +1690,7 @@
     
         function perform()
         {
-            $this->message = "<b>Updating admin user permissions (step 1 of 3)</b><br/><br/>";        
+            $this->message = "<b>Updating admin user permissions (step 3 of 6)</b><br/><br/>";        
         
             // load each one of the categories and update them
             // list of categories
@@ -1707,8 +1707,7 @@
 			$allPerms = $permissions->getAllPermissions();
 			
             while( $row = $res3->FetchRow()) {
-            	if( $row["site_admin"] == "1" ) {
-					print("processing admin user = ".$row["id"]."<br/>");
+            	if( $row["site_admin"] > 0 ) {
 					// it's an admin, let's grant all the appropriate permissions
 					foreach( $allPerms as $perm ) {
 						if( $perm->isAdminOnlyPermission() && $perm->getName() != "login_perm" ) {
@@ -1724,7 +1723,7 @@
 				$this->updatedRecords++;
             }
         
-            $this->message .= "{$this->updatedRecords} users updated, ".$this->getTotalProcessedRecords()." processed so far (".$this->getPercentProcessed()."%)<br/>";
+            $this->message .= "{$this->updatedRecords} users updated (".$this->getPercentProcessed()."%)<br/>";
             return true;        
         }
     }
@@ -1741,7 +1740,7 @@
     
         function perform()
         {
-            $this->message = "<b>Updating resource files (step 3 of 3)</b><br/><br/>";        
+            $this->message = "<b>Updating resource files (step 6 of 6)</b><br/><br/>";        
         
             $query1 = "SELECT id, owner_id, file_name, resource_type, thumbnail_format FROM ".$this->dbPrefix."gallery_resources";
 
@@ -1843,15 +1842,15 @@
      * the methods DatabaseDataTransformer::perform() and DatabaseDataTransformer::getNumSteps(). The
      * first does the data processing while the second one returns the number of needed steps to the
      * class running the transformer.
-     * - Add the name of the transformer class to the the UpdateStepThree::transformers array,
+     * - Add the name of the transformer class to the the UpdateStepTwo::transformers array,
      * and the class will take care of everything else. 
      */
-    class UpdateStepThree extends WizardPagedAction
+    class UpdateStepTwo extends WizardPagedAction
     {
         var $message;    
         var $currentTransformerId;
     
-        function UpdateStepThree( $actionInfo, $httpRequest )
+        function UpdateStepTwo( $actionInfo, $httpRequest )
         {
             $this->WizardPagedAction( $actionInfo, $httpRequest );
             
@@ -1859,8 +1858,11 @@
              * array with the data transformers that will be run
              */
             $this->transformers = Array(
+				"DatabaseSchemaDataTransformer",
+				"PermissionLoader",
 				"AdminUserPermissionsDataTransformer",
 				"UserPermissionsDataTransformer",
+				"ConfigDataTransformer",
 				"ResourcesDataTransformer"
             );
             
@@ -1910,7 +1912,7 @@
                 $this->_view->setValue( "transformerId", $this->currentTransformerId );            
                 $this->_view->setValue( "error", true );
                 if( $transformer->DbError() != "" ) {
-                    $message .= "<br/><br/>The database error message was: ".$transformer->DbError()."<br/>";
+                    $message .= "<br/>The database error message was: ".$transformer->DbError()."<br/>";
                 }
 
                 $this->_view->setErrorMessage( $message );



More information about the pLog-svn mailing list