[pkg-horde] [SCM] Debian Horde Packages repository: mnemo2 package branch, upstream+patches, updated. af8b8c2537cf203b8a850db7040911e965a1da5e

Mathieu Parent math.parent at gmail.com
Mon Dec 21 17:39:07 UTC 2009


The following commit has been merged in the upstream+patches branch:
commit af8b8c2537cf203b8a850db7040911e965a1da5e
Author: Mathieu Parent <math.parent at gmail.com>
Date:   Mon Dec 21 18:37:10 2009 +0100

    Import new upstream sources 2.2.3
    
    Summary: Import new upstream sources 2.2.3
    Keywords:
    
    Imported mnemo-h3-2.2.3
    into Git repository

diff --git a/LICENSE b/LICENSE
index da074b8..437a0dc 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 Version 1.0
 
-Copyright (c) 2002-2005 The Horde Project. All rights reserved.
+Copyright 2002-2009 The Horde Project. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
diff --git a/README b/README
index f8912ed..4a88411 100644
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
 What is Mnemo?
 ==============
 
-:Last update:   $Date: 2007/12/20 14:17:36 $
+:Last update:   $Date: 2007-12-20 14:17:36 $
 :Revision:      $Revision: 1.7.10.2 $
 :Contact:       horde at lists.horde.org
 
diff --git a/config/conf.xml b/config/conf.xml
index d6cb0fd..98b28f4 100644
--- a/config/conf.xml
+++ b/config/conf.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!-- $Horde: mnemo/config/conf.xml,v 1.17.10.1 2007/12/20 14:17:38 jan Exp $ -->
+<!-- $Horde: mnemo/config/conf.xml,v 1.17.10.1 2007-12-20 14:17:38 jan Exp $ -->
 <configuration>
  <configsection name="storage">
   <configheader>Storage System Settings</configheader>
diff --git a/config/hooks.php.dist b/config/hooks.php.dist
new file mode 100644
index 0000000..0aaa90f
--- /dev/null
+++ b/config/hooks.php.dist
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Example hooks for Mnemo
+ *
+ * $Horde: mnemo/config/hooks.php.dist,v 1.1.2.1 2008-11-26 21:25:26 chuck Exp $
+ */
+
+// if (!function_exists('_mnemo_hook_format_description')) {
+//     function _mnemo_hook_format_description($text)
+//     {
+//         $text = preg_replace('/#(\d+)/', '<a href="http://bugs.horde.org/ticket/\1">\0</a>', $text);
+//         $text = preg_replace('/(bug|ticket|request|enhancement|issue):\s*#?(\d+)/i', '<a href="http://bugs.horde.org/ticket/\1">\0</a>', $text);
+//
+//         $text = preg_replace_callback('/\[\[note: ?(.*)\]\]/i', create_function('$m', 'return \'<a href="/horde/mnemo/notes/?q=\' . urlencode($m[1]) . \'">\' . htmlspecialchars($m[0]) . \'</a>\';'), $text);
+//         $text = preg_replace_callback('/\[\[task: ?(.*)\]\]/i', create_function('$m', 'return \'<a href="/horde/nag/tasks/?q=\' . urlencode($m[1]) . \'">\' . htmlspecialchars($m[0]) . \'</a>\';'), $text);
+//
+//         return $text;
+//     }
+// }
+
+// if (!function_exists('_mnemo_hook_description_help')) {
+//     function _mnemo_hook_description_help()
+//     {
+//         return '<p>To create a link to a bug, use #123 where 123 is the bug number. To create a link to a task, use [[task: name]], where name is the beginning of the task name. To create a link to another note, use [[note: title]] where title is the beginning of the note title.</p>';
+//     }
+// }
diff --git a/config/prefs.php.dist b/config/prefs.php.dist
index b83d5a4..5e566de 100644
--- a/config/prefs.php.dist
+++ b/config/prefs.php.dist
@@ -1,6 +1,6 @@
 <?php
 /**
- * $Horde: mnemo/config/prefs.php.dist,v 1.24.2.4 2008/06/13 14:44:04 jan Exp $
+ * $Horde: mnemo/config/prefs.php.dist,v 1.24.2.5 2009-06-19 17:06:22 jan Exp $
  *
  * See horde/config/prefs.php for documentation on the structure of this file.
  */
@@ -12,7 +12,7 @@ $prefGroups['display'] = array(
     'column' => _("General Options"),
     'label' => _("Display Options"),
     'desc' => _("Change your note sorting and display options."),
-    'members' => array('show_notepad', 'show_panel', 'sortby', 'sortdir')
+    'members' => array('show_notepad', 'sortby', 'sortdir')
 );
 
 $prefGroups['share'] = array(
@@ -45,8 +45,7 @@ $_prefs['show_panel'] = array(
     'value' => 1,
     'locked' => false,
     'shared' => false,
-    'type' => 'checkbox',
-    'desc' => _("Show notepad options panel?")
+    'type' => 'implicit',
 );
 
 // user preferred sorting column
diff --git a/data.php b/data.php
index 87de9a3..571fe25 100644
--- a/data.php
+++ b/data.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/data.php,v 1.36.2.11 2008/03/10 05:08:10 chuck Exp $
+ * $Horde: mnemo/data.php,v 1.36.2.12 2009-01-06 15:24:57 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/docs/CHANGES b/docs/CHANGES
index 0990248..a7e5740 100644
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -1,4 +1,30 @@
 ------
+v2.2.3
+------
+
+[jan] Add and fix Oracle SQL scripts.
+[jan] Add Croatian translation (Matej Vela <matej.vela at carnet.hr>).
+
+
+------
+v2.2.2
+------
+
+[mms] Upgrade prototype.js to v1.6.1.
+[jan] Fix synchronization with output compression enabled (Bug #7769).
+[jan] Add passphrase confirmation field (Bug #7379).
+[cjh] Work around BC break with Horde versions before 3.2 (Bug #7820).
+[cjh] Add URL access to notes by "starts-with" search on the note title.
+[cjh] Add hooks for altering the displayed note body and showing help text next
+      to the note entry field.
+[cjh] Explicitly load DB library (Bug #7648).
+[jan] Fix "replace" API method (Alfonso Marín Marín <almarin at um.es>, Bug #7436).
+[cjh] Add a PostgreSQL-specific upgrade script.
+[jan] Change group field in shares table to work with LDAP groups (Bug #6883).
+[jan] Fix user name conversion with user hooks in the notepad panel (Bug #7366).
+
+
+------
 v2.2.1
 ------
 
diff --git a/docs/CREDITS b/docs/CREDITS
index b3f0dd3..96f4b7f 100644
--- a/docs/CREDITS
+++ b/docs/CREDITS
@@ -23,9 +23,11 @@ Bulgarian               Miroslav Pendev <miro at cybershade.us>
 Chinese (Simplified)    Peter Wang <whw at oulink.net>
                         Anna Chen <annachen2008 at yahoo.com.cn>
 Chinese (Traditional)   Chih-Wei Yeh <cwyeh at ccca.nctu.edu.tw>
+Croatian                Matej Vela <matej.vela at carnet.hr>
 Czech                   Pavel Chytil <pavel at chytil.tk>
 Danish                  Martin List-Petersen <martin at list-petersen.dk>
                         Brian Truelsen <horde+i18n at briantruelsen.dk>
+                        Niels Baggesen <nba at users.sourceforge.net>
 Dutch                   Jan Kuipers <jrkuipers at lauwerscollege.nl>
 Finnish                 Leena Heino <liinu at uta.fi>
 French                  Thierry Thomas <thierry at pompo.net>
diff --git a/docs/RELEASE_NOTES b/docs/RELEASE_NOTES
index 494e17d..c16e6ab 100644
--- a/docs/RELEASE_NOTES
+++ b/docs/RELEASE_NOTES
@@ -1,38 +1,35 @@
 <?php
 /**
- * Release focus. Possible values:
- * 0 - N/A
- * 1 - Initial freshmeat announcement
- * 2 - Documentation
- * 3 - Code cleanup
- * 4 - Minor feature enhancements
- * 5 - Major feature enhancements
- * 6 - Minor bugfixes
- * 7 - Major bugfixes
- * 8 - Minor security fixes
- * 9 - Major security fixes
+ * Release focus. Possible values (multiple possible with arrays):
+ * Horde_Release::FOCUS_INITIAL - Initial announcement
+ * Horde_Release::FOCUS_MINORFEATURE - Minor feature enhancement
+ * Horde_Release::FOCUS_MAJORFEATURE - Major feature enhancement
+ * Horde_Release::FOCUS_MINORBUG - Minor bugfixes
+ * Horde_Release::FOCUS_MAJORBUG - Major bugfixes
+ * Horde_Release::FOCUS_MINORSECURITY - Minor security fixes
+ * Horde_Release::FOCUS_MAJORSECURITY - Major security fixes
+ * Horde_Release::FOCUS_DOCS - Documentation improvements
  */
-$this->notes['fm']['focus'] = 4;
+$this->notes['fm']['focus'] = array(Horde_Release::FOCUS_MINORFEATURE);
 
 /* Mailing list release notes. */
 $this->notes['ml']['changes'] = <<<ML
 The Horde Team is pleased to announce the final release of the Mnemo Note
-Manager version H3 (2.2.1).
+Manager version H3 (2.2.3).
 
 The Mnemo Note Manager is the Horde notes/memos application.  It provides
 web-based notes and freeform text, similar to the PalmOS Note application and
 shared notepads.  It requires the Horde Application Framework and an SQL
 database or Kolab server for backend storage.
 
-Major changes compared to the Mnemo H3 (2.2) version are:
-    * Improved deleting user data.
-    * Added Basque and Estonian translations.
+Major changes compared to the Mnemo H3 (2.2.2) version are:
+    * Improved Oracle compatibility.
+    * Added Croatian translation.
 ML;
 
 /* Freshmeat release notes. */
 $this->notes['fm']['changes'] = <<<FM
-Deleting user data has been improved.
-Basque and Estonian translations have been added.
+Oracle compatibility has been improved. A Croatian translation has been added.
 FM;
 
 $this->notes['name'] = 'Mnemo';
diff --git a/docs/TODO b/docs/TODO
index 218a962..c2c2b42 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -2,7 +2,7 @@
  Mnemo Development TODO List
 =============================
 
-:Last update:   $Date: 2007/12/20 14:17:38 $
+:Last update:   $Date: 2007-12-20 14:17:38 $
 :Revision:      $Revision: 1.2.10.1 $
 :Contact:       horde at lists.horde.org
 
diff --git a/docs/UPGRADING b/docs/UPGRADING
index 362ece1..a38711d 100644
--- a/docs/UPGRADING
+++ b/docs/UPGRADING
@@ -1,9 +1,9 @@
-========================
+=================
  Upgrading Mnemo
-========================
+=================
 
-:Last update:   $Date: 2008/09/11 15:04:08 $
-:Revision:      $Revision: 1.1.8.11 $
+:Last update:   $Date: 2008-09-23 15:18:24 $
+:Revision:      $Revision: 1.1.8.13 $
 :Contact:       horde at lists.horde.org
 
 
@@ -11,6 +11,16 @@ These are instructions to upgrade from earlier Mnemo versions. Please
 backup your existing data before running any of the steps described below.
 
 
+Upgrading Mnemo from 2.2.1 to 2.2.2
+===================================
+
+The group_uid field in the SQL share driver groups table has been changed from
+an INT to a VARCHAR(255). Execute the provided SQL script to update your
+database if you are using the native SQL share driver.
+
+   mysql --user=root --password=<MySQL-root-password>  <db name> < scripts/upgrades/2.2.1_to_2.2.2.sql
+
+
 Upgrading Mnemo from 2.2 to 2.2.1
 =================================
 
diff --git a/index.php b/index.php
index 67cb146..040f806 100644
--- a/index.php
+++ b/index.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/index.php,v 1.10.10.7 2008/01/02 11:32:25 jan Exp $
+ * $Horde: mnemo/index.php,v 1.10.10.8 2009-01-06 15:24:57 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/js/QuickFinder.js b/js/QuickFinder.js
index d0bc2df..d1dfef1 100644
--- a/js/QuickFinder.js
+++ b/js/QuickFinder.js
@@ -1 +1 @@
-var QuickFinder={attachBehavior:function(){$$("input").each(function(C){var B=C.readAttribute("for");if(!B){return }if(B.indexOf(",")!=-1){C.filterTargets=[];var A=B.split(",");for(var F=0;F<A.length;++F){var E=$(A[F]);if(E){C.filterTargets.push(E)}}if(!C.filterTargets.length){return }}else{C.filterTargets=[$(B)];if(!C.filterTargets[0]){return }}filterEmpty=C.readAttribute("empty");if(filterEmpty){C.filterEmpty=$(filterEmpty)}C.observe("keyup",QuickFinder.onKeyUp);for(var F=0,D=C.filterTargets.length;F<D;F++){C.filterTargets[F].immediateDescendants().each(function(G){var H=G.filterText||G.readAttribute("filterText");if(!H){G.filterText=G.innerHTML.stripTags()}G.filterText=G.filterText.toLowerCase()})}QuickFinder.filter(C)})},onKeyUp:function(A){input=A.element();if(input.filterTargets){QuickFinder.filter(input)}},filter:function(B){var F=B.value.toLowerCase();var A=0;for(var D=0,C=B.filterTargets.length;D<C;D++){B.filterTargets[D].immediateDescendants().each(function(G){var H=G.filterText;if(H.indexOf(F)==-1){G.addClassName("QuickFinderNoMatch")}else{++A;G.removeClassName("QuickFinderNoMatch")}})}try{if(B.filterEmpty){(A==0)?B.filterEmpty.show():B.filterEmpty.hide()}}catch(E){}}};document.observe("dom:loaded",QuickFinder.attachBehavior);
\ No newline at end of file
+var QuickFinder={attachBehavior:function(){$$("input").each(function(c){var b=c.readAttribute("for");if(!b){return}if(b.indexOf(",")!=-1){c.filterTargets=[];var a=b.split(",");for(var f=0;f<a.length;++f){var e=$(a[f]);if(e){c.filterTargets.push(e)}}if(!c.filterTargets.length){return}}else{c.filterTargets=[$(b)];if(!c.filterTargets[0]){return}}filterEmpty=c.readAttribute("empty");if(filterEmpty){c.filterEmpty=$(filterEmpty)}c.observe("keyup",QuickFinder.onKeyUp);for(var f=0,d=c.filterTargets.length;f<d;f++){c.filterTargets[f].immediateDescendants().each(function(g){var h=g.filterText||g.readAttribute("filterText");if(!h){g.filterText=g.innerHTML.stripTags()}g.filterText=g.filterText.toLowerCase()})}QuickFinder.filter(c)})},onKeyUp:function(a){input=a.element();if(input.filterTargets){QuickFinder.filter(input)}},filter:function(b){var g=b.value.toLowerCase();var a=0;for(var d=0,c=b.filterTargets.length;d<c;d++){b.filterTargets[d].immediateDescendants().each(function(e){var h=e.filterText;if(h.indexOf(g)==-1){e.addClassName("QuickFinderNoMatch")}else{++a;e.removeClassName("QuickFinderNoMatch")}})}try{if(b.filterEmpty){(a==0)?b.filterEmpty.show():b.filterEmpty.hide()}}catch(f){}}};document.observe("dom:loaded",QuickFinder.attachBehavior);
\ No newline at end of file
diff --git a/js/prototype.js b/js/prototype.js
index ab8726c..80e8d60 100644
--- a/js/prototype.js
+++ b/js/prototype.js
@@ -1 +1 @@
-var Prototype={Version:"1.6.0.2",Browser:{IE:!!(window.attachEvent&&!window.opera),Opera:!!window.opera,WebKit:navigator.userAgent.indexOf("AppleWebKit/")>-1,Gecko:navigator.userAgent.indexOf("Gecko")>-1&&navigator.userAgent.indexOf("KHTML")==-1,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement("div").__proto__&&document.createElement("div").__proto__!==document.createElement("form").__proto__},ScriptFragment:"<script[^>]*>([\\S\\s]*?)<\/script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(A){return A}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false}var Class={create:function(){var E=null,D=$A(arguments);if(Object.isFunction(D[0])){E=D.shift()}function A(){this.initialize.apply(this,arguments)}Object.extend(A,Class.Methods);A.superclass=E;A.subclasses=[];if(E){var B=function(){};B.prototype=E.prototype;A.prototype=new B;E.subclasses.push(A)}for(var C=0;C<D.length;C++){A.addMethods(D[C])}if(!A.prototype.initialize){A.prototype.initialize=Prototype.emptyFunction}A.prototype.constructor=A;return A}};Class.Methods={addMethods:function(G){var C=this.superclass&&this.superclass.prototype;var B=Object.keys(G);if(!Object.keys({toString:true}).length){B.push("toString","valueOf")}for(var A=0,D=B.length;A<D;A++){var F=B[A],E=G[F];if(C&&Object.isFunction(E)&&E.argumentNames().first()=="$super"){var H=E,E=Object.extend((function(I){return function(){return C[I].apply(this,arguments)}})(F).wrap(H),{valueOf:function(){return H},toString:function(){return H.toString()}})}this.prototype[F]=E}return this}};var Abstract={};Object.extend=function(A,C){for(var B in C){A[B]=C[B]}return A};Object.extend(Object,{inspect:function(A){try{if(Object.isUndefined(A)){return"undefined"}if(A===null){return"null"}return A.inspect?A.inspect():String(A)}catch(B){if(B instanceof RangeError){return"..."}throw B}},toJSON:function(A){var C=typeof A;switch(C){case"undefined":case"function":case"unknown":return ;case"boolean":return A.toString()}if(A===null){return"null"}if(A.toJSON){return A.toJSON()}if(Object.isElement(A)){return }var B=[];for(var E in A){var D=Object.toJSON(A[E]);if(!Object.isUndefined(D)){B.push(E.toJSON()+": "+D)}}return"{"+B.join(", ")+"}"},toQueryString:function(A){return $H(A).toQueryString()},toHTML:function(A){return A&&A.toHTML?A.toHTML():String.interpret(A)},keys:function(A){var B=[];for(var C in A){B.push(C)}return B},values:function(B){var A=[];for(var C in B){A.push(B[C])}return A},clone:function(A){return Object.extend({},A)},isElement:function(A){return A&&A.nodeType==1},isArray:function(A){return A!=null&&typeof A=="object"&&"splice" in A&&"join" in A},isHash:function(A){return A instanceof Hash},isFunction:function(A){return typeof A=="function"},isString:function(A){return typeof A=="string"},isNumber:function(A){return typeof A=="number"},isUndefined:function(A){return typeof A=="undefined"}});Object.extend(Function.prototype,{argumentNames:function(){var A=this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");return A.length==1&&!A[0]?[]:A},bind:function(){if(arguments.length<2&&Object.isUndefined(arguments[0])){return this}var A=this,C=$A(arguments),B=C.shift();return function(){return A.apply(B,C.concat($A(arguments)))}},bindAsEventListener:function(){var A=this,C=$A(arguments),B=C.shift();return function(D){return A.apply(B,[D||window.event].concat(C))}},curry:function(){if(!arguments.length){return this}var A=this,B=$A(arguments);return function(){return A.apply(this,B.concat($A(arguments)))}},delay:function(){var A=this,B=$A(arguments),C=B.shift()*1000;return window.setTimeout(function(){return A.apply(A,B)},C)},wrap:function(B){var A=this;return function(){return B.apply(this,[A.bind(this)].concat($A(arguments)))}},methodize:function(){if(this._methodized){return this._methodized}var A=this;return this._methodized=function(){return A.apply(null,[this].concat($A(arguments)))}}});Function.prototype.defer=Function.prototype.delay.curry(0.01);Date.prototype.toJSON=function(){return'"'+this.getUTCFullYear()+"-"+(this.getUTCMonth()+1).toPaddedString(2)+"-"+this.getUTCDate().toPaddedString(2)+"T"+this.getUTCHours().toPaddedString(2)+":"+this.getUTCMinutes().toPaddedString(2)+":"+this.getUTCSeconds().toPaddedString(2)+'Z"'};var Try={these:function(){var C;for(var B=0,D=arguments.length;B<D;B++){var A=arguments[B];try{C=A();break}catch(E){}}return C}};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(A){return String(A).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")};var PeriodicalExecuter=Class.create({initialize:function(B,A){this.callback=B;this.frequency=A;this.currentlyExecuting=false;this.registerCallback()},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000)},execute:function(){this.callback(this)},stop:function(){if(!this.timer){return }clearInterval(this.timer);this.timer=null},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.execute()}finally{this.currentlyExecuting=false}}}});Object.extend(String,{interpret:function(A){return A==null?"":String(A)},specialChar:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"}});Object.extend(String.prototype,{gsub:function(E,C){var A="",D=this,B;C=arguments.callee.prepareReplacement(C);while(D.length>0){if(B=D.match(E)){A+=D.slice(0,B.index);A+=String.interpret(C(B));D=D.slice(B.index+B[0].length)}else{A+=D,D=""}}return A},sub:function(C,A,B){A=this.gsub.prepareReplacement(A);B=Object.isUndefined(B)?1:B;return this.gsub(C,function(D){if(--B<0){return D[0]}return A(D)})},scan:function(B,A){this.gsub(B,A);return String(this)},truncate:function(B,A){B=B||30;A=Object.isUndefined(A)?"...":A;return this.length>B?this.slice(0,B-A.length)+A:String(this)},strip:function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,"")},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"")},extractScripts:function(){var B=new RegExp(Prototype.ScriptFragment,"img");var A=new RegExp(Prototype.ScriptFragment,"im");return(this.match(B)||[]).map(function(C){return(C.match(A)||["",""])[1]})},evalScripts:function(){return this.extractScripts().map(function(script){return eval(script)})},escapeHTML:function(){var A=arguments.callee;A.text.data=this;return A.div.innerHTML},unescapeHTML:function(){var A=new Element("div");A.innerHTML=this.stripTags();return A.childNodes[0]?(A.childNodes.length>1?$A(A.childNodes).inject("",function(B,C){return B+C.nodeValue}):A.childNodes[0].nodeValue):""},toQueryParams:function(B){var A=this.strip().match(/([^?#]*)(#.*)?$/);if(!A){return{}}return A[1].split(B||"&").inject({},function(E,F){if((F=F.split("="))[0]){var C=decodeURIComponent(F.shift());var D=F.length>1?F.join("="):F[0];if(D!=undefined){D=decodeURIComponent(D)}if(C in E){if(!Object.isArray(E[C])){E[C]=[E[C]]}E[C].push(D)}else{E[C]=D}}return E})},toArray:function(){return this.split("")},succ:function(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)},times:function(A){return A<1?"":new Array(A+1).join(this)},camelize:function(){var D=this.split("-"),A=D.length;if(A==1){return D[0]}var C=this.charAt(0)=="-"?D[0].charAt(0).toUpperCase()+D[0].substring(1):D[0];for(var B=1;B<A;B++){C+=D[B].charAt(0).toUpperCase()+D[B].substring(1)}return C},capitalize:function(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase()},underscore:function(){return this.gsub(/::/,"/").gsub(/([A-Z]+)([A-Z][a-z])/,"#{1}_#{2}").gsub(/([a-z\d])([A-Z])/,"#{1}_#{2}").gsub(/-/,"_").toLowerCase()},dasherize:function(){return this.gsub(/_/,"-")},inspect:function(B){var A=this.gsub(/[\x00-\x1f\\]/,function(C){var D=String.specialChar[C[0]];return D?D:"\\u00"+C[0].charCodeAt().toPaddedString(2,16)});if(B){return'"'+A.replace(/"/g,'\\"')+'"'}return"'"+A.replace(/'/g,"\\'")+"'"},toJSON:function(){return this.inspect(true)},unfilterJSON:function(A){return this.sub(A||Prototype.JSONFilter,"#{1}")},isJSON:function(){var A=this;if(A.blank()){return false}A=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(A)},evalJSON:function(sanitize){var json=this.unfilterJSON();try{if(!sanitize||json.isJSON()){return eval("("+json+")")}}catch(e){}throw new SyntaxError("Badly formed JSON string: "+this.inspect())},include:function(A){return this.indexOf(A)>-1},startsWith:function(A){return this.indexOf(A)===0},endsWith:function(A){var B=this.length-A.length;return B>=0&&this.lastIndexOf(A)===B},empty:function(){return this==""},blank:function(){return/^\s*$/.test(this)},interpolate:function(A,B){return new Template(this,B).evaluate(A)}});if(Prototype.Browser.WebKit||Prototype.Browser.IE){Object.extend(String.prototype,{escapeHTML:function(){return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},unescapeHTML:function(){return this.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}})}String.prototype.gsub.prepareReplacement=function(B){if(Object.isFunction(B)){return B}var A=new Template(B);return function(C){return A.evaluate(C)}};String.prototype.parseQuery=String.prototype.toQueryParams;Object.extend(String.prototype.escapeHTML,{div:document.createElement("div"),text:document.createTextNode("")});with(String.prototype.escapeHTML){div.appendChild(text)}var Template=Class.create({initialize:function(A,B){this.template=A.toString();this.pattern=B||Template.Pattern},evaluate:function(A){if(Object.isFunction(A.toTemplateReplacements)){A=A.toTemplateReplacements()}return this.template.gsub(this.pattern,function(D){if(A==null){return""}var F=D[1]||"";if(F=="\\"){return D[2]}var B=A,G=D[3];var E=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;D=E.exec(G);if(D==null){return F}while(D!=null){var C=D[1].startsWith("[")?D[2].gsub("\\\\]","]"):D[1];B=B[C];if(null==B||""==D[3]){break}G=G.substring("["==D[3]?D[1].length:D[0].length);D=E.exec(G)}return F+String.interpret(B)})}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable={each:function(C,B){var A=0;C=C.bind(B);try{this._each(function(E){C(E,A++)})}catch(D){if(D!=$break){throw D}}return this},eachSlice:function(D,C,B){C=C?C.bind(B):Prototype.K;var A=-D,E=[],F=this.toArray();while((A+=D)<F.length){E.push(F.slice(A,A+D))}return E.collect(C,B)},all:function(C,B){C=C?C.bind(B):Prototype.K;var A=true;this.each(function(E,D){A=A&&!!C(E,D);if(!A){throw $break}});return A},any:function(C,B){C=C?C.bind(B):Prototype.K;var A=false;this.each(function(E,D){if(A=!!C(E,D)){throw $break}});return A},collect:function(C,B){C=C?C.bind(B):Prototype.K;var A=[];this.each(function(E,D){A.push(C(E,D))});return A},detect:function(C,B){C=C.bind(B);var A;this.each(function(E,D){if(C(E,D)){A=E;throw $break}});return A},findAll:function(C,B){C=C.bind(B);var A=[];this.each(function(E,D){if(C(E,D)){A.push(E)}});return A},grep:function(D,C,B){C=C?C.bind(B):Prototype.K;var A=[];if(Object.isString(D)){D=new RegExp(D)}this.each(function(F,E){if(D.match(F)){A.push(C(F,E))}});return A},include:function(A){if(Object.isFunction(this.indexOf)){if(this.indexOf(A)!=-1){return true}}var B=false;this.each(function(C){if(C==A){B=true;throw $break}});return B},inGroupsOf:function(B,A){A=Object.isUndefined(A)?null:A;return this.eachSlice(B,function(C){while(C.length<B){C.push(A)}return C})},inject:function(A,C,B){C=C.bind(B);this.each(function(E,D){A=C(A,E,D)});return A},invoke:function(B){var A=$A(arguments).slice(1);return this.map(function(C){return C[B].apply(C,A)})},max:function(C,B){C=C?C.bind(B):Prototype.K;var A;this.each(function(E,D){E=C(E,D);if(A==null||E>=A){A=E}});return A},min:function(C,B){C=C?C.bind(B):Prototype.K;var A;this.each(function(E,D){E=C(E,D);if(A==null||E<A){A=E}});return A},partition:function(D,B){D=D?D.bind(B):Prototype.K;var C=[],A=[];this.each(function(F,E){(D(F,E)?C:A).push(F)});return[C,A]},pluck:function(B){var A=[];this.each(function(C){A.push(C[B])});return A},reject:function(C,B){C=C.bind(B);var A=[];this.each(function(E,D){if(!C(E,D)){A.push(E)}});return A},sortBy:function(B,A){B=B.bind(A);return this.map(function(D,C){return{value:D,criteria:B(D,C)}}).sort(function(F,E){var D=F.criteria,C=E.criteria;return D<C?-1:D>C?1:0}).pluck("value")},toArray:function(){return this.map()},zip:function(){var B=Prototype.K,A=$A(arguments);if(Object.isFunction(A.last())){B=A.pop()}var C=[this].concat(A).map($A);return this.map(function(E,D){return B(C.pluck(D))})},size:function(){return this.toArray().length},inspect:function(){return"#<Enumerable:"+this.toArray().inspect()+">"}};Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,filter:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray,every:Enumerable.all,some:Enumerable.any});function $A(C){if(!C){return[]}if(C.toArray){return C.toArray()}var B=C.length||0,A=new Array(B);while(B--){A[B]=C[B]}return A}if(Prototype.Browser.WebKit){$A=function(C){if(!C){return[]}if(!(Object.isFunction(C)&&C=="[object NodeList]")&&C.toArray){return C.toArray()}var B=C.length||0,A=new Array(B);while(B--){A[B]=C[B]}return A}}Array.from=$A;Object.extend(Array.prototype,Enumerable);if(!Array.prototype._reverse){Array.prototype._reverse=Array.prototype.reverse}Object.extend(Array.prototype,{_each:function(B){for(var A=0,C=this.length;A<C;A++){B(this[A])}},clear:function(){this.length=0;return this},first:function(){return this[0]},last:function(){return this[this.length-1]},compact:function(){return this.select(function(A){return A!=null})},flatten:function(){return this.inject([],function(B,A){return B.concat(Object.isArray(A)?A.flatten():[A])})},without:function(){var A=$A(arguments);return this.select(function(B){return !A.include(B)})},reverse:function(A){return(A!==false?this:this.toArray())._reverse()},reduce:function(){return this.length>1?this:this[0]},uniq:function(A){return this.inject([],function(D,C,B){if(0==B||(A?D.last()!=C:!D.include(C))){D.push(C)}return D})},intersect:function(A){return this.uniq().findAll(function(B){return A.detect(function(C){return B===C})})},clone:function(){return[].concat(this)},size:function(){return this.length},inspect:function(){return"["+this.map(Object.inspect).join(", ")+"]"},toJSON:function(){var A=[];this.each(function(B){var C=Object.toJSON(B);if(!Object.isUndefined(C)){A.push(C)}});return"["+A.join(", ")+"]"}});if(Object.isFunction(Array.prototype.forEach)){Array.prototype._each=Array.prototype.forEach}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(C,A){A||(A=0);var B=this.length;if(A<0){A=B+A}for(;A<B;A++){if(this[A]===C){return A}}return -1}}if(!Array.prototype.lastIndexOf){Array.prototype.lastIndexOf=function(B,A){A=isNaN(A)?this.length:(A<0?this.length+A:A)+1;var C=this.slice(0,A).reverse().indexOf(B);return(C<0)?C:A-C-1}}Array.prototype.toArray=Array.prototype.clone;function $w(A){if(!Object.isString(A)){return[]}A=A.strip();return A?A.split(/\s+/):[]}if(Prototype.Browser.Opera){Array.prototype.concat=function(){var E=[];for(var B=0,C=this.length;B<C;B++){E.push(this[B])}for(var B=0,C=arguments.length;B<C;B++){if(Object.isArray(arguments[B])){for(var A=0,D=arguments[B].length;A<D;A++){E.push(arguments[B][A])}}else{E.push(arguments[B])}}return E}}Object.extend(Number.prototype,{toColorPart:function(){return this.toPaddedString(2,16)},succ:function(){return this+1},times:function(A){$R(0,this,true).each(A);return this},toPaddedString:function(C,B){var A=this.toString(B||10);return"0".times(C-A.length)+A},toJSON:function(){return isFinite(this)?this.toString():"null"}});$w("abs round ceil floor").each(function(A){Number.prototype[A]=Math[A].methodize()});function $H(A){return new Hash(A)}var Hash=Class.create(Enumerable,(function(){function A(B,C){if(Object.isUndefined(C)){return B}return B+"="+encodeURIComponent(String.interpret(C))}return{initialize:function(B){this._object=Object.isHash(B)?B.toObject():Object.clone(B)},_each:function(C){for(var B in this._object){var D=this._object[B],E=[B,D];E.key=B;E.value=D;C(E)}},set:function(B,C){return this._object[B]=C},get:function(B){return this._object[B]},unset:function(B){var C=this._object[B];delete this._object[B];return C},toObject:function(){return Object.clone(this._object)},keys:function(){return this.pluck("key")},values:function(){return this.pluck("value")},index:function(C){var B=this.detect(function(D){return D.value===C});return B&&B.key},merge:function(B){return this.clone().update(B)},update:function(B){return new Hash(B).inject(this,function(C,D){C.set(D.key,D.value);return C})},toQueryString:function(){return this.map(function(D){var C=encodeURIComponent(D.key),B=D.value;if(B&&typeof B=="object"){if(Object.isArray(B)){return B.map(A.curry(C)).join("&")}}return A(C,B)}).join("&")},inspect:function(){return"#<Hash:{"+this.map(function(B){return B.map(Object.inspect).join(": ")}).join(", ")+"}>"},toJSON:function(){return Object.toJSON(this.toObject())},clone:function(){return new Hash(this)}}})());Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;Hash.from=$H;var ObjectRange=Class.create(Enumerable,{initialize:function(C,A,B){this.start=C;this.end=A;this.exclusive=B},_each:function(A){var B=this.start;while(this.include(B)){A(B);B=B.succ()}},include:function(A){if(A<this.start){return false}if(this.exclusive){return A<this.end}return A<=this.end}});var $R=function(C,A,B){return new ObjectRange(C,A,B)};var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")})||false},activeRequestCount:0};Ajax.Responders={responders:[],_each:function(A){this.responders._each(A)},register:function(A){if(!this.include(A)){this.responders.push(A)}},unregister:function(A){this.responders=this.responders.without(A)},dispatch:function(D,B,C,A){this.each(function(E){if(Object.isFunction(E[D])){try{E[D].apply(E,[B,C,A])}catch(F){}}})}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++},onComplete:function(){Ajax.activeRequestCount--}});Ajax.Base=Class.create({initialize:function(A){this.options={method:"post",asynchronous:true,contentType:"application/x-www-form-urlencoded",encoding:"UTF-8",parameters:"",evalJSON:true,evalJS:true};Object.extend(this.options,A||{});this.options.method=this.options.method.toLowerCase();if(Object.isString(this.options.parameters)){this.options.parameters=this.options.parameters.toQueryParams()}else{if(Object.isHash(this.options.parameters)){this.options.parameters=this.options.parameters.toObject()}}}});Ajax.Request=Class.create(Ajax.Base,{_complete:false,initialize:function($super,B,A){$super(A);this.transport=Ajax.getTransport();this.request(B)},request:function(B){this.url=B;this.method=this.options.method;var D=Object.clone(this.options.parameters);if(!["get","post"].include(this.method)){D._method=this.method;this.method="post"}this.parameters=D;if(D=Object.toQueryString(D)){if(this.method=="get"){this.url+=(this.url.include("?")?"&":"?")+D}else{if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){D+="&_="}}}try{var A=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(A)}Ajax.Responders.dispatch("onCreate",this,A);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){this.respondToReadyState.bind(this).defer(1)}this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();this.body=this.method=="post"?(this.options.postBody||D):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange()}}catch(C){this.dispatchException(C)}},onStateChange:function(){var A=this.transport.readyState;if(A>1&&!((A==4)&&this._complete)){this.respondToReadyState(this.transport.readyState)}},setRequestHeaders:function(){var E={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,Accept:"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){E["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){E.Connection="close"}}if(typeof this.options.requestHeaders=="object"){var C=this.options.requestHeaders;if(Object.isFunction(C.push)){for(var B=0,D=C.length;B<D;B+=2){E[C[B]]=C[B+1]}}else{$H(C).each(function(F){E[F.key]=F.value})}}for(var A in E){this.transport.setRequestHeader(A,E[A])}},success:function(){var A=this.getStatus();return !A||(A>=200&&A<300)},getStatus:function(){try{return this.transport.status||0}catch(A){return 0}},respondToReadyState:function(A){var C=Ajax.Request.Events[A],B=new Ajax.Response(this);if(C=="Complete"){try{this._complete=true;(this.options["on"+B.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(B,B.headerJSON)}catch(D){this.dispatchException(D)}var E=B.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&E&&E.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+C]||Prototype.emptyFunction)(B,B.headerJSON);Ajax.Responders.dispatch("on"+C,this,B,B.headerJSON)}catch(D){this.dispatchException(D)}if(C=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}},isSameOrigin:function(){var A=this.url.match(/^\s*https?:\/\/[^\/]*/);return !A||(A[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}))},getHeader:function(A){try{return this.transport.getResponseHeader(A)||null}catch(B){return null}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON())}catch(e){this.dispatchException(e)}},dispatchException:function(A){(this.options.onException||Prototype.emptyFunction)(this,A);Ajax.Responders.dispatch("onException",this,A)}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(C){this.request=C;var D=this.transport=C.transport,A=this.readyState=D.readyState;if((A>2&&!Prototype.Browser.IE)||A==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(D.responseText);this.headerJSON=this._getHeaderJSON()}if(A==4){var B=D.responseXML;this.responseXML=Object.isUndefined(B)?null:B;this.responseJSON=this._getResponseJSON()}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||""}catch(A){return""}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders()}catch(A){return null}},getResponseHeader:function(A){return this.transport.getResponseHeader(A)},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders()},_getHeaderJSON:function(){var A=this.getHeader("X-JSON");if(!A){return null}A=decodeURIComponent(escape(A));try{return A.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())}catch(B){this.request.dispatchException(B)}},_getResponseJSON:function(){var A=this.request.options;if(!A.evalJSON||(A.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null}try{return this.responseText.evalJSON(A.sanitizeJSON||!this.request.isSameOrigin())}catch(B){this.request.dispatchException(B)}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,A,C,B){this.container={success:(A.success||A),failure:(A.failure||(A.success?null:A))};B=Object.clone(B);var D=B.onComplete;B.onComplete=(function(E,F){this.updateContent(E.responseText);if(Object.isFunction(D)){D(E,F)}}).bind(this);$super(C,B)},updateContent:function(D){var C=this.container[this.success()?"success":"failure"],A=this.options;if(!A.evalScripts){D=D.stripScripts()}if(C=$(C)){if(A.insertion){if(Object.isString(A.insertion)){var B={};B[A.insertion]=D;C.insert(B)}else{A.insertion(C,D)}}else{C.update(D)}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,A,C,B){$super(B);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=A;this.url=C;this.start()},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent()},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments)},updateComplete:function(A){if(this.options.decay){this.decay=(A.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=A.responseText}this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options)}});function $(B){if(arguments.length>1){for(var A=0,D=[],C=arguments.length;A<C;A++){D.push($(arguments[A]))}return D}if(Object.isString(B)){B=document.getElementById(B)}return Element.extend(B)}if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(F,A){var C=[];var E=document.evaluate(F,$(A)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var B=0,D=E.snapshotLength;B<D;B++){C.push(Element.extend(E.snapshotItem(B)))}return C}}if(!window.Node){var Node={}}if(!Node.ELEMENT_NODE){Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12})}(function(){var A=this.Element;this.Element=function(D,C){C=C||{};D=D.toLowerCase();var B=Element.cache;if(Prototype.Browser.IE&&C.name){D="<"+D+' name="'+C.name+'">';delete C.name;return Element.writeAttribute(document.createElement(D),C)}if(!B[D]){B[D]=Element.extend(document.createElement(D))}return Element.writeAttribute(B[D].cloneNode(false),C)};Object.extend(this.Element,A||{})}).call(window);Element.cache={};Element.Methods={visible:function(A){return $(A).style.display!="none"},toggle:function(A){A=$(A);Element[Element.visible(A)?"hide":"show"](A);return A},hide:function(A){$(A).style.display="none";return A},show:function(A){$(A).style.display="";return A},remove:function(A){A=$(A);A.parentNode.removeChild(A);return A},update:function(A,B){A=$(A);if(B&&B.toElement){B=B.toElement()}if(Object.isElement(B)){return A.update().insert(B)}B=Object.toHTML(B);A.innerHTML=B.stripScripts();B.evalScripts.bind(B).defer();return A},replace:function(B,C){B=$(B);if(C&&C.toElement){C=C.toElement()}else{if(!Object.isElement(C)){C=Object.toHTML(C);var A=B.ownerDocument.createRange();A.selectNode(B);C.evalScripts.bind(C).defer();C=A.createContextualFragment(C.stripScripts())}}B.parentNode.replaceChild(C,B);return B},insert:function(C,E){C=$(C);if(Object.isString(E)||Object.isNumber(E)||Object.isElement(E)||(E&&(E.toElement||E.toHTML))){E={bottom:E}}var D,F,B,G;for(var A in E){D=E[A];A=A.toLowerCase();F=Element._insertionTranslations[A];if(D&&D.toElement){D=D.toElement()}if(Object.isElement(D)){F(C,D);continue}D=Object.toHTML(D);B=((A=="before"||A=="after")?C.parentNode:C).tagName.toUpperCase();G=Element._getContentFromAnonymousElement(B,D.stripScripts());if(A=="top"||A=="after"){G.reverse()}G.each(F.curry(C));D.evalScripts.bind(D).defer()}return C},wrap:function(B,C,A){B=$(B);if(Object.isElement(C)){$(C).writeAttribute(A||{})}else{if(Object.isString(C)){C=new Element(C,A)}else{C=new Element("div",C)}}if(B.parentNode){B.parentNode.replaceChild(C,B)}C.appendChild(B);return C},inspect:function(B){B=$(B);var A="<"+B.tagName.toLowerCase();$H({id:"id",className:"class"}).each(function(F){var E=F.first(),C=F.last();var D=(B[E]||"").toString();if(D){A+=" "+C+"="+D.inspect(true)}});return A+">"},recursivelyCollect:function(A,C){A=$(A);var B=[];while(A=A[C]){if(A.nodeType==1){B.push(Element.extend(A))}}return B},ancestors:function(A){return $(A).recursivelyCollect("parentNode")},descendants:function(A){return $(A).select("*")},firstDescendant:function(A){A=$(A).firstChild;while(A&&A.nodeType!=1){A=A.nextSibling}return $(A)},immediateDescendants:function(A){if(!(A=$(A).firstChild)){return[]}while(A&&A.nodeType!=1){A=A.nextSibling}if(A){return[A].concat($(A).nextSiblings())}return[]},previousSiblings:function(A){return $(A).recursivelyCollect("previousSibling")},nextSiblings:function(A){return $(A).recursivelyCollect("nextSibling")},siblings:function(A){A=$(A);return A.previousSiblings().reverse().concat(A.nextSiblings())},match:function(B,A){if(Object.isString(A)){A=new Selector(A)}return A.match($(B))},up:function(B,D,A){B=$(B);if(arguments.length==1){return $(B.parentNode)}var C=B.ancestors();return Object.isNumber(D)?C[D]:Selector.findElement(C,D,A)},down:function(B,C,A){B=$(B);if(arguments.length==1){return B.firstDescendant()}return Object.isNumber(C)?B.descendants()[C]:B.select(C)[A||0]},previous:function(B,D,A){B=$(B);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(B))}var C=B.previousSiblings();return Object.isNumber(D)?C[D]:Selector.findElement(C,D,A)},next:function(C,D,B){C=$(C);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(C))}var A=C.nextSiblings();return Object.isNumber(D)?A[D]:Selector.findElement(A,D,B)},select:function(){var A=$A(arguments),B=$(A.shift());return Selector.findChildElements(B,A)},adjacent:function(){var A=$A(arguments),B=$(A.shift());return Selector.findChildElements(B.parentNode,A).without(B)},identify:function(B){B=$(B);var C=B.readAttribute("id"),A=arguments.callee;if(C){return C}do{C="anonymous_element_"+A.counter++}while($(C));B.writeAttribute("id",C);return C},readAttribute:function(C,A){C=$(C);if(Prototype.Browser.IE){var B=Element._attributeTranslations.read;if(B.values[A]){return B.values[A](C,A)}if(B.names[A]){A=B.names[A]}if(A.include(":")){return(!C.attributes||!C.attributes[A])?null:C.attributes[A].value}}return C.getAttribute(A)},writeAttribute:function(E,C,F){E=$(E);var B={},D=Element._attributeTranslations.write;if(typeof C=="object"){B=C}else{B[C]=Object.isUndefined(F)?true:F}for(var A in B){C=D.names[A]||A;F=B[A];if(D.values[A]){C=D.values[A](E,F)}if(F===false||F===null){E.removeAttribute(C)}else{if(F===true){E.setAttribute(C,C)}else{E.setAttribute(C,F)}}}return E},getHeight:function(A){return $(A).getDimensions().height},getWidth:function(A){return $(A).getDimensions().width},classNames:function(A){return new Element.ClassNames(A)},hasClassName:function(A,B){if(!(A=$(A))){return }var C=A.className;return(C.length>0&&(C==B||new RegExp("(^|\\s)"+B+"(\\s|$)").test(C)))},addClassName:function(A,B){if(!(A=$(A))){return }if(!A.hasClassName(B)){A.className+=(A.className?" ":"")+B}return A},removeClassName:function(A,B){if(!(A=$(A))){return }A.className=A.className.replace(new RegExp("(^|\\s+)"+B+"(\\s+|$)")," ").strip();return A},toggleClassName:function(A,B){if(!(A=$(A))){return }return A[A.hasClassName(B)?"removeClassName":"addClassName"](B)},cleanWhitespace:function(B){B=$(B);var C=B.firstChild;while(C){var A=C.nextSibling;if(C.nodeType==3&&!/\S/.test(C.nodeValue)){B.removeChild(C)}C=A}return B},empty:function(A){return $(A).innerHTML.blank()},descendantOf:function(D,C){D=$(D),C=$(C);var F=C;if(D.compareDocumentPosition){return(D.compareDocumentPosition(C)&8)===8}if(D.sourceIndex&&!Prototype.Browser.Opera){var E=D.sourceIndex,B=C.sourceIndex,A=C.nextSibling;if(!A){do{C=C.parentNode}while(!(A=C.nextSibling)&&C.parentNode)}if(A&&A.sourceIndex){return(E>B&&E<A.sourceIndex)}}while(D=D.parentNode){if(D==F){return true}}return false},scrollTo:function(A){A=$(A);var B=A.cumulativeOffset();window.scrollTo(B[0],B[1]);return A},getStyle:function(B,C){B=$(B);C=C=="float"?"cssFloat":C.camelize();var D=B.style[C];if(!D){var A=document.defaultView.getComputedStyle(B,null);D=A?A[C]:null}if(C=="opacity"){return D?parseFloat(D):1}return D=="auto"?null:D},getOpacity:function(A){return $(A).getStyle("opacity")},setStyle:function(B,C){B=$(B);var E=B.style,A;if(Object.isString(C)){B.style.cssText+=";"+C;return C.include("opacity")?B.setOpacity(C.match(/opacity:\s*(\d?\.?\d*)/)[1]):B}for(var D in C){if(D=="opacity"){B.setOpacity(C[D])}else{E[(D=="float"||D=="cssFloat")?(Object.isUndefined(E.styleFloat)?"cssFloat":"styleFloat"):D]=C[D]}}return B},setOpacity:function(A,B){A=$(A);A.style.opacity=(B==1||B==="")?"":(B<0.00001)?0:B;return A},getDimensions:function(C){C=$(C);var G=$(C).getStyle("display");if(G!="none"&&G!=null){return{width:C.offsetWidth,height:C.offsetHeight}}var B=C.style;var F=B.visibility;var D=B.position;var A=B.display;B.visibility="hidden";B.position="absolute";B.display="block";var H=C.clientWidth;var E=C.clientHeight;B.display=A;B.position=D;B.visibility=F;return{width:H,height:E}},makePositioned:function(A){A=$(A);var B=Element.getStyle(A,"position");if(B=="static"||!B){A._madePositioned=true;A.style.position="relative";if(window.opera){A.style.top=0;A.style.left=0}}return A},undoPositioned:function(A){A=$(A);if(A._madePositioned){A._madePositioned=undefined;A.style.position=A.style.top=A.style.left=A.style.bottom=A.style.right=""}return A},makeClipping:function(A){A=$(A);if(A._overflow){return A}A._overflow=Element.getStyle(A,"overflow")||"auto";if(A._overflow!=="hidden"){A.style.overflow="hidden"}return A},undoClipping:function(A){A=$(A);if(!A._overflow){return A}A.style.overflow=A._overflow=="auto"?"":A._overflow;A._overflow=null;return A},cumulativeOffset:function(B){var A=0,C=0;do{A+=B.offsetTop||0;C+=B.offsetLeft||0;B=B.offsetParent}while(B);return Element._returnOffset(C,A)},positionedOffset:function(B){var A=0,D=0;do{A+=B.offsetTop||0;D+=B.offsetLeft||0;B=B.offsetParent;if(B){if(B.tagName=="BODY"){break}var C=Element.getStyle(B,"position");if(C!=="static"){break}}}while(B);return Element._returnOffset(D,A)},absolutize:function(B){B=$(B);if(B.getStyle("position")=="absolute"){return }var D=B.positionedOffset();var F=D[1];var E=D[0];var C=B.clientWidth;var A=B.clientHeight;B._originalLeft=E-parseFloat(B.style.left||0);B._originalTop=F-parseFloat(B.style.top||0);B._originalWidth=B.style.width;B._originalHeight=B.style.height;B.style.position="absolute";B.style.top=F+"px";B.style.left=E+"px";B.style.width=C+"px";B.style.height=A+"px";return B},relativize:function(A){A=$(A);if(A.getStyle("position")=="relative"){return }A.style.position="relative";var C=parseFloat(A.style.top||0)-(A._originalTop||0);var B=parseFloat(A.style.left||0)-(A._originalLeft||0);A.style.top=C+"px";A.style.left=B+"px";A.style.height=A._originalHeight;A.style.width=A._originalWidth;return A},cumulativeScrollOffset:function(B){var A=0,C=0;do{A+=B.scrollTop||0;C+=B.scrollLeft||0;B=B.parentNode}while(B);return Element._returnOffset(C,A)},getOffsetParent:function(B){B=$(B);var D=B.offsetParent,A=document.body,C=document.documentElement;if(D&&D!==C){return $(D)}if(D===C||B===C||B===A){return $(A)}while((B=B.parentNode)&&B!==A){if(Element.getStyle(B,"position")!="static"){return $(B)}}return $(A)},viewportOffset:function(D){D=$(D);var B=D,A=0,C=0;do{A+=B.offsetTop||0;C+=B.offsetLeft||0}while((B=B.getOffsetParent())!=document.body);B=D;do{if(!Prototype.Browser.Opera||B.tagName=="BODY"){A-=B.scrollTop||0;C-=B.scrollLeft||0}}while(B=B.parentNode);return Element._returnOffset(C,A)},clonePosition:function(B,D){var A=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});D=$(D);var E=D.viewportOffset();B=$(B);var F=[0,0];var C=null;if(Element.getStyle(B,"position")=="absolute"){C=B.getOffsetParent();F=C.viewportOffset()}if(C==document.body){F[0]-=document.body.offsetLeft;F[1]-=document.body.offsetTop}if(A.setLeft){B.style.left=(E[0]-F[0]+A.offsetLeft)+"px"}if(A.setTop){B.style.top=(E[1]-F[1]+A.offsetTop)+"px"}if(A.setWidth){B.style.width=D.offsetWidth+"px"}if(A.setHeight){B.style.height=D.offsetHeight+"px"}return B}};Element.Methods.identify.counter=1;Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants});Element._attributeTranslations={write:{names:{className:"class",htmlFor:"for"},values:{}}};if(Prototype.Browser.Opera){Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(D,B,C){switch(C){case"left":case"top":case"right":case"bottom":if(D(B,"position")==="static"){return null}case"height":case"width":if(!Element.visible(B)){return null}var E=parseInt(D(B,C),10);if(E!==B["offset"+C.capitalize()]){return E+"px"}var A;if(C==="height"){A=["border-top-width","padding-top","padding-bottom","border-bottom-width"]}else{A=["border-left-width","padding-left","padding-right","border-right-width"]}return A.inject(E,function(F,G){var H=D(B,G);return H===null?F:F-parseInt(H,10)})+"px";default:return D(B,C)}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(C,A,B){if(B==="title"){return A.title}return C(A,B)})}else{if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(C,B){B=$(B);var A=B.getStyle("position");if(A!=="static"){return C(B)}B.setStyle({position:"relative"});var D=C(B);B.setStyle({position:A});return D});$w("positionedOffset viewportOffset").each(function(A){Element.Methods[A]=Element.Methods[A].wrap(function(E,C){C=$(C);var B=C.getStyle("position");if(B!=="static"){return E(C)}var D=C.getOffsetParent();if(D&&D.getStyle("position")==="fixed"){D.setStyle({zoom:1})}C.setStyle({position:"relative"});var F=E(C);C.setStyle({position:B});return F})});Element.Methods.getStyle=function(A,B){A=$(A);B=(B=="float"||B=="cssFloat")?"styleFloat":B.camelize();var C=A.style[B];if(!C&&A.currentStyle){C=A.currentStyle[B]}if(B=="opacity"){if(C=(A.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){if(C[1]){return parseFloat(C[1])/100}}return 1}if(C=="auto"){if((B=="width"||B=="height")&&(A.getStyle("display")!="none")){return A["offset"+B.capitalize()]+"px"}return null}return C};Element.Methods.setOpacity=function(B,E){function F(G){return G.replace(/alpha\([^\)]*\)/gi,"")}B=$(B);var A=B.currentStyle;if((A&&!A.hasLayout)||(!A&&B.style.zoom=="normal")){B.style.zoom=1}var D=B.getStyle("filter"),C=B.style;if(E==1||E===""){(D=F(D))?C.filter=D:C.removeAttribute("filter");return B}else{if(E<0.00001){E=0}}C.filter=F(D)+"alpha(opacity="+(E*100)+")";return B};Element._attributeTranslations={read:{names:{"class":"className","for":"htmlFor"},values:{_getAttr:function(A,B){return A.getAttribute(B,2)},_getAttrNode:function(A,C){var B=A.getAttributeNode(C);return B?B.value:""},_getEv:function(A,B){B=A.getAttribute(B);return B?B.toString().slice(23,-2):null},_flag:function(A,B){return $(A).hasAttribute(B)?B:null},style:function(A){return A.style.cssText.toLowerCase()},title:function(A){return A.title}}}};Element._attributeTranslations.write={names:Object.extend({cellpadding:"cellPadding",cellspacing:"cellSpacing"},Element._attributeTranslations.read.names),values:{checked:function(A,B){A.checked=!!B},style:function(A,B){A.style.cssText=B?B:""}}};Element._attributeTranslations.has={};$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc").each(function(A){Element._attributeTranslations.write.names[A.toLowerCase()]=A;Element._attributeTranslations.has[A.toLowerCase()]=A});(function(A){Object.extend(A,{href:A._getAttr,src:A._getAttr,type:A._getAttr,action:A._getAttrNode,disabled:A._flag,checked:A._flag,readonly:A._flag,multiple:A._flag,onload:A._getEv,onunload:A._getEv,onclick:A._getEv,ondblclick:A._getEv,onmousedown:A._getEv,onmouseup:A._getEv,onmouseover:A._getEv,onmousemove:A._getEv,onmouseout:A._getEv,onfocus:A._getEv,onblur:A._getEv,onkeypress:A._getEv,onkeydown:A._getEv,onkeyup:A._getEv,onsubmit:A._getEv,onreset:A._getEv,onselect:A._getEv,onchange:A._getEv})})(Element._attributeTranslations.read.values)}else{if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(A,B){A=$(A);A.style.opacity=(B==1)?0.999999:(B==="")?"":(B<0.00001)?0:B;return A}}else{if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(A,B){A=$(A);A.style.opacity=(B==1||B==="")?"":(B<0.00001)?0:B;if(B==1){if(A.tagName=="IMG"&&A.width){A.width++;A.width--}else{try{var D=document.createTextNode(" ");A.appendChild(D);A.removeChild(D)}catch(C){}}}return A};Element.Methods.cumulativeOffset=function(B){var A=0,C=0;do{A+=B.offsetTop||0;C+=B.offsetLeft||0;if(B.offsetParent==document.body){if(Element.getStyle(B,"position")=="absolute"){break}}B=B.offsetParent}while(B);return Element._returnOffset(C,A)}}}}}if(Prototype.Browser.IE||Prototype.Browser.Opera){Element.Methods.update=function(B,C){B=$(B);if(C&&C.toElement){C=C.toElement()}if(Object.isElement(C)){return B.update().insert(C)}C=Object.toHTML(C);var A=B.tagName.toUpperCase();if(A in Element._insertionTranslations.tags){$A(B.childNodes).each(function(D){B.removeChild(D)});Element._getContentFromAnonymousElement(A,C.stripScripts()).each(function(D){B.appendChild(D)})}else{B.innerHTML=C.stripScripts()}C.evalScripts.bind(C).defer();return B}}if("outerHTML" in document.createElement("div")){Element.Methods.replace=function(C,E){C=$(C);if(E&&E.toElement){E=E.toElement()}if(Object.isElement(E)){C.parentNode.replaceChild(E,C);return C}E=Object.toHTML(E);var D=C.parentNode,B=D.tagName.toUpperCase();if(Element._insertionTranslations.tags[B]){var F=C.next();var A=Element._getContentFromAnonymousElement(B,E.stripScripts());D.removeChild(C);if(F){A.each(function(G){D.insertBefore(G,F)})}else{A.each(function(G){D.appendChild(G)})}}else{C.outerHTML=E.stripScripts()}E.evalScripts.bind(E).defer();return C}}Element._returnOffset=function(B,C){var A=[B,C];A.left=B;A.top=C;return A};Element._getContentFromAnonymousElement=function(C,B){var D=new Element("div"),A=Element._insertionTranslations.tags[C];if(A){D.innerHTML=A[0]+B+A[1];A[2].times(function(){D=D.firstChild})}else{D.innerHTML=B}return $A(D.childNodes)};Element._insertionTranslations={before:function(A,B){A.parentNode.insertBefore(B,A)},top:function(A,B){A.insertBefore(B,A.firstChild)},bottom:function(A,B){A.appendChild(B)},after:function(A,B){A.parentNode.insertBefore(B,A.nextSibling)},tags:{TABLE:["<table>","</table>",1],TBODY:["<table><tbody>","</tbody></table>",2],TR:["<table><tbody><tr>","</tr></tbody></table>",3],TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],SELECT:["<select>","</select>",1]}};(function(){Object.extend(this.tags,{THEAD:this.tags.TBODY,TFOOT:this.tags.TBODY,TH:this.tags.TD})}).call(Element._insertionTranslations);Element.Methods.Simulated={hasAttribute:function(A,C){C=Element._attributeTranslations.has[C]||C;var B=$(A).getAttributeNode(C);return B&&B.specified}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement("div").__proto__){window.HTMLElement={};window.HTMLElement.prototype=document.createElement("div").__proto__;Prototype.BrowserFeatures.ElementExtensions=true}Element.extend=(function(){if(Prototype.BrowserFeatures.SpecificElementExtensions){return Prototype.K}var A={},B=Element.Methods.ByTag;var C=Object.extend(function(F){if(!F||F._extendedByPrototype||F.nodeType!=1||F==window){return F}var D=Object.clone(A),E=F.tagName,H,G;if(B[E]){Object.extend(D,B[E])}for(H in D){G=D[H];if(Object.isFunction(G)&&!(H in F)){F[H]=G.methodize()}}F._extendedByPrototype=Prototype.emptyFunction;return F},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(A,Element.Methods);Object.extend(A,Element.Methods.Simulated)}}});C.refresh();return C})();Element.hasAttribute=function(A,B){if(A.hasAttribute){return A.hasAttribute(B)}return Element.Methods.Simulated.hasAttribute(A,B)};Element.addMethods=function(C){var I=Prototype.BrowserFeatures,D=Element.Methods.ByTag;if(!C){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{FORM:Object.clone(Form.Methods),INPUT:Object.clone(Form.Element.Methods),SELECT:Object.clone(Form.Element.Methods),TEXTAREA:Object.clone(Form.Element.Methods)})}if(arguments.length==2){var B=C;C=arguments[1]}if(!B){Object.extend(Element.Methods,C||{})}else{if(Object.isArray(B)){B.each(H)}else{H(B)}}function H(F){F=F.toUpperCase();if(!Element.Methods.ByTag[F]){Element.Methods.ByTag[F]={}}Object.extend(Element.Methods.ByTag[F],C)}function A(L,K,F){F=F||false;for(var N in L){var M=L[N];if(!Object.isFunction(M)){continue}if(!F||!(N in K)){K[N]=M.methodize()}}}function E(L){var F;var K={OPTGROUP:"OptGroup",TEXTAREA:"TextArea",P:"Paragraph",FIELDSET:"FieldSet",UL:"UList",OL:"OList",DL:"DList",DIR:"Directory",H1:"Heading",H2:"Heading",H3:"Heading",H4:"Heading",H5:"Heading",H6:"Heading",Q:"Quote",INS:"Mod",DEL:"Mod",A:"Anchor",IMG:"Image",CAPTION:"TableCaption",COL:"TableCol",COLGROUP:"TableCol",THEAD:"TableSection",TFOOT:"TableSection",TBODY:"TableSection",TR:"TableRow",TH:"TableCell",TD:"TableCell",FRAMESET:"FrameSet",IFRAME:"IFrame"};if(K[L]){F="HTML"+K[L]+"Element"}if(window[F]){return window[F]}F="HTML"+L+"Element";if(window[F]){return window[F]}F="HTML"+L.capitalize()+"Element";if(window[F]){return window[F]}window[F]={};window[F].prototype=document.createElement(L).__proto__;return window[F]}if(I.ElementExtensions){A(Element.Methods,HTMLElement.prototype);A(Element.Methods.Simulated,HTMLElement.prototype,true)}if(I.SpecificElementExtensions){for(var J in Element.Methods.ByTag){var G=E(J);if(Object.isUndefined(G)){continue}A(D[J],G.prototype)}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh()}Element.cache={}};document.viewport={getDimensions:function(){var A={};var C=Prototype.Browser;$w("width height").each(function(E){var B=E.capitalize();A[E]=(C.WebKit&&!document.evaluate)?self["inner"+B]:(C.Opera)?document.body["client"+B]:document.documentElement["client"+B]});return A},getWidth:function(){return this.getDimensions().width},getHeight:function(){return this.getDimensions().height},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)}};var Selector=Class.create({initialize:function(A){this.expression=A.strip();this.compileMatcher()},shouldUseXPath:function(){if(!Prototype.BrowserFeatures.XPath){return false}var A=this.expression;if(Prototype.Browser.WebKit&&(A.include("-of-type")||A.include(":empty"))){return false}if((/(\[[\w-]*?:|:checked)/).test(this.expression)){return false}return true},compileMatcher:function(){if(this.shouldUseXPath()){return this.compileXPathMatcher()}var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m;if(Selector._cache[e]){this.matcher=Selector._cache[e];return }this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in ps){p=ps[i];if(m=e.match(p)){this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m));e=e.replace(m[0],"");break}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher},compileXPathMatcher:function(){var E=this.expression,F=Selector.patterns,B=Selector.xpath,D,A;if(Selector._cache[E]){this.xpath=Selector._cache[E];return }this.matcher=[".//*"];while(E&&D!=E&&(/\S/).test(E)){D=E;for(var C in F){if(A=E.match(F[C])){this.matcher.push(Object.isFunction(B[C])?B[C](A):new Template(B[C]).evaluate(A));E=E.replace(A[0],"");break}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath},findElements:function(A){A=A||document;if(this.xpath){return document._getElementsByXPath(this.xpath,A)}return this.matcher(A)},match:function(H){this.tokens=[];var L=this.expression,A=Selector.patterns,E=Selector.assertions;var B,D,F;while(L&&B!==L&&(/\S/).test(L)){B=L;for(var I in A){D=A[I];if(F=L.match(D)){if(E[I]){this.tokens.push([I,Object.clone(F)]);L=L.replace(F[0],"")}else{return this.findElements(document).include(H)}}}}var K=true,C,J;for(var I=0,G;G=this.tokens[I];I++){C=G[0],J=G[1];if(!Selector.assertions[C](H,J)){K=false;break}}return K},toString:function(){return this.expression},inspect:function(){return"#<Selector:"+this.expression.inspect()+">"}});Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(A){if(A[1]=="*"){return""}return"[local-name()='"+A[1].toLowerCase()+"' or local-name()='"+A[1].toUpperCase()+"']"},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(A){A[1]=A[1].toLowerCase();return new Template("[@#{1}]").evaluate(A)},attr:function(A){A[1]=A[1].toLowerCase();A[3]=A[5]||A[6];return new Template(Selector.xpath.operators[A[2]]).evaluate(A)},pseudo:function(A){var B=Selector.xpath.pseudos[A[1]];if(!B){return""}if(Object.isFunction(B)){return B(A)}return new Template(Selector.xpath.pseudos[A[1]]).evaluate(A)},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]",empty:"[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",checked:"[@checked]",disabled:"[@disabled]",enabled:"[not(@disabled)]",not:function(B){var H=B[6],G=Selector.patterns,A=Selector.xpath,E,C;var F=[];while(H&&E!=H&&(/\S/).test(H)){E=H;for(var D in G){if(B=H.match(G[D])){C=Object.isFunction(A[D])?A[D](B):new Template(A[D]).evaluate(B);F.push("("+C.substring(1,C.length-1)+")");H=H.replace(B[0],"");break}}}return"[not("+F.join(" and ")+")]"},"nth-child":function(A){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",A)},"nth-last-child":function(A){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",A)},"nth-of-type":function(A){return Selector.xpath.pseudos.nth("position() ",A)},"nth-last-of-type":function(A){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",A)},"first-of-type":function(A){A[6]="1";return Selector.xpath.pseudos["nth-of-type"](A)},"last-of-type":function(A){A[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](A)},"only-of-type":function(A){var B=Selector.xpath.pseudos;return B["first-of-type"](A)+B["last-of-type"](A)},nth:function(E,C){var F,G=C[6],B;if(G=="even"){G="2n+0"}if(G=="odd"){G="2n+1"}if(F=G.match(/^(\d+)$/)){return"["+E+"= "+F[1]+"]"}if(F=G.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(F[1]=="-"){F[1]=-1}var D=F[1]?Number(F[1]):1;var A=F[2]?Number(F[2]):0;B="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(B).evaluate({fragment:E,a:D,b:A})}}}},criteria:{tagName:'n = h.tagName(n, r, "#{1}", c);      c = false;',className:'n = h.className(n, r, "#{1}", c);    c = false;',id:'n = h.id(n, r, "#{1}", c);           c = false;',attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',attr:function(A){A[3]=(A[5]||A[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(A)},pseudo:function(A){if(A[6]){A[6]=A[6].replace(/"/g,'\\"')}return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(A)},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:{laterSibling:/^\s*~\s*/,child:/^\s*>\s*/,adjacent:/^\s*\+\s*/,descendant:/^\s/,tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,id:/^#([\w\-\*]+)(\b|$)/,className:/^\.([\w\-\*]+)(\b|$)/,pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,attrPresence:/^\[([\w]+)\]/,attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/},assertions:{tagName:function(A,B){return B[1].toUpperCase()==A.tagName.toUpperCase()},className:function(A,B){return Element.hasClassName(A,B[1])},id:function(A,B){return A.id===B[1]},attrPresence:function(A,B){return Element.hasAttribute(A,B[1])},attr:function(B,C){var A=Element.readAttribute(B,C[1]);return A&&Selector.operators[C[2]](A,C[5]||C[6])}},handlers:{concat:function(B,A){for(var C=0,D;D=A[C];C++){B.push(D)}return B},mark:function(A){var D=Prototype.emptyFunction;for(var B=0,C;C=A[B];B++){C._countedByPrototype=D}return A},unmark:function(A){for(var B=0,C;C=A[B];B++){C._countedByPrototype=undefined}return A},index:function(A,D,G){A._countedByPrototype=Prototype.emptyFunction;if(D){for(var B=A.childNodes,E=B.length-1,C=1;E>=0;E--){var F=B[E];if(F.nodeType==1&&(!G||F._countedByPrototype)){F.nodeIndex=C++}}}else{for(var E=0,C=1,B=A.childNodes;F=B[E];E++){if(F.nodeType==1&&(!G||F._countedByPrototype)){F.nodeIndex=C++}}}},unique:function(B){if(B.length==0){return B}var D=[],E;for(var C=0,A=B.length;C<A;C++){if(!(E=B[C])._countedByPrototype){E._countedByPrototype=Prototype.emptyFunction;D.push(Element.extend(E))}}return Selector.handlers.unmark(D)},descendant:function(A){var D=Selector.handlers;for(var C=0,B=[],E;E=A[C];C++){D.concat(B,E.getElementsByTagName("*"))}return B},child:function(A){var E=Selector.handlers;for(var D=0,C=[],F;F=A[D];D++){for(var B=0,G;G=F.childNodes[B];B++){if(G.nodeType==1&&G.tagName!="!"){C.push(G)}}}return C},adjacent:function(A){for(var C=0,B=[],E;E=A[C];C++){var D=this.nextElementSibling(E);if(D){B.push(D)}}return B},laterSibling:function(A){var D=Selector.handlers;for(var C=0,B=[],E;E=A[C];C++){D.concat(B,Element.nextSiblings(E))}return B},nextElementSibling:function(A){while(A=A.nextSibling){if(A.nodeType==1){return A}}return null},previousElementSibling:function(A){while(A=A.previousSibling){if(A.nodeType==1){return A}}return null},tagName:function(A,H,C,B){var I=C.toUpperCase();var E=[],G=Selector.handlers;if(A){if(B){if(B=="descendant"){for(var F=0,D;D=A[F];F++){G.concat(E,D.getElementsByTagName(C))}return E}else{A=this[B](A)}if(C=="*"){return A}}for(var F=0,D;D=A[F];F++){if(D.tagName.toUpperCase()===I){E.push(D)}}return E}else{return H.getElementsByTagName(C)}},id:function(B,A,H,F){var G=$(H),D=Selector.handlers;if(!G){return[]}if(!B&&A==document){return[G]}if(B){if(F){if(F=="child"){for(var C=0,E;E=B[C];C++){if(G.parentNode==E){return[G]}}}else{if(F=="descendant"){for(var C=0,E;E=B[C];C++){if(Element.descendantOf(G,E)){return[G]}}}else{if(F=="adjacent"){for(var C=0,E;E=B[C];C++){if(Selector.handlers.previousElementSibling(G)==E){return[G]}}}else{B=D[F](B)}}}}for(var C=0,E;E=B[C];C++){if(E==G){return[G]}}return[]}return(G&&Element.descendantOf(G,A))?[G]:[]},className:function(B,A,C,D){if(B&&D){B=this[D](B)}return Selector.handlers.byClassName(B,A,C)},byClassName:function(C,B,F){if(!C){C=Selector.handlers.descendant([B])}var H=" "+F+" ";for(var E=0,D=[],G,A;G=C[E];E++){A=G.className;if(A.length==0){continue}if(A==F||(" "+A+" ").include(H)){D.push(G)}}return D},attrPresence:function(C,B,A,G){if(!C){C=B.getElementsByTagName("*")}if(C&&G){C=this[G](C)}var E=[];for(var D=0,F;F=C[D];D++){if(Element.hasAttribute(F,A)){E.push(F)}}return E},attr:function(A,I,H,J,C,B){if(!A){A=I.getElementsByTagName("*")}if(A&&B){A=this[B](A)}var K=Selector.operators[C],F=[];for(var E=0,D;D=A[E];E++){var G=Element.readAttribute(D,H);if(G===null){continue}if(K(G,J)){F.push(D)}}return F},pseudo:function(B,C,E,A,D){if(B&&D){B=this[D](B)}if(!B){B=A.getElementsByTagName("*")}return Selector.pseudos[C](B,E,A)}},pseudos:{"first-child":function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(Selector.handlers.previousElementSibling(E)){continue}C.push(E)}return C},"last-child":function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(Selector.handlers.nextElementSibling(E)){continue}C.push(E)}return C},"only-child":function(B,G,A){var E=Selector.handlers;for(var D=0,C=[],F;F=B[D];D++){if(!E.previousElementSibling(F)&&!E.nextElementSibling(F)){C.push(F)}}return C},"nth-child":function(B,C,A){return Selector.pseudos.nth(B,C,A)},"nth-last-child":function(B,C,A){return Selector.pseudos.nth(B,C,A,true)},"nth-of-type":function(B,C,A){return Selector.pseudos.nth(B,C,A,false,true)},"nth-last-of-type":function(B,C,A){return Selector.pseudos.nth(B,C,A,true,true)},"first-of-type":function(B,C,A){return Selector.pseudos.nth(B,"1",A,false,true)},"last-of-type":function(B,C,A){return Selector.pseudos.nth(B,"1",A,true,true)},"only-of-type":function(B,D,A){var C=Selector.pseudos;return C["last-of-type"](C["first-of-type"](B,D,A),D,A)},getIndices:function(B,A,C){if(B==0){return A>0?[A]:[]}return $R(1,C).inject([],function(D,E){if(0==(E-A)%B&&(E-A)/B>=0){D.push(E)}return D})},nth:function(A,L,N,K,C){if(A.length==0){return[]}if(L=="even"){L="2n+0"}if(L=="odd"){L="2n+1"}var J=Selector.handlers,I=[],B=[],E;J.mark(A);for(var H=0,D;D=A[H];H++){if(!D.parentNode._countedByPrototype){J.index(D.parentNode,K,C);B.push(D.parentNode)}}if(L.match(/^\d+$/)){L=Number(L);for(var H=0,D;D=A[H];H++){if(D.nodeIndex==L){I.push(D)}}}else{if(E=L.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(E[1]=="-"){E[1]=-1}var O=E[1]?Number(E[1]):1;var M=E[2]?Number(E[2]):0;var P=Selector.pseudos.getIndices(O,M,A.length);for(var H=0,D,F=P.length;D=A[H];H++){for(var G=0;G<F;G++){if(D.nodeIndex==P[G]){I.push(D)}}}}}J.unmark(A);J.unmark(B);return I},empty:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(E.tagName=="!"||(E.firstChild&&!E.innerHTML.match(/^\s*$/))){continue}C.push(E)}return C},not:function(A,D,I){var G=Selector.handlers,J,C;var H=new Selector(D).findElements(I);G.mark(H);for(var F=0,E=[],B;B=A[F];F++){if(!B._countedByPrototype){E.push(B)}}G.unmark(H);return E},enabled:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(!E.disabled){C.push(E)}}return C},disabled:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(E.disabled){C.push(E)}}return C},checked:function(B,F,A){for(var D=0,C=[],E;E=B[D];D++){if(E.checked){C.push(E)}}return C}},operators:{"=":function(B,A){return B==A},"!=":function(B,A){return B!=A},"^=":function(B,A){return B.startsWith(A)},"$=":function(B,A){return B.endsWith(A)},"*=":function(B,A){return B.include(A)},"~=":function(B,A){return(" "+B+" ").include(" "+A+" ")},"|=":function(B,A){return("-"+B.toUpperCase()+"-").include("-"+A.toUpperCase()+"-")}},split:function(B){var A=[];B.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(C){A.push(C[1].strip())});return A},matchElements:function(F,G){var E=$$(G),D=Selector.handlers;D.mark(E);for(var C=0,B=[],A;A=F[C];C++){if(A._countedByPrototype){B.push(A)}}D.unmark(E);return B},findElement:function(B,C,A){if(Object.isNumber(C)){A=C;C=false}return Selector.matchElements(B,C||"*")[A||0]},findChildElements:function(E,G){G=Selector.split(G.join(","));var D=[],F=Selector.handlers;for(var C=0,B=G.length,A;C<B;C++){A=new Selector(G[C].strip());F.concat(D,A.findElements(E))}return(B>1)?F.unique(D):D}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(B,A){for(var C=0,D;D=A[C];C++){if(D.tagName!=="!"){B.push(D)}}return B},unmark:function(A){for(var B=0,C;C=A[B];B++){C.removeAttribute("_countedByPrototype")}return A}})}function $$(){return Selector.findChildElements(document,$A(arguments))}var Form={reset:function(A){$(A).reset();return A},serializeElements:function(G,B){if(typeof B!="object"){B={hash:!!B}}else{if(Object.isUndefined(B.hash)){B.hash=true}}var C,F,A=false,E=B.submit;var D=G.inject({},function(H,I){if(!I.disabled&&I.name){C=I.name;F=$(I).getValue();if(F!=null&&(I.type!="submit"||(!A&&E!==false&&(!E||C==E)&&(A=true)))){if(C in H){if(!Object.isArray(H[C])){H[C]=[H[C]]}H[C].push(F)}else{H[C]=F}}}return H});return B.hash?D:Object.toQueryString(D)}};Form.Methods={serialize:function(B,A){return Form.serializeElements(Form.getElements(B),A)},getElements:function(A){return $A($(A).getElementsByTagName("*")).inject([],function(B,C){if(Form.Element.Serializers[C.tagName.toLowerCase()]){B.push(Element.extend(C))}return B})},getInputs:function(G,C,D){G=$(G);var A=G.getElementsByTagName("input");if(!C&&!D){return $A(A).map(Element.extend)}for(var E=0,H=[],F=A.length;E<F;E++){var B=A[E];if((C&&B.type!=C)||(D&&B.name!=D)){continue}H.push(Element.extend(B))}return H},disable:function(A){A=$(A);Form.getElements(A).invoke("disable");return A},enable:function(A){A=$(A);Form.getElements(A).invoke("enable");return A},findFirstElement:function(B){var C=$(B).getElements().findAll(function(D){return"hidden"!=D.type&&!D.disabled});var A=C.findAll(function(D){return D.hasAttribute("tabIndex")&&D.tabIndex>=0}).sortBy(function(D){return D.tabIndex}).first();return A?A:C.find(function(D){return["input","select","textarea"].include(D.tagName.toLowerCase())})},focusFirstElement:function(A){A=$(A);A.findFirstElement().activate();return A},request:function(B,A){B=$(B),A=Object.clone(A||{});var D=A.parameters,C=B.readAttribute("action")||"";if(C.blank()){C=window.location.href}A.parameters=B.serialize(true);if(D){if(Object.isString(D)){D=D.toQueryParams()}Object.extend(A.parameters,D)}if(B.hasAttribute("method")&&!A.method){A.method=B.method}return new Ajax.Request(C,A)}};Form.Element={focus:function(A){$(A).focus();return A},select:function(A){$(A).select();return A}};Form.Element.Methods={serialize:function(A){A=$(A);if(!A.disabled&&A.name){var B=A.getValue();if(B!=undefined){var C={};C[A.name]=B;return Object.toQueryString(C)}}return""},getValue:function(A){A=$(A);var B=A.tagName.toLowerCase();return Form.Element.Serializers[B](A)},setValue:function(A,B){A=$(A);var C=A.tagName.toLowerCase();Form.Element.Serializers[C](A,B);return A},clear:function(A){$(A).value="";return A},present:function(A){return $(A).value!=""},activate:function(A){A=$(A);try{A.focus();if(A.select&&(A.tagName.toLowerCase()!="input"||!["button","reset","submit"].include(A.type))){A.select()}}catch(B){}return A},disable:function(A){A=$(A);A.blur();A.disabled=true;return A},enable:function(A){A=$(A);A.disabled=false;return A}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(A,B){switch(A.type.toLowerCase()){case"checkbox":case"radio":return Form.Element.Serializers.inputSelector(A,B);default:return Form.Element.Serializers.textarea(A,B)}},inputSelector:function(A,B){if(Object.isUndefined(B)){return A.checked?A.value:null}else{A.checked=!!B}},textarea:function(A,B){if(Object.isUndefined(B)){return A.value}else{A.value=B}},select:function(D,A){if(Object.isUndefined(A)){return this[D.type=="select-one"?"selectOne":"selectMany"](D)}else{var C,F,G=!Object.isArray(A);for(var B=0,E=D.length;B<E;B++){C=D.options[B];F=this.optionValue(C);if(G){if(F==A){C.selected=true;return }}else{C.selected=A.include(F)}}}},selectOne:function(B){var A=B.selectedIndex;return A>=0?this.optionValue(B.options[A]):null},selectMany:function(D){var A,E=D.length;if(!E){return null}for(var C=0,A=[];C<E;C++){var B=D.options[C];if(B.selected){A.push(this.optionValue(B))}}return A},optionValue:function(A){return Element.extend(A).hasAttribute("value")?A.value:A.text}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,A,B,C){$super(C,B);this.element=$(A);this.lastValue=this.getValue()},execute:function(){var A=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(A)?this.lastValue!=A:String(this.lastValue)!=String(A)){this.callback(this.element,A);this.lastValue=A}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}});Abstract.EventObserver=Class.create({initialize:function(A,B){this.element=$(A);this.callback=B;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks()}else{this.registerCallback(this.element)}},onElementEvent:function(){var A=this.getValue();if(this.lastValue!=A){this.callback(this.element,A);this.lastValue=A}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(A){if(A.type){switch(A.type.toLowerCase()){case"checkbox":case"radio":Event.observe(A,"click",this.onElementEvent.bind(this));break;default:Event.observe(A,"change",this.onElementEvent.bind(this));break}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}});if(!window.Event){var Event={}}Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{},relatedTarget:function(B){var A;switch(B.type){case"mouseover":A=B.fromElement;break;case"mouseout":A=B.toElement;break;default:return null}return Element.extend(A)}});Event.Methods=(function(){var A;if(Prototype.Browser.IE){var B={0:1,1:4,2:2};A=function(D,C){return D.button==B[C]}}else{if(Prototype.Browser.WebKit){A=function(D,C){switch(C){case 0:return D.which==1&&!D.metaKey;case 1:return D.which==1&&D.metaKey;default:return false}}}else{A=function(D,C){return D.which?(D.which===C+1):(D.button===C)}}}return{isLeftClick:function(C){return A(C,0)},isMiddleClick:function(C){return A(C,1)},isRightClick:function(C){return A(C,2)},element:function(D){var C=Event.extend(D).target;return Element.extend(C.nodeType==Node.TEXT_NODE?C.parentNode:C)},findElement:function(D,F){var C=Event.element(D);if(!F){return C}var E=[C].concat(C.ancestors());return Selector.findElement(E,F,0)},pointer:function(C){return{x:C.pageX||(C.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)),y:C.pageY||(C.clientY+(document.documentElement.scrollTop||document.body.scrollTop))}},pointerX:function(C){return Event.pointer(C).x},pointerY:function(C){return Event.pointer(C).y},stop:function(C){Event.extend(C);C.preventDefault();C.stopPropagation();C.stopped=true}}})();Event.extend=(function(){var A=Object.keys(Event.Methods).inject({},function(B,C){B[C]=Event.Methods[C].methodize();return B});if(Prototype.Browser.IE){Object.extend(A,{stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}});return function(B){if(!B){return false}if(B._extendedByPrototype){return B}B._extendedByPrototype=Prototype.emptyFunction;var C=Event.pointer(B);Object.extend(B,{target:B.srcElement,relatedTarget:Event.relatedTarget(B),pageX:C.x,pageY:C.y});return Object.extend(B,A)}}else{Event.prototype=Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(Event.prototype,A);return Prototype.K}})();Object.extend(Event,(function(){var B=Event.cache;function C(J){if(J._prototypeEventID){return J._prototypeEventID[0]}arguments.callee.id=arguments.callee.id||1;return J._prototypeEventID=[++arguments.callee.id]}function G(J){if(J&&J.include(":")){return"dataavailable"}return J}function A(J){return B[J]=B[J]||{}}function F(L,J){var K=A(L);return K[J]=K[J]||[]}function H(K,J,L){var O=C(K);var N=F(O,J);if(N.pluck("handler").include(L)){return false}var M=function(P){if(!Event||!Event.extend||(P.eventName&&P.eventName!=J)){return false}Event.extend(P);L.call(K,P)};M.handler=L;N.push(M);return M}function I(M,J,K){var L=F(M,J);return L.find(function(N){return N.handler==K})}function D(M,J,K){var L=A(M);if(!L[J]){return false}L[J]=L[J].without(I(M,J,K))}function E(){for(var K in B){for(var J in B[K]){B[K][J]=null}}}if(window.attachEvent){window.attachEvent("onunload",E)}return{observe:function(L,J,M){L=$(L);var K=G(J);var N=H(L,J,M);if(!N){return L}if(L.addEventListener){L.addEventListener(K,N,false)}else{L.attachEvent("on"+K,N)}return L},stopObserving:function(L,J,M){L=$(L);var O=C(L),K=G(J);if(!M&&J){F(O,J).each(function(P){L.stopObserving(J,P.handler)});return L}else{if(!J){Object.keys(A(O)).each(function(P){L.stopObserving(P)});return L}}var N=I(O,J,M);if(!N){return L}if(L.removeEventListener){L.removeEventListener(K,N,false)}else{L.detachEvent("on"+K,N)}D(O,J,M);return L},fire:function(L,K,J){L=$(L);if(L==document&&document.createEvent&&!L.dispatchEvent){L=document.documentElement}var M;if(document.createEvent){M=document.createEvent("HTMLEvents");M.initEvent("dataavailable",true,true)}else{M=document.createEventObject();M.eventType="ondataavailable"}M.eventName=K;M.memo=J||{};if(document.createEvent){L.dispatchEvent(M)}else{L.fireEvent(M.eventType,M)}return Event.extend(M)}}})());Object.extend(Event,Event.Methods);Element.addMethods({fire:Event.fire,observe:Event.observe,stopObserving:Event.stopObserving});Object.extend(document,{fire:Element.Methods.fire.methodize(),observe:Element.Methods.observe.methodize(),stopObserving:Element.Methods.stopObserving.methodize(),loaded:false});(function(){var B;function A(){if(document.loaded){return }if(B){window.clearInterval(B)}document.fire("dom:loaded");document.loaded=true}if(document.addEventListener){if(Prototype.Browser.WebKit){B=window.setInterval(function(){if(/loaded|complete/.test(document.readyState)){A()}},0);Event.observe(window,"load",A)}else{document.addEventListener("DOMContentLoaded",A,false)}}else{document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");$("__onDOMContentLoaded").onreadystatechange=function(){if(this.readyState=="complete"){this.onreadystatechange=null;A()}}}})();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(A,B){return Element.insert(A,{before:B})},Top:function(A,B){return Element.insert(A,{top:B})},Bottom:function(A,B){return Element.insert(A,{bottom:B})},After:function(A,B){return Element.insert(A,{after:B})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(B,A,C){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(B,A,C)}this.xcomp=A;this.ycomp=C;this.offset=Element.cumulativeOffset(B);return(C>=this.offset[1]&&C<this.offset[1]+B.offsetHeight&&A>=this.offset[0]&&A<this.offset[0]+B.offsetWidth)},withinIncludingScrolloffsets:function(B,A,D){var C=Element.cumulativeScrollOffset(B);this.xcomp=A+C[0]-this.deltaX;this.ycomp=D+C[1]-this.deltaY;this.offset=Element.cumulativeOffset(B);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+B.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+B.offsetWidth)},overlap:function(B,A){if(!B){return 0}if(B=="vertical"){return((this.offset[1]+A.offsetHeight)-this.ycomp)/A.offsetHeight}if(B=="horizontal"){return((this.offset[0]+A.offsetWidth)-this.xcomp)/A.offsetWidth}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(A){Position.prepare();return Element.absolutize(A)},relativize:function(A){Position.prepare();return Element.relativize(A)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(B,C,A){A=A||{};return Element.clonePosition(C,B,A)}};if(!document.getElementsByClassName){document.getElementsByClassName=function(B){function A(C){return C.blank()?null:"[contains(concat(' ', @class, ' '), ' "+C+" ')]"}B.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(C,E){E=E.toString().strip();var D=/\s/.test(E)?$w(E).map(A).join(""):A(E);return D?document._getElementsByXPath(".//*"+D,C):[]}:function(E,F){F=F.toString().strip();var G=[],H=(/\s/.test(F)?$w(F):null);if(!H&&!F){return G}var C=$(E).getElementsByTagName("*");F=" "+F+" ";for(var D=0,J,I;J=C[D];D++){if(J.className&&(I=" "+J.className+" ")&&(I.include(F)||(H&&H.all(function(K){return !K.toString().blank()&&I.include(" "+K+" ")})))){G.push(Element.extend(J))}}return G};return function(D,C){return $(C||document.body).getElementsByClassName(D)}}(Element.Methods)}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(A){this.element=$(A)},_each:function(A){this.element.className.split(/\s+/).select(function(B){return B.length>0})._each(A)},set:function(A){this.element.className=A},add:function(A){if(this.include(A)){return }this.set($A(this).concat(A).join(" "))},remove:function(A){if(!this.include(A)){return }this.set($A(this).without(A).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);Element.addMethods();
\ No newline at end of file
+var Prototype={Version:"1.6.1",Browser:(function(){var b=navigator.userAgent;var a=Object.prototype.toString.call(window.opera)=="[object Opera]";return{IE:!!window.attachEvent&&!a,Opera:a,WebKit:b.indexOf("AppleWebKit/")>-1,Gecko:b.indexOf("Gecko")>-1&&b.indexOf("KHTML")===-1,MobileSafari:/Apple.*Mobile.*Safari/.test(b)}})(),BrowserFeatures:{XPath:!!document.evaluate,SelectorsAPI:!!document.querySelector,ElementExtensions:(function(){var a=window.Element||window.HTMLElement;return!!(a&&a.prototype)})(),SpecificElementExtensions:(function(){if(typeof window.HTMLDivElement!=="undefined"){return true}var c=document.createElement("div");var b=document.createElement("form");var a=false;if(c.__proto__&&(c.__proto__!==b.__proto__)){a=true}c=b=null;return a})()},ScriptFragment:"<script[^>]*>([\\S\\s]*?)<\/script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(a){return a}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false}var Abstract={};var Try={these:function(){var c;for(var b=0,d=arguments.length;b<d;b++){var a=arguments[b];try{c=a();break}catch(f){}}return c}};var Class=(function(){function a(){}function b(){var g=null,f=$A(arguments);if(Object.isFunction(f[0])){g=f.shift()}function d(){this.initialize.apply(this,arguments)}Object.extend(d,Class.Methods);d.superclass=g;d.subclasses=[];if(g){a.prototype=g.prototype;d.prototype=new a;g.subclasses.push(d)}for(var e=0;e<f.length;e++){d.addMethods(f[e])}if(!d.prototype.initialize){d.prototype.initialize=Prototype.emptyFunction}d.prototype.constructor=d;return d}function c(k){var f=this.superclass&&this.superclass.prototype;var e=Object.keys(k);if(!Object.keys({toString:true}).length){if(k.toString!=Object.prototype.toString){e.push("toString")}if(k.valueOf!=Object.prototype.valueOf){e.push("valueOf")}}for(var d=0,g=e.length;d<g;d++){var j=e[d],h=k[j];if(f&&Object.isFunction(h)&&h.argumentNames().first()=="$super"){var l=h;h=(function(i){return function(){return f[i].apply(this,arguments)}})(j).wrap(l);h.valueOf=l.valueOf.bind(l);h.toString=l.toString.bind(l)}this.prototype[j]=h}return this}return{create:b,Methods:{addMethods:c}}})();(function(){var d=Object.prototype.toString;function i(q,s){for(var r in s){q[r]=s[r]}return q}function l(q){try{if(e(q)){return"undefined"}if(q===null){return"null"}return q.inspect?q.inspect():String(q)}catch(r){if(r instanceof RangeError){return"..."}throw r}}function k(q){var s=typeof q;switch(s){case"undefined":case"function":case"unknown":return;case"boolean":return q.toString()}if(q===null){return"null"}if(q.toJSON){return q.toJSON()}if(h(q)){return}var r=[];for(var u in q){var t=k(q[u]);if(!e(t)){r.push(u.toJSON()+": "+t)}}return"{"+r.join(", ")+"}"}function c(q){return $H(q).toQueryString()}function f(q){return q&&q.toHTML?q.toHTML():String.interpret(q)}function o(q){var r=[];for(var s in q){r.push(s)}return r}function m(q){var r=[];for(var s in q){r.push(q[s])}return r}function j(q){return i({},q)}function h(q){return!!(q&&q.nodeType==1)}function g(q){return d.call(q)=="[object Array]"}function p(q){return q instanceof Hash}function b(q){return typeof q==="function"}function a(q){return d.call(q)=="[object String]"}function n(q){return d.call(q)=="[object Number]"}function e(q){return typeof q==="undefined"}i(Object,{extend:i,inspect:l,toJSON:k,toQueryString:c,toHTML:f,keys:o,values:m,clone:j,isElement:h,isArray:g,isHash:p,isFunction:b,isString:a,isNumber:n,isUndefined:e})})();Object.extend(Function.prototype,(function(){var k=Array.prototype.slice;function d(o,l){var n=o.length,m=l.length;while(m--){o[n+m]=l[m]}return o}function i(m,l){m=k.call(m,0);return d(m,l)}function g(){var l=this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1].replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g,"").replace(/\s+/g,"").split(",");return l.length==1&&!l[0]?[]:l}function h(n){if(arguments.length<2&&Object.isUndefined(arguments[0])){return this}var l=this,m=k.call(arguments,1);return function(){var o=i(m,arguments);return l.apply(n,o)}}function f(n){var l=this,m=k.call(arguments,1);return function(p){var o=d([p||window.event],m);return l.apply(n,o)}}function j(){if(!arguments.length){return this}var l=this,m=k.call(arguments,0);return function(){var n=i(m,arguments);return l.apply(this,n)}}function e(n){var l=this,m=k.call(arguments,1);n=n*1000;return window.setTimeout(function(){return l.apply(l,m)},n)}function a(){var l=d([0.01],arguments);return this.delay.apply(this,l)}function c(m){var l=this;return function(){var n=d([l.bind(this)],arguments);return m.apply(this,n)}}function b(){if(this._methodized){return this._methodized}var l=this;return this._methodized=function(){var m=d([this],arguments);return l.apply(null,m)}}return{argumentNames:g,bind:h,bindAsEventListener:f,curry:j,delay:e,defer:a,wrap:c,methodize:b}})());Date.prototype.toJSON=function(){return'"'+this.getUTCFullYear()+"-"+(this.getUTCMonth()+1).toPaddedString(2)+"-"+this.getUTCDate().toPaddedString(2)+"T"+this.getUTCHours().toPaddedString(2)+":"+this.getUTCMinutes().toPaddedString(2)+":"+this.getUTCSeconds().toPaddedString(2)+'Z"'};RegExp.prototype.match=RegExp.prototype.test;RegExp.escape=function(a){return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")};var PeriodicalExecuter=Class.create({initialize:function(b,a){this.callback=b;this.frequency=a;this.currentlyExecuting=false;this.registerCallback()},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),this.frequency*1000)},execute:function(){this.callback(this)},stop:function(){if(!this.timer){return}clearInterval(this.timer);this.timer=null},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.execute();this.currentlyExecuting=false}catch(a){this.currentlyExecuting=false;throw a}}}});Object.extend(String,{interpret:function(a){return a==null?"":String(a)},specialChar:{"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r","\\":"\\\\"}});Object.extend(String.prototype,(function(){function prepareReplacement(replacement){if(Object.isFunction(replacement)){return replacement}var template=new Template(replacement);return function(match){return template.evaluate(match)}}function gsub(pattern,replacement){var result="",source=this,match;replacement=prepareReplacement(replacement);if(Object.isString(pattern)){pattern=RegExp.escape(pattern)}if(!(pattern.length||pattern.source)){replacement=replacement("");return replacement+source.split("").join(replacement)+replacement}while(source.length>0){if(match=source.match(pattern)){result+=source.slice(0,match.index);result+=String.interpret(replacement(match));source=source.slice(match.index+match[0].length)}else{result+=source,source=""}}return result}function sub(pattern,replacement,count){replacement=prepareReplacement(replacement);count=Object.isUndefined(count)?1:count;return this.gsub(pattern,function(match){if(--count<0){return match[0]}return replacement(match)})}function scan(pattern,iterator){this.gsub(pattern,iterator);return String(this)}function truncate(length,truncation){length=length||30;truncation=Object.isUndefined(truncation)?"...":truncation;return this.length>length?this.slice(0,length-truncation.length)+truncation:String(this)}function strip(){return this.replace(/^\s+/,"").replace(/\s+$/,"")}function stripTags(){return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi,"")}function stripScripts(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"")}function extractScripts(){var matchAll=new RegExp(Prototype.ScriptFragment,"img");var matchOne=new RegExp(Prototype.ScriptFragment,"im");return(this.match(matchAll)||[]).map(function(scriptTag){return(scriptTag.match(matchOne)||["",""])[1]})}function evalScripts(){return this.extractScripts().map(function(script){return eval(script)})}function escapeHTML(){return this.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function unescapeHTML(){return this.stripTags().replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&")}function toQueryParams(separator){var match=this.strip().match(/([^?#]*)(#.*)?$/);if(!match){return{}}return match[1].split(separator||"&").inject({},function(hash,pair){if((pair=pair.split("="))[0]){var key=decodeURIComponent(pair.shift());var value=pair.length>1?pair.join("="):pair[0];if(value!=undefined){value=decodeURIComponent(value)}if(key in hash){if(!Object.isArray(hash[key])){hash[key]=[hash[key]]}hash[key].push(value)}else{hash[key]=value}}return hash})}function toArray(){return this.split("")}function succ(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)}function times(count){return count<1?"":new Array(count+1).join(this)}function camelize(){var parts=this.split("-"),len=parts.length;if(len==1){return parts[0]}var camelized=this.charAt(0)=="-"?parts[0].charAt(0).toUpperCase()+parts[0].substring(1):parts[0];for(var i=1;i<len;i++){camelized+=parts[i].charAt(0).toUpperCase()+parts[i].substring(1)}return camelized}function capitalize(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase()}function underscore(){return this.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/-/g,"_").toLowerCase()}function dasherize(){return this.replace(/_/g,"-")}function inspect(useDoubleQuotes){var escapedString=this.replace(/[\x00-\x1f\\]/g,function(character){if(character in String.specialChar){return String.specialChar[character]}return"\\u00"+character.charCodeAt().toPaddedString(2,16)});if(useDoubleQuotes){return'"'+escapedString.replace(/"/g,'\\"')+'"'}return"'"+escapedString.replace(/'/g,"\\'")+"'"}function toJSON(){return this.inspect(true)}function unfilterJSON(filter){return this.replace(filter||Prototype.JSONFilter,"$1")}function isJSON(){var str=this;if(str.blank()){return false}str=this.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,"");return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str)}function evalJSON(sanitize){var json=this.unfilterJSON();try{if(!sanitize||json.isJSON()){return eval("("+json+")")}}catch(e){}throw new SyntaxError("Badly formed JSON string: "+this.inspect())}function include(pattern){return this.indexOf(pattern)>-1}function startsWith(pattern){return this.indexOf(pattern)===0}function endsWith(pattern){var d=this.length-pattern.length;return d>=0&&this.lastIndexOf(pattern)===d}function empty(){return this==""}function blank(){return/^\s*$/.test(this)}function interpolate(object,pattern){return new Template(this,pattern).evaluate(object)}return{gsub:gsub,sub:sub,scan:scan,truncate:truncate,strip:String.prototype.trim?String.prototype.trim:strip,stripTags:stripTags,stripScripts:stripScripts,extractScripts:extractScripts,evalScripts:evalScripts,escapeHTML:escapeHTML,unescapeHTML:unescapeHTML,toQueryParams:toQueryParams,parseQuery:toQueryParams,toArray:toArray,succ:succ,times:times,camelize:camelize,capitalize:capitalize,underscore:underscore,dasherize:dasherize,inspect:inspect,toJSON:toJSON,unfilterJSON:unfilterJSON,isJSON:isJSON,evalJSON:evalJSON,include:include,startsWith:startsWith,endsWith:endsWith,empty:empty,blank:blank,interpolate:interpolate}})());var Template=Class.create({initialize:function(a,b){this.template=a.toString();this.pattern=b||Template.Pattern},evaluate:function(a){if(a&&Object.isFunction(a.toTemplateReplacements)){a=a.toTemplateReplacements()}return this.template.gsub(this.pattern,function(d){if(a==null){return(d[1]+"")}var f=d[1]||"";if(f=="\\"){return d[2]}var b=a,g=d[3];var e=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;d=e.exec(g);if(d==null){return f}while(d!=null){var c=d[1].startsWith("[")?d[2].replace(/\\\\]/g,"]"):d[1];b=b[c];if(null==b||""==d[3]){break}g=g.substring("["==d[3]?d[1].length:d[0].length);d=e.exec(g)}return f+String.interpret(b)})}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable=(function(){function c(y,x){var w=0;try{this._each(function(A){y.call(x,A,w++)})}catch(z){if(z!=$break){throw z}}return this}function r(z,y,x){var w=-z,A=[],B=this.toArray();if(z<1){return B}while((w+=z)<B.length){A.push(B.slice(w,w+z))}return A.collect(y,x)}function b(y,x){y=y||Prototype.K;var w=true;this.each(function(A,z){w=w&&!!y.call(x,A,z);if(!w){throw $break}});return w}function i(y,x){y=y||Prototype.K;var w=false;this.each(function(A,z){if(w=!!y.call(x,A,z)){throw $break}});return w}function j(y,x){y=y||Prototype.K;var w=[];this.each(function(A,z){w.push(y.call(x,A,z))});return w}function t(y,x){var w;this.each(function(A,z){if(y.call(x,A,z)){w=A;throw $break}});return w}function h(y,x){var w=[];this.each(function(A,z){if(y.call(x,A,z)){w.push(A)}});return w}function g(z,y,x){y=y||Prototype.K;var w=[];if(Object.isString(z)){z=new RegExp(RegExp.escape(z))}this.each(function(B,A){if(z.match(B)){w.push(y.call(x,B,A))}});return w}function a(w){if(Object.isFunction(this.indexOf)){if(this.indexOf(w)!=-1){return true}}var x=false;this.each(function(y){if(y==w){x=true;throw $break}});return x}function q(x,w){w=Object.isUndefined(w)?null:w;return this.eachSlice(x,function(y){while(y.length<x){y.push(w)}return y})}function l(w,y,x){this.each(function(A,z){w=y.call(x,w,A,z)});return w}function v(x){var w=$A(arguments).slice(1);return this.map(function(y){return y[x].apply(y,w)})}function p(y,x){y=y||Prototype.K;var w;this.each(function(A,z){A=y.call(x,A,z);if(w==null||A>=w){w=A}});return w}function n(y,x){y=y||Prototype.K;var w;this.each(function(A,z){A=y.call(x,A,z);if(w==null||A<w){w=A}});return w}function e(z,x){z=z||Prototype.K;var y=[],w=[];this.each(function(B,A){(z.call(x,B,A)?y:w).push(B)});return[y,w]}function f(x){var w=[];this.each(function(y){w.push(y[x])});return w}function d(y,x){var w=[];this.each(function(A,z){if(!y.call(x,A,z)){w.push(A)}});return w}function m(x,w){return this.map(function(z,y){return{value:z,criteria:x.call(w,z,y)}}).sort(function(B,A){var z=B.criteria,y=A.criteria;return z<y?-1:z>y?1:0}).pluck("value")}function o(){return this.map()}function s(){var x=Prototype.K,w=$A(arguments);if(Object.isFunction(w.last())){x=w.pop()}var y=[this].concat(w).map($A);return this.map(function(A,z){return x(y.pluck(z))})}function k(){return this.toArray().length}function u(){return"#<Enumerable:"+this.toArray().inspect()+">"}return{each:c,eachSlice:r,all:b,every:b,any:i,some:i,collect:j,map:j,detect:t,findAll:h,select:h,filter:h,grep:g,include:a,member:a,inGroupsOf:q,inject:l,invoke:v,max:p,min:n,partition:e,pluck:f,reject:d,sortBy:m,toArray:o,entries:o,zip:s,size:k,inspect:u,find:t}})();function $A(c){if(!c){return[]}if("toArray"in Object(c)){return c.toArray()}var b=c.length||0,a=new Array(b);while(b--){a[b]=c[b]}return a}function $w(a){if(!Object.isString(a)){return[]}a=a.strip();return a?a.split(/\s+/):[]}Array.from=$A;(function(){var s=Array.prototype,m=s.slice,o=s.forEach;function b(w){for(var v=0,x=this.length;v<x;v++){w(this[v])}}if(!o){o=b}function l(){this.length=0;return this}function d(){return this[0]}function g(){return this[this.length-1]}function i(){return this.select(function(v){return v!=null})}function u(){return this.inject([],function(w,v){if(Object.isArray(v)){return w.concat(v.flatten())}w.push(v);return w})}function h(){var v=m.call(arguments,0);return this.select(function(w){return!v.include(w)})}function f(v){return(v!==false?this:this.toArray())._reverse()}function k(v){return this.inject([],function(y,x,w){if(0==w||(v?y.last()!=x:!y.include(x))){y.push(x)}return y})}function p(v){return this.uniq().findAll(function(w){return v.detect(function(x){return w===x})})}function q(){return m.call(this,0)}function j(){return this.length}function t(){return"["+this.map(Object.inspect).join(", ")+"]"}function r(){var v=[];this.each(function(w){var x=Object.toJSON(w);if(!Object.isUndefined(x)){v.push(x)}});return"["+v.join(", ")+"]"}function a(x,v){v||(v=0);var w=this.length;if(v<0){v=w+v}for(;v<w;v++){if(this[v]===x){return v}}return-1}function n(w,v){v=isNaN(v)?this.length:(v<0?this.length+v:v)+1;var x=this.slice(0,v).reverse().indexOf(w);return(x<0)?x:v-x-1}function c(){var A=m.call(this,0),y;for(var w=0,x=arguments.length;w<x;w++){y=arguments[w];if(Object.isArray(y)&&!("callee"in y)){for(var v=0,z=y.length;v<z;v++){A.push(y[v])}}else{A.push(y)}}return A}Object.extend(s,Enumerable);if(!s._reverse){s._reverse=s.reverse}Object.extend(s,{_each:o,clear:l,first:d,last:g,compact:i,flatten:u,without:h,reverse:f,uniq:k,intersect:p,clone:q,toArray:q,size:j,inspect:t,toJSON:r});var e=(function(){return[].concat(arguments)[0][0]!==1})(1,2);if(e){s.concat=c}if(!s.indexOf){s.indexOf=a}if(!s.lastIndexOf){s.lastIndexOf=n}})();function $H(a){return new Hash(a)}var Hash=Class.create(Enumerable,(function(){function e(q){this._object=Object.isHash(q)?q.toObject():Object.clone(q)}function f(r){for(var q in this._object){var s=this._object[q],t=[q,s];t.key=q;t.value=s;r(t)}}function k(q,r){return this._object[q]=r}function c(q){if(this._object[q]!==Object.prototype[q]){return this._object[q]}}function n(q){var r=this._object[q];delete this._object[q];return r}function p(){return Object.clone(this._object)}function o(){return this.pluck("key")}function m(){return this.pluck("value")}function g(r){var q=this.detect(function(s){return s.value===r});return q&&q.key}function i(q){return this.clone().update(q)}function d(q){return new Hash(q).inject(this,function(r,s){r.set(s.key,s.value);return r})}function b(q,r){if(Object.isUndefined(r)){return q}return q+"="+encodeURIComponent(String.interpret(r))}function a(){return this.inject([],function(s,t){var r=encodeURIComponent(t.key),q=t.value;if(q&&typeof q=="object"){if(Object.isArray(q)){return s.concat(q.map(b.curry(r)))}}else{s.push(b(r,q))}return s}).join("&")}function l(){return"#<Hash:{"+this.map(function(q){return q.map(Object.inspect).join(": ")}).join(", ")+"}>"}function j(){return Object.toJSON(this.toObject())}function h(){return new Hash(this)}return{initialize:e,_each:f,set:k,get:c,unset:n,toObject:p,toTemplateReplacements:p,keys:o,values:m,index:g,merge:i,update:d,toQueryString:a,inspect:l,toJSON:j,clone:h}})());Hash.from=$H;Object.extend(Number.prototype,(function(){function d(){return this.toPaddedString(2,16)}function e(){return this+1}function a(k,j){$R(0,this,true).each(k,j);return this}function b(l,k){var j=this.toString(k||10);return"0".times(l-j.length)+j}function f(){return isFinite(this)?this.toString():"null"}function i(){return Math.abs(this)}function h(){return Math.round(this)}function g(){return Math.ceil(this)}function c(){return Math.floor(this)}return{toColorPart:d,succ:e,times:a,toPaddedString:b,toJSON:f,abs:i,round:h,ceil:g,floor:c}})());function $R(c,a,b){return new ObjectRange(c,a,b)}var ObjectRange=Class.create(Enumerable,(function(){function b(f,d,e){this.start=f;this.end=d;this.exclusive=e}function c(d){var e=this.start;while(this.include(e)){d(e);e=e.succ()}}function a(d){if(d<this.start){return false}if(this.exclusive){return d<this.end}return d<=this.end}return{initialize:b,_each:c,include:a}})());var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")})||false},activeRequestCount:0};Ajax.Responders={responders:[],_each:function(a){this.responders._each(a)},register:function(a){if(!this.include(a)){this.responders.push(a)}},unregister:function(a){this.responders=this.responders.without(a)},dispatch:function(d,b,c,a){this.each(function(f){if(Object.isFunction(f[d])){try{f[d].apply(f,[b,c,a])}catch(g){}}})}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++},onComplete:function(){Ajax.activeRequestCount--}});Ajax.Base=Class.create({initialize:function(a){this.options={method:"post",asynchronous:true,contentType:"application/x-www-form-urlencoded",encoding:"UTF-8",parameters:"",evalJSON:true,evalJS:true};Object.extend(this.options,a||{});this.options.method=this.options.method.toLowerCase();if(Object.isString(this.options.parameters)){this.options.parameters=this.options.parameters.toQueryParams()}else{if(Object.isHash(this.options.parameters)){this.options.parameters=this.options.parameters.toObject()}}}});Ajax.Request=Class.create(Ajax.Base,{_complete:false,initialize:function($super,b,a){$super(a);this.transport=Ajax.getTransport();this.request(b)},request:function(b){this.url=b;this.method=this.options.method;var d=Object.clone(this.options.parameters);if(!["get","post"].include(this.method)){d._method=this.method;this.method="post"}this.parameters=d;if(d=Object.toQueryString(d)){if(this.method=="get"){this.url+=(this.url.include("?")?"&":"?")+d}else{if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){d+="&_="}}}try{var a=new Ajax.Response(this);if(this.options.onCreate){this.options.onCreate(a)}Ajax.Responders.dispatch("onCreate",this,a);this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous);if(this.options.asynchronous){this.respondToReadyState.bind(this).defer(1)}this.transport.onreadystatechange=this.onStateChange.bind(this);this.setRequestHeaders();this.body=this.method=="post"?(this.options.postBody||d):null;this.transport.send(this.body);if(!this.options.asynchronous&&this.transport.overrideMimeType){this.onStateChange()}}catch(c){this.dispatchException(c)}},onStateChange:function(){var a=this.transport.readyState;if(a>1&&!((a==4)&&this._complete)){this.respondToReadyState(this.transport.readyState)}},setRequestHeaders:function(){var e={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,Accept:"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){e["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){e.Connection="close"}}if(typeof this.options.requestHeaders=="object"){var c=this.options.requestHeaders;if(Object.isFunction(c.push)){for(var b=0,d=c.length;b<d;b+=2){e[c[b]]=c[b+1]}}else{$H(c).each(function(f){e[f.key]=f.value})}}for(var a in e){this.transport.setRequestHeader(a,e[a])}},success:function(){var a=this.getStatus();return!a||(a>=200&&a<300)},getStatus:function(){try{return this.transport.status||0}catch(a){return 0}},respondToReadyState:function(a){var c=Ajax.Request.Events[a],b=new Ajax.Response(this);if(c=="Complete"){try{this._complete=true;(this.options["on"+b.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(b,b.headerJSON)}catch(d){this.dispatchException(d)}var f=b.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&f&&f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+c]||Prototype.emptyFunction)(b,b.headerJSON);Ajax.Responders.dispatch("on"+c,this,b,b.headerJSON)}catch(d){this.dispatchException(d)}if(c=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}},isSameOrigin:function(){var a=this.url.match(/^\s*https?:\/\/[^\/]*/);return!a||(a[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}))},getHeader:function(a){try{return this.transport.getResponseHeader(a)||null}catch(b){return null}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON())}catch(e){this.dispatchException(e)}},dispatchException:function(a){(this.options.onException||Prototype.emptyFunction)(this,a);Ajax.Responders.dispatch("onException",this,a)}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(c){this.request=c;var d=this.transport=c.transport,a=this.readyState=d.readyState;if((a>2&&!Prototype.Browser.IE)||a==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(d.responseText);this.headerJSON=this._getHeaderJSON()}if(a==4){var b=d.responseXML;this.responseXML=Object.isUndefined(b)?null:b;this.responseJSON=this._getResponseJSON()}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||""}catch(a){return""}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders()}catch(a){return null}},getResponseHeader:function(a){return this.transport.getResponseHeader(a)},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders()},_getHeaderJSON:function(){var a=this.getHeader("X-JSON");if(!a){return null}a=decodeURIComponent(escape(a));try{return a.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}},_getResponseJSON:function(){var a=this.request.options;if(!a.evalJSON||(a.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null}try{return this.responseText.evalJSON(a.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,a,c,b){this.container={success:(a.success||a),failure:(a.failure||(a.success?null:a))};b=Object.clone(b);var d=b.onComplete;b.onComplete=(function(e,f){this.updateContent(e.responseText);if(Object.isFunction(d)){d(e,f)}}).bind(this);$super(c,b)},updateContent:function(d){var c=this.container[this.success()?"success":"failure"],a=this.options;if(!a.evalScripts){d=d.stripScripts()}if(c=$(c)){if(a.insertion){if(Object.isString(a.insertion)){var b={};b[a.insertion]=d;c.insert(b)}else{a.insertion(c,d)}}else{c.update(d)}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,a,c,b){$super(b);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=a;this.url=c;this.start()},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent()},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments)},updateComplete:function(a){if(this.options.decay){this.decay=(a.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=a.responseText}this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options)}});function $(b){if(arguments.length>1){for(var a=0,d=[],c=arguments.length;a<c;a++){d.push($(arguments[a]))}return d}if(Object.isString(b)){b=document.getElementById(b)}return Element.extend(b)}if(Prototype.BrowserFeatures.XPath){document._getElementsByXPath=function(f,a){var c=[];var e=document.evaluate(f,$(a)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);for(var b=0,d=e.snapshotLength;b<d;b++){c.push(Element.extend(e.snapshotItem(b)))}return c}}if(!window.Node){var Node={}}if(!Node.ELEMENT_NODE){Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12})}(function(c){var b=(function(){var f=document.createElement("form");var e=document.createElement("input");var d=document.documentElement;e.setAttribute("name","test");f.appendChild(e);d.appendChild(f);var g=f.elements?(typeof f.elements.test=="undefined"):null;d.removeChild(f);f=e=null;return g})();var a=c.Element;c.Element=function(f,e){e=e||{};f=f.toLowerCase();var d=Element.cache;if(b&&e.name){f="<"+f+' name="'+e.name+'">';delete e.name;return Element.writeAttribute(document.createElement(f),e)}if(!d[f]){d[f]=Element.extend(document.createElement(f))}return Element.writeAttribute(d[f].cloneNode(false),e)};Object.extend(c.Element,a||{});if(a){c.Element.prototype=a.prototype}})(this);Element.cache={};Element.idCounter=1;Element.Methods={visible:function(a){return $(a).style.display!="none"},toggle:function(a){a=$(a);Element[Element.visible(a)?"hide":"show"](a);return a},hide:function(a){a=$(a);a.style.display="none";return a},show:function(a){a=$(a);a.style.display="";return a},remove:function(a){a=$(a);a.parentNode.removeChild(a);return a},update:(function(){var b=(function(){var e=document.createElement("select"),f=true;e.innerHTML='<option value="test">test</option>';if(e.options&&e.options[0]){f=e.options[0].nodeName.toUpperCase()!=="OPTION"}e=null;return f})();var a=(function(){try{var f=document.createElement("table");if(f&&f.tBodies){f.innerHTML="<tbody><tr><td>test</td></tr></tbody>";var h=typeof f.tBodies[0]=="undefined";f=null;return h}}catch(g){return true}})();var d=(function(){var f=document.createElement("script"),h=false;try{f.appendChild(document.createTextNode(""));h=!f.firstChild||f.firstChild&&f.firstChild.nodeType!==3}catch(g){h=true}f=null;return h})();function c(f,g){f=$(f);if(g&&g.toElement){g=g.toElement()}if(Object.isElement(g)){return f.update().insert(g)}g=Object.toHTML(g);var e=f.tagName.toUpperCase();if(e==="SCRIPT"&&d){f.text=g;return f}if(b||a){if(e in Element._insertionTranslations.tags){while(f.firstChild){f.removeChild(f.firstChild)}Element._getContentFromAnonymousElement(e,g.stripScripts()).each(function(h){f.appendChild(h)})}else{f.innerHTML=g.stripScripts()}}else{f.innerHTML=g.stripScripts()}g.evalScripts.bind(g).defer();return f}return c})(),replace:function(b,c){b=$(b);if(c&&c.toElement){c=c.toElement()}else{if(!Object.isElement(c)){c=Object.toHTML(c);var a=b.ownerDocument.createRange();a.selectNode(b);c.evalScripts.bind(c).defer();c=a.createContextualFragment(c.stripScripts())}}b.parentNode.replaceChild(c,b);return b},insert:function(c,e){c=$(c);if(Object.isString(e)||Object.isNumber(e)||Object.isElement(e)||(e&&(e.toElement||e.toHTML))){e={bottom:e}}var d,f,b,g;for(var a in e){d=e[a];a=a.toLowerCase();f=Element._insertionTranslations[a];if(d&&d.toElement){d=d.toElement()}if(Object.isElement(d)){f(c,d);continue}d=Object.toHTML(d);b=((a=="before"||a=="after")?c.parentNode:c).tagName.toUpperCase();g=Element._getContentFromAnonymousElement(b,d.stripScripts());if(a=="top"||a=="after"){g.reverse()}g.each(f.curry(c));d.evalScripts.bind(d).defer()}return c},wrap:function(b,c,a){b=$(b);if(Object.isElement(c)){$(c).writeAttribute(a||{})}else{if(Object.isString(c)){c=new Element(c,a)}else{c=new Element("div",c)}}if(b.parentNode){b.parentNode.replaceChild(c,b)}c.appendChild(b);return c},inspect:function(b){b=$(b);var a="<"+b.tagName.toLowerCase();$H({id:"id",className:"class"}).each(function(f){var e=f.first(),c=f.last();var d=(b[e]||"").toString();if(d){a+=" "+c+"="+d.inspect(true)}});return a+">"},recursivelyCollect:function(a,c){a=$(a);var b=[];while(a=a[c]){if(a.nodeType==1){b.push(Element.extend(a))}}return b},ancestors:function(a){return Element.recursivelyCollect(a,"parentNode")},descendants:function(a){return Element.select(a,"*")},firstDescendant:function(a){a=$(a).firstChild;while(a&&a.nodeType!=1){a=a.nextSibling}return $(a)},immediateDescendants:function(a){if(!(a=$(a).firstChild)){return[]}while(a&&a.nodeType!=1){a=a.nextSibling}if(a){return[a].concat($(a).nextSiblings())}return[]},previousSiblings:function(a){return Element.recursivelyCollect(a,"previousSibling")},nextSiblings:function(a){return Element.recursivelyCollect(a,"nextSibling")},siblings:function(a){a=$(a);return Element.previousSiblings(a).reverse().concat(Element.nextSiblings(a))},match:function(b,a){if(Object.isString(a)){a=new Selector(a)}return a.match($(b))},up:function(b,d,a){b=$(b);if(arguments.length==1){return $(b.parentNode)}var c=Element.ancestors(b);return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)},down:function(b,c,a){b=$(b);if(arguments.length==1){return Element.firstDescendant(b)}return Object.isNumber(c)?Element.descendants(b)[c]:Element.select(b,c)[a||0]},previous:function(b,d,a){b=$(b);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(b))}var c=Element.previousSiblings(b);return Object.isNumber(d)?c[d]:Selector.findElement(c,d,a)},next:function(c,d,b){c=$(c);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(c))}var a=Element.nextSiblings(c);return Object.isNumber(d)?a[d]:Selector.findElement(a,d,b)},select:function(b){var a=Array.prototype.slice.call(arguments,1);return Selector.findChildElements(b,a)},adjacent:function(b){var a=Array.prototype.slice.call(arguments,1);return Selector.findChildElements(b.parentNode,a).without(b)},identify:function(a){a=$(a);var b=Element.readAttribute(a,"id");if(b){return b}do{b="anonymous_element_"+Element.idCounter++}while($(b));Element.writeAttribute(a,"id",b);return b},readAttribute:function(c,a){c=$(c);if(Prototype.Browser.IE){var b=Element._attributeTranslations.read;if(b.values[a]){return b.values[a](c,a)}if(b.names[a]){a=b.names[a]}if(a.include(":")){return(!c.attributes||!c.attributes[a])?null:c.attributes[a].value}}return c.getAttribute(a)},writeAttribute:function(e,c,f){e=$(e);var b={},d=Element._attributeTranslations.write;if(typeof c=="object"){b=c}else{b[c]=Object.isUndefined(f)?true:f}for(var a in b){c=d.names[a]||a;f=b[a];if(d.values[a]){c=d.values[a](e,f)}if(f===false||f===null){e.removeAttribute(c)}else{if(f===true){e.setAttribute(c,c)}else{e.setAttribute(c,f)}}}return e},getHeight:function(a){return Element.getDimensions(a).height},getWidth:function(a){return Element.getDimensions(a).width},classNames:function(a){return new Element.ClassNames(a)},hasClassName:function(a,b){if(!(a=$(a))){return}var c=a.className;return(c.length>0&&(c==b||new RegExp("(^|\\s)"+b+"(\\s|$)").test(c)))},addClassName:function(a,b){if(!(a=$(a))){return}if(!Element.hasClassName(a,b)){a.className+=(a.className?" ":"")+b}return a},removeClassName:function(a,b){if(!(a=$(a))){return}a.className=a.className.replace(new RegExp("(^|\\s+)"+b+"(\\s+|$)")," ").strip();return a},toggleClassName:function(a,b){if(!(a=$(a))){return}return Element[Element.hasClassName(a,b)?"removeClassName":"addClassName"](a,b)},cleanWhitespace:function(b){b=$(b);var c=b.firstChild;while(c){var a=c.nextSibling;if(c.nodeType==3&&!/\S/.test(c.nodeValue)){b.removeChild(c)}c=a}return b},empty:function(a){return $(a).innerHTML.blank()},descendantOf:function(b,a){b=$(b),a=$(a);if(b.compareDocumentPosition){return(b.compareDocumentPosition(a)&8)===8}if(a.contains){return a.contains(b)&&a!==b}while(b=b.parentNode){if(b==a){return true}}return false},scrollTo:function(a){a=$(a);var b=Element.cumulativeOffset(a);window.scrollTo(b[0],b[1]);return a},getStyle:function(b,c){b=$(b);c=c=="float"?"cssFloat":c.camelize();var d=b.style[c];if(!d||d=="auto"){var a=document.defaultView.getComputedStyle(b,null);d=a?a[c]:null}if(c=="opacity"){return d?parseFloat(d):1}return d=="auto"?null:d},getOpacity:function(a){return $(a).getStyle("opacity")},setStyle:function(b,c){b=$(b);var e=b.style,a;if(Object.isString(c)){b.style.cssText+=";"+c;return c.include("opacity")?b.setOpacity(c.match(/opacity:\s*(\d?\.?\d*)/)[1]):b}for(var d in c){if(d=="opacity"){b.setOpacity(c[d])}else{e[(d=="float"||d=="cssFloat")?(Object.isUndefined(e.styleFloat)?"cssFloat":"styleFloat"):d]=c[d]}}return b},setOpacity:function(a,b){a=$(a);a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;return a},getDimensions:function(c){c=$(c);var g=Element.getStyle(c,"display");if(g!="none"&&g!=null){return{width:c.offsetWidth,height:c.offsetHeight}}var b=c.style;var f=b.visibility;var d=b.position;var a=b.display;b.visibility="hidden";if(d!="fixed"){b.position="absolute"}b.display="block";var h=c.clientWidth;var e=c.clientHeight;b.display=a;b.position=d;b.visibility=f;return{width:h,height:e}},makePositioned:function(a){a=$(a);var b=Element.getStyle(a,"position");if(b=="static"||!b){a._madePositioned=true;a.style.position="relative";if(Prototype.Browser.Opera){a.style.top=0;a.style.left=0}}return a},undoPositioned:function(a){a=$(a);if(a._madePositioned){a._madePositioned=undefined;a.style.position=a.style.top=a.style.left=a.style.bottom=a.style.right=""}return a},makeClipping:function(a){a=$(a);if(a._overflow){return a}a._overflow=Element.getStyle(a,"overflow")||"auto";if(a._overflow!=="hidden"){a.style.overflow="hidden"}return a},undoClipping:function(a){a=$(a);if(!a._overflow){return a}a.style.overflow=a._overflow=="auto"?"":a._overflow;a._overflow=null;return a},cumulativeOffset:function(b){var a=0,c=0;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;b=b.offsetParent}while(b);return Element._returnOffset(c,a)},positionedOffset:function(b){var a=0,d=0;do{a+=b.offsetTop||0;d+=b.offsetLeft||0;b=b.offsetParent;if(b){if(b.tagName.toUpperCase()=="BODY"){break}var c=Element.getStyle(b,"position");if(c!=="static"){break}}}while(b);return Element._returnOffset(d,a)},absolutize:function(b){b=$(b);if(Element.getStyle(b,"position")=="absolute"){return b}var d=Element.positionedOffset(b);var f=d[1];var e=d[0];var c=b.clientWidth;var a=b.clientHeight;b._originalLeft=e-parseFloat(b.style.left||0);b._originalTop=f-parseFloat(b.style.top||0);b._originalWidth=b.style.width;b._originalHeight=b.style.height;b.style.position="absolute";b.style.top=f+"px";b.style.left=e+"px";b.style.width=c+"px";b.style.height=a+"px";return b},relativize:function(a){a=$(a);if(Element.getStyle(a,"position")=="relative"){return a}a.style.position="relative";var c=parseFloat(a.style.top||0)-(a._originalTop||0);var b=parseFloat(a.style.left||0)-(a._originalLeft||0);a.style.top=c+"px";a.style.left=b+"px";a.style.height=a._originalHeight;a.style.width=a._originalWidth;return a},cumulativeScrollOffset:function(b){var a=0,c=0;do{a+=b.scrollTop||0;c+=b.scrollLeft||0;b=b.parentNode}while(b);return Element._returnOffset(c,a)},getOffsetParent:function(a){if(a.offsetParent){return $(a.offsetParent)}if(a==document.body){return $(a)}while((a=a.parentNode)&&a!=document.body&&a!=document){if(Element.getStyle(a,"position")!="static"){return $(a)}}return $(document.body)},viewportOffset:function(d){var a=0,c=0;var b=d;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;if(b.offsetParent==document.body&&Element.getStyle(b,"position")=="absolute"){break}}while(b=b.offsetParent);b=d;do{if(!Prototype.Browser.Opera||(b.tagName&&(b.tagName.toUpperCase()=="BODY"))){a-=b.scrollTop||0;c-=b.scrollLeft||0}}while(b=b.parentNode);return Element._returnOffset(c,a)},clonePosition:function(b,d){var a=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});d=$(d);var e=Element.viewportOffset(d);b=$(b);var f=[0,0];var c=null;if(Element.getStyle(b,"position")=="absolute"){c=Element.getOffsetParent(b);f=Element.viewportOffset(c)}if(c==document.body){f[0]-=document.body.offsetLeft;f[1]-=document.body.offsetTop}if(a.setLeft){b.style.left=(e[0]-f[0]+a.offsetLeft)+"px"}if(a.setTop){b.style.top=(e[1]-f[1]+a.offsetTop)+"px"}if(a.setWidth){b.style.width=d.offsetWidth+"px"}if(a.setHeight){b.style.height=d.offsetHeight+"px"}return b}};Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants});Element._attributeTranslations={write:{names:{className:"class",htmlFor:"for"},values:{}}};if(Prototype.Browser.Opera){Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(d,b,c){switch(c){case"left":case"top":case"right":case"bottom":if(d(b,"position")==="static"){return null}case"height":case"width":if(!Element.visible(b)){return null}var e=parseInt(d(b,c),10);if(e!==b["offset"+c.capitalize()]){return e+"px"}var a;if(c==="height"){a=["border-top-width","padding-top","padding-bottom","border-bottom-width"]}else{a=["border-left-width","padding-left","padding-right","border-right-width"]}return a.inject(e,function(f,g){var h=d(b,g);return h===null?f:f-parseInt(h,10)})+"px";default:return d(b,c)}});Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(c,a,b){if(b==="title"){return a.title}return c(a,b)})}else{if(Prototype.Browser.IE){Element.Methods.getOffsetParent=Element.Methods.getOffsetParent.wrap(function(c,b){b=$(b);try{b.offsetParent}catch(f){return $(document.body)}var a=b.getStyle("position");if(a!=="static"){return c(b)}b.setStyle({position:"relative"});var d=c(b);b.setStyle({position:a});return d});$w("positionedOffset viewportOffset").each(function(a){Element.Methods[a]=Element.Methods[a].wrap(function(f,c){c=$(c);try{c.offsetParent}catch(h){return Element._returnOffset(0,0)}var b=c.getStyle("position");if(b!=="static"){return f(c)}var d=c.getOffsetParent();if(d&&d.getStyle("position")==="fixed"){d.setStyle({zoom:1})}c.setStyle({position:"relative"});var g=f(c);c.setStyle({position:b});return g})});Element.Methods.cumulativeOffset=Element.Methods.cumulativeOffset.wrap(function(b,a){try{a.offsetParent}catch(c){return Element._returnOffset(0,0)}return b(a)});Element.Methods.getStyle=function(a,b){a=$(a);b=(b=="float"||b=="cssFloat")?"styleFloat":b.camelize();var c=a.style[b];if(!c&&a.currentStyle){c=a.currentStyle[b]}if(b=="opacity"){if(c=(a.getStyle("filter")||"").match(/alpha\(opacity=(.*)\)/)){if(c[1]){return parseFloat(c[1])/100}}return 1}if(c=="auto"){if((b=="width"||b=="height")&&(a.getStyle("display")!="none")){return a["offset"+b.capitalize()]+"px"}return null}return c};Element.Methods.setOpacity=function(b,e){function f(g){return g.replace(/alpha\([^\)]*\)/gi,"")}b=$(b);var a=b.currentStyle;if((a&&!a.hasLayout)||(!a&&b.style.zoom=="normal")){b.style.zoom=1}var d=b.getStyle("filter"),c=b.style;if(e==1||e===""){(d=f(d))?c.filter=d:c.removeAttribute("filter");return b}else{if(e<0.00001){e=0}}c.filter=f(d)+"alpha(opacity="+(e*100)+")";return b};Element._attributeTranslations=(function(){var b="className";var a="for";var c=document.createElement("div");c.setAttribute(b,"x");if(c.className!=="x"){c.setAttribute("class","x");if(c.className==="x"){b="class"}}c=null;c=document.createElement("label");c.setAttribute(a,"x");if(c.htmlFor!=="x"){c.setAttribute("htmlFor","x");if(c.htmlFor==="x"){a="htmlFor"}}c=null;return{read:{names:{"class":b,className:b,"for":a,htmlFor:a},values:{_getAttr:function(d,e){return d.getAttribute(e)},_getAttr2:function(d,e){return d.getAttribute(e,2)},_getAttrNode:function(d,f){var e=d.getAttributeNode(f);return e?e.value:""},_getEv:(function(){var d=document.createElement("div");d.onclick=Prototype.emptyFunction;var g=d.getAttribute("onclick");var e;if(String(g).indexOf("{")>-1){e=function(f,h){h=f.getAttribute(h);if(!h){return null}h=h.toString();h=h.split("{")[1];h=h.split("}")[0];return h.strip()}}else{if(g===""){e=function(f,h){h=f.getAttribute(h);if(!h){return null}return h.strip()}}}d=null;return e})(),_flag:function(d,e){return $(d).hasAttribute(e)?e:null},style:function(d){return d.style.cssText.toLowerCase()},title:function(d){return d.title}}}}})();Element._attributeTranslations.write={names:Object.extend({cellpadding:"cellPadding",cellspacing:"cellSpacing"},Element._attributeTranslations.read.names),values:{checked:function(a,b){a.checked=!!b},style:function(a,b){a.style.cssText=b?b:""}}};Element._attributeTranslations.has={};$w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder").each(function(a){Element._attributeTranslations.write.names[a.toLowerCase()]=a;Element._attributeTranslations.has[a.toLowerCase()]=a});(function(a){Object.extend(a,{href:a._getAttr2,src:a._getAttr2,type:a._getAttr,action:a._getAttrNode,disabled:a._flag,checked:a._flag,readonly:a._flag,multiple:a._flag,onload:a._getEv,onunload:a._getEv,onclick:a._getEv,ondblclick:a._getEv,onmousedown:a._getEv,onmouseup:a._getEv,onmouseover:a._getEv,onmousemove:a._getEv,onmouseout:a._getEv,onfocus:a._getEv,onblur:a._getEv,onkeypress:a._getEv,onkeydown:a._getEv,onkeyup:a._getEv,onsubmit:a._getEv,onreset:a._getEv,onselect:a._getEv,onchange:a._getEv})})(Element._attributeTranslations.read.values);if(Prototype.BrowserFeatures.ElementExtensions){(function(){function a(e){var b=e.getElementsByTagName("*"),d=[];for(var c=0,f;f=b[c];c++){if(f.tagName!=="!"){d.push(f)}}return d}Element.Methods.down=function(c,d,b){c=$(c);if(arguments.length==1){return c.firstDescendant()}return Object.isNumber(d)?a(c)[d]:Element.select(c,d)[b||0]}})()}}else{if(Prototype.Browser.Gecko&&/rv:1\.8\.0/.test(navigator.userAgent)){Element.Methods.setOpacity=function(a,b){a=$(a);a.style.opacity=(b==1)?0.999999:(b==="")?"":(b<0.00001)?0:b;return a}}else{if(Prototype.Browser.WebKit){Element.Methods.setOpacity=function(a,b){a=$(a);a.style.opacity=(b==1||b==="")?"":(b<0.00001)?0:b;if(b==1){if(a.tagName.toUpperCase()=="IMG"&&a.width){a.width++;a.width--}else{try{var d=document.createTextNode(" ");a.appendChild(d);a.removeChild(d)}catch(c){}}}return a};Element.Methods.cumulativeOffset=function(b){var a=0,c=0;do{a+=b.offsetTop||0;c+=b.offsetLeft||0;if(b.offsetParent==document.body){if(Element.getStyle(b,"position")=="absolute"){break}}b=b.offsetParent}while(b);return Element._returnOffset(c,a)}}}}}if("outerHTML"in document.documentElement){Element.Methods.replace=function(c,e){c=$(c);if(e&&e.toElement){e=e.toElement()}if(Object.isElement(e)){c.parentNode.replaceChild(e,c);return c}e=Object.toHTML(e);var d=c.parentNode,b=d.tagName.toUpperCase();if(Element._insertionTranslations.tags[b]){var f=c.next();var a=Element._getContentFromAnonymousElement(b,e.stripScripts());d.removeChild(c);if(f){a.each(function(g){d.insertBefore(g,f)})}else{a.each(function(g){d.appendChild(g)})}}else{c.outerHTML=e.stripScripts()}e.evalScripts.bind(e).defer();return c}}Element._returnOffset=function(b,c){var a=[b,c];a.left=b;a.top=c;return a};Element._getContentFromAnonymousElement=function(c,b){var d=new Element("div"),a=Element._insertionTranslations.tags[c];if(a){d.innerHTML=a[0]+b+a[1];a[2].times(function(){d=d.firstChild})}else{d.innerHTML=b}return $A(d.childNodes)};Element._insertionTranslations={before:function(a,b){a.parentNode.insertBefore(b,a)},top:function(a,b){a.insertBefore(b,a.firstChild)},bottom:function(a,b){a.appendChild(b)},after:function(a,b){a.parentNode.insertBefore(b,a.nextSibling)},tags:{TABLE:["<table>","</table>",1],TBODY:["<table><tbody>","</tbody></table>",2],TR:["<table><tbody><tr>","</tr></tbody></table>",3],TD:["<table><tbody><tr><td>","</td></tr></tbody></table>",4],SELECT:["<select>","</select>",1]}};(function(){var a=Element._insertionTranslations.tags;Object.extend(a,{THEAD:a.TBODY,TFOOT:a.TBODY,TH:a.TD})})();Element.Methods.Simulated={hasAttribute:function(a,c){c=Element._attributeTranslations.has[c]||c;var b=$(a).getAttributeNode(c);return!!(b&&b.specified)}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);(function(a){if(!Prototype.BrowserFeatures.ElementExtensions&&a.__proto__){window.HTMLElement={};window.HTMLElement.prototype=a.__proto__;Prototype.BrowserFeatures.ElementExtensions=true}a=null})(document.createElement("div"));Element.extend=(function(){function c(g){if(typeof window.Element!="undefined"){var i=window.Element.prototype;if(i){var k="_"+(Math.random()+"").slice(2);var h=document.createElement(g);i[k]="x";var j=(h[k]!=="x");delete i[k];h=null;return j}}return false}function b(h,g){for(var j in g){var i=g[j];if(Object.isFunction(i)&&!(j in h)){h[j]=i.methodize()}}}var d=c("object");if(Prototype.BrowserFeatures.SpecificElementExtensions){if(d){return function(h){if(h&&typeof h._extendedByPrototype=="undefined"){var g=h.tagName;if(g&&(/^(?:object|applet|embed)$/i.test(g))){b(h,Element.Methods);b(h,Element.Methods.Simulated);b(h,Element.Methods.ByTag[g.toUpperCase()])}}return h}}return Prototype.K}var a={},e=Element.Methods.ByTag;var f=Object.extend(function(i){if(!i||typeof i._extendedByPrototype!="undefined"||i.nodeType!=1||i==window){return i}var g=Object.clone(a),h=i.tagName.toUpperCase();if(e[h]){Object.extend(g,e[h])}b(i,g);i._extendedByPrototype=Prototype.emptyFunction;return i},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(a,Element.Methods);Object.extend(a,Element.Methods.Simulated)}}});f.refresh();return f})();Element.hasAttribute=function(a,b){if(a.hasAttribute){return a.hasAttribute(b)}return Element.Methods.Simulated.hasAttribute(a,b)};Element.addMethods=function(c){var i=Prototype.BrowserFeatures,d=Element.Methods.ByTag;if(!c){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{FORM:Object.clone(Form.Methods),INPUT:Object.clone(Form.Element.Methods),SELECT:Object.clone(Form.Element.Methods),TEXTAREA:Object.clone(Form.Element.Methods)})}if(arguments.length==2){var b=c;c=arguments[1]}if(!b){Object.extend(Element.Methods,c||{})}else{if(Object.isArray(b)){b.each(g)}else{g(b)}}function g(k){k=k.toUpperCase();if(!Element.Methods.ByTag[k]){Element.Methods.ByTag[k]={}}Object.extend(Element.Methods.ByTag[k],c)}function a(m,l,k){k=k||false;for(var o in m){var n=m[o];if(!Object.isFunction(n)){continue}if(!k||!(o in l)){l[o]=n.methodize()}}}function e(n){var k;var m={OPTGROUP:"OptGroup",TEXTAREA:"TextArea",P:"Paragraph",FIELDSET:"FieldSet",UL:"UList",OL:"OList",DL:"DList",DIR:"Directory",H1:"Heading",H2:"Heading",H3:"Heading",H4:"Heading",H5:"Heading",H6:"Heading",Q:"Quote",INS:"Mod",DEL:"Mod",A:"Anchor",IMG:"Image",CAPTION:"TableCaption",COL:"TableCol",COLGROUP:"TableCol",THEAD:"TableSection",TFOOT:"TableSection",TBODY:"TableSection",TR:"TableRow",TH:"TableCell",TD:"TableCell",FRAMESET:"FrameSet",IFRAME:"IFrame"};if(m[n]){k="HTML"+m[n]+"Element"}if(window[k]){return window[k]}k="HTML"+n+"Element";if(window[k]){return window[k]}k="HTML"+n.capitalize()+"Element";if(window[k]){return window[k]}var l=document.createElement(n);var o=l.__proto__||l.constructor.prototype;l=null;return o}var h=window.HTMLElement?HTMLElement.prototype:Element.prototype;if(i.ElementExtensions){a(Element.Methods,h);a(Element.Methods.Simulated,h,true)}if(i.SpecificElementExtensions){for(var j in Element.Methods.ByTag){var f=e(j);if(Object.isUndefined(f)){continue}a(d[j],f.prototype)}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh()}Element.cache={}};document.viewport={getDimensions:function(){return{width:this.getWidth(),height:this.getHeight()}},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)}};(function(b){var g=Prototype.Browser,e=document,c,d={};function a(){if(g.WebKit&&!e.evaluate){return document}if(g.Opera&&window.parseFloat(window.opera.version())<9.5){return document.body}return document.documentElement}function f(h){if(!c){c=a()}d[h]="client"+h;b["get"+h]=function(){return c[d[h]]};return b["get"+h]()}b.getWidth=f.curry("Width");b.getHeight=f.curry("Height")})(document.viewport);Element.Storage={UID:1};Element.addMethods({getStorage:function(b){if(!(b=$(b))){return}var a;if(b===window){a=0}else{if(typeof b._prototypeUID==="undefined"){b._prototypeUID=[Element.Storage.UID++]}a=b._prototypeUID[0]}if(!Element.Storage[a]){Element.Storage[a]=$H()}return Element.Storage[a]},store:function(b,a,c){if(!(b=$(b))){return}if(arguments.length===2){Element.getStorage(b).update(a)}else{Element.getStorage(b).set(a,c)}return b},retrieve:function(c,b,a){if(!(c=$(c))){return}var e=Element.getStorage(c),d=e.get(b);if(Object.isUndefined(d)){e.set(b,a);d=a}return d},clone:function(c,a){if(!(c=$(c))){return}var e=c.cloneNode(a);e._prototypeUID=void 0;if(a){var d=Element.select(e,"*"),b=d.length;while(b--){d[b]._prototypeUID=void 0}}return Element.extend(e)}});var Selector=Class.create({initialize:function(a){this.expression=a.strip();if(this.shouldUseSelectorsAPI()){this.mode="selectorsAPI"}else{if(this.shouldUseXPath()){this.mode="xpath";this.compileXPathMatcher()}else{this.mode="normal";this.compileMatcher()}}},shouldUseXPath:(function(){var a=(function(){var e=false;if(document.evaluate&&window.XPathResult){var d=document.createElement("div");d.innerHTML="<ul><li></li></ul><div><ul><li></li></ul></div>";var c=".//*[local-name()='ul' or local-name()='UL']//*[local-name()='li' or local-name()='LI']";var b=document.evaluate(c,d,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);e=(b.snapshotLength!==2);d=null}return e})();return function(){if(!Prototype.BrowserFeatures.XPath){return false}var b=this.expression;if(Prototype.Browser.WebKit&&(b.include("-of-type")||b.include(":empty"))){return false}if((/(\[[\w-]*?:|:checked)/).test(b)){return false}if(a){return false}return true}})(),shouldUseSelectorsAPI:function(){if(!Prototype.BrowserFeatures.SelectorsAPI){return false}if(Selector.CASE_INSENSITIVE_CLASS_NAMES){return false}if(!Selector._div){Selector._div=new Element("div")}try{Selector._div.querySelector(this.expression)}catch(a){return false}return true},compileMatcher:function(){var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m,len=ps.length,name;if(Selector._cache[e]){this.matcher=Selector._cache[e];return}this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i=0;i<len;i++){p=ps[i].re;name=ps[i].name;if(m=e.match(p)){this.matcher.push(Object.isFunction(c[name])?c[name](m):new Template(c[name]).evaluate(m));e=e.replace(m[0],"");break}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher},compileXPathMatcher:function(){var h=this.expression,j=Selector.patterns,c=Selector.xpath,g,b,a=j.length,d;if(Selector._cache[h]){this.xpath=Selector._cache[h];return}this.matcher=[".//*"];while(h&&g!=h&&(/\S/).test(h)){g=h;for(var f=0;f<a;f++){d=j[f].name;if(b=h.match(j[f].re)){this.matcher.push(Object.isFunction(c[d])?c[d](b):new Template(c[d]).evaluate(b));h=h.replace(b[0],"");break}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath},findElements:function(a){a=a||document;var c=this.expression,b;switch(this.mode){case"selectorsAPI":if(a!==document){var d=a.id,f=$(a).identify();f=f.replace(/([\.:])/g,"\\$1");c="#"+f+" "+c}b=$A(a.querySelectorAll(c)).map(Element.extend);a.id=d;return b;case"xpath":return document._getElementsByXPath(this.xpath,a);default:return this.matcher(a)}},match:function(k){this.tokens=[];var q=this.expression,a=Selector.patterns,f=Selector.assertions;var b,d,g,o=a.length,c;while(q&&b!==q&&(/\S/).test(q)){b=q;for(var j=0;j<o;j++){d=a[j].re;c=a[j].name;if(g=q.match(d)){if(f[c]){this.tokens.push([c,Object.clone(g)]);q=q.replace(g[0],"")}else{return this.findElements(document).include(k)}}}}var n=true,c,l;for(var j=0,h;h=this.tokens[j];j++){c=h[0],l=h[1];if(!Selector.assertions[c](k,l)){n=false;break}}return n},toString:function(){return this.expression},inspect:function(){return"#<Selector:"+this.expression.inspect()+">"}});if(Prototype.BrowserFeatures.SelectorsAPI&&document.compatMode==="BackCompat"){Selector.CASE_INSENSITIVE_CLASS_NAMES=(function(){var c=document.createElement("div"),a=document.createElement("span");c.id="prototype_test_id";a.className="Test";c.appendChild(a);var b=(c.querySelector("#prototype_test_id .test")!==null);c=a=null;return b})()}Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(a){if(a[1]=="*"){return""}return"[local-name()='"+a[1].toLowerCase()+"' or local-name()='"+a[1].toUpperCase()+"']"},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(a){a[1]=a[1].toLowerCase();return new Template("[@#{1}]").evaluate(a)},attr:function(a){a[1]=a[1].toLowerCase();a[3]=a[5]||a[6];return new Template(Selector.xpath.operators[a[2]]).evaluate(a)},pseudo:function(a){var b=Selector.xpath.pseudos[a[1]];if(!b){return""}if(Object.isFunction(b)){return b(a)}return new Template(Selector.xpath.pseudos[a[1]]).evaluate(a)},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]",empty:"[count(*) = 0 and (count(text()) = 0)]",checked:"[@checked]",disabled:"[(@disabled) and (@type!='hidden')]",enabled:"[not(@disabled) and (@type!='hidden')]",not:function(f){var j=f[6],c=Selector.patterns,k=Selector.xpath,a,l,h=c.length,b;var d=[];while(j&&a!=j&&(/\S/).test(j)){a=j;for(var g=0;g<h;g++){b=c[g].name;if(f=j.match(c[g].re)){l=Object.isFunction(k[b])?k[b](f):new Template(k[b]).evaluate(f);d.push("("+l.substring(1,l.length-1)+")");j=j.replace(f[0],"");break}}}return"[not("+d.join(" and ")+")]"},"nth-child":function(a){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",a)},"nth-last-child":function(a){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",a)},"nth-of-type":function(a){return Selector.xpath.pseudos.nth("position() ",a)},"nth-last-of-type":function(a){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",a)},"first-of-type":function(a){a[6]="1";return Selector.xpath.pseudos["nth-of-type"](a)},"last-of-type":function(a){a[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](a)},"only-of-type":function(a){var b=Selector.xpath.pseudos;return b["first-of-type"](a)+b["last-of-type"](a)},nth:function(g,e){var h,i=e[6],d;if(i=="even"){i="2n+0"}if(i=="odd"){i="2n+1"}if(h=i.match(/^(\d+)$/)){return"["+g+"= "+h[1]+"]"}if(h=i.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(h[1]=="-"){h[1]=-1}var f=h[1]?Number(h[1]):1;var c=h[2]?Number(h[2]):0;d="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(d).evaluate({fragment:g,a:f,b:c})}}}},criteria:{tagName:'n = h.tagName(n, r, "#{1}", c);      c = false;',className:'n = h.className(n, r, "#{1}", c);    c = false;',id:'n = h.id(n, r, "#{1}", c);           c = false;',attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',attr:function(a){a[3]=(a[5]||a[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(a)},pseudo:function(a){if(a[6]){a[6]=a[6].replace(/"/g,'\\"')}return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(a)},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:[{name:"laterSibling",re:/^\s*~\s*/},{name:"child",re:/^\s*>\s*/},{name:"adjacent",re:/^\s*\+\s*/},{name:"descendant",re:/^\s/},{name:"tagName",re:/^\s*(\*|[\w\-]+)(\b|$)?/},{name:"id",re:/^#([\w\-\*]+)(\b|$)/},{name:"className",re:/^\.([\w\-\*]+)(\b|$)/},{name:"pseudo",re:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/},{name:"attrPresence",re:/^\[((?:[\w-]+:)?[\w-]+)\]/},{name:"attr",re:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/}],assertions:{tagName:function(a,b){return b[1].toUpperCase()==a.tagName.toUpperCase()},className:function(a,b){return Element.hasClassName(a,b[1])},id:function(a,b){return a.id===b[1]},attrPresence:function(a,b){return Element.hasAttribute(a,b[1])},attr:function(b,c){var a=Element.readAttribute(b,c[1]);return a&&Selector.operators[c[2]](a,c[5]||c[6])}},handlers:{concat:function(d,c){for(var e=0,f;f=c[e];e++){d.push(f)}return d},mark:function(a){var d=Prototype.emptyFunction;for(var b=0,c;c=a[b];b++){c._countedByPrototype=d}return a},unmark:(function(){var a=(function(){var b=document.createElement("div"),e=false,d="_countedByPrototype",c="x";b[d]=c;e=(b.getAttribute(d)===c);b=null;return e})();return a?function(b){for(var c=0,d;d=b[c];c++){d.removeAttribute("_countedByPrototype")}return b}:function(b){for(var c=0,d;d=b[c];c++){d._countedByPrototype=void 0}return b}})(),index:function(a,d,g){a._countedByPrototype=Prototype.emptyFunction;if(d){for(var b=a.childNodes,e=b.length-1,c=1;e>=0;e--){var f=b[e];if(f.nodeType==1&&(!g||f._countedByPrototype)){f.nodeIndex=c++}}}else{for(var e=0,c=1,b=a.childNodes;f=b[e];e++){if(f.nodeType==1&&(!g||f._countedByPrototype)){f.nodeIndex=c++}}}},unique:function(b){if(b.length==0){return b}var d=[],e;for(var c=0,a=b.length;c<a;c++){if(typeof(e=b[c])._countedByPrototype=="undefined"){e._countedByPrototype=Prototype.emptyFunction;d.push(Element.extend(e))}}return Selector.handlers.unmark(d)},descendant:function(a){var d=Selector.handlers;for(var c=0,b=[],e;e=a[c];c++){d.concat(b,e.getElementsByTagName("*"))}return b},child:function(a){var e=Selector.handlers;for(var d=0,c=[],f;f=a[d];d++){for(var b=0,g;g=f.childNodes[b];b++){if(g.nodeType==1&&g.tagName!="!"){c.push(g)}}}return c},adjacent:function(a){for(var c=0,b=[],e;e=a[c];c++){var d=this.nextElementSibling(e);if(d){b.push(d)}}return b},laterSibling:function(a){var d=Selector.handlers;for(var c=0,b=[],e;e=a[c];c++){d.concat(b,Element.nextSiblings(e))}return b},nextElementSibling:function(a){while(a=a.nextSibling){if(a.nodeType==1){return a}}return null},previousElementSibling:function(a){while(a=a.previousSibling){if(a.nodeType==1){return a}}return null},tagName:function(a,j,c,b){var k=c.toUpperCase();var e=[],g=Selector.handlers;if(a){if(b){if(b=="descendant"){for(var f=0,d;d=a[f];f++){g.concat(e,d.getElementsByTagName(c))}return e}else{a=this[b](a)}if(c=="*"){return a}}for(var f=0,d;d=a[f];f++){if(d.tagName.toUpperCase()===k){e.push(d)}}return e}else{return j.getElementsByTagName(c)}},id:function(a,l,b,c){var k=$(b),g=Selector.handlers;if(l==document){if(!k){return[]}if(!a){return[k]}}else{if(!l.sourceIndex||l.sourceIndex<1){var a=l.getElementsByTagName("*");for(var e=0,d;d=a[e];e++){if(d.id===b){return[d]}}}}if(a){if(c){if(c=="child"){for(var f=0,d;d=a[f];f++){if(k.parentNode==d){return[k]}}}else{if(c=="descendant"){for(var f=0,d;d=a[f];f++){if(Element.descendantOf(k,d)){return[k]}}}else{if(c=="adjacent"){for(var f=0,d;d=a[f];f++){if(Selector.handlers.previousElementSibling(k)==d){return[k]}}}else{a=g[c](a)}}}}for(var f=0,d;d=a[f];f++){if(d==k){return[k]}}return[]}return(k&&Element.descendantOf(k,l))?[k]:[]},className:function(b,a,c,d){if(b&&d){b=this[d](b)}return Selector.handlers.byClassName(b,a,c)},byClassName:function(c,b,f){if(!c){c=Selector.handlers.descendant([b])}var h=" "+f+" ";for(var e=0,d=[],g,a;g=c[e];e++){a=g.className;if(a.length==0){continue}if(a==f||(" "+a+" ").include(h)){d.push(g)}}return d},attrPresence:function(c,b,a,g){if(!c){c=b.getElementsByTagName("*")}if(c&&g){c=this[g](c)}var e=[];for(var d=0,f;f=c[d];d++){if(Element.hasAttribute(f,a)){e.push(f)}}return e},attr:function(a,j,h,k,c,b){if(!a){a=j.getElementsByTagName("*")}if(a&&b){a=this[b](a)}var l=Selector.operators[c],f=[];for(var e=0,d;d=a[e];e++){var g=Element.readAttribute(d,h);if(g===null){continue}if(l(g,k)){f.push(d)}}return f},pseudo:function(b,c,e,a,d){if(b&&d){b=this[d](b)}if(!b){b=a.getElementsByTagName("*")}return Selector.pseudos[c](b,e,a)}},pseudos:{"first-child":function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(Selector.handlers.previousElementSibling(e)){continue}c.push(e)}return c},"last-child":function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(Selector.handlers.nextElementSibling(e)){continue}c.push(e)}return c},"only-child":function(b,g,a){var e=Selector.handlers;for(var d=0,c=[],f;f=b[d];d++){if(!e.previousElementSibling(f)&&!e.nextElementSibling(f)){c.push(f)}}return c},"nth-child":function(b,c,a){return Selector.pseudos.nth(b,c,a)},"nth-last-child":function(b,c,a){return Selector.pseudos.nth(b,c,a,true)},"nth-of-type":function(b,c,a){return Selector.pseudos.nth(b,c,a,false,true)},"nth-last-of-type":function(b,c,a){return Selector.pseudos.nth(b,c,a,true,true)},"first-of-type":function(b,c,a){return Selector.pseudos.nth(b,"1",a,false,true)},"last-of-type":function(b,c,a){return Selector.pseudos.nth(b,"1",a,true,true)},"only-of-type":function(b,d,a){var c=Selector.pseudos;return c["last-of-type"](c["first-of-type"](b,d,a),d,a)},getIndices:function(d,c,e){if(d==0){return c>0?[c]:[]}return $R(1,e).inject([],function(a,b){if(0==(b-c)%d&&(b-c)/d>=0){a.push(b)}return a})},nth:function(c,s,u,r,e){if(c.length==0){return[]}if(s=="even"){s="2n+0"}if(s=="odd"){s="2n+1"}var q=Selector.handlers,p=[],d=[],g;q.mark(c);for(var o=0,f;f=c[o];o++){if(!f.parentNode._countedByPrototype){q.index(f.parentNode,r,e);d.push(f.parentNode)}}if(s.match(/^\d+$/)){s=Number(s);for(var o=0,f;f=c[o];o++){if(f.nodeIndex==s){p.push(f)}}}else{if(g=s.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(g[1]=="-"){g[1]=-1}var v=g[1]?Number(g[1]):1;var t=g[2]?Number(g[2]):0;var w=Selector.pseudos.getIndices(v,t,c.length);for(var o=0,f,k=w.length;f=c[o];o++){for(var n=0;n<k;n++){if(f.nodeIndex==w[n]){p.push(f)}}}}}q.unmark(c);q.unmark(d);return p},empty:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.tagName=="!"||e.firstChild){continue}c.push(e)}return c},not:function(a,d,k){var g=Selector.handlers,l,c;var j=new Selector(d).findElements(k);g.mark(j);for(var f=0,e=[],b;b=a[f];f++){if(!b._countedByPrototype){e.push(b)}}g.unmark(j);return e},enabled:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(!e.disabled&&(!e.type||e.type!=="hidden")){c.push(e)}}return c},disabled:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.disabled){c.push(e)}}return c},checked:function(b,f,a){for(var d=0,c=[],e;e=b[d];d++){if(e.checked){c.push(e)}}return c}},operators:{"=":function(b,a){return b==a},"!=":function(b,a){return b!=a},"^=":function(b,a){return b==a||b&&b.startsWith(a)},"$=":function(b,a){return b==a||b&&b.endsWith(a)},"*=":function(b,a){return b==a||b&&b.include(a)},"~=":function(b,a){return(" "+b+" ").include(" "+a+" ")},"|=":function(b,a){return("-"+(b||"").toUpperCase()+"-").include("-"+(a||"").toUpperCase()+"-")}},split:function(b){var a=[];b.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(c){a.push(c[1].strip())});return a},matchElements:function(f,g){var e=$$(g),d=Selector.handlers;d.mark(e);for(var c=0,b=[],a;a=f[c];c++){if(a._countedByPrototype){b.push(a)}}d.unmark(e);return b},findElement:function(b,c,a){if(Object.isNumber(c)){a=c;c=false}return Selector.matchElements(b,c||"*")[a||0]},findChildElements:function(e,g){g=Selector.split(g.join(","));var d=[],f=Selector.handlers;for(var c=0,b=g.length,a;c<b;c++){a=new Selector(g[c].strip());f.concat(d,a.findElements(e))}return(b>1)?f.unique(d):d}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(d,c){for(var e=0,f;f=c[e];e++){if(f.tagName!=="!"){d.push(f)}}return d}})}function $$(){return Selector.findChildElements(document,$A(arguments))}var Form={reset:function(a){a=$(a);a.reset();return a},serializeElements:function(g,b){if(typeof b!="object"){b={hash:!!b}}else{if(Object.isUndefined(b.hash)){b.hash=true}}var c,f,a=false,e=b.submit;var d=g.inject({},function(h,i){if(!i.disabled&&i.name){c=i.name;f=$(i).getValue();if(f!=null&&i.type!="file"&&(i.type!="submit"||(!a&&e!==false&&(!e||c==e)&&(a=true)))){if(c in h){if(!Object.isArray(h[c])){h[c]=[h[c]]}h[c].push(f)}else{h[c]=f}}}return h});return b.hash?d:Object.toQueryString(d)}};Form.Methods={serialize:function(b,a){return Form.serializeElements(Form.getElements(b),a)},getElements:function(e){var f=$(e).getElementsByTagName("*"),d,a=[],c=Form.Element.Serializers;for(var b=0;d=f[b];b++){a.push(d)}return a.inject([],function(g,h){if(c[h.tagName.toLowerCase()]){g.push(Element.extend(h))}return g})},getInputs:function(g,c,d){g=$(g);var a=g.getElementsByTagName("input");if(!c&&!d){return $A(a).map(Element.extend)}for(var e=0,h=[],f=a.length;e<f;e++){var b=a[e];if((c&&b.type!=c)||(d&&b.name!=d)){continue}h.push(Element.extend(b))}return h},disable:function(a){a=$(a);Form.getElements(a).invoke("disable");return a},enable:function(a){a=$(a);Form.getElements(a).invoke("enable");return a},findFirstElement:function(b){var c=$(b).getElements().findAll(function(d){return"hidden"!=d.type&&!d.disabled});var a=c.findAll(function(d){return d.hasAttribute("tabIndex")&&d.tabIndex>=0}).sortBy(function(d){return d.tabIndex}).first();return a?a:c.find(function(d){return/^(?:input|select|textarea)$/i.test(d.tagName)})},focusFirstElement:function(a){a=$(a);a.findFirstElement().activate();return a},request:function(b,a){b=$(b),a=Object.clone(a||{});var d=a.parameters,c=b.readAttribute("action")||"";if(c.blank()){c=window.location.href}a.parameters=b.serialize(true);if(d){if(Object.isString(d)){d=d.toQueryParams()}Object.extend(a.parameters,d)}if(b.hasAttribute("method")&&!a.method){a.method=b.method}return new Ajax.Request(c,a)}};Form.Element={focus:function(a){$(a).focus();return a},select:function(a){$(a).select();return a}};Form.Element.Methods={serialize:function(a){a=$(a);if(!a.disabled&&a.name){var b=a.getValue();if(b!=undefined){var c={};c[a.name]=b;return Object.toQueryString(c)}}return""},getValue:function(a){a=$(a);var b=a.tagName.toLowerCase();return Form.Element.Serializers[b](a)},setValue:function(a,b){a=$(a);var c=a.tagName.toLowerCase();Form.Element.Serializers[c](a,b);return a},clear:function(a){$(a).value="";return a},present:function(a){return $(a).value!=""},activate:function(a){a=$(a);try{a.focus();if(a.select&&(a.tagName.toLowerCase()!="input"||!(/^(?:button|reset|submit)$/i.test(a.type)))){a.select()}}catch(b){}return a},disable:function(a){a=$(a);a.disabled=true;return a},enable:function(a){a=$(a);a.disabled=false;return a}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(a,b){switch(a.type.toLowerCase()){case"checkbox":case"radio":return Form.Element.Serializers.inputSelector(a,b);default:return Form.Element.Serializers.textarea(a,b)}},inputSelector:function(a,b){if(Object.isUndefined(b)){return a.checked?a.value:null}else{a.checked=!!b}},textarea:function(a,b){if(Object.isUndefined(b)){return a.value}else{a.value=b}},select:function(c,f){if(Object.isUndefined(f)){return this[c.type=="select-one"?"selectOne":"selectMany"](c)}else{var b,d,g=!Object.isArray(f);for(var a=0,e=c.length;a<e;a++){b=c.options[a];d=this.optionValue(b);if(g){if(d==f){b.selected=true;return}}else{b.selected=f.include(d)}}}},selectOne:function(b){var a=b.selectedIndex;return a>=0?this.optionValue(b.options[a]):null},selectMany:function(d){var a,e=d.length;if(!e){return null}for(var c=0,a=[];c<e;c++){var b=d.options[c];if(b.selected){a.push(this.optionValue(b))}}return a},optionValue:function(a){return Element.extend(a).hasAttribute("value")?a.value:a.text}};Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function($super,a,b,c){$super(c,b);this.element=$(a);this.lastValue=this.getValue()},execute:function(){var a=this.getValue();if(Object.isString(this.lastValue)&&Object.isString(a)?this.lastValue!=a:String(this.lastValue)!=String(a)){this.callback(this.element,a);this.lastValue=a}}});Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}});Abstract.EventObserver=Class.create({initialize:function(a,b){this.element=$(a);this.callback=b;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=="form"){this.registerFormCallbacks()}else{this.registerCallback(this.element)}},onElementEvent:function(){var a=this.getValue();if(this.lastValue!=a){this.callback(this.element,a);this.lastValue=a}},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(a){if(a.type){switch(a.type.toLowerCase()){case"checkbox":case"radio":Event.observe(a,"click",this.onElementEvent.bind(this));break;default:Event.observe(a,"change",this.onElementEvent.bind(this));break}}}});Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}});Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}});(function(){var v={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{}};var e=document.documentElement;var w="onmouseenter"in e&&"onmouseleave"in e;var o;if(Prototype.Browser.IE){var h={0:1,1:4,2:2};o=function(y,x){return y.button===h[x]}}else{if(Prototype.Browser.WebKit){o=function(y,x){switch(x){case 0:return y.which==1&&!y.metaKey;case 1:return y.which==1&&y.metaKey;default:return false}}}else{o=function(y,x){return y.which?(y.which===x+1):(y.button===x)}}}function r(x){return o(x,0)}function q(x){return o(x,1)}function k(x){return o(x,2)}function c(z){z=v.extend(z);var y=z.target,x=z.type,A=z.currentTarget;if(A&&A.tagName){if(x==="load"||x==="error"||(x==="click"&&A.tagName.toLowerCase()==="input"&&A.type==="radio")){y=A}}if(y.nodeType==Node.TEXT_NODE){y=y.parentNode}return Element.extend(y)}function m(y,A){var x=v.element(y);if(!A){return x}var z=[x].concat(x.ancestors());return Selector.findElement(z,A,0)}function p(x){return{x:b(x),y:a(x)}}function b(z){var y=document.documentElement,x=document.body||{scrollLeft:0};return z.pageX||(z.clientX+(y.scrollLeft||x.scrollLeft)-(y.clientLeft||0))}function a(z){var y=document.documentElement,x=document.body||{scrollTop:0};return z.pageY||(z.clientY+(y.scrollTop||x.scrollTop)-(y.clientTop||0))}function n(x){v.extend(x);x.preventDefault();x.stopPropagation();x.stopped=true}v.Methods={isLeftClick:r,isMiddleClick:q,isRightClick:k,element:c,findElement:m,pointer:p,pointerX:b,pointerY:a,stop:n};var t=Object.keys(v.Methods).inject({},function(x,y){x[y]=v.Methods[y].methodize();return x});if(Prototype.Browser.IE){function g(y){var x;switch(y.type){case"mouseover":x=y.fromElement;break;case"mouseout":x=y.toElement;break;default:return null}return Element.extend(x)}Object.extend(t,{stopPropagation:function(){this.cancelBubble=true},preventDefault:function(){this.returnValue=false},inspect:function(){return"[object Event]"}});v.extend=function(y,x){if(!y){return false}if(y._extendedByPrototype){return y}y._extendedByPrototype=Prototype.emptyFunction;var z=v.pointer(y);Object.extend(y,{target:y.srcElement||x,relatedTarget:g(y),pageX:z.x,pageY:z.y});return Object.extend(y,t)}}else{v.prototype=window.Event.prototype||document.createEvent("HTMLEvents").__proto__;Object.extend(v.prototype,t);v.extend=Prototype.K}function l(B,A,C){var z=Element.retrieve(B,"prototype_event_registry");if(Object.isUndefined(z)){d.push(B);z=Element.retrieve(B,"prototype_event_registry",$H())}var x=z.get(A);if(Object.isUndefined(x)){x=[];z.set(A,x)}if(x.pluck("handler").include(C)){return false}var y;if(A.include(":")){y=function(D){if(Object.isUndefined(D.eventName)){return false}if(D.eventName!==A){return false}v.extend(D,B);C.call(B,D)}}else{if(!w&&(A==="mouseenter"||A==="mouseleave")){if(A==="mouseenter"||A==="mouseleave"){y=function(E){v.extend(E,B);var D=E.relatedTarget;while(D&&D!==B){try{D=D.parentNode}catch(F){D=B}}if(D===B){return}C.call(B,E)}}}else{y=function(D){v.extend(D,B);C.call(B,D)}}}y.handler=C;x.push(y);return y}function f(){for(var x=0,y=d.length;x<y;x++){v.stopObserving(d[x]);d[x]=null}}var d=[];if(Prototype.Browser.IE){window.attachEvent("onunload",f)}if(Prototype.Browser.WebKit){window.addEventListener("unload",Prototype.emptyFunction,false)}var j=Prototype.K;if(!w){j=function(y){var x={mouseenter:"mouseover",mouseleave:"mouseout"};return y in x?x[y]:y}}function s(A,z,B){A=$(A);var y=l(A,z,B);if(!y){return A}if(z.include(":")){if(A.addEventListener){A.addEventListener("dataavailable",y,false)}else{A.attachEvent("ondataavailable",y);A.attachEvent("onfilterchange",y)}}else{var x=j(z);if(A.addEventListener){A.addEventListener(x,y,false)}else{A.attachEvent("on"+x,y)}}return A}function i(C,A,D){C=$(C);var z=Element.retrieve(C,"prototype_event_registry");if(Object.isUndefined(z)){return C}if(A&&!D){var B=z.get(A);if(Object.isUndefined(B)){return C}B.each(function(E){Element.stopObserving(C,A,E.handler)});return C}else{if(!A){z.each(function(G){var E=G.key,F=G.value;F.each(function(H){Element.stopObserving(C,E,H.handler)})});return C}}var B=z.get(A);if(!B){return}var y=B.find(function(E){return E.handler===D});if(!y){return C}var x=j(A);if(A.include(":")){if(C.removeEventListener){C.removeEventListener("dataavailable",y,false)}else{C.detachEvent("ondataavailable",y);C.detachEvent("onfilterchange",y)}}else{if(C.removeEventListener){C.removeEventListener(x,y,false)}else{C.detachEvent("on"+x,y)}}z.set(A,B.without(y));return C}function u(A,z,y,x){A=$(A);if(Object.isUndefined(x)){x=true}if(A==document&&document.createEvent&&!A.dispatchEvent){A=document.documentElement}var B;if(document.createEvent){B=document.createEvent("HTMLEvents");B.initEvent("dataavailable",true,true)}else{B=document.createEventObject();B.eventType=x?"ondataavailable":"onfilterchange"}B.eventName=z;B.memo=y||{};if(document.createEvent){A.dispatchEvent(B)}else{A.fireEvent(B.eventType,B)}return v.extend(B)}Object.extend(v,v.Methods);Object.extend(v,{fire:u,observe:s,stopObserving:i});Element.addMethods({fire:u,observe:s,stopObserving:i});Object.extend(document,{fire:u.methodize(),observe:s.methodize(),stopObserving:i.methodize(),loaded:false});if(window.Event){Object.extend(window.Event,v)}else{window.Event=v}})();(function(){var d;function a(){if(document.loaded){return}if(d){window.clearTimeout(d)}document.loaded=true;document.fire("dom:loaded")}function c(){if(document.readyState==="complete"){document.stopObserving("readystatechange",c);a()}}function b(){try{document.documentElement.doScroll("left")}catch(f){d=b.defer();return}a()}if(document.addEventListener){document.addEventListener("DOMContentLoaded",a,false)}else{document.observe("readystatechange",c);if(window==top){d=b.defer()}}Event.observe(window,"load",a)})();Element.addMethods();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(a,b){return Element.insert(a,{before:b})},Top:function(a,b){return Element.insert(a,{top:b})},Bottom:function(a,b){return Element.insert(a,{bottom:b})},After:function(a,b){return Element.insert(a,{after:b})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(b,a,c){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(b,a,c)}this.xcomp=a;this.ycomp=c;this.offset=Element.cumulativeOffset(b);return(c>=this.offset[1]&&c<this.offset[1]+b.offsetHeight&&a>=this.offset[0]&&a<this.offset[0]+b.offsetWidth)},withinIncludingScrolloffsets:function(b,a,d){var c=Element.cumulativeScrollOffset(b);this.xcomp=a+c[0]-this.deltaX;this.ycomp=d+c[1]-this.deltaY;this.offset=Element.cumulativeOffset(b);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+b.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+b.offsetWidth)},overlap:function(b,a){if(!b){return 0}if(b=="vertical"){return((this.offset[1]+a.offsetHeight)-this.ycomp)/a.offsetHeight}if(b=="horizontal"){return((this.offset[0]+a.offsetWidth)-this.xcomp)/a.offsetWidth}},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(a){Position.prepare();return Element.absolutize(a)},relativize:function(a){Position.prepare();return Element.relativize(a)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(b,c,a){a=a||{};return Element.clonePosition(c,b,a)}};if(!document.getElementsByClassName){document.getElementsByClassName=function(b){function a(c){return c.blank()?null:"[contains(concat(' ', @class, ' '), ' "+c+" ')]"}b.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(c,e){e=e.toString().strip();var d=/\s/.test(e)?$w(e).map(a).join(""):a(e);return d?document._getElementsByXPath(".//*"+d,c):[]}:function(e,f){f=f.toString().strip();var g=[],h=(/\s/.test(f)?$w(f):null);if(!h&&!f){return g}var c=$(e).getElementsByTagName("*");f=" "+f+" ";for(var d=0,k,j;k=c[d];d++){if(k.className&&(j=" "+k.className+" ")&&(j.include(f)||(h&&h.all(function(i){return!i.toString().blank()&&j.include(" "+i+" ")})))){g.push(Element.extend(k))}}return g};return function(d,c){return $(c||document.body).getElementsByClassName(d)}}(Element.Methods)}Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(a){this.element=$(a)},_each:function(a){this.element.className.split(/\s+/).select(function(b){return b.length>0})._each(a)},set:function(a){this.element.className=a},add:function(a){if(this.include(a)){return}this.set($A(this).concat(a).join(" "))},remove:function(a){if(!this.include(a)){return}this.set($A(this).without(a).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);
\ No newline at end of file
diff --git a/js/src/QuickFinder.js b/js/src/QuickFinder.js
index da8594d..dd115b7 100644
--- a/js/src/QuickFinder.js
+++ b/js/src/QuickFinder.js
@@ -15,7 +15,7 @@
  *
  * @author Chuck Hagenbuch <chuck at horde.org>
  *
- * $Horde: mnemo/js/src/QuickFinder.js,v 1.1.2.2 2007/12/22 05:24:23 chuck Exp $
+ * $Horde: mnemo/js/src/QuickFinder.js,v 1.1.2.2 2007-12-22 05:24:23 chuck Exp $
  */
 
 var QuickFinder = {
diff --git a/js/src/prototype.js b/js/src/prototype.js
index 0bb8807..8fc1415 100644
--- a/js/src/prototype.js
+++ b/js/src/prototype.js
@@ -1,5 +1,5 @@
-/*  Prototype JavaScript framework, version 1.6.0.2
- *  (c) 2005-2008 Sam Stephenson
+/*  Prototype JavaScript framework, version 1.6.1
+ *  (c) 2005-2009 Sam Stephenson
  *
  *  Prototype is freely distributable under the terms of an MIT-style license.
  *  For details, see the Prototype web site: http://www.prototypejs.org/
@@ -7,23 +7,43 @@
  *--------------------------------------------------------------------------*/
 
 var Prototype = {
-  Version: '1.6.0.2',
-
-  Browser: {
-    IE:     !!(window.attachEvent && !window.opera),
-    Opera:  !!window.opera,
-    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
-    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
-    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
-  },
+  Version: '1.6.1',
+
+  Browser: (function(){
+    var ua = navigator.userAgent;
+    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
+    return {
+      IE:             !!window.attachEvent && !isOpera,
+      Opera:          isOpera,
+      WebKit:         ua.indexOf('AppleWebKit/') > -1,
+      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
+      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
+    }
+  })(),
 
   BrowserFeatures: {
     XPath: !!document.evaluate,
-    ElementExtensions: !!window.HTMLElement,
-    SpecificElementExtensions:
-      document.createElement('div').__proto__ &&
-      document.createElement('div').__proto__ !==
-        document.createElement('form').__proto__
+    SelectorsAPI: !!document.querySelector,
+    ElementExtensions: (function() {
+      var constructor = window.Element || window.HTMLElement;
+      return !!(constructor && constructor.prototype);
+    })(),
+    SpecificElementExtensions: (function() {
+      if (typeof window.HTMLDivElement !== 'undefined')
+        return true;
+
+      var div = document.createElement('div');
+      var form = document.createElement('form');
+      var isSupported = false;
+
+      if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
+        isSupported = true;
+      }
+
+      div = form = null;
+
+      return isSupported;
+    })()
   },
 
   ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
@@ -37,9 +57,30 @@ if (Prototype.Browser.MobileSafari)
   Prototype.BrowserFeatures.SpecificElementExtensions = false;
 
 
+var Abstract = { };
+
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) { }
+    }
+
+    return returnValue;
+  }
+};
+
 /* Based on Alex Arnell's inheritance implementation. */
-var Class = {
-  create: function() {
+
+var Class = (function() {
+  function subclass() {};
+  function create() {
     var parent = null, properties = $A(arguments);
     if (Object.isFunction(properties[0]))
       parent = properties.shift();
@@ -53,7 +94,6 @@ var Class = {
     klass.subclasses = [];
 
     if (parent) {
-      var subclass = function() { };
       subclass.prototype = parent.prototype;
       klass.prototype = new subclass;
       parent.subclasses.push(klass);
@@ -66,58 +106,67 @@ var Class = {
       klass.prototype.initialize = Prototype.emptyFunction;
 
     klass.prototype.constructor = klass;
-
     return klass;
   }
-};
 
-Class.Methods = {
-  addMethods: function(source) {
+  function addMethods(source) {
     var ancestor   = this.superclass && this.superclass.prototype;
     var properties = Object.keys(source);
 
-    if (!Object.keys({ toString: true }).length)
-      properties.push("toString", "valueOf");
+    if (!Object.keys({ toString: true }).length) {
+      if (source.toString != Object.prototype.toString)
+        properties.push("toString");
+      if (source.valueOf != Object.prototype.valueOf)
+        properties.push("valueOf");
+    }
 
     for (var i = 0, length = properties.length; i < length; i++) {
       var property = properties[i], value = source[property];
       if (ancestor && Object.isFunction(value) &&
           value.argumentNames().first() == "$super") {
-        var method = value, value = Object.extend((function(m) {
-          return function() { return ancestor[m].apply(this, arguments) };
-        })(property).wrap(method), {
-          valueOf:  function() { return method },
-          toString: function() { return method.toString() }
-        });
+        var method = value;
+        value = (function(m) {
+          return function() { return ancestor[m].apply(this, arguments); };
+        })(property).wrap(method);
+
+        value.valueOf = method.valueOf.bind(method);
+        value.toString = method.toString.bind(method);
       }
       this.prototype[property] = value;
     }
 
     return this;
   }
-};
 
-var Abstract = { };
+  return {
+    create: create,
+    Methods: {
+      addMethods: addMethods
+    }
+  };
+})();
+(function() {
 
-Object.extend = function(destination, source) {
-  for (var property in source)
-    destination[property] = source[property];
-  return destination;
-};
+  var _toString = Object.prototype.toString;
 
-Object.extend(Object, {
-  inspect: function(object) {
+  function extend(destination, source) {
+    for (var property in source)
+      destination[property] = source[property];
+    return destination;
+  }
+
+  function inspect(object) {
     try {
-      if (Object.isUndefined(object)) return 'undefined';
+      if (isUndefined(object)) return 'undefined';
       if (object === null) return 'null';
       return object.inspect ? object.inspect() : String(object);
     } catch (e) {
       if (e instanceof RangeError) return '...';
       throw e;
     }
-  },
+  }
 
-  toJSON: function(object) {
+  function toJSON(object) {
     var type = typeof object;
     switch (type) {
       case 'undefined':
@@ -128,127 +177,180 @@ Object.extend(Object, {
 
     if (object === null) return 'null';
     if (object.toJSON) return object.toJSON();
-    if (Object.isElement(object)) return;
+    if (isElement(object)) return;
 
     var results = [];
     for (var property in object) {
-      var value = Object.toJSON(object[property]);
-      if (!Object.isUndefined(value))
+      var value = toJSON(object[property]);
+      if (!isUndefined(value))
         results.push(property.toJSON() + ': ' + value);
     }
 
     return '{' + results.join(', ') + '}';
-  },
+  }
 
-  toQueryString: function(object) {
+  function toQueryString(object) {
     return $H(object).toQueryString();
-  },
+  }
 
-  toHTML: function(object) {
+  function toHTML(object) {
     return object && object.toHTML ? object.toHTML() : String.interpret(object);
-  },
+  }
 
-  keys: function(object) {
-    var keys = [];
+  function keys(object) {
+    var results = [];
     for (var property in object)
-      keys.push(property);
-    return keys;
-  },
+      results.push(property);
+    return results;
+  }
 
-  values: function(object) {
-    var values = [];
+  function values(object) {
+    var results = [];
     for (var property in object)
-      values.push(object[property]);
-    return values;
-  },
+      results.push(object[property]);
+    return results;
+  }
 
-  clone: function(object) {
-    return Object.extend({ }, object);
-  },
+  function clone(object) {
+    return extend({ }, object);
+  }
 
-  isElement: function(object) {
-    return object && object.nodeType == 1;
-  },
+  function isElement(object) {
+    return !!(object && object.nodeType == 1);
+  }
+
+  function isArray(object) {
+    return _toString.call(object) == "[object Array]";
+  }
 
-  isArray: function(object) {
-    return object != null && typeof object == "object" &&
-      'splice' in object && 'join' in object;
-  },
 
-  isHash: function(object) {
+  function isHash(object) {
     return object instanceof Hash;
-  },
+  }
 
-  isFunction: function(object) {
-    return typeof object == "function";
-  },
+  function isFunction(object) {
+    return typeof object === "function";
+  }
 
-  isString: function(object) {
-    return typeof object == "string";
-  },
+  function isString(object) {
+    return _toString.call(object) == "[object String]";
+  }
 
-  isNumber: function(object) {
-    return typeof object == "number";
-  },
+  function isNumber(object) {
+    return _toString.call(object) == "[object Number]";
+  }
 
-  isUndefined: function(object) {
-    return typeof object == "undefined";
+  function isUndefined(object) {
+    return typeof object === "undefined";
   }
-});
 
-Object.extend(Function.prototype, {
-  argumentNames: function() {
-    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
+  extend(Object, {
+    extend:        extend,
+    inspect:       inspect,
+    toJSON:        toJSON,
+    toQueryString: toQueryString,
+    toHTML:        toHTML,
+    keys:          keys,
+    values:        values,
+    clone:         clone,
+    isElement:     isElement,
+    isArray:       isArray,
+    isHash:        isHash,
+    isFunction:    isFunction,
+    isString:      isString,
+    isNumber:      isNumber,
+    isUndefined:   isUndefined
+  });
+})();
+Object.extend(Function.prototype, (function() {
+  var slice = Array.prototype.slice;
+
+  function update(array, args) {
+    var arrayLength = array.length, length = args.length;
+    while (length--) array[arrayLength + length] = args[length];
+    return array;
+  }
+
+  function merge(array, args) {
+    array = slice.call(array, 0);
+    return update(array, args);
+  }
+
+  function argumentNames() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
+      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
+      .replace(/\s+/g, '').split(',');
     return names.length == 1 && !names[0] ? [] : names;
-  },
+  }
 
-  bind: function() {
+  function bind(context) {
     if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
-    var __method = this, args = $A(arguments), object = args.shift();
+    var __method = this, args = slice.call(arguments, 1);
     return function() {
-      return __method.apply(object, args.concat($A(arguments)));
+      var a = merge(args, arguments);
+      return __method.apply(context, a);
     }
-  },
+  }
 
-  bindAsEventListener: function() {
-    var __method = this, args = $A(arguments), object = args.shift();
+  function bindAsEventListener(context) {
+    var __method = this, args = slice.call(arguments, 1);
     return function(event) {
-      return __method.apply(object, [event || window.event].concat(args));
+      var a = update([event || window.event], args);
+      return __method.apply(context, a);
     }
-  },
+  }
 
-  curry: function() {
+  function curry() {
     if (!arguments.length) return this;
-    var __method = this, args = $A(arguments);
+    var __method = this, args = slice.call(arguments, 0);
     return function() {
-      return __method.apply(this, args.concat($A(arguments)));
+      var a = merge(args, arguments);
+      return __method.apply(this, a);
     }
-  },
+  }
 
-  delay: function() {
-    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+  function delay(timeout) {
+    var __method = this, args = slice.call(arguments, 1);
+    timeout = timeout * 1000
     return window.setTimeout(function() {
       return __method.apply(__method, args);
     }, timeout);
-  },
+  }
+
+  function defer() {
+    var args = update([0.01], arguments);
+    return this.delay.apply(this, args);
+  }
 
-  wrap: function(wrapper) {
+  function wrap(wrapper) {
     var __method = this;
     return function() {
-      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+      var a = update([__method.bind(this)], arguments);
+      return wrapper.apply(this, a);
     }
-  },
+  }
 
-  methodize: function() {
+  function methodize() {
     if (this._methodized) return this._methodized;
     var __method = this;
     return this._methodized = function() {
-      return __method.apply(null, [this].concat($A(arguments)));
+      var a = update([this], arguments);
+      return __method.apply(null, a);
     };
   }
-});
 
-Function.prototype.defer = Function.prototype.delay.curry(0.01);
+  return {
+    argumentNames:       argumentNames,
+    bind:                bind,
+    bindAsEventListener: bindAsEventListener,
+    curry:               curry,
+    delay:               delay,
+    defer:               defer,
+    wrap:                wrap,
+    methodize:           methodize
+  }
+})());
+
 
 Date.prototype.toJSON = function() {
   return '"' + this.getUTCFullYear() + '-' +
@@ -259,30 +361,12 @@ Date.prototype.toJSON = function() {
     this.getUTCSeconds().toPaddedString(2) + 'Z"';
 };
 
-var Try = {
-  these: function() {
-    var returnValue;
-
-    for (var i = 0, length = arguments.length; i < length; i++) {
-      var lambda = arguments[i];
-      try {
-        returnValue = lambda();
-        break;
-      } catch (e) { }
-    }
-
-    return returnValue;
-  }
-};
 
 RegExp.prototype.match = RegExp.prototype.test;
 
 RegExp.escape = function(str) {
   return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
 };
-
-/*--------------------------------------------------------------------------*/
-
 var PeriodicalExecuter = Class.create({
   initialize: function(callback, frequency) {
     this.callback = callback;
@@ -311,8 +395,10 @@ var PeriodicalExecuter = Class.create({
       try {
         this.currentlyExecuting = true;
         this.execute();
-      } finally {
         this.currentlyExecuting = false;
+      } catch(e) {
+        this.currentlyExecuting = false;
+        throw e;
       }
     }
   }
@@ -331,10 +417,25 @@ Object.extend(String, {
   }
 });
 
-Object.extend(String.prototype, {
-  gsub: function(pattern, replacement) {
+Object.extend(String.prototype, (function() {
+
+  function prepareReplacement(replacement) {
+    if (Object.isFunction(replacement)) return replacement;
+    var template = new Template(replacement);
+    return function(match) { return template.evaluate(match) };
+  }
+
+  function gsub(pattern, replacement) {
     var result = '', source = this, match;
-    replacement = arguments.callee.prepareReplacement(replacement);
+    replacement = prepareReplacement(replacement);
+
+    if (Object.isString(pattern))
+      pattern = RegExp.escape(pattern);
+
+    if (!(pattern.length || pattern.source)) {
+      replacement = replacement('');
+      return replacement + source.split('').join(replacement) + replacement;
+    }
 
     while (source.length > 0) {
       if (match = source.match(pattern)) {
@@ -346,69 +447,64 @@ Object.extend(String.prototype, {
       }
     }
     return result;
-  },
+  }
 
-  sub: function(pattern, replacement, count) {
-    replacement = this.gsub.prepareReplacement(replacement);
+  function sub(pattern, replacement, count) {
+    replacement = prepareReplacement(replacement);
     count = Object.isUndefined(count) ? 1 : count;
 
     return this.gsub(pattern, function(match) {
       if (--count < 0) return match[0];
       return replacement(match);
     });
-  },
+  }
 
-  scan: function(pattern, iterator) {
+  function scan(pattern, iterator) {
     this.gsub(pattern, iterator);
     return String(this);
-  },
+  }
 
-  truncate: function(length, truncation) {
+  function truncate(length, truncation) {
     length = length || 30;
     truncation = Object.isUndefined(truncation) ? '...' : truncation;
     return this.length > length ?
       this.slice(0, length - truncation.length) + truncation : String(this);
-  },
+  }
 
-  strip: function() {
+  function strip() {
     return this.replace(/^\s+/, '').replace(/\s+$/, '');
-  },
+  }
 
-  stripTags: function() {
-    return this.replace(/<\/?[^>]+>/gi, '');
-  },
+  function stripTags() {
+    return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
+  }
 
-  stripScripts: function() {
+  function stripScripts() {
     return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
-  },
+  }
 
-  extractScripts: function() {
+  function extractScripts() {
     var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
     var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
     return (this.match(matchAll) || []).map(function(scriptTag) {
       return (scriptTag.match(matchOne) || ['', ''])[1];
     });
-  },
+  }
 
-  evalScripts: function() {
+  function evalScripts() {
     return this.extractScripts().map(function(script) { return eval(script) });
-  },
+  }
 
-  escapeHTML: function() {
-    var self = arguments.callee;
-    self.text.data = this;
-    return self.div.innerHTML;
-  },
+  function escapeHTML() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  }
 
-  unescapeHTML: function() {
-    var div = new Element('div');
-    div.innerHTML = this.stripTags();
-    return div.childNodes[0] ? (div.childNodes.length > 1 ?
-      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
-      div.childNodes[0].nodeValue) : '';
-  },
+  function unescapeHTML() {
+    return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
+  }
 
-  toQueryParams: function(separator) {
+
+  function toQueryParams(separator) {
     var match = this.strip().match(/([^?#]*)(#.*)?$/);
     if (!match) return { };
 
@@ -426,22 +522,22 @@ Object.extend(String.prototype, {
       }
       return hash;
     });
-  },
+  }
 
-  toArray: function() {
+  function toArray() {
     return this.split('');
-  },
+  }
 
-  succ: function() {
+  function succ() {
     return this.slice(0, this.length - 1) +
       String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
-  },
+  }
 
-  times: function(count) {
+  function times(count) {
     return count < 1 ? '' : new Array(count + 1).join(this);
-  },
+  }
 
-  camelize: function() {
+  function camelize() {
     var parts = this.split('-'), len = parts.length;
     if (len == 1) return parts[0];
 
@@ -453,101 +549,117 @@ Object.extend(String.prototype, {
       camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
 
     return camelized;
-  },
+  }
 
-  capitalize: function() {
+  function capitalize() {
     return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
-  },
+  }
 
-  underscore: function() {
-    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
-  },
+  function underscore() {
+    return this.replace(/::/g, '/')
+               .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
+               .replace(/([a-z\d])([A-Z])/g, '$1_$2')
+               .replace(/-/g, '_')
+               .toLowerCase();
+  }
 
-  dasherize: function() {
-    return this.gsub(/_/,'-');
-  },
+  function dasherize() {
+    return this.replace(/_/g, '-');
+  }
 
-  inspect: function(useDoubleQuotes) {
-    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
-      var character = String.specialChar[match[0]];
-      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+  function inspect(useDoubleQuotes) {
+    var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
+      if (character in String.specialChar) {
+        return String.specialChar[character];
+      }
+      return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
     });
     if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
     return "'" + escapedString.replace(/'/g, '\\\'') + "'";
-  },
+  }
 
-  toJSON: function() {
+  function toJSON() {
     return this.inspect(true);
-  },
+  }
 
-  unfilterJSON: function(filter) {
-    return this.sub(filter || Prototype.JSONFilter, '#{1}');
-  },
+  function unfilterJSON(filter) {
+    return this.replace(filter || Prototype.JSONFilter, '$1');
+  }
 
-  isJSON: function() {
+  function isJSON() {
     var str = this;
     if (str.blank()) return false;
     str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
     return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
-  },
+  }
 
-  evalJSON: function(sanitize) {
+  function evalJSON(sanitize) {
     var json = this.unfilterJSON();
     try {
       if (!sanitize || json.isJSON()) return eval('(' + json + ')');
     } catch (e) { }
     throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
-  },
+  }
 
-  include: function(pattern) {
+  function include(pattern) {
     return this.indexOf(pattern) > -1;
-  },
+  }
 
-  startsWith: function(pattern) {
+  function startsWith(pattern) {
     return this.indexOf(pattern) === 0;
-  },
+  }
 
-  endsWith: function(pattern) {
+  function endsWith(pattern) {
     var d = this.length - pattern.length;
     return d >= 0 && this.lastIndexOf(pattern) === d;
-  },
+  }
 
-  empty: function() {
+  function empty() {
     return this == '';
-  },
+  }
 
-  blank: function() {
+  function blank() {
     return /^\s*$/.test(this);
-  },
-
-  interpolate: function(object, pattern) {
-    return new Template(this, pattern).evaluate(object);
   }
-});
 
-if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
-  escapeHTML: function() {
-    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
-  },
-  unescapeHTML: function() {
-    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
+  function interpolate(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
   }
-});
 
-String.prototype.gsub.prepareReplacement = function(replacement) {
-  if (Object.isFunction(replacement)) return replacement;
-  var template = new Template(replacement);
-  return function(match) { return template.evaluate(match) };
-};
-
-String.prototype.parseQuery = String.prototype.toQueryParams;
-
-Object.extend(String.prototype.escapeHTML, {
-  div:  document.createElement('div'),
-  text: document.createTextNode('')
-});
-
-with (String.prototype.escapeHTML) div.appendChild(text);
+  return {
+    gsub:           gsub,
+    sub:            sub,
+    scan:           scan,
+    truncate:       truncate,
+    strip:          String.prototype.trim ? String.prototype.trim : strip,
+    stripTags:      stripTags,
+    stripScripts:   stripScripts,
+    extractScripts: extractScripts,
+    evalScripts:    evalScripts,
+    escapeHTML:     escapeHTML,
+    unescapeHTML:   unescapeHTML,
+    toQueryParams:  toQueryParams,
+    parseQuery:     toQueryParams,
+    toArray:        toArray,
+    succ:           succ,
+    times:          times,
+    camelize:       camelize,
+    capitalize:     capitalize,
+    underscore:     underscore,
+    dasherize:      dasherize,
+    inspect:        inspect,
+    toJSON:         toJSON,
+    unfilterJSON:   unfilterJSON,
+    isJSON:         isJSON,
+    evalJSON:       evalJSON,
+    include:        include,
+    startsWith:     startsWith,
+    endsWith:       endsWith,
+    empty:          empty,
+    blank:          blank,
+    interpolate:    interpolate
+  };
+})());
 
 var Template = Class.create({
   initialize: function(template, pattern) {
@@ -556,11 +668,11 @@ var Template = Class.create({
   },
 
   evaluate: function(object) {
-    if (Object.isFunction(object.toTemplateReplacements))
+    if (object && Object.isFunction(object.toTemplateReplacements))
       object = object.toTemplateReplacements();
 
     return this.template.gsub(this.pattern, function(match) {
-      if (object == null) return '';
+      if (object == null) return (match[1] + '');
 
       var before = match[1] || '';
       if (before == '\\') return match[2];
@@ -571,7 +683,7 @@ var Template = Class.create({
       if (match == null) return before;
 
       while (match != null) {
-        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+        var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
         ctx = ctx[comp];
         if (null == ctx || '' == match[3]) break;
         expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
@@ -586,94 +698,91 @@ Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
 
 var $break = { };
 
-var Enumerable = {
-  each: function(iterator, context) {
+var Enumerable = (function() {
+  function each(iterator, context) {
     var index = 0;
-    iterator = iterator.bind(context);
     try {
       this._each(function(value) {
-        iterator(value, index++);
+        iterator.call(context, value, index++);
       });
     } catch (e) {
       if (e != $break) throw e;
     }
     return this;
-  },
+  }
 
-  eachSlice: function(number, iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function eachSlice(number, iterator, context) {
     var index = -number, slices = [], array = this.toArray();
+    if (number < 1) return array;
     while ((index += number) < array.length)
       slices.push(array.slice(index, index+number));
     return slices.collect(iterator, context);
-  },
+  }
 
-  all: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function all(iterator, context) {
+    iterator = iterator || Prototype.K;
     var result = true;
     this.each(function(value, index) {
-      result = result && !!iterator(value, index);
+      result = result && !!iterator.call(context, value, index);
       if (!result) throw $break;
     });
     return result;
-  },
+  }
 
-  any: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function any(iterator, context) {
+    iterator = iterator || Prototype.K;
     var result = false;
     this.each(function(value, index) {
-      if (result = !!iterator(value, index))
+      if (result = !!iterator.call(context, value, index))
         throw $break;
     });
     return result;
-  },
+  }
 
-  collect: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function collect(iterator, context) {
+    iterator = iterator || Prototype.K;
     var results = [];
     this.each(function(value, index) {
-      results.push(iterator(value, index));
+      results.push(iterator.call(context, value, index));
     });
     return results;
-  },
+  }
 
-  detect: function(iterator, context) {
-    iterator = iterator.bind(context);
+  function detect(iterator, context) {
     var result;
     this.each(function(value, index) {
-      if (iterator(value, index)) {
+      if (iterator.call(context, value, index)) {
         result = value;
         throw $break;
       }
     });
     return result;
-  },
+  }
 
-  findAll: function(iterator, context) {
-    iterator = iterator.bind(context);
+  function findAll(iterator, context) {
     var results = [];
     this.each(function(value, index) {
-      if (iterator(value, index))
+      if (iterator.call(context, value, index))
         results.push(value);
     });
     return results;
-  },
+  }
 
-  grep: function(filter, iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function grep(filter, iterator, context) {
+    iterator = iterator || Prototype.K;
     var results = [];
 
     if (Object.isString(filter))
-      filter = new RegExp(filter);
+      filter = new RegExp(RegExp.escape(filter));
 
     this.each(function(value, index) {
       if (filter.match(value))
-        results.push(iterator(value, index));
+        results.push(iterator.call(context, value, index));
     });
     return results;
-  },
+  }
 
-  include: function(object) {
+  function include(object) {
     if (Object.isFunction(this.indexOf))
       if (this.indexOf(object) != -1) return true;
 
@@ -685,96 +794,96 @@ var Enumerable = {
       }
     });
     return found;
-  },
+  }
 
-  inGroupsOf: function(number, fillWith) {
+  function inGroupsOf(number, fillWith) {
     fillWith = Object.isUndefined(fillWith) ? null : fillWith;
     return this.eachSlice(number, function(slice) {
       while(slice.length < number) slice.push(fillWith);
       return slice;
     });
-  },
+  }
 
-  inject: function(memo, iterator, context) {
-    iterator = iterator.bind(context);
+  function inject(memo, iterator, context) {
     this.each(function(value, index) {
-      memo = iterator(memo, value, index);
+      memo = iterator.call(context, memo, value, index);
     });
     return memo;
-  },
+  }
 
-  invoke: function(method) {
+  function invoke(method) {
     var args = $A(arguments).slice(1);
     return this.map(function(value) {
       return value[method].apply(value, args);
     });
-  },
+  }
 
-  max: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function max(iterator, context) {
+    iterator = iterator || Prototype.K;
     var result;
     this.each(function(value, index) {
-      value = iterator(value, index);
+      value = iterator.call(context, value, index);
       if (result == null || value >= result)
         result = value;
     });
     return result;
-  },
+  }
 
-  min: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function min(iterator, context) {
+    iterator = iterator || Prototype.K;
     var result;
     this.each(function(value, index) {
-      value = iterator(value, index);
+      value = iterator.call(context, value, index);
       if (result == null || value < result)
         result = value;
     });
     return result;
-  },
+  }
 
-  partition: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
+  function partition(iterator, context) {
+    iterator = iterator || Prototype.K;
     var trues = [], falses = [];
     this.each(function(value, index) {
-      (iterator(value, index) ?
+      (iterator.call(context, value, index) ?
         trues : falses).push(value);
     });
     return [trues, falses];
-  },
+  }
 
-  pluck: function(property) {
+  function pluck(property) {
     var results = [];
     this.each(function(value) {
       results.push(value[property]);
     });
     return results;
-  },
+  }
 
-  reject: function(iterator, context) {
-    iterator = iterator.bind(context);
+  function reject(iterator, context) {
     var results = [];
     this.each(function(value, index) {
-      if (!iterator(value, index))
+      if (!iterator.call(context, value, index))
         results.push(value);
     });
     return results;
-  },
+  }
 
-  sortBy: function(iterator, context) {
-    iterator = iterator.bind(context);
+  function sortBy(iterator, context) {
     return this.map(function(value, index) {
-      return {value: value, criteria: iterator(value, index)};
+      return {
+        value: value,
+        criteria: iterator.call(context, value, index)
+      };
     }).sort(function(left, right) {
       var a = left.criteria, b = right.criteria;
       return a < b ? -1 : a > b ? 1 : 0;
     }).pluck('value');
-  },
+  }
 
-  toArray: function() {
+  function toArray() {
     return this.map();
-  },
+  }
 
-  zip: function() {
+  function zip() {
     var iterator = Prototype.K, args = $A(arguments);
     if (Object.isFunction(args.last()))
       iterator = args.pop();
@@ -783,126 +892,152 @@ var Enumerable = {
     return this.map(function(value, index) {
       return iterator(collections.pluck(index));
     });
-  },
+  }
 
-  size: function() {
+  function size() {
     return this.toArray().length;
-  },
+  }
 
-  inspect: function() {
+  function inspect() {
     return '#<Enumerable:' + this.toArray().inspect() + '>';
   }
-};
 
-Object.extend(Enumerable, {
-  map:     Enumerable.collect,
-  find:    Enumerable.detect,
-  select:  Enumerable.findAll,
-  filter:  Enumerable.findAll,
-  member:  Enumerable.include,
-  entries: Enumerable.toArray,
-  every:   Enumerable.all,
-  some:    Enumerable.any
-});
+
+
+
+
+
+
+
+
+  return {
+    each:       each,
+    eachSlice:  eachSlice,
+    all:        all,
+    every:      all,
+    any:        any,
+    some:       any,
+    collect:    collect,
+    map:        collect,
+    detect:     detect,
+    findAll:    findAll,
+    select:     findAll,
+    filter:     findAll,
+    grep:       grep,
+    include:    include,
+    member:     include,
+    inGroupsOf: inGroupsOf,
+    inject:     inject,
+    invoke:     invoke,
+    max:        max,
+    min:        min,
+    partition:  partition,
+    pluck:      pluck,
+    reject:     reject,
+    sortBy:     sortBy,
+    toArray:    toArray,
+    entries:    toArray,
+    zip:        zip,
+    size:       size,
+    inspect:    inspect,
+    find:       detect
+  };
+})();
 function $A(iterable) {
   if (!iterable) return [];
-  if (iterable.toArray) return iterable.toArray();
+  if ('toArray' in Object(iterable)) return iterable.toArray();
   var length = iterable.length || 0, results = new Array(length);
   while (length--) results[length] = iterable[length];
   return results;
 }
 
-if (Prototype.Browser.WebKit) {
-  $A = function(iterable) {
-    if (!iterable) return [];
-    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
-        iterable.toArray) return iterable.toArray();
-    var length = iterable.length || 0, results = new Array(length);
-    while (length--) results[length] = iterable[length];
-    return results;
-  };
+function $w(string) {
+  if (!Object.isString(string)) return [];
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
 }
 
 Array.from = $A;
 
-Object.extend(Array.prototype, Enumerable);
 
-if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
+(function() {
+  var arrayProto = Array.prototype,
+      slice = arrayProto.slice,
+      _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
 
-Object.extend(Array.prototype, {
-  _each: function(iterator) {
+  function each(iterator) {
     for (var i = 0, length = this.length; i < length; i++)
       iterator(this[i]);
-  },
+  }
+  if (!_each) _each = each;
 
-  clear: function() {
+  function clear() {
     this.length = 0;
     return this;
-  },
+  }
 
-  first: function() {
+  function first() {
     return this[0];
-  },
+  }
 
-  last: function() {
+  function last() {
     return this[this.length - 1];
-  },
+  }
 
-  compact: function() {
+  function compact() {
     return this.select(function(value) {
       return value != null;
     });
-  },
+  }
 
-  flatten: function() {
+  function flatten() {
     return this.inject([], function(array, value) {
-      return array.concat(Object.isArray(value) ?
-        value.flatten() : [value]);
+      if (Object.isArray(value))
+        return array.concat(value.flatten());
+      array.push(value);
+      return array;
     });
-  },
+  }
 
-  without: function() {
-    var values = $A(arguments);
+  function without() {
+    var values = slice.call(arguments, 0);
     return this.select(function(value) {
       return !values.include(value);
     });
-  },
+  }
 
-  reverse: function(inline) {
+  function reverse(inline) {
     return (inline !== false ? this : this.toArray())._reverse();
-  },
-
-  reduce: function() {
-    return this.length > 1 ? this : this[0];
-  },
+  }
 
-  uniq: function(sorted) {
+  function uniq(sorted) {
     return this.inject([], function(array, value, index) {
       if (0 == index || (sorted ? array.last() != value : !array.include(value)))
         array.push(value);
       return array;
     });
-  },
+  }
 
-  intersect: function(array) {
+  function intersect(array) {
     return this.uniq().findAll(function(item) {
       return array.detect(function(value) { return item === value });
     });
-  },
+  }
 
-  clone: function() {
-    return [].concat(this);
-  },
 
-  size: function() {
+  function clone() {
+    return slice.call(this, 0);
+  }
+
+  function size() {
     return this.length;
-  },
+  }
 
-  inspect: function() {
+  function inspect() {
     return '[' + this.map(Object.inspect).join(', ') + ']';
-  },
+  }
 
-  toJSON: function() {
+  function toJSON() {
     var results = [];
     this.each(function(object) {
       var value = Object.toJSON(object);
@@ -910,203 +1045,270 @@ Object.extend(Array.prototype, {
     });
     return '[' + results.join(', ') + ']';
   }
-});
-
-// use native browser JS 1.6 implementation if available
-if (Object.isFunction(Array.prototype.forEach))
-  Array.prototype._each = Array.prototype.forEach;
-
-if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
-  i || (i = 0);
-  var length = this.length;
-  if (i < 0) i = length + i;
-  for (; i < length; i++)
-    if (this[i] === item) return i;
-  return -1;
-};
-
-if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
-  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
-  var n = this.slice(0, i).reverse().indexOf(item);
-  return (n < 0) ? n : i - n - 1;
-};
 
-Array.prototype.toArray = Array.prototype.clone;
+  function indexOf(item, i) {
+    i || (i = 0);
+    var length = this.length;
+    if (i < 0) i = length + i;
+    for (; i < length; i++)
+      if (this[i] === item) return i;
+    return -1;
+  }
 
-function $w(string) {
-  if (!Object.isString(string)) return [];
-  string = string.strip();
-  return string ? string.split(/\s+/) : [];
-}
+  function lastIndexOf(item, i) {
+    i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+    var n = this.slice(0, i).reverse().indexOf(item);
+    return (n < 0) ? n : i - n - 1;
+  }
 
-if (Prototype.Browser.Opera){
-  Array.prototype.concat = function() {
-    var array = [];
-    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+  function concat() {
+    var array = slice.call(this, 0), item;
     for (var i = 0, length = arguments.length; i < length; i++) {
-      if (Object.isArray(arguments[i])) {
-        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
-          array.push(arguments[i][j]);
+      item = arguments[i];
+      if (Object.isArray(item) && !('callee' in item)) {
+        for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
+          array.push(item[j]);
       } else {
-        array.push(arguments[i]);
+        array.push(item);
       }
     }
     return array;
-  };
-}
-Object.extend(Number.prototype, {
-  toColorPart: function() {
-    return this.toPaddedString(2, 16);
-  },
-
-  succ: function() {
-    return this + 1;
-  },
+  }
 
-  times: function(iterator) {
-    $R(0, this, true).each(iterator);
-    return this;
-  },
+  Object.extend(arrayProto, Enumerable);
+
+  if (!arrayProto._reverse)
+    arrayProto._reverse = arrayProto.reverse;
+
+  Object.extend(arrayProto, {
+    _each:     _each,
+    clear:     clear,
+    first:     first,
+    last:      last,
+    compact:   compact,
+    flatten:   flatten,
+    without:   without,
+    reverse:   reverse,
+    uniq:      uniq,
+    intersect: intersect,
+    clone:     clone,
+    toArray:   clone,
+    size:      size,
+    inspect:   inspect,
+    toJSON:    toJSON
+  });
 
-  toPaddedString: function(length, radix) {
-    var string = this.toString(radix || 10);
-    return '0'.times(length - string.length) + string;
-  },
+  var CONCAT_ARGUMENTS_BUGGY = (function() {
+    return [].concat(arguments)[0][0] !== 1;
+  })(1,2)
 
-  toJSON: function() {
-    return isFinite(this) ? this.toString() : 'null';
-  }
-});
+  if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
 
-$w('abs round ceil floor').each(function(method){
-  Number.prototype[method] = Math[method].methodize();
-});
+  if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
+  if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
+})();
 function $H(object) {
   return new Hash(object);
 };
 
 var Hash = Class.create(Enumerable, (function() {
+  function initialize(object) {
+    this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+  }
+
+  function _each(iterator) {
+    for (var key in this._object) {
+      var value = this._object[key], pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  }
+
+  function set(key, value) {
+    return this._object[key] = value;
+  }
+
+  function get(key) {
+    if (this._object[key] !== Object.prototype[key])
+      return this._object[key];
+  }
+
+  function unset(key) {
+    var value = this._object[key];
+    delete this._object[key];
+    return value;
+  }
+
+  function toObject() {
+    return Object.clone(this._object);
+  }
+
+  function keys() {
+    return this.pluck('key');
+  }
+
+  function values() {
+    return this.pluck('value');
+  }
+
+  function index(value) {
+    var match = this.detect(function(pair) {
+      return pair.value === value;
+    });
+    return match && match.key;
+  }
+
+  function merge(object) {
+    return this.clone().update(object);
+  }
+
+  function update(object) {
+    return new Hash(object).inject(this, function(result, pair) {
+      result.set(pair.key, pair.value);
+      return result;
+    });
+  }
 
   function toQueryPair(key, value) {
     if (Object.isUndefined(value)) return key;
     return key + '=' + encodeURIComponent(String.interpret(value));
   }
 
-  return {
-    initialize: function(object) {
-      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
-    },
-
-    _each: function(iterator) {
-      for (var key in this._object) {
-        var value = this._object[key], pair = [key, value];
-        pair.key = key;
-        pair.value = value;
-        iterator(pair);
-      }
-    },
+  function toQueryString() {
+    return this.inject([], function(results, pair) {
+      var key = encodeURIComponent(pair.key), values = pair.value;
 
-    set: function(key, value) {
-      return this._object[key] = value;
-    },
+      if (values && typeof values == 'object') {
+        if (Object.isArray(values))
+          return results.concat(values.map(toQueryPair.curry(key)));
+      } else results.push(toQueryPair(key, values));
+      return results;
+    }).join('&');
+  }
 
-    get: function(key) {
-      return this._object[key];
-    },
+  function inspect() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
 
-    unset: function(key) {
-      var value = this._object[key];
-      delete this._object[key];
-      return value;
-    },
+  function toJSON() {
+    return Object.toJSON(this.toObject());
+  }
 
-    toObject: function() {
-      return Object.clone(this._object);
-    },
+  function clone() {
+    return new Hash(this);
+  }
 
-    keys: function() {
-      return this.pluck('key');
-    },
+  return {
+    initialize:             initialize,
+    _each:                  _each,
+    set:                    set,
+    get:                    get,
+    unset:                  unset,
+    toObject:               toObject,
+    toTemplateReplacements: toObject,
+    keys:                   keys,
+    values:                 values,
+    index:                  index,
+    merge:                  merge,
+    update:                 update,
+    toQueryString:          toQueryString,
+    inspect:                inspect,
+    toJSON:                 toJSON,
+    clone:                  clone
+  };
+})());
 
-    values: function() {
-      return this.pluck('value');
-    },
+Hash.from = $H;
+Object.extend(Number.prototype, (function() {
+  function toColorPart() {
+    return this.toPaddedString(2, 16);
+  }
 
-    index: function(value) {
-      var match = this.detect(function(pair) {
-        return pair.value === value;
-      });
-      return match && match.key;
-    },
+  function succ() {
+    return this + 1;
+  }
 
-    merge: function(object) {
-      return this.clone().update(object);
-    },
+  function times(iterator, context) {
+    $R(0, this, true).each(iterator, context);
+    return this;
+  }
 
-    update: function(object) {
-      return new Hash(object).inject(this, function(result, pair) {
-        result.set(pair.key, pair.value);
-        return result;
-      });
-    },
+  function toPaddedString(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  }
 
-    toQueryString: function() {
-      return this.map(function(pair) {
-        var key = encodeURIComponent(pair.key), values = pair.value;
+  function toJSON() {
+    return isFinite(this) ? this.toString() : 'null';
+  }
 
-        if (values && typeof values == 'object') {
-          if (Object.isArray(values))
-            return values.map(toQueryPair.curry(key)).join('&');
-        }
-        return toQueryPair(key, values);
-      }).join('&');
-    },
+  function abs() {
+    return Math.abs(this);
+  }
 
-    inspect: function() {
-      return '#<Hash:{' + this.map(function(pair) {
-        return pair.map(Object.inspect).join(': ');
-      }).join(', ') + '}>';
-    },
+  function round() {
+    return Math.round(this);
+  }
 
-    toJSON: function() {
-      return Object.toJSON(this.toObject());
-    },
+  function ceil() {
+    return Math.ceil(this);
+  }
 
-    clone: function() {
-      return new Hash(this);
-    }
+  function floor() {
+    return Math.floor(this);
   }
+
+  return {
+    toColorPart:    toColorPart,
+    succ:           succ,
+    times:          times,
+    toPaddedString: toPaddedString,
+    toJSON:         toJSON,
+    abs:            abs,
+    round:          round,
+    ceil:           ceil,
+    floor:          floor
+  };
 })());
 
-Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
-Hash.from = $H;
-var ObjectRange = Class.create(Enumerable, {
-  initialize: function(start, end, exclusive) {
+function $R(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var ObjectRange = Class.create(Enumerable, (function() {
+  function initialize(start, end, exclusive) {
     this.start = start;
     this.end = end;
     this.exclusive = exclusive;
-  },
+  }
 
-  _each: function(iterator) {
+  function _each(iterator) {
     var value = this.start;
     while (this.include(value)) {
       iterator(value);
       value = value.succ();
     }
-  },
+  }
 
-  include: function(value) {
+  function include(value) {
     if (value < this.start)
       return false;
     if (this.exclusive)
       return value < this.end;
     return value <= this.end;
   }
-});
 
-var $R = function(start, end, exclusive) {
-  return new ObjectRange(start, end, exclusive);
-};
+  return {
+    initialize: initialize,
+    _each:      _each,
+    include:    include
+  };
+})());
+
+
 
 var Ajax = {
   getTransport: function() {
@@ -1153,7 +1355,6 @@ Ajax.Responders.register({
   onCreate:   function() { Ajax.activeRequestCount++ },
   onComplete: function() { Ajax.activeRequestCount-- }
 });
-
 Ajax.Base = Class.create({
   initialize: function(options) {
     this.options = {
@@ -1175,7 +1376,6 @@ Ajax.Base = Class.create({
       this.options.parameters = this.options.parameters.toObject();
   }
 });
-
 Ajax.Request = Class.create(Ajax.Base, {
   _complete: false,
 
@@ -1191,7 +1391,6 @@ Ajax.Request = Class.create(Ajax.Base, {
     var params = Object.clone(this.options.parameters);
 
     if (!['get', 'post'].include(this.method)) {
-      // simulate other verbs over post
       params['_method'] = this.method;
       this.method = 'post';
     }
@@ -1199,7 +1398,6 @@ Ajax.Request = Class.create(Ajax.Base, {
     this.parameters = params;
 
     if (params = Object.toQueryString(params)) {
-      // when GET, append parameters to URL
       if (this.method == 'get')
         this.url += (this.url.include('?') ? '&' : '?') + params;
       else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
@@ -1258,7 +1456,6 @@ Ajax.Request = Class.create(Ajax.Base, {
             headers['Connection'] = 'close';
     }
 
-    // user-defined headers
     if (typeof this.options.requestHeaders == 'object') {
       var extras = this.options.requestHeaders;
 
@@ -1312,7 +1509,6 @@ Ajax.Request = Class.create(Ajax.Base, {
     }
 
     if (state == 'Complete') {
-      // avoid memory leak in MSIE: clean up
       this.transport.onreadystatechange = Prototype.emptyFunction;
     }
   },
@@ -1329,7 +1525,7 @@ Ajax.Request = Class.create(Ajax.Base, {
   getHeader: function(name) {
     try {
       return this.transport.getResponseHeader(name) || null;
-    } catch (e) { return null }
+    } catch (e) { return null; }
   },
 
   evalResponse: function() {
@@ -1349,6 +1545,13 @@ Ajax.Request = Class.create(Ajax.Base, {
 Ajax.Request.Events =
   ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
 
+
+
+
+
+
+
+
 Ajax.Response = Class.create({
   initialize: function(request){
     this.request = request;
@@ -1370,6 +1573,7 @@ Ajax.Response = Class.create({
   },
 
   status:      0,
+
   statusText: '',
 
   getStatus: Ajax.Request.prototype.getStatus,
@@ -1499,6 +1703,9 @@ Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
     this.updater = new Ajax.Updater(this.container, this.url, this.options);
   }
 });
+
+
+
 function $(element) {
   if (arguments.length > 1) {
     for (var i = 0, elements = [], length = arguments.length; i < length; i++)
@@ -1526,7 +1733,6 @@ if (Prototype.BrowserFeatures.XPath) {
 if (!window.Node) var Node = { };
 
 if (!Node.ELEMENT_NODE) {
-  // DOM level 2 ECMAScript Language Binding
   Object.extend(Node, {
     ELEMENT_NODE: 1,
     ATTRIBUTE_NODE: 2,
@@ -1543,13 +1749,30 @@ if (!Node.ELEMENT_NODE) {
   });
 }
 
-(function() {
-  var element = this.Element;
-  this.Element = function(tagName, attributes) {
+
+(function(global) {
+
+  var SETATTRIBUTE_IGNORES_NAME = (function(){
+    var elForm = document.createElement("form");
+    var elInput = document.createElement("input");
+    var root = document.documentElement;
+    elInput.setAttribute("name", "test");
+    elForm.appendChild(elInput);
+    root.appendChild(elForm);
+    var isBuggy = elForm.elements
+      ? (typeof elForm.elements.test == "undefined")
+      : null;
+    root.removeChild(elForm);
+    elForm = elInput = null;
+    return isBuggy;
+  })();
+
+  var element = global.Element;
+  global.Element = function(tagName, attributes) {
     attributes = attributes || { };
     tagName = tagName.toLowerCase();
     var cache = Element.cache;
-    if (Prototype.Browser.IE && attributes.name) {
+    if (SETATTRIBUTE_IGNORES_NAME && attributes.name) {
       tagName = '<' + tagName + ' name="' + attributes.name + '">';
       delete attributes.name;
       return Element.writeAttribute(document.createElement(tagName), attributes);
@@ -1557,10 +1780,12 @@ if (!Node.ELEMENT_NODE) {
     if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
     return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
   };
-  Object.extend(this.Element, element || { });
-}).call(window);
+  Object.extend(global.Element, element || { });
+  if (element) global.Element.prototype = element.prototype;
+})(this);
 
 Element.cache = { };
+Element.idCounter = 1;
 
 Element.Methods = {
   visible: function(element) {
@@ -1573,13 +1798,16 @@ Element.Methods = {
     return element;
   },
 
+
   hide: function(element) {
-    $(element).style.display = 'none';
+    element = $(element);
+    element.style.display = 'none';
     return element;
   },
 
   show: function(element) {
-    $(element).style.display = '';
+    element = $(element);
+    element.style.display = '';
     return element;
   },
 
@@ -1589,15 +1817,89 @@ Element.Methods = {
     return element;
   },
 
-  update: function(element, content) {
-    element = $(element);
-    if (content && content.toElement) content = content.toElement();
-    if (Object.isElement(content)) return element.update().insert(content);
-    content = Object.toHTML(content);
-    element.innerHTML = content.stripScripts();
-    content.evalScripts.bind(content).defer();
-    return element;
-  },
+  update: (function(){
+
+    var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
+      var el = document.createElement("select"),
+          isBuggy = true;
+      el.innerHTML = "<option value=\"test\">test</option>";
+      if (el.options && el.options[0]) {
+        isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
+      }
+      el = null;
+      return isBuggy;
+    })();
+
+    var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
+      try {
+        var el = document.createElement("table");
+        if (el && el.tBodies) {
+          el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
+          var isBuggy = typeof el.tBodies[0] == "undefined";
+          el = null;
+          return isBuggy;
+        }
+      } catch (e) {
+        return true;
+      }
+    })();
+
+    var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
+      var s = document.createElement("script"),
+          isBuggy = false;
+      try {
+        s.appendChild(document.createTextNode(""));
+        isBuggy = !s.firstChild ||
+          s.firstChild && s.firstChild.nodeType !== 3;
+      } catch (e) {
+        isBuggy = true;
+      }
+      s = null;
+      return isBuggy;
+    })();
+
+    function update(element, content) {
+      element = $(element);
+
+      if (content && content.toElement)
+        content = content.toElement();
+
+      if (Object.isElement(content))
+        return element.update().insert(content);
+
+      content = Object.toHTML(content);
+
+      var tagName = element.tagName.toUpperCase();
+
+      if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
+        element.text = content;
+        return element;
+      }
+
+      if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) {
+        if (tagName in Element._insertionTranslations.tags) {
+          while (element.firstChild) {
+            element.removeChild(element.firstChild);
+          }
+          Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+            .each(function(node) {
+              element.appendChild(node)
+            });
+        }
+        else {
+          element.innerHTML = content.stripScripts();
+        }
+      }
+      else {
+        element.innerHTML = content.stripScripts();
+      }
+
+      content.evalScripts.bind(content).defer();
+      return element;
+    }
+
+    return update;
+  })(),
 
   replace: function(element, content) {
     element = $(element);
@@ -1682,11 +1984,11 @@ Element.Methods = {
   },
 
   ancestors: function(element) {
-    return $(element).recursivelyCollect('parentNode');
+    return Element.recursivelyCollect(element, 'parentNode');
   },
 
   descendants: function(element) {
-    return $(element).select("*");
+    return Element.select(element, "*");
   },
 
   firstDescendant: function(element) {
@@ -1703,16 +2005,17 @@ Element.Methods = {
   },
 
   previousSiblings: function(element) {
-    return $(element).recursivelyCollect('previousSibling');
+    return Element.recursivelyCollect(element, 'previousSibling');
   },
 
   nextSiblings: function(element) {
-    return $(element).recursivelyCollect('nextSibling');
+    return Element.recursivelyCollect(element, 'nextSibling');
   },
 
   siblings: function(element) {
     element = $(element);
-    return element.previousSiblings().reverse().concat(element.nextSiblings());
+    return Element.previousSiblings(element).reverse()
+      .concat(Element.nextSiblings(element));
   },
 
   match: function(element, selector) {
@@ -1724,22 +2027,22 @@ Element.Methods = {
   up: function(element, expression, index) {
     element = $(element);
     if (arguments.length == 1) return $(element.parentNode);
-    var ancestors = element.ancestors();
+    var ancestors = Element.ancestors(element);
     return Object.isNumber(expression) ? ancestors[expression] :
       Selector.findElement(ancestors, expression, index);
   },
 
   down: function(element, expression, index) {
     element = $(element);
-    if (arguments.length == 1) return element.firstDescendant();
-    return Object.isNumber(expression) ? element.descendants()[expression] :
-      element.select(expression)[index || 0];
+    if (arguments.length == 1) return Element.firstDescendant(element);
+    return Object.isNumber(expression) ? Element.descendants(element)[expression] :
+      Element.select(element, expression)[index || 0];
   },
 
   previous: function(element, expression, index) {
     element = $(element);
     if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
-    var previousSiblings = element.previousSiblings();
+    var previousSiblings = Element.previousSiblings(element);
     return Object.isNumber(expression) ? previousSiblings[expression] :
       Selector.findElement(previousSiblings, expression, index);
   },
@@ -1747,27 +2050,28 @@ Element.Methods = {
   next: function(element, expression, index) {
     element = $(element);
     if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
-    var nextSiblings = element.nextSiblings();
+    var nextSiblings = Element.nextSiblings(element);
     return Object.isNumber(expression) ? nextSiblings[expression] :
       Selector.findElement(nextSiblings, expression, index);
   },
 
-  select: function() {
-    var args = $A(arguments), element = $(args.shift());
+
+  select: function(element) {
+    var args = Array.prototype.slice.call(arguments, 1);
     return Selector.findChildElements(element, args);
   },
 
-  adjacent: function() {
-    var args = $A(arguments), element = $(args.shift());
+  adjacent: function(element) {
+    var args = Array.prototype.slice.call(arguments, 1);
     return Selector.findChildElements(element.parentNode, args).without(element);
   },
 
   identify: function(element) {
     element = $(element);
-    var id = element.readAttribute('id'), self = arguments.callee;
+    var id = Element.readAttribute(element, 'id');
     if (id) return id;
-    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
-    element.writeAttribute('id', id);
+    do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id));
+    Element.writeAttribute(element, 'id', id);
     return id;
   },
 
@@ -1806,11 +2110,11 @@ Element.Methods = {
   },
 
   getHeight: function(element) {
-    return $(element).getDimensions().height;
+    return Element.getDimensions(element).height;
   },
 
   getWidth: function(element) {
-    return $(element).getDimensions().width;
+    return Element.getDimensions(element).width;
   },
 
   classNames: function(element) {
@@ -1826,7 +2130,7 @@ Element.Methods = {
 
   addClassName: function(element, className) {
     if (!(element = $(element))) return;
-    if (!element.hasClassName(className))
+    if (!Element.hasClassName(element, className))
       element.className += (element.className ? ' ' : '') + className;
     return element;
   },
@@ -1840,11 +2144,10 @@ Element.Methods = {
 
   toggleClassName: function(element, className) {
     if (!(element = $(element))) return;
-    return element[element.hasClassName(className) ?
-      'removeClassName' : 'addClassName'](className);
+    return Element[Element.hasClassName(element, className) ?
+      'removeClassName' : 'addClassName'](element, className);
   },
 
-  // removes whitespace-only text node children
   cleanWhitespace: function(element) {
     element = $(element);
     var node = element.firstChild;
@@ -1863,30 +2166,22 @@ Element.Methods = {
 
   descendantOf: function(element, ancestor) {
     element = $(element), ancestor = $(ancestor);
-    var originalAncestor = ancestor;
 
     if (element.compareDocumentPosition)
       return (element.compareDocumentPosition(ancestor) & 8) === 8;
 
-    if (element.sourceIndex && !Prototype.Browser.Opera) {
-      var e = element.sourceIndex, a = ancestor.sourceIndex,
-       nextAncestor = ancestor.nextSibling;
-      if (!nextAncestor) {
-        do { ancestor = ancestor.parentNode; }
-        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
-      }
-      if (nextAncestor && nextAncestor.sourceIndex)
-       return (e > a && e < nextAncestor.sourceIndex);
-    }
+    if (ancestor.contains)
+      return ancestor.contains(element) && ancestor !== element;
 
     while (element = element.parentNode)
-      if (element == originalAncestor) return true;
+      if (element == ancestor) return true;
+
     return false;
   },
 
   scrollTo: function(element) {
     element = $(element);
-    var pos = element.cumulativeOffset();
+    var pos = Element.cumulativeOffset(element);
     window.scrollTo(pos[0], pos[1]);
     return element;
   },
@@ -1895,7 +2190,7 @@ Element.Methods = {
     element = $(element);
     style = style == 'float' ? 'cssFloat' : style.camelize();
     var value = element.style[style];
-    if (!value) {
+    if (!value || value == 'auto') {
       var css = document.defaultView.getComputedStyle(element, null);
       value = css ? css[style] : null;
     }
@@ -1934,18 +2229,17 @@ Element.Methods = {
 
   getDimensions: function(element) {
     element = $(element);
-    var display = $(element).getStyle('display');
+    var display = Element.getStyle(element, 'display');
     if (display != 'none' && display != null) // Safari bug
       return {width: element.offsetWidth, height: element.offsetHeight};
 
-    // All *Width and *Height properties give 0 on elements with display none,
-    // so enable the element temporarily
     var els = element.style;
     var originalVisibility = els.visibility;
     var originalPosition = els.position;
     var originalDisplay = els.display;
     els.visibility = 'hidden';
-    els.position = 'absolute';
+    if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari
+      els.position = 'absolute';
     els.display = 'block';
     var originalWidth = element.clientWidth;
     var originalHeight = element.clientHeight;
@@ -1961,9 +2255,7 @@ Element.Methods = {
     if (pos == 'static' || !pos) {
       element._madePositioned = true;
       element.style.position = 'relative';
-      // Opera returns the offset relative to the positioning context, when an
-      // element is position relative but top and left have not been defined
-      if (window.opera) {
+      if (Prototype.Browser.Opera) {
         element.style.top = 0;
         element.style.left = 0;
       }
@@ -2018,7 +2310,7 @@ Element.Methods = {
       valueL += element.offsetLeft || 0;
       element = element.offsetParent;
       if (element) {
-        if (element.tagName == 'BODY') break;
+        if (element.tagName.toUpperCase() == 'BODY') break;
         var p = Element.getStyle(element, 'position');
         if (p !== 'static') break;
       }
@@ -2028,10 +2320,9 @@ Element.Methods = {
 
   absolutize: function(element) {
     element = $(element);
-    if (element.getStyle('position') == 'absolute') return;
-    // Position.prepare(); // To be done manually by Scripty when it needs it.
+    if (Element.getStyle(element, 'position') == 'absolute') return element;
 
-    var offsets = element.positionedOffset();
+    var offsets = Element.positionedOffset(element);
     var top     = offsets[1];
     var left    = offsets[0];
     var width   = element.clientWidth;
@@ -2052,8 +2343,7 @@ Element.Methods = {
 
   relativize: function(element) {
     element = $(element);
-    if (element.getStyle('position') == 'relative') return;
-    // Position.prepare(); // To be done manually by Scripty when it needs it.
+    if (Element.getStyle(element, 'position') == 'relative') return element;
 
     element.style.position = 'relative';
     var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
@@ -2077,33 +2367,32 @@ Element.Methods = {
   },
 
   getOffsetParent: function(element) {
-    element = $(element);  
-    var op = element.offsetParent, body = document.body, docEl = document.documentElement;  
-
-    /* IE with strict doctype may try to return documentElement as offsetParent  
-       on relatively positioned elements, we will return body instead */  
-    if (op && op !== docEl) return $(op);  
-    if (op === docEl || element === docEl || element === body) return $(body);  
-         
-    while ((element = element.parentNode) && element !== body)  
+    if (element.offsetParent) return $(element.offsetParent);
+    if (element == document.body) return $(element);
+
+    while ((element = element.parentNode) && element != document.body && element != document)
       if (Element.getStyle(element, 'position') != 'static')
         return $(element);
 
-    return $(body);
+    return $(document.body);
   },
 
   viewportOffset: function(forElement) {
-    forElement = $(forElement);
+    var valueT = 0, valueL = 0;
 
-    var element = forElement, valueT = 0, valueL = 0;
+    var element = forElement;
     do {
       valueT += element.offsetTop  || 0;
       valueL += element.offsetLeft || 0;
-    } while ((element = element.getOffsetParent()) != document.body);
+
+      if (element.offsetParent == document.body &&
+        Element.getStyle(element, 'position') == 'absolute') break;
+
+    } while (element = element.offsetParent);
 
     element = forElement;
     do {
-      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
+      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
         valueT -= element.scrollTop  || 0;
         valueL -= element.scrollLeft || 0;
       }
@@ -2122,28 +2411,22 @@ Element.Methods = {
       offsetLeft: 0
     }, arguments[2] || { });
 
-    // find page position of source
     source = $(source);
-    var p = source.viewportOffset();
+    var p = Element.viewportOffset(source);
 
-    // find coordinate system to use
     element = $(element);
     var delta = [0, 0];
     var parent = null;
-    // delta [0,0] will do fine with position: fixed elements,
-    // position:absolute needs offsetParent deltas
     if (Element.getStyle(element, 'position') == 'absolute') {
-      parent = element.getOffsetParent();
-      delta = parent.viewportOffset();
+      parent = Element.getOffsetParent(element);
+      delta = Element.viewportOffset(parent);
     }
 
-    // correct by body offsets (fixes Safari)
     if (parent == document.body) {
       delta[0] -= document.body.offsetLeft;
       delta[1] -= document.body.offsetTop;
     }
 
-    // set position
     if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
     if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
     if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
@@ -2152,10 +2435,9 @@ Element.Methods = {
   }
 };
 
-Element.Methods.identify.counter = 1;
-
 Object.extend(Element.Methods, {
   getElementsBySelector: Element.Methods.select,
+
   childElements: Element.Methods.immediateDescendants
 });
 
@@ -2176,11 +2458,8 @@ if (Prototype.Browser.Opera) {
         case 'left': case 'top': case 'right': case 'bottom':
           if (proceed(element, 'position') === 'static') return null;
         case 'height': case 'width':
-          // returns '0px' for hidden elements; we want it to return null
           if (!Element.visible(element)) return null;
 
-          // returns the border-box dimensions rather than the content-box
-          // dimensions, so we subtract padding and borders from the value
           var dim = parseInt(proceed(element, style), 10);
 
           if (dim !== element['offset' + style.capitalize()])
@@ -2213,11 +2492,11 @@ if (Prototype.Browser.Opera) {
 }
 
 else if (Prototype.Browser.IE) {
-  // IE doesn't report offsets correctly for static elements, so we change them
-  // to "relative" to get the values, then change them back.
   Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
     function(proceed, element) {
       element = $(element);
+      try { element.offsetParent }
+      catch(e) { return $(document.body) }
       var position = element.getStyle('position');
       if (position !== 'static') return proceed(element);
       element.setStyle({ position: 'relative' });
@@ -2231,10 +2510,10 @@ else if (Prototype.Browser.IE) {
     Element.Methods[method] = Element.Methods[method].wrap(
       function(proceed, element) {
         element = $(element);
+        try { element.offsetParent }
+        catch(e) { return Element._returnOffset(0,0) }
         var position = element.getStyle('position');
         if (position !== 'static') return proceed(element);
-        // Trigger hasLayout on the offset parent so that IE6 reports
-        // accurate offsetTop and offsetLeft values for position: fixed.
         var offsetParent = element.getOffsetParent();
         if (offsetParent && offsetParent.getStyle('position') === 'fixed')
           offsetParent.setStyle({ zoom: 1 });
@@ -2246,6 +2525,14 @@ else if (Prototype.Browser.IE) {
     );
   });
 
+  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
+    function(proceed, element) {
+      try { element.offsetParent }
+      catch(e) { return Element._returnOffset(0,0) }
+      return proceed(element);
+    }
+  );
+
   Element.Methods.getStyle = function(element, style) {
     element = $(element);
     style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
@@ -2287,36 +2574,92 @@ else if (Prototype.Browser.IE) {
     return element;
   };
 
-  Element._attributeTranslations = {
-    read: {
-      names: {
-        'class': 'className',
-        'for':   'htmlFor'
-      },
-      values: {
-        _getAttr: function(element, attribute) {
-          return element.getAttribute(attribute, 2);
-        },
-        _getAttrNode: function(element, attribute) {
-          var node = element.getAttributeNode(attribute);
-          return node ? node.value : "";
-        },
-        _getEv: function(element, attribute) {
-          attribute = element.getAttribute(attribute);
-          return attribute ? attribute.toString().slice(23, -2) : null;
-        },
-        _flag: function(element, attribute) {
-          return $(element).hasAttribute(attribute) ? attribute : null;
-        },
-        style: function(element) {
-          return element.style.cssText.toLowerCase();
+  Element._attributeTranslations = (function(){
+
+    var classProp = 'className';
+    var forProp = 'for';
+
+    var el = document.createElement('div');
+
+    el.setAttribute(classProp, 'x');
+
+    if (el.className !== 'x') {
+      el.setAttribute('class', 'x');
+      if (el.className === 'x') {
+        classProp = 'class';
+      }
+    }
+    el = null;
+
+    el = document.createElement('label');
+    el.setAttribute(forProp, 'x');
+    if (el.htmlFor !== 'x') {
+      el.setAttribute('htmlFor', 'x');
+      if (el.htmlFor === 'x') {
+        forProp = 'htmlFor';
+      }
+    }
+    el = null;
+
+    return {
+      read: {
+        names: {
+          'class':      classProp,
+          'className':  classProp,
+          'for':        forProp,
+          'htmlFor':    forProp
         },
-        title: function(element) {
-          return element.title;
+        values: {
+          _getAttr: function(element, attribute) {
+            return element.getAttribute(attribute);
+          },
+          _getAttr2: function(element, attribute) {
+            return element.getAttribute(attribute, 2);
+          },
+          _getAttrNode: function(element, attribute) {
+            var node = element.getAttributeNode(attribute);
+            return node ? node.value : "";
+          },
+          _getEv: (function(){
+
+            var el = document.createElement('div');
+            el.onclick = Prototype.emptyFunction;
+            var value = el.getAttribute('onclick');
+            var f;
+
+            if (String(value).indexOf('{') > -1) {
+              f = function(element, attribute) {
+                attribute = element.getAttribute(attribute);
+                if (!attribute) return null;
+                attribute = attribute.toString();
+                attribute = attribute.split('{')[1];
+                attribute = attribute.split('}')[0];
+                return attribute.strip();
+              };
+            }
+            else if (value === '') {
+              f = function(element, attribute) {
+                attribute = element.getAttribute(attribute);
+                if (!attribute) return null;
+                return attribute.strip();
+              };
+            }
+            el = null;
+            return f;
+          })(),
+          _flag: function(element, attribute) {
+            return $(element).hasAttribute(attribute) ? attribute : null;
+          },
+          style: function(element) {
+            return element.style.cssText.toLowerCase();
+          },
+          title: function(element) {
+            return element.title;
+          }
         }
       }
     }
-  };
+  })();
 
   Element._attributeTranslations.write = {
     names: Object.extend({
@@ -2337,15 +2680,15 @@ else if (Prototype.Browser.IE) {
   Element._attributeTranslations.has = {};
 
   $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
-      'encType maxLength readOnly longDesc').each(function(attr) {
+      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
     Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
     Element._attributeTranslations.has[attr.toLowerCase()] = attr;
   });
 
   (function(v) {
     Object.extend(v, {
-      href:        v._getAttr,
-      src:         v._getAttr,
+      href:        v._getAttr2,
+      src:         v._getAttr2,
       type:        v._getAttr,
       action:      v._getAttrNode,
       disabled:    v._flag,
@@ -2372,6 +2715,26 @@ else if (Prototype.Browser.IE) {
       onchange:    v._getEv
     });
   })(Element._attributeTranslations.read.values);
+
+  if (Prototype.BrowserFeatures.ElementExtensions) {
+    (function() {
+      function _descendants(element) {
+        var nodes = element.getElementsByTagName('*'), results = [];
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName !== "!") // Filter out comment nodes.
+            results.push(node);
+        return results;
+      }
+
+      Element.Methods.down = function(element, expression, index) {
+        element = $(element);
+        if (arguments.length == 1) return element.firstDescendant();
+        return Object.isNumber(expression) ? _descendants(element)[expression] :
+          Element.select(element, expression)[index || 0];
+      }
+    })();
+  }
+
 }
 
 else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
@@ -2390,7 +2753,7 @@ else if (Prototype.Browser.WebKit) {
       (value < 0.00001) ? 0 : value;
 
     if (value == 1)
-      if(element.tagName == 'IMG' && element.width) {
+      if(element.tagName.toUpperCase() == 'IMG' && element.width) {
         element.width++; element.width--;
       } else try {
         var n = document.createTextNode(' ');
@@ -2401,9 +2764,6 @@ else if (Prototype.Browser.WebKit) {
     return element;
   };
 
-  // Safari returns margins on body which is incorrect if the child is absolutely
-  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
-  // KHTML/WebKit only.
   Element.Methods.cumulativeOffset = function(element) {
     var valueT = 0, valueL = 0;
     do {
@@ -2419,30 +2779,7 @@ else if (Prototype.Browser.WebKit) {
   };
 }
 
-if (Prototype.Browser.IE || Prototype.Browser.Opera) {
-  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
-  Element.Methods.update = function(element, content) {
-    element = $(element);
-
-    if (content && content.toElement) content = content.toElement();
-    if (Object.isElement(content)) return element.update().insert(content);
-
-    content = Object.toHTML(content);
-    var tagName = element.tagName.toUpperCase();
-
-    if (tagName in Element._insertionTranslations.tags) {
-      $A(element.childNodes).each(function(node) { element.removeChild(node) });
-      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
-        .each(function(node) { element.appendChild(node) });
-    }
-    else element.innerHTML = content.stripScripts();
-
-    content.evalScripts.bind(content).defer();
-    return element;
-  };
-}
-
-if ('outerHTML' in document.createElement('div')) {
+if ('outerHTML' in document.documentElement) {
   Element.Methods.replace = function(element, content) {
     element = $(element);
 
@@ -2510,18 +2847,19 @@ Element._insertionTranslations = {
 };
 
 (function() {
-  Object.extend(this.tags, {
-    THEAD: this.tags.TBODY,
-    TFOOT: this.tags.TBODY,
-    TH:    this.tags.TD
+  var tags = Element._insertionTranslations.tags;
+  Object.extend(tags, {
+    THEAD: tags.TBODY,
+    TFOOT: tags.TBODY,
+    TH:    tags.TD
   });
-}).call(Element._insertionTranslations);
+})();
 
 Element.Methods.Simulated = {
   hasAttribute: function(element, attribute) {
     attribute = Element._attributeTranslations.has[attribute] || attribute;
     var node = $(element).getAttributeNode(attribute);
-    return node && node.specified;
+    return !!(node && node.specified);
   }
 };
 
@@ -2529,41 +2867,81 @@ Element.Methods.ByTag = { };
 
 Object.extend(Element, Element.Methods);
 
-if (!Prototype.BrowserFeatures.ElementExtensions &&
-    document.createElement('div').__proto__) {
-  window.HTMLElement = { };
-  window.HTMLElement.prototype = document.createElement('div').__proto__;
-  Prototype.BrowserFeatures.ElementExtensions = true;
-}
+(function(div) {
+
+  if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
+    window.HTMLElement = { };
+    window.HTMLElement.prototype = div['__proto__'];
+    Prototype.BrowserFeatures.ElementExtensions = true;
+  }
+
+  div = null;
+
+})(document.createElement('div'))
 
 Element.extend = (function() {
-  if (Prototype.BrowserFeatures.SpecificElementExtensions)
+
+  function checkDeficiency(tagName) {
+    if (typeof window.Element != 'undefined') {
+      var proto = window.Element.prototype;
+      if (proto) {
+        var id = '_' + (Math.random()+'').slice(2);
+        var el = document.createElement(tagName);
+        proto[id] = 'x';
+        var isBuggy = (el[id] !== 'x');
+        delete proto[id];
+        el = null;
+        return isBuggy;
+      }
+    }
+    return false;
+  }
+
+  function extendElementWith(element, methods) {
+    for (var property in methods) {
+      var value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+  }
+
+  var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
+
+  if (Prototype.BrowserFeatures.SpecificElementExtensions) {
+    if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
+      return function(element) {
+        if (element && typeof element._extendedByPrototype == 'undefined') {
+          var t = element.tagName;
+          if (t && (/^(?:object|applet|embed)$/i.test(t))) {
+            extendElementWith(element, Element.Methods);
+            extendElementWith(element, Element.Methods.Simulated);
+            extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
+          }
+        }
+        return element;
+      }
+    }
     return Prototype.K;
+  }
 
   var Methods = { }, ByTag = Element.Methods.ByTag;
 
   var extend = Object.extend(function(element) {
-    if (!element || element._extendedByPrototype ||
+    if (!element || typeof element._extendedByPrototype != 'undefined' ||
         element.nodeType != 1 || element == window) return element;
 
     var methods = Object.clone(Methods),
-      tagName = element.tagName, property, value;
+        tagName = element.tagName.toUpperCase();
 
-    // extend methods for specific tags
     if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
 
-    for (property in methods) {
-      value = methods[property];
-      if (Object.isFunction(value) && !(property in element))
-        element[property] = value.methodize();
-    }
+    extendElementWith(element, methods);
 
     element._extendedByPrototype = Prototype.emptyFunction;
     return element;
 
   }, {
     refresh: function() {
-      // extend methods for all tags (Safari doesn't need this)
       if (!Prototype.BrowserFeatures.ElementExtensions) {
         Object.extend(Methods, Element.Methods);
         Object.extend(Methods, Element.Methods.Simulated);
@@ -2642,14 +3020,18 @@ Element.addMethods = function(methods) {
     klass = 'HTML' + tagName.capitalize() + 'Element';
     if (window[klass]) return window[klass];
 
-    window[klass] = { };
-    window[klass].prototype = document.createElement(tagName).__proto__;
-    return window[klass];
+    var element = document.createElement(tagName);
+    var proto = element['__proto__'] || element.constructor.prototype;
+    element = null;
+    return proto;
   }
 
+  var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
+   Element.prototype;
+
   if (F.ElementExtensions) {
-    copy(Element.Methods, HTMLElement.prototype);
-    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+    copy(Element.Methods, elementPrototype);
+    copy(Element.Methods.Simulated, elementPrototype, true);
   }
 
   if (F.SpecificElementExtensions) {
@@ -2667,66 +3049,187 @@ Element.addMethods = function(methods) {
   Element.cache = { };
 };
 
-document.viewport = {
-  getDimensions: function() {
-    var dimensions = { };
-    var B = Prototype.Browser;
-    $w('width height').each(function(d) {
-      var D = d.capitalize();
-      dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
-        (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];
-    });
-    return dimensions;
-  },
 
-  getWidth: function() {
-    return this.getDimensions().width;
-  },
+document.viewport = {
 
-  getHeight: function() {
-    return this.getDimensions().height;
+  getDimensions: function() {
+    return { width: this.getWidth(), height: this.getHeight() };
   },
 
   getScrollOffsets: function() {
     return Element._returnOffset(
       window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
-      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+      window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop);
   }
 };
-/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
+
+(function(viewport) {
+  var B = Prototype.Browser, doc = document, element, property = {};
+
+  function getRootElement() {
+    if (B.WebKit && !doc.evaluate)
+      return document;
+
+    if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
+      return document.body;
+
+    return document.documentElement;
+  }
+
+  function define(D) {
+    if (!element) element = getRootElement();
+
+    property[D] = 'client' + D;
+
+    viewport['get' + D] = function() { return element[property[D]] };
+    return viewport['get' + D]();
+  }
+
+  viewport.getWidth  = define.curry('Width');
+
+  viewport.getHeight = define.curry('Height');
+})(document.viewport);
+
+
+Element.Storage = {
+  UID: 1
+};
+
+Element.addMethods({
+  getStorage: function(element) {
+    if (!(element = $(element))) return;
+
+    var uid;
+    if (element === window) {
+      uid = 0;
+    } else {
+      if (typeof element._prototypeUID === "undefined")
+        element._prototypeUID = [Element.Storage.UID++];
+      uid = element._prototypeUID[0];
+    }
+
+    if (!Element.Storage[uid])
+      Element.Storage[uid] = $H();
+
+    return Element.Storage[uid];
+  },
+
+  store: function(element, key, value) {
+    if (!(element = $(element))) return;
+
+    if (arguments.length === 2) {
+      Element.getStorage(element).update(key);
+    } else {
+      Element.getStorage(element).set(key, value);
+    }
+
+    return element;
+  },
+
+  retrieve: function(element, key, defaultValue) {
+    if (!(element = $(element))) return;
+    var hash = Element.getStorage(element), value = hash.get(key);
+
+    if (Object.isUndefined(value)) {
+      hash.set(key, defaultValue);
+      value = defaultValue;
+    }
+
+    return value;
+  },
+
+  clone: function(element, deep) {
+    if (!(element = $(element))) return;
+    var clone = element.cloneNode(deep);
+    clone._prototypeUID = void 0;
+    if (deep) {
+      var descendants = Element.select(clone, '*'),
+          i = descendants.length;
+      while (i--) {
+        descendants[i]._prototypeUID = void 0;
+      }
+    }
+    return Element.extend(clone);
+  }
+});
+/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
  * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
  * license.  Please see http://www.yui-ext.com/ for more information. */
 
 var Selector = Class.create({
   initialize: function(expression) {
     this.expression = expression.strip();
-    this.compileMatcher();
+
+    if (this.shouldUseSelectorsAPI()) {
+      this.mode = 'selectorsAPI';
+    } else if (this.shouldUseXPath()) {
+      this.mode = 'xpath';
+      this.compileXPathMatcher();
+    } else {
+      this.mode = "normal";
+      this.compileMatcher();
+    }
+
   },
 
-  shouldUseXPath: function() {
-    if (!Prototype.BrowserFeatures.XPath) return false;
+  shouldUseXPath: (function() {
 
-    var e = this.expression;
+    var IS_DESCENDANT_SELECTOR_BUGGY = (function(){
+      var isBuggy = false;
+      if (document.evaluate && window.XPathResult) {
+        var el = document.createElement('div');
+        el.innerHTML = '<ul><li></li></ul><div><ul><li></li></ul></div>';
 
-    // Safari 3 chokes on :*-of-type and :empty
-    if (Prototype.Browser.WebKit &&
-     (e.include("-of-type") || e.include(":empty")))
-      return false;
+        var xpath = ".//*[local-name()='ul' or local-name()='UL']" +
+          "//*[local-name()='li' or local-name()='LI']";
 
-    // XPath can't do namespaced attributes, nor can it read
-    // the "checked" property from DOM nodes
-    if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
+        var result = document.evaluate(xpath, el, null,
+          XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+
+        isBuggy = (result.snapshotLength !== 2);
+        el = null;
+      }
+      return isBuggy;
+    })();
+
+    return function() {
+      if (!Prototype.BrowserFeatures.XPath) return false;
+
+      var e = this.expression;
+
+      if (Prototype.Browser.WebKit &&
+       (e.include("-of-type") || e.include(":empty")))
+        return false;
+
+      if ((/(\[[\w-]*?:|:checked)/).test(e))
+        return false;
+
+      if (IS_DESCENDANT_SELECTOR_BUGGY) return false;
+
+      return true;
+    }
+
+  })(),
+
+  shouldUseSelectorsAPI: function() {
+    if (!Prototype.BrowserFeatures.SelectorsAPI) return false;
+
+    if (Selector.CASE_INSENSITIVE_CLASS_NAMES) return false;
+
+    if (!Selector._div) Selector._div = new Element('div');
+
+    try {
+      Selector._div.querySelector(this.expression);
+    } catch(e) {
       return false;
+    }
 
     return true;
   },
 
   compileMatcher: function() {
-    if (this.shouldUseXPath())
-      return this.compileXPathMatcher();
-
     var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
-        c = Selector.criteria, le, p, m;
+        c = Selector.criteria, le, p, m, len = ps.length, name;
 
     if (Selector._cache[e]) {
       this.matcher = Selector._cache[e];
@@ -2738,11 +3241,12 @@ var Selector = Class.create({
 
     while (e && le != e && (/\S/).test(e)) {
       le = e;
-      for (var i in ps) {
-        p = ps[i];
+      for (var i = 0; i<len; i++) {
+        p = ps[i].re;
+        name = ps[i].name;
         if (m = e.match(p)) {
-          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
-    	      new Template(c[i]).evaluate(m));
+          this.matcher.push(Object.isFunction(c[name]) ? c[name](m) :
+            new Template(c[name]).evaluate(m));
           e = e.replace(m[0], '');
           break;
         }
@@ -2756,7 +3260,7 @@ var Selector = Class.create({
 
   compileXPathMatcher: function() {
     var e = this.expression, ps = Selector.patterns,
-        x = Selector.xpath, le, m;
+        x = Selector.xpath, le, m, len = ps.length, name;
 
     if (Selector._cache[e]) {
       this.xpath = Selector._cache[e]; return;
@@ -2765,10 +3269,11 @@ var Selector = Class.create({
     this.matcher = ['.//*'];
     while (e && le != e && (/\S/).test(e)) {
       le = e;
-      for (var i in ps) {
-        if (m = e.match(ps[i])) {
-          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
-            new Template(x[i]).evaluate(m));
+      for (var i = 0; i<len; i++) {
+        name = ps[i].name;
+        if (m = e.match(ps[i].re)) {
+          this.matcher.push(Object.isFunction(x[name]) ? x[name](m) :
+            new Template(x[name]).evaluate(m));
           e = e.replace(m[0], '');
           break;
         }
@@ -2781,29 +3286,43 @@ var Selector = Class.create({
 
   findElements: function(root) {
     root = root || document;
-    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
-    return this.matcher(root);
+    var e = this.expression, results;
+
+    switch (this.mode) {
+      case 'selectorsAPI':
+        if (root !== document) {
+          var oldId = root.id, id = $(root).identify();
+          id = id.replace(/([\.:])/g, "\\$1");
+          e = "#" + id + " " + e;
+        }
+
+        results = $A(root.querySelectorAll(e)).map(Element.extend);
+        root.id = oldId;
+
+        return results;
+      case 'xpath':
+        return document._getElementsByXPath(this.xpath, root);
+      default:
+       return this.matcher(root);
+    }
   },
 
   match: function(element) {
     this.tokens = [];
 
     var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
-    var le, p, m;
+    var le, p, m, len = ps.length, name;
 
     while (e && le !== e && (/\S/).test(e)) {
       le = e;
-      for (var i in ps) {
-        p = ps[i];
+      for (var i = 0; i<len; i++) {
+        p = ps[i].re;
+        name = ps[i].name;
         if (m = e.match(p)) {
-          // use the Selector.assertions methods unless the selector
-          // is too complex.
-          if (as[i]) {
-            this.tokens.push([i, Object.clone(m)]);
+          if (as[name]) {
+            this.tokens.push([name, Object.clone(m)]);
             e = e.replace(m[0], '');
           } else {
-            // reluctantly do a document-wide search
-            // and look for a match in the array
             return this.findElements(document).include(element);
           }
         }
@@ -2830,6 +3349,21 @@ var Selector = Class.create({
   }
 });
 
+if (Prototype.BrowserFeatures.SelectorsAPI &&
+ document.compatMode === 'BackCompat') {
+  Selector.CASE_INSENSITIVE_CLASS_NAMES = (function(){
+    var div = document.createElement('div'),
+     span = document.createElement('span');
+
+    div.id = "prototype_test_id";
+    span.className = 'Test';
+    div.appendChild(span);
+    var isIgnored = (div.querySelector('#prototype_test_id .test') !== null);
+    div = span = null;
+    return isIgnored;
+  })();
+}
+
 Object.extend(Selector, {
   _cache: { },
 
@@ -2873,20 +3407,21 @@ Object.extend(Selector, {
       'first-child': '[not(preceding-sibling::*)]',
       'last-child':  '[not(following-sibling::*)]',
       'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
-      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
+      'empty':       "[count(*) = 0 and (count(text()) = 0)]",
       'checked':     "[@checked]",
-      'disabled':    "[@disabled]",
-      'enabled':     "[not(@disabled)]",
+      'disabled':    "[(@disabled) and (@type!='hidden')]",
+      'enabled':     "[not(@disabled) and (@type!='hidden')]",
       'not': function(m) {
         var e = m[6], p = Selector.patterns,
-            x = Selector.xpath, le, v;
+            x = Selector.xpath, le, v, len = p.length, name;
 
         var exclusion = [];
         while (e && le != e && (/\S/).test(e)) {
           le = e;
-          for (var i in p) {
-            if (m = e.match(p[i])) {
-              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+          for (var i = 0; i<len; i++) {
+            name = p[i].name
+            if (m = e.match(p[i].re)) {
+              v = Object.isFunction(x[name]) ? x[name](m) : new Template(x[name]).evaluate(m);
               exclusion.push("(" + v.substring(1, v.length - 1) + ")");
               e = e.replace(m[0], '');
               break;
@@ -2954,25 +3489,20 @@ Object.extend(Selector, {
     laterSibling: 'c = "laterSibling";'
   },
 
-  patterns: {
-    // combinators must be listed first
-    // (and descendant needs to be last combinator)
-    laterSibling: /^\s*~\s*/,
-    child:        /^\s*>\s*/,
-    adjacent:     /^\s*\+\s*/,
-    descendant:   /^\s/,
+  patterns: [
+    { name: 'laterSibling', re: /^\s*~\s*/ },
+    { name: 'child',        re: /^\s*>\s*/ },
+    { name: 'adjacent',     re: /^\s*\+\s*/ },
+    { name: 'descendant',   re: /^\s/ },
 
-    // selectors follow
-    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
-    id:           /^#([\w\-\*]+)(\b|$)/,
-    className:    /^\.([\w\-\*]+)(\b|$)/,
-    pseudo:
-/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
-    attrPresence: /^\[([\w]+)\]/,
-    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
-  },
+    { name: 'tagName',      re: /^\s*(\*|[\w\-]+)(\b|$)?/ },
+    { name: 'id',           re: /^#([\w\-\*]+)(\b|$)/ },
+    { name: 'className',    re: /^\.([\w\-\*]+)(\b|$)/ },
+    { name: 'pseudo',       re: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/ },
+    { name: 'attrPresence', re: /^\[((?:[\w-]+:)?[\w-]+)\]/ },
+    { name: 'attr',         re: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ }
+  ],
 
-  // for Selector.match and Element#match
   assertions: {
     tagName: function(element, matches) {
       return matches[1].toUpperCase() == element.tagName.toUpperCase();
@@ -2997,15 +3527,12 @@ Object.extend(Selector, {
   },
 
   handlers: {
-    // UTILITY FUNCTIONS
-    // joins two collections
     concat: function(a, b) {
       for (var i = 0, node; node = b[i]; i++)
         a.push(node);
       return a;
     },
 
-    // marks an array of nodes for counting
     mark: function(nodes) {
       var _true = Prototype.emptyFunction;
       for (var i = 0, node; node = nodes[i]; i++)
@@ -3013,15 +3540,32 @@ Object.extend(Selector, {
       return nodes;
     },
 
-    unmark: function(nodes) {
-      for (var i = 0, node; node = nodes[i]; i++)
-        node._countedByPrototype = undefined;
-      return nodes;
-    },
+    unmark: (function(){
+
+      var PROPERTIES_ATTRIBUTES_MAP = (function(){
+        var el = document.createElement('div'),
+            isBuggy = false,
+            propName = '_countedByPrototype',
+            value = 'x'
+        el[propName] = value;
+        isBuggy = (el.getAttribute(propName) === value);
+        el = null;
+        return isBuggy;
+      })();
+
+      return PROPERTIES_ATTRIBUTES_MAP ?
+        function(nodes) {
+          for (var i = 0, node; node = nodes[i]; i++)
+            node.removeAttribute('_countedByPrototype');
+          return nodes;
+        } :
+        function(nodes) {
+          for (var i = 0, node; node = nodes[i]; i++)
+            node._countedByPrototype = void 0;
+          return nodes;
+        }
+    })(),
 
-    // mark each child node with its position (for nth calls)
-    // "ofType" flag indicates whether we're indexing for nth-of-type
-    // rather than nth-child
     index: function(parentNode, reverse, ofType) {
       parentNode._countedByPrototype = Prototype.emptyFunction;
       if (reverse) {
@@ -3035,19 +3579,17 @@ Object.extend(Selector, {
       }
     },
 
-    // filters out duplicates and extends all nodes
     unique: function(nodes) {
       if (nodes.length == 0) return nodes;
       var results = [], n;
       for (var i = 0, l = nodes.length; i < l; i++)
-        if (!(n = nodes[i])._countedByPrototype) {
+        if (typeof (n = nodes[i])._countedByPrototype == 'undefined') {
           n._countedByPrototype = Prototype.emptyFunction;
           results.push(Element.extend(n));
         }
       return Selector.handlers.unmark(results);
     },
 
-    // COMBINATOR FUNCTIONS
     descendant: function(nodes) {
       var h = Selector.handlers;
       for (var i = 0, results = [], node; node = nodes[i]; i++)
@@ -3081,7 +3623,7 @@ Object.extend(Selector, {
 
     nextElementSibling: function(node) {
       while (node = node.nextSibling)
-	      if (node.nodeType == 1) return node;
+        if (node.nodeType == 1) return node;
       return null;
     },
 
@@ -3091,13 +3633,11 @@ Object.extend(Selector, {
       return null;
     },
 
-    // TOKEN FUNCTIONS
     tagName: function(nodes, root, tagName, combinator) {
       var uTagName = tagName.toUpperCase();
       var results = [], h = Selector.handlers;
       if (nodes) {
         if (combinator) {
-          // fastlane for ordinary descendant combinators
           if (combinator == "descendant") {
             for (var i = 0, node; node = nodes[i]; i++)
               h.concat(results, node.getElementsByTagName(tagName));
@@ -3113,8 +3653,19 @@ Object.extend(Selector, {
 
     id: function(nodes, root, id, combinator) {
       var targetNode = $(id), h = Selector.handlers;
-      if (!targetNode) return [];
-      if (!nodes && root == document) return [targetNode];
+
+      if (root == document) {
+        if (!targetNode) return [];
+        if (!nodes) return [targetNode];
+      } else {
+        if (!root.sourceIndex || root.sourceIndex < 1) {
+          var nodes = root.getElementsByTagName('*');
+          for (var j = 0, node; node = nodes[j]; j++) {
+            if (node.id === id) return [node];
+          }
+        }
+      }
+
       if (nodes) {
         if (combinator) {
           if (combinator == 'child') {
@@ -3226,7 +3777,6 @@ Object.extend(Selector, {
       return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
     },
 
-    // handles the an+b logic
     getIndices: function(a, b, total) {
       if (a == 0) return b > 0 ? [b] : [];
       return $R(1, total).inject([], function(memo, i) {
@@ -3235,7 +3785,6 @@ Object.extend(Selector, {
       });
     },
 
-    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
     nth: function(nodes, formula, root, reverse, ofType) {
       if (nodes.length == 0) return [];
       if (formula == 'even') formula = '2n+0';
@@ -3269,8 +3818,7 @@ Object.extend(Selector, {
 
     'empty': function(nodes, value, root) {
       for (var i = 0, results = [], node; node = nodes[i]; i++) {
-        // IE treats comments as element nodes
-        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
+        if (node.tagName == '!' || node.firstChild) continue;
         results.push(node);
       }
       return results;
@@ -3288,7 +3836,8 @@ Object.extend(Selector, {
 
     'enabled': function(nodes, value, root) {
       for (var i = 0, results = [], node; node = nodes[i]; i++)
-        if (!node.disabled) results.push(node);
+        if (!node.disabled && (!node.type || node.type !== 'hidden'))
+          results.push(node);
       return results;
     },
 
@@ -3308,11 +3857,12 @@ Object.extend(Selector, {
   operators: {
     '=':  function(nv, v) { return nv == v; },
     '!=': function(nv, v) { return nv != v; },
-    '^=': function(nv, v) { return nv.startsWith(v); },
-    '$=': function(nv, v) { return nv.endsWith(v); },
-    '*=': function(nv, v) { return nv.include(v); },
+    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
+    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
+    '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
     '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
-    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
+    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
+     '-').include('-' + (v || "").toUpperCase() + '-'); }
   },
 
   split: function(expression) {
@@ -3352,19 +3902,10 @@ Object.extend(Selector, {
 
 if (Prototype.Browser.IE) {
   Object.extend(Selector.handlers, {
-    // IE returns comment nodes on getElementsByTagName("*").
-    // Filter them out.
     concat: function(a, b) {
       for (var i = 0, node; node = b[i]; i++)
         if (node.tagName !== "!") a.push(node);
       return a;
-    },
-
-    // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
-    unmark: function(nodes) {
-      for (var i = 0, node; node = nodes[i]; i++)
-        node.removeAttribute('_countedByPrototype');
-      return nodes;
     }
   });
 }
@@ -3372,9 +3913,11 @@ if (Prototype.Browser.IE) {
 function $$() {
   return Selector.findChildElements(document, $A(arguments));
 }
+
 var Form = {
   reset: function(form) {
-    $(form).reset();
+    form = $(form);
+    form.reset();
     return form;
   },
 
@@ -3386,10 +3929,9 @@ var Form = {
     var data = elements.inject({ }, function(result, element) {
       if (!element.disabled && element.name) {
         key = element.name; value = $(element).getValue();
-        if (value != null && (element.type != 'submit' || (!submitted &&
+        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
             submit !== false && (!submit || key == submit) && (submitted = true)))) {
           if (key in result) {
-            // a key is already present; construct an array of values
             if (!Object.isArray(result[key])) result[key] = [result[key]];
             result[key].push(value);
           }
@@ -3409,13 +3951,18 @@ Form.Methods = {
   },
 
   getElements: function(form) {
-    return $A($(form).getElementsByTagName('*')).inject([],
-      function(elements, child) {
-        if (Form.Element.Serializers[child.tagName.toLowerCase()])
-          elements.push(Element.extend(child));
-        return elements;
-      }
-    );
+    var elements = $(form).getElementsByTagName('*'),
+        element,
+        arr = [ ],
+        serializers = Form.Element.Serializers;
+    for (var i = 0; element = elements[i]; i++) {
+      arr.push(element);
+    }
+    return arr.inject([], function(elements, child) {
+      if (serializers[child.tagName.toLowerCase()])
+        elements.push(Element.extend(child));
+      return elements;
+    })
   },
 
   getInputs: function(form, typeName, name) {
@@ -3455,7 +4002,7 @@ Form.Methods = {
     }).sortBy(function(element) { return element.tabIndex }).first();
 
     return firstByIndex ? firstByIndex : elements.find(function(element) {
-      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+      return /^(?:input|select|textarea)$/i.test(element.tagName);
     });
   },
 
@@ -3486,6 +4033,7 @@ Form.Methods = {
 
 /*--------------------------------------------------------------------------*/
 
+
 Form.Element = {
   focus: function(element) {
     $(element).focus();
@@ -3499,6 +4047,7 @@ Form.Element = {
 };
 
 Form.Element.Methods = {
+
   serialize: function(element) {
     element = $(element);
     if (!element.disabled && element.name) {
@@ -3539,7 +4088,7 @@ Form.Element.Methods = {
     try {
       element.focus();
       if (element.select && (element.tagName.toLowerCase() != 'input' ||
-          !['button', 'reset', 'submit'].include(element.type)))
+          !(/^(?:button|reset|submit)$/i.test(element.type))))
         element.select();
     } catch (e) { }
     return element;
@@ -3547,7 +4096,6 @@ Form.Element.Methods = {
 
   disable: function(element) {
     element = $(element);
-    element.blur();
     element.disabled = true;
     return element;
   },
@@ -3562,6 +4110,7 @@ Form.Element.Methods = {
 /*--------------------------------------------------------------------------*/
 
 var Field = Form.Element;
+
 var $F = Form.Element.Methods.getValue;
 
 /*--------------------------------------------------------------------------*/
@@ -3587,22 +4136,22 @@ Form.Element.Serializers = {
     else element.value = value;
   },
 
-  select: function(element, index) {
-    if (Object.isUndefined(index))
+  select: function(element, value) {
+    if (Object.isUndefined(value))
       return this[element.type == 'select-one' ?
         'selectOne' : 'selectMany'](element);
     else {
-      var opt, value, single = !Object.isArray(index);
+      var opt, currentValue, single = !Object.isArray(value);
       for (var i = 0, length = element.length; i < length; i++) {
         opt = element.options[i];
-        value = this.optionValue(opt);
+        currentValue = this.optionValue(opt);
         if (single) {
-          if (value == index) {
+          if (currentValue == value) {
             opt.selected = true;
             return;
           }
         }
-        else opt.selected = index.include(value);
+        else opt.selected = value.include(currentValue);
       }
     }
   },
@@ -3624,13 +4173,13 @@ Form.Element.Serializers = {
   },
 
   optionValue: function(opt) {
-    // extend element because hasAttribute may not be native
     return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
   }
 };
 
 /*--------------------------------------------------------------------------*/
 
+
 Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
   initialize: function($super, element, frequency, callback) {
     $super(callback, frequency);
@@ -3712,325 +4261,441 @@ Form.EventObserver = Class.create(Abstract.EventObserver, {
     return Form.serialize(this.element);
   }
 });
-if (!window.Event) var Event = { };
-
-Object.extend(Event, {
-  KEY_BACKSPACE: 8,
-  KEY_TAB:       9,
-  KEY_RETURN:   13,
-  KEY_ESC:      27,
-  KEY_LEFT:     37,
-  KEY_UP:       38,
-  KEY_RIGHT:    39,
-  KEY_DOWN:     40,
-  KEY_DELETE:   46,
-  KEY_HOME:     36,
-  KEY_END:      35,
-  KEY_PAGEUP:   33,
-  KEY_PAGEDOWN: 34,
-  KEY_INSERT:   45,
-
-  cache: { },
-
-  relatedTarget: function(event) {
-    var element;
-    switch(event.type) {
-      case 'mouseover': element = event.fromElement; break;
-      case 'mouseout':  element = event.toElement;   break;
-      default: return null;
-    }
-    return Element.extend(element);
-  }
-});
+(function() {
+
+  var Event = {
+    KEY_BACKSPACE: 8,
+    KEY_TAB:       9,
+    KEY_RETURN:   13,
+    KEY_ESC:      27,
+    KEY_LEFT:     37,
+    KEY_UP:       38,
+    KEY_RIGHT:    39,
+    KEY_DOWN:     40,
+    KEY_DELETE:   46,
+    KEY_HOME:     36,
+    KEY_END:      35,
+    KEY_PAGEUP:   33,
+    KEY_PAGEDOWN: 34,
+    KEY_INSERT:   45,
+
+    cache: {}
+  };
 
-Event.Methods = (function() {
-  var isButton;
+  var docEl = document.documentElement;
+  var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
+    && 'onmouseleave' in docEl;
 
+  var _isButton;
   if (Prototype.Browser.IE) {
     var buttonMap = { 0: 1, 1: 4, 2: 2 };
-    isButton = function(event, code) {
-      return event.button == buttonMap[code];
+    _isButton = function(event, code) {
+      return event.button === buttonMap[code];
     };
-
   } else if (Prototype.Browser.WebKit) {
-    isButton = function(event, code) {
+    _isButton = function(event, code) {
       switch (code) {
         case 0: return event.which == 1 && !event.metaKey;
         case 1: return event.which == 1 && event.metaKey;
         default: return false;
       }
     };
-
   } else {
-    isButton = function(event, code) {
+    _isButton = function(event, code) {
       return event.which ? (event.which === code + 1) : (event.button === code);
     };
   }
 
-  return {
-    isLeftClick:   function(event) { return isButton(event, 0) },
-    isMiddleClick: function(event) { return isButton(event, 1) },
-    isRightClick:  function(event) { return isButton(event, 2) },
+  function isLeftClick(event)   { return _isButton(event, 0) }
 
-    element: function(event) {
-      var node = Event.extend(event).target;
-      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
-    },
+  function isMiddleClick(event) { return _isButton(event, 1) }
 
-    findElement: function(event, expression) {
-      var element = Event.element(event);
-      if (!expression) return element;
-      var elements = [element].concat(element.ancestors());
-      return Selector.findElement(elements, expression, 0);
-    },
+  function isRightClick(event)  { return _isButton(event, 2) }
 
-    pointer: function(event) {
-      return {
-        x: event.pageX || (event.clientX +
-          (document.documentElement.scrollLeft || document.body.scrollLeft)),
-        y: event.pageY || (event.clientY +
-          (document.documentElement.scrollTop || document.body.scrollTop))
-      };
-    },
+  function element(event) {
+    event = Event.extend(event);
 
-    pointerX: function(event) { return Event.pointer(event).x },
-    pointerY: function(event) { return Event.pointer(event).y },
+    var node = event.target, type = event.type,
+     currentTarget = event.currentTarget;
 
-    stop: function(event) {
-      Event.extend(event);
-      event.preventDefault();
-      event.stopPropagation();
-      event.stopped = true;
+    if (currentTarget && currentTarget.tagName) {
+      if (type === 'load' || type === 'error' ||
+        (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
+          && currentTarget.type === 'radio'))
+            node = currentTarget;
     }
+
+    if (node.nodeType == Node.TEXT_NODE)
+      node = node.parentNode;
+
+    return Element.extend(node);
+  }
+
+  function findElement(event, expression) {
+    var element = Event.element(event);
+    if (!expression) return element;
+    var elements = [element].concat(element.ancestors());
+    return Selector.findElement(elements, expression, 0);
+  }
+
+  function pointer(event) {
+    return { x: pointerX(event), y: pointerY(event) };
+  }
+
+  function pointerX(event) {
+    var docElement = document.documentElement,
+     body = document.body || { scrollLeft: 0 };
+
+    return event.pageX || (event.clientX +
+      (docElement.scrollLeft || body.scrollLeft) -
+      (docElement.clientLeft || 0));
+  }
+
+  function pointerY(event) {
+    var docElement = document.documentElement,
+     body = document.body || { scrollTop: 0 };
+
+    return  event.pageY || (event.clientY +
+       (docElement.scrollTop || body.scrollTop) -
+       (docElement.clientTop || 0));
+  }
+
+
+  function stop(event) {
+    Event.extend(event);
+    event.preventDefault();
+    event.stopPropagation();
+
+    event.stopped = true;
+  }
+
+  Event.Methods = {
+    isLeftClick: isLeftClick,
+    isMiddleClick: isMiddleClick,
+    isRightClick: isRightClick,
+
+    element: element,
+    findElement: findElement,
+
+    pointer: pointer,
+    pointerX: pointerX,
+    pointerY: pointerY,
+
+    stop: stop
   };
-})();
 
-Event.extend = (function() {
+
   var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
     m[name] = Event.Methods[name].methodize();
     return m;
   });
 
   if (Prototype.Browser.IE) {
+    function _relatedTarget(event) {
+      var element;
+      switch (event.type) {
+        case 'mouseover': element = event.fromElement; break;
+        case 'mouseout':  element = event.toElement;   break;
+        default: return null;
+      }
+      return Element.extend(element);
+    }
+
     Object.extend(methods, {
       stopPropagation: function() { this.cancelBubble = true },
       preventDefault:  function() { this.returnValue = false },
-      inspect: function() { return "[object Event]" }
+      inspect: function() { return '[object Event]' }
     });
 
-    return function(event) {
+    Event.extend = function(event, element) {
       if (!event) return false;
       if (event._extendedByPrototype) return event;
 
       event._extendedByPrototype = Prototype.emptyFunction;
       var pointer = Event.pointer(event);
+
       Object.extend(event, {
-        target: event.srcElement,
-        relatedTarget: Event.relatedTarget(event),
+        target: event.srcElement || element,
+        relatedTarget: _relatedTarget(event),
         pageX:  pointer.x,
         pageY:  pointer.y
       });
+
       return Object.extend(event, methods);
     };
-
   } else {
-    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
+    Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
     Object.extend(Event.prototype, methods);
-    return Prototype.K;
+    Event.extend = Prototype.K;
   }
-})();
-
-Object.extend(Event, (function() {
-  var cache = Event.cache;
 
-  function getEventID(element) {
-    if (element._prototypeEventID) return element._prototypeEventID[0];
-    arguments.callee.id = arguments.callee.id || 1;
-    return element._prototypeEventID = [++arguments.callee.id];
-  }
+  function _createResponder(element, eventName, handler) {
+    var registry = Element.retrieve(element, 'prototype_event_registry');
 
-  function getDOMEventName(eventName) {
-    if (eventName && eventName.include(':')) return "dataavailable";
-    return eventName;
-  }
+    if (Object.isUndefined(registry)) {
+      CACHE.push(element);
+      registry = Element.retrieve(element, 'prototype_event_registry', $H());
+    }
 
-  function getCacheForID(id) {
-    return cache[id] = cache[id] || { };
-  }
+    var respondersForEvent = registry.get(eventName);
+    if (Object.isUndefined(respondersForEvent)) {
+      respondersForEvent = [];
+      registry.set(eventName, respondersForEvent);
+    }
 
-  function getWrappersForEventName(id, eventName) {
-    var c = getCacheForID(id);
-    return c[eventName] = c[eventName] || [];
-  }
+    if (respondersForEvent.pluck('handler').include(handler)) return false;
 
-  function createWrapper(element, eventName, handler) {
-    var id = getEventID(element);
-    var c = getWrappersForEventName(id, eventName);
-    if (c.pluck("handler").include(handler)) return false;
+    var responder;
+    if (eventName.include(":")) {
+      responder = function(event) {
+        if (Object.isUndefined(event.eventName))
+          return false;
 
-    var wrapper = function(event) {
-      if (!Event || !Event.extend ||
-        (event.eventName && event.eventName != eventName))
+        if (event.eventName !== eventName)
           return false;
 
-      Event.extend(event);
-      handler.call(element, event);
-    };
+        Event.extend(event, element);
+        handler.call(element, event);
+      };
+    } else {
+      if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
+       (eventName === "mouseenter" || eventName === "mouseleave")) {
+        if (eventName === "mouseenter" || eventName === "mouseleave") {
+          responder = function(event) {
+            Event.extend(event, element);
+
+            var parent = event.relatedTarget;
+            while (parent && parent !== element) {
+              try { parent = parent.parentNode; }
+              catch(e) { parent = element; }
+            }
 
-    wrapper.handler = handler;
-    c.push(wrapper);
-    return wrapper;
-  }
+            if (parent === element) return;
 
-  function findWrapper(id, eventName, handler) {
-    var c = getWrappersForEventName(id, eventName);
-    return c.find(function(wrapper) { return wrapper.handler == handler });
-  }
+            handler.call(element, event);
+          };
+        }
+      } else {
+        responder = function(event) {
+          Event.extend(event, element);
+          handler.call(element, event);
+        };
+      }
+    }
 
-  function destroyWrapper(id, eventName, handler) {
-    var c = getCacheForID(id);
-    if (!c[eventName]) return false;
-    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+    responder.handler = handler;
+    respondersForEvent.push(responder);
+    return responder;
   }
 
-  function destroyCache() {
-    for (var id in cache)
-      for (var eventName in cache[id])
-        cache[id][eventName] = null;
+  function _destroyCache() {
+    for (var i = 0, length = CACHE.length; i < length; i++) {
+      Event.stopObserving(CACHE[i]);
+      CACHE[i] = null;
+    }
   }
 
-  if (window.attachEvent) {
-    window.attachEvent("onunload", destroyCache);
+  var CACHE = [];
+
+  if (Prototype.Browser.IE)
+    window.attachEvent('onunload', _destroyCache);
+
+  if (Prototype.Browser.WebKit)
+    window.addEventListener('unload', Prototype.emptyFunction, false);
+
+
+  var _getDOMEventName = Prototype.K;
+
+  if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
+    _getDOMEventName = function(eventName) {
+      var translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
+      return eventName in translations ? translations[eventName] : eventName;
+    };
   }
 
-  return {
-    observe: function(element, eventName, handler) {
-      element = $(element);
-      var name = getDOMEventName(eventName);
+  function observe(element, eventName, handler) {
+    element = $(element);
 
-      var wrapper = createWrapper(element, eventName, handler);
-      if (!wrapper) return element;
+    var responder = _createResponder(element, eventName, handler);
 
-      if (element.addEventListener) {
-        element.addEventListener(name, wrapper, false);
-      } else {
-        element.attachEvent("on" + name, wrapper);
+    if (!responder) return element;
+
+    if (eventName.include(':')) {
+      if (element.addEventListener)
+        element.addEventListener("dataavailable", responder, false);
+      else {
+        element.attachEvent("ondataavailable", responder);
+        element.attachEvent("onfilterchange", responder);
       }
+    } else {
+      var actualEventName = _getDOMEventName(eventName);
 
-      return element;
-    },
+      if (element.addEventListener)
+        element.addEventListener(actualEventName, responder, false);
+      else
+        element.attachEvent("on" + actualEventName, responder);
+    }
 
-    stopObserving: function(element, eventName, handler) {
-      element = $(element);
-      var id = getEventID(element), name = getDOMEventName(eventName);
+    return element;
+  }
 
-      if (!handler && eventName) {
-        getWrappersForEventName(id, eventName).each(function(wrapper) {
-          element.stopObserving(eventName, wrapper.handler);
-        });
-        return element;
+  function stopObserving(element, eventName, handler) {
+    element = $(element);
 
-      } else if (!eventName) {
-        Object.keys(getCacheForID(id)).each(function(eventName) {
-          element.stopObserving(eventName);
-        });
-        return element;
-      }
+    var registry = Element.retrieve(element, 'prototype_event_registry');
 
-      var wrapper = findWrapper(id, eventName, handler);
-      if (!wrapper) return element;
+    if (Object.isUndefined(registry)) return element;
 
-      if (element.removeEventListener) {
-        element.removeEventListener(name, wrapper, false);
-      } else {
-        element.detachEvent("on" + name, wrapper);
-      }
+    if (eventName && !handler) {
+      var responders = registry.get(eventName);
 
-      destroyWrapper(id, eventName, handler);
+      if (Object.isUndefined(responders)) return element;
 
+      responders.each( function(r) {
+        Element.stopObserving(element, eventName, r.handler);
+      });
       return element;
-    },
+    } else if (!eventName) {
+      registry.each( function(pair) {
+        var eventName = pair.key, responders = pair.value;
 
-    fire: function(element, eventName, memo) {
-      element = $(element);
-      if (element == document && document.createEvent && !element.dispatchEvent)
-        element = document.documentElement;
+        responders.each( function(r) {
+          Element.stopObserving(element, eventName, r.handler);
+        });
+      });
+      return element;
+    }
 
-      var event;
-      if (document.createEvent) {
-        event = document.createEvent("HTMLEvents");
-        event.initEvent("dataavailable", true, true);
-      } else {
-        event = document.createEventObject();
-        event.eventType = "ondataavailable";
-      }
+    var responders = registry.get(eventName);
 
-      event.eventName = eventName;
-      event.memo = memo || { };
+    if (!responders) return;
 
-      if (document.createEvent) {
-        element.dispatchEvent(event);
-      } else {
-        element.fireEvent(event.eventType, event);
+    var responder = responders.find( function(r) { return r.handler === handler; });
+    if (!responder) return element;
+
+    var actualEventName = _getDOMEventName(eventName);
+
+    if (eventName.include(':')) {
+      if (element.removeEventListener)
+        element.removeEventListener("dataavailable", responder, false);
+      else {
+        element.detachEvent("ondataavailable", responder);
+        element.detachEvent("onfilterchange",  responder);
       }
+    } else {
+      if (element.removeEventListener)
+        element.removeEventListener(actualEventName, responder, false);
+      else
+        element.detachEvent('on' + actualEventName, responder);
+    }
+
+    registry.set(eventName, responders.without(responder));
+
+    return element;
+  }
+
+  function fire(element, eventName, memo, bubble) {
+    element = $(element);
+
+    if (Object.isUndefined(bubble))
+      bubble = true;
 
-      return Event.extend(event);
+    if (element == document && document.createEvent && !element.dispatchEvent)
+      element = document.documentElement;
+
+    var event;
+    if (document.createEvent) {
+      event = document.createEvent('HTMLEvents');
+      event.initEvent('dataavailable', true, true);
+    } else {
+      event = document.createEventObject();
+      event.eventType = bubble ? 'ondataavailable' : 'onfilterchange';
     }
-  };
-})());
 
-Object.extend(Event, Event.Methods);
+    event.eventName = eventName;
+    event.memo = memo || { };
 
-Element.addMethods({
-  fire:          Event.fire,
-  observe:       Event.observe,
-  stopObserving: Event.stopObserving
-});
+    if (document.createEvent)
+      element.dispatchEvent(event);
+    else
+      element.fireEvent(event.eventType, event);
 
-Object.extend(document, {
-  fire:          Element.Methods.fire.methodize(),
-  observe:       Element.Methods.observe.methodize(),
-  stopObserving: Element.Methods.stopObserving.methodize(),
-  loaded:        false
-});
+    return Event.extend(event);
+  }
+
+
+  Object.extend(Event, Event.Methods);
+
+  Object.extend(Event, {
+    fire:          fire,
+    observe:       observe,
+    stopObserving: stopObserving
+  });
+
+  Element.addMethods({
+    fire:          fire,
+
+    observe:       observe,
+
+    stopObserving: stopObserving
+  });
+
+  Object.extend(document, {
+    fire:          fire.methodize(),
+
+    observe:       observe.methodize(),
+
+    stopObserving: stopObserving.methodize(),
+
+    loaded:        false
+  });
+
+  if (window.Event) Object.extend(window.Event, Event);
+  else window.Event = Event;
+})();
 
 (function() {
   /* Support for the DOMContentLoaded event is based on work by Dan Webb,
-     Matthias Miller, Dean Edwards and John Resig. */
+     Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
 
   var timer;
 
   function fireContentLoadedEvent() {
     if (document.loaded) return;
-    if (timer) window.clearInterval(timer);
-    document.fire("dom:loaded");
+    if (timer) window.clearTimeout(timer);
     document.loaded = true;
+    document.fire('dom:loaded');
   }
 
-  if (document.addEventListener) {
-    if (Prototype.Browser.WebKit) {
-      timer = window.setInterval(function() {
-        if (/loaded|complete/.test(document.readyState))
-          fireContentLoadedEvent();
-      }, 0);
-
-      Event.observe(window, "load", fireContentLoadedEvent);
+  function checkReadyState() {
+    if (document.readyState === 'complete') {
+      document.stopObserving('readystatechange', checkReadyState);
+      fireContentLoadedEvent();
+    }
+  }
 
-    } else {
-      document.addEventListener("DOMContentLoaded",
-        fireContentLoadedEvent, false);
+  function pollDoScroll() {
+    try { document.documentElement.doScroll('left'); }
+    catch(e) {
+      timer = pollDoScroll.defer();
+      return;
     }
+    fireContentLoadedEvent();
+  }
 
+  if (document.addEventListener) {
+    document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
   } else {
-    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
-    $("__onDOMContentLoaded").onreadystatechange = function() {
-      if (this.readyState == "complete") {
-        this.onreadystatechange = null;
-        fireContentLoadedEvent();
-      }
-    };
+    document.observe('readystatechange', checkReadyState);
+    if (window == top)
+      timer = pollDoScroll.defer();
   }
+
+  Event.observe(window, 'load', fireContentLoadedEvent);
 })();
+
+Element.addMethods();
+
 /*------------------------------- DEPRECATED -------------------------------*/
 
 Hash.toQueryString = Object.toQueryString;
@@ -4059,16 +4724,9 @@ var Insertion = {
 
 var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
 
-// This should be moved to script.aculo.us; notice the deprecated methods
-// further below, that map to the newer Element methods.
 var Position = {
-  // set to true if needed, warning: firefox performance problems
-  // NOT neeeded for page scrolling, only if draggable contained in
-  // scrollable elements
   includeScrollOffsets: false,
 
-  // must be called before calling withinIncludingScrolloffset, every time the
-  // page is scrolled
   prepare: function() {
     this.deltaX =  window.pageXOffset
                 || document.documentElement.scrollLeft
@@ -4080,7 +4738,6 @@ var Position = {
                 || 0;
   },
 
-  // caches x/y coordinate pair to use with overlap
   within: function(element, x, y) {
     if (this.includeScrollOffsets)
       return this.withinIncludingScrolloffsets(element, x, y);
@@ -4107,7 +4764,6 @@ var Position = {
             this.xcomp <  this.offset[0] + element.offsetWidth);
   },
 
-  // within must be called directly before
   overlap: function(mode, element) {
     if (!mode) return 0;
     if (mode == 'vertical')
@@ -4118,7 +4774,6 @@ var Position = {
         element.offsetWidth;
   },
 
-  // Deprecation layer -- use newer Element methods now (1.5.2).
 
   cumulativeOffset: Element.Methods.cumulativeOffset,
 
@@ -4217,5 +4872,3 @@ Element.ClassNames.prototype = {
 Object.extend(Element.ClassNames.prototype, Enumerable);
 
 /*--------------------------------------------------------------------------*/
-
-Element.addMethods();
\ No newline at end of file
diff --git a/js/src/tables.js b/js/src/tables.js
index 4ae1cbf..6dc27d9 100644
--- a/js/src/tables.js
+++ b/js/src/tables.js
@@ -8,7 +8,7 @@
  * http://tablesorter.com/docs/, and
  * http://www.millstream.com.au/view/code/tablekit/
  *
- * $Horde: mnemo/js/src/tables.js,v 1.4.2.1 2007/12/20 14:17:41 jan Exp $
+ * $Horde: mnemo/js/src/tables.js,v 1.4.2.1 2007-12-20 14:17:41 jan Exp $
  *
  * See the enclosed file COPYING for license information (LGPL). If you
  * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
diff --git a/js/tables.js b/js/tables.js
index e7a12ca..2864ebc 100644
--- a/js/tables.js
+++ b/js/tables.js
@@ -1 +1 @@
-if(window.addEventListener){window.addEventListener("load",table_init,false)}else{if(window.attachEvent){window.attachEvent("onload",table_init)}else{if(window.onload!=null){var old_onload=window.onload;window.onload=function(A){old_onload(A);table_init()}}else{window.onload=table_init}}}var SORT_COLUMN_INDEX;function table_init(){if(!document.getElementsByTagName){return }tables=document.getElementsByTagName("table");for(var A=0;A<tables.length;++A){if(hasClass(tables[A],"striped")){table_stripe(tables[A])}if(hasClass(tables[A],"sortable")&&tables[A].id){table_makeSortable(tables[A])}}}function table_stripe(D){var E=false;var B=D.childNodes;for(var F=0;F<B.length;++F){if(B[F].tagName!="TBODY"){continue}var A=B[F].childNodes;for(var C=0;C<A.length;++C){if(A[C].tagName=="TR"){removeClass(A[C],"rowEven");removeClass(A[C],"rowOdd");addClass(A[C],E?"rowEven":"rowOdd");E=!E}}}}function table_makeSortable(C){if(C.rows&&C.rows.length>0){var D=C.rows[0]}if(!D){return }for(var B=0;B<D.cells.length;++B){var A=D.cells[B];if(hasClass(A,"nosort")){continue}A.columnIndex=B;A.style.cursor="pointer";A.onclick=function(E){var E=E||window.event;if(E.target){if(E.target.nodeType==3){E.target=E.target.parentNode}}else{if(E.srcElement){E.target=E.srcElement}}el=hasParent(E.target,"A","TH");if(el&&!hasClass(el,"sortlink")){return true}table_resortTable(getParent(E.target,"TH"));return false}}}function table_getSortValue(D){if(typeof D=="string"){return D.replace(/^\s+/,"").replace(/\s+$/,"")}if(typeof D=="undefined"){return D}if((D.hasAttribute&&D.hasAttribute("sortval"))||typeof D.sortval!="undefined"){return D.getAttribute("sortval")}if(D.innerText){return D.innerText.replace(/^\s+/,"").replace(/\s+$/,"")}var E="";var C=D.childNodes;var A=C.length;for(var B=0;B<A;++B){switch(C[B].nodeType){case 1:E+=table_getSortValue(C[B]);break;case 3:E+=C[B].nodeValue;break}}return E.replace(/^\s+/,"").replace(/\s+$/,"")}function table_resortTable(C){table=getParent(C,"TABLE");sortColumn=C.columnIndex;sortDown=0;theads=table.tHead.getElementsByTagName("th");for(var B=0;B<theads.length;++B){if(C==theads[B]){if(hasClass(theads[B],"sortup")){removeClass(theads[B],"sortup");addClass(theads[B],"sortdown")}else{if(hasClass(theads[B],"sortdown")){removeClass(theads[B],"sortdown");addClass(theads[B],"sortup");sortDown=1}else{addClass(theads[B],"sortdown")}}}else{removeClass(theads[B],"sortup");removeClass(theads[B],"sortdown")}}if(table.rows.length<=1){return }var D=table_getSortValue(table.rows[1].cells[sortColumn]);sortfn=table_sort_caseinsensitive;if(D.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d(\d\d)?$/)){sortfn=table_sort_date}else{if(D.match(/^[??$?????]/)){sortfn=table_sort_currency}else{if(D.match(/^[\d\.]+$/)){sortfn=table_sort_numeric}}}SORT_COLUMN_INDEX=sortColumn;for(var B=0;B<table.tBodies.length;++B){trs=table.tBodies[B].getElementsByTagName("tr");newRows=[];for(var A=0;A<trs.length;++A){newRows[A]=trs[A]}newRows.sort(sortfn);if(sortDown){newRows.reverse()}for(var A=0;A<newRows.length;++A){if(!hasClass(newRows[A],"sortbottom")){table.tBodies[B].appendChild(newRows[A])}}for(var A=0;A<newRows.length;++A){if(hasClass(newRows[A],"sortbottom")){table.tBodies[B].appendChild(newRows[A])}}}if(hasClass(table,"striped")){table_stripe(table)}if(typeof (table_sortCallback)=="function"){table_sortCallback(table.id,C.id,sortDown)}}function getParent(B,A){if(B==null){return null}else{if(A==null){return B.parentNode}else{if(B.nodeType==1&&B.tagName.toLowerCase()==A.toLowerCase()){return B}else{return getParent(B.parentNode,A)}}}}function table_sort_date(B,A){aa=table_getSortValue(B.cells[SORT_COLUMN_INDEX]);bb=table_getSortValue(A.cells[SORT_COLUMN_INDEX]);if(aa.length==10){dt1=aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2)}else{yr=aa.substr(6,2);if(parseInt(yr)<50){yr="20"+yr}else{yr="19"+yr}dt1=yr+aa.substr(3,2)+aa.substr(0,2)}if(bb.length==10){dt2=bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2)}else{yr=bb.substr(6,2);if(parseInt(yr)<50){yr="20"+yr}else{yr="19"+yr}dt2=yr+bb.substr(3,2)+bb.substr(0,2)}if(dt1==dt2){return 0}else{if(dt1<dt2){return -1}}return 1}function table_sort_currency(B,A){aa=table_getSortValue(B.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,"");bb=table_getSortValue(A.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,"");return parseFloat(aa)-parseFloat(bb)}function table_sort_numeric(B,A){aa=parseFloat(table_getSortValue(B.cells[SORT_COLUMN_INDEX]));if(isNaN(aa)){aa=0}bb=parseFloat(table_getSortValue(A.cells[SORT_COLUMN_INDEX]));if(isNaN(bb)){bb=0}return aa-bb}function table_sort_caseinsensitive(B,A){aa=table_getSortValue(B.cells[SORT_COLUMN_INDEX]).toLowerCase();bb=table_getSortValue(A.cells[SORT_COLUMN_INDEX]).toLowerCase();if(aa==bb){return 0}else{if(aa<bb){return -1}}return 1}function table_sort_default(B,A){aa=table_getSortValue(B.cells[SORT_COLUMN_INDEX]);bb=table_getSortValue(A.cells[SORT_COLUMN_INDEX]);if(aa==bb){return 0}else{if(aa<bb){return -1}}return 1}function hasParent(C,A,B){if(C.tagName==A){return C}else{if(B!=null&&C.tagName==B){return false}else{return hasParent(getParent(C),A,B)}}}function addClass(B,A){B.className+=B.className?" "+A:A}function removeClass(B,A){B.className=B.className.replace(new RegExp(" ?"+A+" ?"),"")}function hasClass(B,A){return(B.className.indexOf(A)!=-1)};
\ No newline at end of file
+if(window.addEventListener){window.addEventListener("load",table_init,false)}else{if(window.attachEvent){window.attachEvent("onload",table_init)}else{if(window.onload!=null){var old_onload=window.onload;window.onload=function(a){old_onload(a);table_init()}}else{window.onload=table_init}}}var SORT_COLUMN_INDEX;function table_init(){if(!document.getElementsByTagName){return}tables=document.getElementsByTagName("table");for(var a=0;a<tables.length;++a){if(hasClass(tables[a],"striped")){table_stripe(tables[a])}if(hasClass(tables[a],"sortable")&&tables[a].id){table_makeSortable(tables[a])}}}function table_stripe(e){var f=false;var b=e.childNodes;for(var g=0;g<b.length;++g){if(b[g].tagName!="TBODY"){continue}var a=b[g].childNodes;for(var d=0;d<a.length;++d){if(a[d].tagName=="TR"){removeClass(a[d],"rowEven");removeClass(a[d],"rowOdd");addClass(a[d],f?"rowEven":"rowOdd");f=!f}}}}function table_makeSortable(c){if(c.rows&&c.rows.length>0){var d=c.rows[0]}if(!d){return}for(var b=0;b<d.cells.length;++b){var a=d.cells[b];if(hasClass(a,"nosort")){continue}a.columnIndex=b;a.style.cursor="pointer";a.onclick=function(f){var f=f||window.event;if(f.target){if(f.target.nodeType==3){f.target=f.target.parentNode}}else{if(f.srcElement){f.target=f.srcElement}}el=hasParent(f.target,"A","TH");if(el&&!hasClass(el,"sortlink")){return true}table_resortTable(getParent(f.target,"TH"));return false}}}function table_getSortValue(d){if(typeof d=="string"){return d.replace(/^\s+/,"").replace(/\s+$/,"")}if(typeof d=="undefined"){return d}if((d.hasAttribute&&d.hasAttribute("sortval"))||typeof d.sortval!="undefined"){return d.getAttribute("sortval")}if(d.innerText){return d.innerText.replace(/^\s+/,"").replace(/\s+$/,"")}var e="";var c=d.childNodes;var a=c.length;for(var b=0;b<a;++b){switch(c[b].nodeType){case 1:e+=table_getSortValue(c[b]);break;case 3:e+=c[b].nodeValue;break}}return e.replace(/^\s+/,"").replace(/\s+$/,"")}function table_resortTable(c){table=getParent(c,"TABLE");sortColumn=c.columnIndex;sortDown=0;theads=table.tHead.getElementsByTagName("th");for(var b=0;b<theads.length;++b){if(c==theads[b]){if(hasClass(theads[b],"sortup")){removeClass(theads[b],"sortup");addClass(theads[b],"sortdown")}else{if(hasClass(theads[b],"sortdown")){removeClass(theads[b],"sortdown");addClass(theads[b],"sortup");sortDown=1}else{addClass(theads[b],"sortdown")}}}else{removeClass(theads[b],"sortup");removeClass(theads[b],"sortdown")}}if(table.rows.length<=1){return}var d=table_getSortValue(table.rows[1].cells[sortColumn]);sortfn=table_sort_caseinsensitive;if(d.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d(\d\d)?$/)){sortfn=table_sort_date}else{if(d.match(/^[£$€¥]/)){sortfn=table_sort_currency}else{if(d.match(/^[\d\.]+$/)){sortfn=table_sort_numeric}}}SORT_COLUMN_INDEX=sortColumn;for(var b=0;b<table.tBodies.length;++b){trs=table.tBodies[b].getElementsByTagName("tr");newRows=[];for(var a=0;a<trs.length;++a){newRows[a]=trs[a]}newRows.sort(sortfn);if(sortDown){newRows.reverse()}for(var a=0;a<newRows.length;++a){if(!hasClass(newRows[a],"sortbottom")){table.tBodies[b].appendChild(newRows[a])}}for(var a=0;a<newRows.length;++a){if(hasClass(newRows[a],"sortbottom")){table.tBodies[b].appendChild(newRows[a])}}}if(hasClass(table,"striped")){table_stripe(table)}if(typeof(table_sortCallback)=="function"){table_sortCallback(table.id,c.id,sortDown)}}function getParent(b,a){if(b==null){return null}else{if(a==null){return b.parentNode}else{if(b.nodeType==1&&b.tagName.toLowerCase()==a.toLowerCase()){return b}else{return getParent(b.parentNode,a)}}}}function table_sort_date(d,c){aa=table_getSortValue(d.cells[SORT_COLUMN_INDEX]);bb=table_getSortValue(c.cells[SORT_COLUMN_INDEX]);if(aa.length==10){dt1=aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2)}else{yr=aa.substr(6,2);if(parseInt(yr)<50){yr="20"+yr}else{yr="19"+yr}dt1=yr+aa.substr(3,2)+aa.substr(0,2)}if(bb.length==10){dt2=bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2)}else{yr=bb.substr(6,2);if(parseInt(yr)<50){yr="20"+yr}else{yr="19"+yr}dt2=yr+bb.substr(3,2)+bb.substr(0,2)}if(dt1==dt2){return 0}else{if(dt1<dt2){return-1}}return 1}function table_sort_currency(d,c){aa=table_getSortValue(d.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,"");bb=table_getSortValue(c.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,"");return parseFloat(aa)-parseFloat(bb)}function table_sort_numeric(d,c){aa=parseFloat(table_getSortValue(d.cells[SORT_COLUMN_INDEX]));if(isNaN(aa)){aa=0}bb=parseFloat(table_getSortValue(c.cells[SORT_COLUMN_INDEX]));if(isNaN(bb)){bb=0}return aa-bb}function table_sort_caseinsensitive(d,c){aa=table_getSortValue(d.cells[SORT_COLUMN_INDEX]).toLowerCase();bb=table_getSortValue(c.cells[SORT_COLUMN_INDEX]).toLowerCase();if(aa==bb){return 0}else{if(aa<bb){return-1}}return 1}function table_sort_default(d,c){aa=table_getSortValue(d.cells[SORT_COLUMN_INDEX]);bb=table_getSortValue(c.cells[SORT_COLUMN_INDEX]);if(aa==bb){return 0}else{if(aa<bb){return-1}}return 1}function hasParent(c,a,b){if(c.tagName==a){return c}else{if(b!=null&&c.tagName==b){return false}else{return hasParent(getParent(c),a,b)}}}function addClass(b,a){b.className+=b.className?" "+a:a}function removeClass(b,a){b.className=b.className.replace(new RegExp(" ?"+a+" ?"),"")}function hasClass(b,a){return(b.className.indexOf(a)!=-1)};
\ No newline at end of file
diff --git a/lib/Block/summary.php b/lib/Block/summary.php
index 46e227c..8116581 100644
--- a/lib/Block/summary.php
+++ b/lib/Block/summary.php
@@ -5,7 +5,7 @@ $block_name = _("Notes Summary");
 /**
  * Implementation of Horde_Block api to show notes summary.
  *
- * $Horde: mnemo/lib/Block/summary.php,v 1.22.8.9 2008/05/20 22:02:10 jan Exp $
+ * $Horde: mnemo/lib/Block/summary.php,v 1.22.8.9 2008-05-20 22:02:10 jan Exp $
  *
  * @package Horde_Block
  */
diff --git a/lib/Block/tree_menu.php b/lib/Block/tree_menu.php
index 6bff35d..0f0c14e 100644
--- a/lib/Block/tree_menu.php
+++ b/lib/Block/tree_menu.php
@@ -4,7 +4,7 @@ $block_name = _("Menu List");
 $block_type = 'tree';
 
 /**
- * $Horde: mnemo/lib/Block/tree_menu.php,v 1.4.2.2 2008/01/02 16:50:49 chuck Exp $
+ * $Horde: mnemo/lib/Block/tree_menu.php,v 1.4.2.2 2008-01-02 16:50:49 chuck Exp $
  *
  * @package Horde_Block
  */
diff --git a/lib/Driver.php b/lib/Driver.php
index 89fa643..c1d901a 100644
--- a/lib/Driver.php
+++ b/lib/Driver.php
@@ -2,9 +2,9 @@
 /**
  * Mnemo_Driver:: defines an API for implementing storage backends for Mnemo.
  *
- * $Horde: mnemo/lib/Driver.php,v 1.25.2.13 2008/06/09 03:28:06 chuck Exp $
+ * $Horde: mnemo/lib/Driver.php,v 1.25.2.14 2009-01-06 15:24:58 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/lib/Driver/kolab.php b/lib/Driver/kolab.php
index dcf2673..41225d7 100644
--- a/lib/Driver/kolab.php
+++ b/lib/Driver/kolab.php
@@ -5,9 +5,9 @@ require_once 'Horde/Kolab.php';
 /**
  * Horde Mnemo driver for the Kolab IMAP server.
  *
- * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.11 2008/03/12 08:16:03 wrobel Exp $
+ * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.12 2009-01-06 15:24:59 jan Exp $
  *
- * Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -181,9 +181,9 @@ class Mnemo_Driver_kolab extends Mnemo_Driver {
 /**
  * Horde Mnemo wrapper to distinguish between both Kolab driver implementations.
  *
- * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.11 2008/03/12 08:16:03 wrobel Exp $
+ * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.12 2009-01-06 15:24:59 jan Exp $
  *
- * Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -291,9 +291,9 @@ class Mnemo_Driver_kolab_wrapper {
 /**
  * Old Horde Mnemo driver for the Kolab IMAP server.
  *
- * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.11 2008/03/12 08:16:03 wrobel Exp $
+ * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.12 2009-01-06 15:24:59 jan Exp $
  *
- * Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -458,9 +458,9 @@ class Mnemo_Driver_kolab_wrapper_old extends Mnemo_Driver_kolab_wrapper {
 /**
  * New Horde Mnemo driver for the Kolab IMAP server.
  *
- * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.11 2008/03/12 08:16:03 wrobel Exp $
+ * $Horde: mnemo/lib/Driver/kolab.php,v 1.7.2.12 2009-01-06 15:24:59 jan Exp $
  *
- * Copyright 2004-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/lib/Driver/sql.php b/lib/Driver/sql.php
index dbc32a3..86ff9e0 100644
--- a/lib/Driver/sql.php
+++ b/lib/Driver/sql.php
@@ -23,9 +23,9 @@
  *
  * The table structure is defined in scripts/drivers/mnemo_memos.sql.
  *
- * $Horde: mnemo/lib/Driver/sql.php,v 1.28.2.17 2008/08/20 17:14:56 jan Exp $
+ * $Horde: mnemo/lib/Driver/sql.php,v 1.28.2.20 2009-02-17 18:42:26 chuck Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -95,8 +95,10 @@ class Mnemo_Driver_sql extends Mnemo_Driver {
         }
 
         /* Connect to the SQL server using the supplied parameters. */
+        require_once 'DB.php';
         $this->_write_db = &DB::connect($this->_params,
-                                        array('persistent' => !empty($this->_params['persistent'])));
+                                        array('persistent' => !empty($this->_params['persistent']),
+                                              'ssl' => !empty($this->_params['ssl'])));
         if (is_a($this->_write_db, 'PEAR_Error')) {
             Horde::fatal($this->_write_db, __FILE__, __LINE__);
         }
@@ -115,7 +117,8 @@ class Mnemo_Driver_sql extends Mnemo_Driver {
         if (!empty($this->_params['splitread'])) {
             $params = array_merge($this->_params, $this->_params['read']);
             $this->_db = &DB::connect($params,
-                                      array('persistent' => !empty($params['persistent'])));
+                                      array('persistent' => !empty($params['persistent']),
+                                            'ssl' => !empty($params['ssl'])));
             if (is_a($this->_db, 'PEAR_Error')) {
                 Horde::fatal($this->_db, __FILE__, __LINE__);
             }
diff --git a/lib/Forms/CreateNotepad.php b/lib/Forms/CreateNotepad.php
index 20ecba8..342936b 100644
--- a/lib/Forms/CreateNotepad.php
+++ b/lib/Forms/CreateNotepad.php
@@ -2,7 +2,7 @@
 /**
  * Horde_Form for creating notepads.
  *
- * $Horde: mnemo/lib/Forms/CreateNotepad.php,v 1.1.2.1 2007/12/20 14:17:46 jan Exp $
+ * $Horde: mnemo/lib/Forms/CreateNotepad.php,v 1.1.2.1 2007-12-20 14:17:46 jan Exp $
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/lib/Forms/DeleteNotepad.php b/lib/Forms/DeleteNotepad.php
index c06111d..c303e95 100644
--- a/lib/Forms/DeleteNotepad.php
+++ b/lib/Forms/DeleteNotepad.php
@@ -2,7 +2,7 @@
 /**
  * Horde_Form for deleting notepads.
  *
- * $Horde: mnemo/lib/Forms/DeleteNotepad.php,v 1.4.2.1 2007/12/20 14:17:46 jan Exp $
+ * $Horde: mnemo/lib/Forms/DeleteNotepad.php,v 1.4.2.1 2007-12-20 14:17:46 jan Exp $
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/lib/Forms/EditNotepad.php b/lib/Forms/EditNotepad.php
index 83bb8d3..3a0a722 100644
--- a/lib/Forms/EditNotepad.php
+++ b/lib/Forms/EditNotepad.php
@@ -2,7 +2,7 @@
 /**
  * Horde_Form for editing notepads.
  *
- * $Horde: mnemo/lib/Forms/EditNotepad.php,v 1.2.2.1 2007/12/20 14:17:46 jan Exp $
+ * $Horde: mnemo/lib/Forms/EditNotepad.php,v 1.2.2.1 2007-12-20 14:17:46 jan Exp $
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/lib/Mnemo.php b/lib/Mnemo.php
index 2f1d431..f133073 100644
--- a/lib/Mnemo.php
+++ b/lib/Mnemo.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/lib/Mnemo.php,v 1.52.2.13 2008/05/02 20:21:52 chuck Exp $
+ * $Horde: mnemo/lib/Mnemo.php,v 1.52.2.15 2009-01-13 15:47:33 chuck Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -112,7 +112,7 @@ class Mnemo {
             return $count;
         }
 
-        $notepads = &Mnemo::listNotepads(true, PERMS_ALL);
+        $notepads = Mnemo::listNotepads(true, PERMS_ALL);
 
         $count = 0;
         foreach (array_keys($notepads) as $notepad) {
@@ -169,9 +169,15 @@ class Mnemo {
      *
      * @return array  The memo lists.
      */
-    function &listNotepads($owneronly = false, $permission = PERMS_SHOW)
+    function listNotepads($owneronly = false, $permission = PERMS_SHOW)
     {
-        $notepads = &$GLOBALS['mnemo_shares']->listShares(Auth::getAuth(), $permission, $owneronly ? Auth::getAuth() : null, 0, 0, 'name');
+        // Work around BC break in listShares() parameters (http://bugs.horde.org/ticket/7820)
+        include_once $GLOBALS['registry']->get('fileroot', 'horde') . '/lib/version.php';
+        if (version_compare(HORDE_VERSION, '3.2', '<')) {
+            $notepads = $GLOBALS['mnemo_shares']->listShares(Auth::getAuth(), $permission, $owneronly ? Auth::getAuth() : null, DATATREE_ROOT, true, 0, 0, 'name');
+        } else {
+            $notepads = $GLOBALS['mnemo_shares']->listShares(Auth::getAuth(), $permission, $owneronly ? Auth::getAuth() : null, 0, 0, 'name');
+        }
         if (is_a($notepads, 'PEAR_Error')) {
             Horde::logMessage($notepads, __FILE__, __LINE__, PEAR_LOG_ERR);
             $empty = array();
@@ -190,7 +196,7 @@ class Mnemo {
         global $prefs;
 
         $default_notepad = $prefs->getValue('default_notepad');
-        $notepads = &Mnemo::listNotepads(false, $permission);
+        $notepads = Mnemo::listNotepads(false, $permission);
 
         if (isset($notepads[$default_notepad])) {
             return $default_notepad;
@@ -419,7 +425,7 @@ class Mnemo {
 
         // Make sure all notepads exist now, to save on checking later.
         $_temp = $GLOBALS['display_notepads'];
-        $_all = &Mnemo::listNotepads();
+        $_all = Mnemo::listNotepads();
         $GLOBALS['display_notepads'] = array();
         foreach ($_temp as $id) {
             if (isset($_all[$id])) {
@@ -428,7 +434,7 @@ class Mnemo {
         }
 
         if (count($GLOBALS['display_notepads']) == 0) {
-            $lists = &Mnemo::listNotepads(true);
+            $lists = Mnemo::listNotepads(true);
             if (!Auth::getAuth()) {
                 /* All notepads for guests. */
                 $GLOBALS['display_notepads'] = array_keys($lists);
diff --git a/lib/api.php b/lib/api.php
index 05c28c6..a2416c2 100644
--- a/lib/api.php
+++ b/lib/api.php
@@ -5,9 +5,9 @@
  * This file defines Mnemo's external API interface.  Other applications can
  * interact with Mnemo through this API.
  *
- * $Horde: mnemo/lib/api.php,v 1.53.2.29 2008/08/13 20:32:44 chuck Exp $
+ * $Horde: mnemo/lib/api.php,v 1.53.2.35 2009-09-04 10:38:37 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -41,18 +41,18 @@ $_services['list'] = array(
 );
 
 $_services['listBy'] = array(
-    'args' => array('action' => 'string', 'timestamp' => 'int'),
+    'args' => array('action' => 'string', 'timestamp' => 'int', 'notepad' => 'string'),
     'type' => '{urn:horde}stringArray'
 );
 
 $_services['getActionTimestamp'] = array(
-    'args' => array('uid' => 'string', 'timestamp' => 'int'),
+    'args' => array('uid' => 'string', 'action' => 'string', 'notepad' => 'string'),
     'type' => 'int',
 );
 
 $_services['import'] = array(
     'args' => array('content' => 'string', 'contentType' => 'string'),
-    'type' => 'int'
+    'type' => 'string'
 );
 
 $_services['export'] = array(
@@ -178,7 +178,7 @@ function _mnemo_removeUserData($user)
  *
  * @return array  The notepads.
  */
-function &_mnemo_listNotepads($owneronly, $permission)
+function _mnemo_listNotepads($owneronly, $permission)
 {
     require_once dirname(__FILE__) . '/base.php';
 
@@ -504,20 +504,27 @@ function _mnemo_replace($uid, $content, $contentType)
         return $storage->modify($memo['memo_id'], $storage->getMemoDescription($content), $content, null);
 
     case 'text/x-vnote':
-        require_once 'Horde/iCalendar.php';
+        if (!is_a($content, 'Horde_iCalendar_vnote')) {
+            require_once 'Horde/iCalendar.php';
+            $iCal = new Horde_iCalendar();
+            if (!$iCal->parsevCalendar($content)) {
+                return PEAR::raiseError(_("There was an error importing the iCalendar data."));
+            }
 
-        // Create the new iCalendar container.
-        $iCal = &new Horde_iCalendar();
-        $iCal->setAttribute('PRODID', '-//The Horde Project//Mnemo //EN');
-        $iCal->setAttribute('METHOD', 'PUBLISH');
+            $components = $iCal->getComponents();
+            switch (count($components)) {
+            case 0:
+                return PEAR::raiseError(_("No iCalendar data was found."));
 
-        // Create a new vNote.
-        $vNote = &Horde_iCalendar::newComponent('vnote', $iCal);
+            case 1:
+                $content = $components[0];
+                break;
 
-        if (!$vNote->parsevCalendar($content)) {
-            return PEAR::raiseError(_("There was an error importing the vNote data."));
+            default:
+                return PEAR::raiseError(_("Multiple iCalendar components found; only one vNote is supported."));
+            }
         }
-        $note = $storage->fromiCalendar($vNote);
+        $note = $storage->fromiCalendar($content);
 
         return $storage->modify($memo['memo_id'], $note['desc'],
                                 $note['body'],!empty($note['category']) ? $note['category'] : '');
diff --git a/lib/base.php b/lib/base.php
index 8044717..969b813 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -5,9 +5,12 @@
  * This file brings in all of the dependencies that every Mnemo
  * script will need and sets up objects that all scripts use.
  *
- * $Horde: mnemo/lib/base.php,v 1.46.10.12 2008/01/02 16:50:49 chuck Exp $
+ * The following global variables are used:
+ *   $no_compress  -  Controls whether the page should be compressed
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * $Horde: mnemo/lib/base.php,v 1.46.10.14 2009-08-12 22:28:13 jan Exp $
+ *
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -54,7 +57,9 @@ require_once 'Horde/Text/Filter.php';
 require_once 'Horde/History.php';
 
 // Start compression, if requested.
-Horde::compressOutput();
+if (!Util::nonInputVar('no_compress')) {
+    Horde::compressOutput();
+}
 
 // Create a share instance.
 require_once 'Horde/Share.php';
diff --git a/lib/prefs.php b/lib/prefs.php
index 0f0a939..c13dc88 100644
--- a/lib/prefs.php
+++ b/lib/prefs.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/lib/prefs.php,v 1.2.10.8 2008/01/02 11:32:27 jan Exp $
+ * $Horde: mnemo/lib/prefs.php,v 1.2.10.10 2009-01-13 15:47:33 chuck Exp $
  *
- * Copyright 2002-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -18,7 +18,7 @@ function handle_notepadselect($updated)
 
     $default_notepad = Util::getFormData('default_notepad');
     if (!is_null($default_notepad)) {
-        $notepads = &Mnemo::listNotepads();
+        $notepads = Mnemo::listNotepads();
         if (is_array($notepads) && array_key_exists($default_notepad, $notepads)) {
             $prefs->setValue('default_notepad', $default_notepad);
             $updated = true;
diff --git a/lib/version.php b/lib/version.php
index 493a453..c736a16 100644
--- a/lib/version.php
+++ b/lib/version.php
@@ -1 +1 @@
-<?php define('MNEMO_VERSION', 'H3 (2.2.1)') ?>
+<?php define('MNEMO_VERSION', 'H3 (2.2.3)') ?>
diff --git a/list.php b/list.php
index c9902fa..d90a97c 100644
--- a/list.php
+++ b/list.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/list.php,v 1.35.8.10 2008/05/20 22:02:10 jan Exp $
+ * $Horde: mnemo/list.php,v 1.35.8.11 2009-01-06 15:24:57 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/locale/da_DK/LC_MESSAGES/mnemo.mo b/locale/da_DK/LC_MESSAGES/mnemo.mo
index fa739b4..8f84ce7 100644
Binary files a/locale/da_DK/LC_MESSAGES/mnemo.mo and b/locale/da_DK/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/da_DK/help.xml b/locale/da_DK/help.xml
index 2a4c014..7ab3431 100644
--- a/locale/da_DK/help.xml
+++ b/locale/da_DK/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!-- $Horde: mnemo/locale/da_DK/help.xml,v 1.2 2002/10/20 16:31:02 jan Exp $ -->
+<!-- $Horde: mnemo/locale/da_DK/help.xml,v 1.2 2002-10-20 16:31:02 jan Exp $ -->
 <help>
   <entry id="Overview" state="new">
     <title>Overview</title>
diff --git a/locale/de_DE/LC_MESSAGES/mnemo.mo b/locale/de_DE/LC_MESSAGES/mnemo.mo
index 12e4568..9f87061 100644
Binary files a/locale/de_DE/LC_MESSAGES/mnemo.mo and b/locale/de_DE/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/de_DE/help.xml b/locale/de_DE/help.xml
index b7d2190..ec116c9 100644
--- a/locale/de_DE/help.xml
+++ b/locale/de_DE/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Horde: mnemo/locale/de_DE/help.xml,v 1.3 2004/12/03 02:03:16 jan Exp $ -->
+<!-- $Horde: mnemo/locale/de_DE/help.xml,v 1.3 2004-12-03 02:03:16 jan Exp $ -->
 <help>
   <entry id="Overview" md5="50ee76138fb08b04b029006053bbadbc" state="uptodate">
     <title>Übersicht</title>
diff --git a/locale/en_US/help.xml b/locale/en_US/help.xml
index 6231d03..8e3198e 100644
--- a/locale/en_US/help.xml
+++ b/locale/en_US/help.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0'?>
-<!-- $Horde: mnemo/locale/en_US/help.xml,v 1.6 2004/11/30 22:25:43 jan Exp $ -->
+<!-- $Horde: mnemo/locale/en_US/help.xml,v 1.6 2004-11-30 22:25:43 jan Exp $ -->
 <help>
 
 <entry id="Overview">
diff --git a/locale/es_ES/LC_MESSAGES/mnemo.mo b/locale/es_ES/LC_MESSAGES/mnemo.mo
index 2601b62..005911f 100644
Binary files a/locale/es_ES/LC_MESSAGES/mnemo.mo and b/locale/es_ES/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/es_ES/help.xml b/locale/es_ES/help.xml
index 20842ea..f83f20c 100644
--- a/locale/es_ES/help.xml
+++ b/locale/es_ES/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!-- $Horde: mnemo/locale/es_ES/help.xml,v 1.1 2004/12/11 11:55:56 jan Exp $ -->
+<!-- $Horde: mnemo/locale/es_ES/help.xml,v 1.1 2004-12-11 11:55:56 jan Exp $ -->
 <help>
 
 <entry id="Overview" md5="50ee76138fb08b04b029006053bbadbc" state="uptodate">
diff --git a/locale/eu_ES/LC_MESSAGES/mnemo.mo b/locale/eu_ES/LC_MESSAGES/mnemo.mo
index 6c52606..359d98f 100644
Binary files a/locale/eu_ES/LC_MESSAGES/mnemo.mo and b/locale/eu_ES/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/eu_ES/help.xml b/locale/eu_ES/help.xml
index 67749ba..2af5b82 100644
--- a/locale/eu_ES/help.xml
+++ b/locale/eu_ES/help.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
-<!-- $Horde: mnemo/locale/eu_ES/help.xml,v 1.1.2.1 2008/07/17 21:09:26 jan Exp $ -->
+<!-- $Horde: mnemo/locale/eu_ES/help.xml,v 1.1.2.2 2009-11-18 14:05:06 jan Exp $ -->
 <help>
 
 <entry id="Overview" md5="50ee76138fb08b04b029006053bbadbc" state="uptodate">
-    <title>Informazio orokorra</title>
-    <heading>Sarrera</heading> <para><i>Oharrak</i> aplikazioaren bidez, ordenagailuak ohar itsaskorren antzeko funtzioa izan dezake.  Oharrak sortu, aldatu, ezabatu eta inprima daitezke.  Bilaketak ere egin ditzakezu oharretan informazioa topatzeko.   Inporta eta esportatu ere egin daitezke.</para> <para>Benetako ohar itsaskorrak ez bezala, ordenagailuko oharrak beste pertsona batzuekin parteka daitezke kokaleku fisiko desberdinetan.  Oharrak ohar-bloketan antola daitezke eta kategoria eslei diezaiekezu.</para></entry>
+    <title>Ikuspegi orokorra</title>
+    <heading>Sarrera</heading> <para><i>Oharrak</i> aplikazioaren bidez, ordenagailuak ohar itsaskorren antzeko funtzioa izan dezake.  Oharrak sortu, aldatu, ezabatu eta inprima daitezke.  Bilaketak ere egin ditzakezu oharretan informazioa topatzeko.   Inporta eta esportatu ere egin daitezke.</para> <para>Benetako ohar itsaskorrak ez bezala, ordenagailuko oharrak beste pertsona batzuekin parteka daitezke kokaleku fisiko desberdinetan.  Oharrak ohar-bloketan antola daitezke, eta kategoria eslei diezaiekezu.</para></entry>
 
 <entry id="list-actions" md5="6d592f153bfb5c296de5dfebb428e1ba" state="uptodate">
-    <title>Nire oharrak: Ekintzak</title>
+    <title>Nire oharrak: ekintzak</title>
     <heading>Ekintzak</heading> <para><i>Ezabatu</i> aukerak oharra betiko ezabatuko du.</para> <para><i>Editatu</i> aukerarekin oharra alda daiteke.</para> <para><i>Itzuli ohar-blokera</i> aukerak ohar-ikuspegitik uneko oharra dagoen ohar-blokera eramango zaitu.</para></entry>
 
 <entry id="menu-actions" md5="715a853d93cd3330e4d730b9112c8a82" state="uptodate">
diff --git a/locale/fi_FI/LC_MESSAGES/mnemo.mo b/locale/fi_FI/LC_MESSAGES/mnemo.mo
index 17612e4..b83da54 100644
Binary files a/locale/fi_FI/LC_MESSAGES/mnemo.mo and b/locale/fi_FI/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/fi_FI/help.xml b/locale/fi_FI/help.xml
index 8b33adf..9cf4daf 100644
--- a/locale/fi_FI/help.xml
+++ b/locale/fi_FI/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!-- $Horde: mnemo/locale/fi_FI/help.xml,v 1.4.12.5 2008/02/22 13:42:50 jan Exp $ -->
+<!-- $Horde: mnemo/locale/fi_FI/help.xml,v 1.4.12.5 2008-02-22 13:42:50 jan Exp $ -->
 <help>
   <entry id="Overview" md5="50ee76138fb08b04b029006053bbadbc" state="uptodate">
     <title>Yleiskuva</title>
diff --git a/locale/fr_FR/LC_MESSAGES/mnemo.mo b/locale/fr_FR/LC_MESSAGES/mnemo.mo
index 5a871be..d8c90af 100644
Binary files a/locale/fr_FR/LC_MESSAGES/mnemo.mo and b/locale/fr_FR/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/hr_HR/LC_MESSAGES/mnemo.mo b/locale/hr_HR/LC_MESSAGES/mnemo.mo
new file mode 100644
index 0000000..4159b06
Binary files /dev/null and b/locale/hr_HR/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/hr_HR/help.xml b/locale/hr_HR/help.xml
new file mode 100644
index 0000000..7f8c4d8
--- /dev/null
+++ b/locale/hr_HR/help.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<help>
+
+<entry id="Overview" md5="50ee76138fb08b04b029006053bbadbc" state="uptodate">
+    <title>Pregled</title>
+    <heading>Uvod</heading>
+    <para>
+    <i>Bilje&#x161;ke</i> je aplikacija koja mogu&#x107;ava stvaranje ra&#x10D;unalnog ekvivalenta samoljepljivih listi&#x107;a.  Bilje&#x161;ke je mogu&#x107;e stvarati, mijenjati, brisati i printati.  Tako&#x111;er je mogu&#x107;e pretra&#x17E;ivanje sadr&#x17E;aja bilje&#x161;ki.  Aplikacija podr&#x17E;ava uvoz i izvoz bilje&#x161;ki koriste&#x107;i standardizirane formate.
+    </para>
+    <para>
+    Za razliku od samoljepljivih listi&#x107;a, ra&#x10D;unalne bilje&#x161;ke mo&#x17E;ete dijeliti sa drugima.  Bilje&#x161;ke mogu biti organizirane u bilje&#x17E;nice, te im se mo&#x17E;e pridru&#x17E;iti kategorija.
+    </para>
+</entry>
+
+<entry id="list-actions" md5="6d592f153bfb5c296de5dfebb428e1ba" state="uptodate">
+    <title>Popis bilje&#x161;ki: Akcije</title>
+    <heading>Akcije</heading>
+    <para>
+    <i>Obri&#x161;i bilje&#x161;ku</i> trajno bri&#x161;e odabranu bilje&#x161;ku.
+    </para>
+    <para>
+    <i>Uredi bilje&#x161;ku</i> omogu&#x107;ava izmjenu postoje&#x107;e bilje&#x161;ke.
+    </para>
+    <para>
+    <i>Natrag u bilje&#x17E;nicu</i> vra&#x107;a na popis bilje&#x161;ki trenutno odabrane bilje&#x17E;nice.
+    </para>
+</entry>
+
+<entry id="menu-actions" md5="715a853d93cd3330e4d730b9112c8a82" state="uptodate">
+    <title>Stavke menija</title>
+    <heading>Stavke menija</heading>
+    <para>
+    <i>Popis bilje&#x161;ki</i> prikazuje sve bilje&#x161;ke trenutno odabrane bilje&#x17E;nice.
+    </para>
+    <para>
+    <i>Nova bilje&#x161;ka</i> dodaje novu bilje&#x161;ku u trenutno odabranu bilje&#x17E;nicu.
+    </para>
+    <para>
+    <i>Tra&#x17E;i</i> pretra&#x17E;uje trenutno odabranu bilje&#x17E;nicu.  Mogu&#x107;e je pretra&#x17E;ivati po naslovu i tekstu bilje&#x161;ke.
+    </para>
+    <para>
+    <i>Uvoz/Izvoz</i> omogu&#x107;ava uvoz i izvoz bilje&#x161;ki u CSV i vNote formatu.
+    </para>
+    <para>
+    <i>Ispi&#x161;i</i> ispisuje bilje&#x161;ku.  Ikona <i>Ispi&#x161;i</i> pojavljuje se u meniju samo kod pregleda bilje&#x161;ke.
+    </para>
+</entry>
+
+
+<entry id="sorting" md5="cca3b1d1c9ed0ec5ab385f82469ddc8f" state="uptodate">
+    <title>Sortiranje bilje&#x161;ki</title>
+    <heading>Sortiranje bilje&#x161;ki</heading>
+    <para>
+    Popis bilje&#x161;ki mogu&#x107;e je sortirati po bilo kojem stupcu klikom na naslov stupca.  Prijelaz izme&#x111;u uzlaznog i silaznog sortiranja posti&#x17E;e se klikom na strelicu u zaglavlju stupca.
+    </para>
+</entry>
+</help>
diff --git a/locale/hu_HU/help.xml b/locale/hu_HU/help.xml
index 0233dd2..e7f6d6d 100644
--- a/locale/hu_HU/help.xml
+++ b/locale/hu_HU/help.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="iso-8859-2"?>
-<!-- based on $Horde: mnemo/locale/hu_HU/help.xml,v 1.2.12.2 2007/12/20 14:18:02 jan Exp $ -->
+<!-- based on $Horde: mnemo/locale/hu_HU/help.xml,v 1.2.12.3 2009-01-06 15:24:59 jan Exp $ -->
 <!-- Mnemo help file, Hungarian translation -->
-<!-- Copyright (C) 2004 Laszlo L. Tornoci -->
+<!-- Copyright 2004 Laszlo L. Tornoci -->
 <!-- This file is distributed under the same license as the Mnemo package. -->
 <!-- Latest versions: ftp://xenia.sote.hu/pub/linux/horde/ -->
 
diff --git a/locale/it_IT/LC_MESSAGES/mnemo.mo b/locale/it_IT/LC_MESSAGES/mnemo.mo
index a167180..bb4fc98 100644
Binary files a/locale/it_IT/LC_MESSAGES/mnemo.mo and b/locale/it_IT/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/it_IT/help.xml b/locale/it_IT/help.xml
index fb0e24c..763cb5c 100644
--- a/locale/it_IT/help.xml
+++ b/locale/it_IT/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Horde: mnemo/locale/it_IT/help.xml,v 1.3 2003/07/04 20:51:45 jan Exp $ -->
+<!-- $Horde: mnemo/locale/it_IT/help.xml,v 1.3 2003-07-04 20:51:45 jan Exp $ -->
 <help>
   <entry id="Overview" state="uptodate" md5="50ee76138fb08b04b029006053bbadbc">
     <title>Overview</title>
diff --git a/locale/ja_JP/LC_MESSAGES/mnemo.mo b/locale/ja_JP/LC_MESSAGES/mnemo.mo
index 39abf88..038dbd4 100644
Binary files a/locale/ja_JP/LC_MESSAGES/mnemo.mo and b/locale/ja_JP/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/lv_LV/help.xml b/locale/lv_LV/help.xml
index 9fc438f..48812e0 100644
--- a/locale/lv_LV/help.xml
+++ b/locale/lv_LV/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Horde: mnemo/locale/lv_LV/help.xml,v 1.2 2004/11/24 15:28:29 jan Exp $ -->
+<!-- $Horde: mnemo/locale/lv_LV/help.xml,v 1.2 2004-11-24 15:28:29 jan Exp $ -->
 <help>
 
 <entry id="Overview" md5="16d3b188ccff84364f6f1514de6655b0" state="uptodate">
diff --git a/locale/nl_NL/LC_MESSAGES/mnemo.mo b/locale/nl_NL/LC_MESSAGES/mnemo.mo
index 8f2f39f..3781d0a 100644
Binary files a/locale/nl_NL/LC_MESSAGES/mnemo.mo and b/locale/nl_NL/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/pt_BR/LC_MESSAGES/mnemo.mo b/locale/pt_BR/LC_MESSAGES/mnemo.mo
index 713c409..10d7302 100644
Binary files a/locale/pt_BR/LC_MESSAGES/mnemo.mo and b/locale/pt_BR/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/ru_RU/LC_MESSAGES/mnemo.mo b/locale/ru_RU/LC_MESSAGES/mnemo.mo
index 402a8eb..ae8212e 100644
Binary files a/locale/ru_RU/LC_MESSAGES/mnemo.mo and b/locale/ru_RU/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/sk_SK/LC_MESSAGES/mnemo.mo b/locale/sk_SK/LC_MESSAGES/mnemo.mo
index 9a4d70c..5556457 100644
Binary files a/locale/sk_SK/LC_MESSAGES/mnemo.mo and b/locale/sk_SK/LC_MESSAGES/mnemo.mo differ
diff --git a/locale/sk_SK/help.xml b/locale/sk_SK/help.xml
index c6ed631..52470b8 100644
--- a/locale/sk_SK/help.xml
+++ b/locale/sk_SK/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-2"?>
-<!-- $Horde: mnemo/locale/sk_SK/help.xml,v 1.2.12.2 2007/12/20 14:18:13 jan Exp $ -->
+<!-- $Horde: mnemo/locale/sk_SK/help.xml,v 1.2.12.2 2007-12-20 14:18:13 jan Exp $ -->
 <!-- (C) 2002, Ivan Noris, <vix at vazka.sk> -->
 <help>
 
diff --git a/locale/tr_TR/help.xml b/locale/tr_TR/help.xml
index ca0e9a2..108661e 100644
--- a/locale/tr_TR/help.xml
+++ b/locale/tr_TR/help.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-9"?>
-<!-- $Horde: mnemo/locale/tr_TR/help.xml,v 1.1.2.2 2007/12/20 14:18:17 jan Exp $ -->
+<!-- $Horde: mnemo/locale/tr_TR/help.xml,v 1.1.2.2 2007-12-20 14:18:17 jan Exp $ -->
 <help>
 
 <!-- English entry:
diff --git a/locale/zh_TW/LC_MESSAGES/mnemo.mo b/locale/zh_TW/LC_MESSAGES/mnemo.mo
index b24e1f7..2687491 100644
Binary files a/locale/zh_TW/LC_MESSAGES/mnemo.mo and b/locale/zh_TW/LC_MESSAGES/mnemo.mo differ
diff --git a/memo.php b/memo.php
index ff11fcc..49100d8 100644
--- a/memo.php
+++ b/memo.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/memo.php,v 1.42.2.11 2008/08/20 17:14:55 jan Exp $
+ * $Horde: mnemo/memo.php,v 1.42.2.14 2009-08-05 23:03:25 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
@@ -12,6 +12,44 @@
  * @package Mnemo
  */
 
+ /**
+  * Encryption tests.
+  */
+function showPassphrase($memo, $storage)
+{
+    global $notification;
+
+    if (!is_a($memo['body'], 'PEAR_Error')) {
+        return false;
+    }
+
+    /* Check for secure connection. */
+    $secure_check = $storage->requireSecureConnection();
+    if ($memo['body']->getCode() == MNEMO_ERR_NO_PASSPHRASE) {
+        if (is_a($secure_check, 'PEAR_Error')) {
+            $notification->push(_("This note has been encrypted.") . ' ' . $secure_check->getMessage(), 'horde.error');
+            $memo['body'] = '';
+            return false;
+        }
+        $notification->push(_("This note has been encrypted, please provide the password below."), 'horde.message');
+        return true;
+    }
+    if ($memo['body']->getCode() == MNEMO_ERR_DECRYPT) {
+        if (is_a($secure_check, 'PEAR_Error')) {
+            $notification->push(_("This note has been encrypted.") . ' ' . $secure_check->getMessage(), 'horde.error');
+            $memo['body'] = '';
+            return false;
+        }
+        $notification->push(_("This note cannot be decrypted:") . ' ' . $memo['body']->getMessage(), 'horde.message');
+        return true;
+    }
+
+    $notification->push($memo['body'], 'horde.error');
+    $memo['body'] = '';
+
+    return false;
+}
+
 @define('MNEMO_BASE', dirname(__FILE__));
 require_once MNEMO_BASE . '/lib/base.php';
 
@@ -71,31 +109,7 @@ case 'modify_memo':
     $storage = &Mnemo_Driver::singleton($memolist_id);
 
     /* Encryption tests. */
-    $show_passphrase = false;
-    if (is_a($memo['body'], 'PEAR_Error')) {
-        /* Check for secure connection. */
-        $secure_check = $storage->requireSecureConnection();
-        if ($memo['body']->getCode() == MNEMO_ERR_NO_PASSPHRASE) {
-            if (is_a($secure_check, 'PEAR_Error')) {
-                $notification->push(_("This note has been encrypted.") . ' ' . $secure_check->getMessage(), 'horde.error');
-                $memo['body'] = '';
-            } else {
-                $notification->push(_("This note has been encrypted, please provide the password below."), 'horde.message');
-                $show_passphrase = true;
-            }
-        } elseif ($memo['body']->getCode() == MNEMO_ERR_DECRYPT) {
-            if (is_a($secure_check, 'PEAR_Error')) {
-                $notification->push(_("This note has been encrypted.") . ' ' . $secure_check->getMessage(), 'horde.error');
-                $memo['body'] = '';
-            } else {
-                $notification->push(_("This note cannot be decrypted:") . ' ' . $memo['body']->getMessage(), 'horde.message');
-                $show_passphrase = true;
-            }
-        } else {
-            $notification->push($memo['body'], 'horde.error');
-            $memo['body'] = '';
-        }
-    }
+    $show_passphrase = showPassphrase($memo, $storage);
 
     /* Set up the note attributes. */
     $memo_body = $memo['body'];
@@ -109,20 +123,43 @@ case 'save_memo':
     $memo_id = Util::getFormData('memo');
     $memo_body = Util::getFormData('memo_body');
     $memo_category = Util::getFormData('memo_category');
-    $memo_passphrase = Util::getFormData('memo_passphrase', Mnemo::getPassphrase($memo_id));
     $memolist_original = Util::getFormData('memolist_original');
     $notepad_target = Util::getFormData('notepad_target');
+    $memo_passphrase = Util::getFormData('memo_passphrase');
+    $memo_passphrase2 = Util::getFormData('memo_passphrase2');
 
     $share = &$GLOBALS['mnemo_shares']->getShare($notepad_target);
     if (is_a($share, 'PEAR_Error')) {
         $notification->push(sprintf(_("Access denied saving note: %s"), $share->getMessage()), 'horde.error');
     } elseif (!$share->hasPermission(Auth::getAuth(), PERMS_EDIT)) {
         $notification->push(sprintf(_("Access denied saving note to %s."), $share->get('name')), 'horde.error');
-    } else {
+    } elseif ($memo_passphrase != $memo_passphrase2) {
+        $notification->push(_("The passwords don't match."), 'horde.error');
+        $storage = &Mnemo_Driver::singleton($memolist_original);
+        if (empty($memo_id)) {
+            $title = _("New Note");
+        } else {
+            $actionID = 'modify_memo';
+            $memo = Mnemo::getMemo($memolist_original, $memo_id);
+            if (!$memo || !isset($memo['memo_id'])) {
+                $notification->push(_("Note not found."), 'horde.error');
+                header('Location: ' . Horde::applicationUrl('list.php', true));
+                exit;
+            }
+            $title = sprintf(_("Edit: %s"), $memo['desc']);
+            $show_passphrase = showPassphrase($memo, $storage);
+            $memo_encrypted = $memo['encrypted'];
+            $memolist_id = $memolist_original;
+        }
+        break;
+  } else {
         if ($new_category = Util::getFormData('new_category')) {
             $new_category = $cManager->add($new_category);
             $memo_category = $new_category ? $new_category : '';
         }
+        if (!strlen($memo_passphrase)) {
+            $memo_passphrase = Mnemo::getPassphrase($memo_id);
+        }
 
         /* If $memo_id is set, we're modifying an existing note.  Otherwise,
          * we're adding a new note with the provided attributes. */
@@ -210,7 +247,7 @@ default:
     exit;
 }
 
-$notepads = &Mnemo::listNotepads(false, PERMS_EDIT);
+$notepads = Mnemo::listNotepads(false, PERMS_EDIT);
 require MNEMO_TEMPLATES . '/common-header.inc';
 require MNEMO_TEMPLATES . '/menu.inc';
 require MNEMO_TEMPLATES . '/memo/memo.inc';
diff --git a/note/pdf.php b/note/pdf.php
index b444aeb..7721d59 100644
--- a/note/pdf.php
+++ b/note/pdf.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/note/pdf.php,v 1.4.2.2 2008/01/02 11:32:28 jan Exp $
+ * $Horde: mnemo/note/pdf.php,v 1.4.2.3 2009-01-06 15:25:00 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/notepads/create.php b/notepads/create.php
index f0f2762..254c075 100644
--- a/notepads/create.php
+++ b/notepads/create.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/notepads/create.php,v 1.1.2.2 2008/01/02 11:32:28 jan Exp $
+ * $Horde: mnemo/notepads/create.php,v 1.1.2.3 2009-01-06 15:25:00 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/notepads/delete.php b/notepads/delete.php
index 33a0fe8..5845e61 100644
--- a/notepads/delete.php
+++ b/notepads/delete.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/notepads/delete.php,v 1.4.2.2 2008/01/02 11:32:28 jan Exp $
+ * $Horde: mnemo/notepads/delete.php,v 1.4.2.3 2009-01-06 15:25:00 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/notepads/edit.php b/notepads/edit.php
index 8a92528..2929d12 100644
--- a/notepads/edit.php
+++ b/notepads/edit.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/notepads/edit.php,v 1.2.2.2 2008/01/02 11:32:28 jan Exp $
+ * $Horde: mnemo/notepads/edit.php,v 1.2.2.3 2009-01-06 15:25:00 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/notepads/index.php b/notepads/index.php
index 07a7118..4610d05 100644
--- a/notepads/index.php
+++ b/notepads/index.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/notepads/index.php,v 1.1.2.2 2008/01/02 11:32:28 jan Exp $
+ * $Horde: mnemo/notepads/index.php,v 1.1.2.3 2009-01-06 15:25:00 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/notes/index.php b/notes/index.php
new file mode 100644
index 0000000..bc9c10b
--- /dev/null
+++ b/notes/index.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * $Horde: mnemo/notes/index.php,v 1.1.2.2 2009-01-06 15:25:00 jan Exp $
+ *
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file LICENSE for license information (ASL). If you
+ * did not receive this file, see http://www.horde.org/licenses/asl.php.
+ */
+
+require_once dirname(__FILE__) . '/../lib/base.php';
+
+$search = Util::getGet('q');
+if (!$search) {
+    header('HTTP/1.0 204 No Content');
+    exit;
+}
+
+$memos = Mnemo::listMemos($prefs->getValue('sortby'), $prefs->getValue('sortdir'));
+
+$search_pattern = '/^' . preg_quote($search, '/') . '/i';
+$search_results = array();
+foreach ($memos as $memo_id => $memo) {
+    if (preg_match($search_pattern, $memo['desc'])) {
+        $search_results[$memo_id] = $memo;
+    }
+}
+
+if (count($search_results) == 1) {
+    $note = array_shift($search_results);
+    header('Location: ' . Horde::applicationUrl(Util::addParameter('view.php', array('memo' => $note['memo_id'], 'memolist' => $note['memolist_id'])), true));
+    exit;
+}
+
+$title = _("Search Results");
+$memos = $search_results;
+
+Horde::addScriptFile('tooltip.js', 'horde', true);
+Horde::addScriptFile('tables.js', 'horde', true);
+Horde::addScriptFile('prototype.js', 'horde', true);
+Horde::addScriptFile('QuickFinder.js', 'horde', true);
+
+require MNEMO_TEMPLATES . '/common-header.inc';
+require MNEMO_TEMPLATES . '/menu.inc';
+require MNEMO_TEMPLATES . '/list/header.inc';
+
+if (count($memos)) {
+    require_once 'Horde/Prefs/CategoryManager.php';
+    $cManager = new Prefs_CategoryManager();
+    $colors = $cManager->colors();
+    $fgcolors = $cManager->fgColors();
+    $sortby = $prefs->getValue('sortby');
+    $sortdir = $prefs->getValue('sortdir');
+    $showNotepad = $prefs->getValue('show_notepad');
+
+    $baseurl = 'list.php';
+    require MNEMO_TEMPLATES . '/list/memo_headers.inc';
+
+    foreach ($memos as $memo_id => $memo) {
+        $viewurl = Util::addParameter(
+            'view.php',
+            array('memo' => $memo['memo_id'],
+                  'memolist' => $memo['memolist_id']));
+
+        $memourl = Util::addParameter(
+            'memo.php', array('memo' => $memo['memo_id'],
+                              'memolist' => $memo['memolist_id']));
+        $share = &$GLOBALS['mnemo_shares']->getShare($memo['memolist_id']);
+
+        $notepad = $memo['memolist_id'];
+        if (!is_a($share, 'PEAR_Error')) {
+            $notepad = $share->get('name');
+        }
+
+        require MNEMO_TEMPLATES . '/list/memo_summaries.inc';
+    }
+
+    require MNEMO_TEMPLATES . '/list/memo_footers.inc';
+} else {
+    require MNEMO_TEMPLATES . '/list/empty.inc';
+}
+
+require MNEMO_TEMPLATES . '/panel.inc';
+require $registry->get('templates', 'horde') . '/common-footer.inc';
diff --git a/po/bg_BG.po b/po/bg_BG.po
index e63568b..b8202dc 100644
--- a/po/bg_BG.po
+++ b/po/bg_BG.po
@@ -1,5 +1,5 @@
 # Bulgarian translations for Mnemo package.
-# Copyright (C) 2002 Horde Project
+# Copyright 2002-2009 The Horde Project
 # This file is distributed under the same license as the Whups package.
 # Miroslav Pendev <miro at cybershade.us>, 2002.
 #
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index 85d99ac..13d9423 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -1,5 +1,5 @@
 # Mnemo Czech translations.
-# Copyright (C) 2004 Horde Project
+# Copyright 2004-2009 The Horde Project
 # This file is distributed under the same license as the Horde package.
 # Pavel Chytil <pavel at chytil.tk>, 2004.
 #
diff --git a/po/da_DK.po b/po/da_DK.po
index 4959bfe..f8a1cd6 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -3,168 +3,163 @@
 # Copyright (C) 2006 Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # Brian Truelsen <horde+i18n at briantruelsen.dk>, 2006.
+# Niels Baggesen <nba at users.sourceforge.net>, 2009.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Mnemo H3 (2.2-cvs)\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2006-03-05 18:16+0100\n"
-"PO-Revision-Date: 2006-03-06 22:12+0100\n"
-"Last-Translator: Brian Truelsen <horde+i18n at briantruelsen.dk>\n"
+"POT-Creation-Date: 2009-04-17 07:16+0200\n"
+"PO-Revision-Date: 2009-04-26 22:12+0100\n"
+"Last-Translator: Niels Baggesen <nba at users.sourceforge.net>\n"
 "Language-Team: i18n at lists.horde.org\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: templates/list/header.inc:3
-#, php-format
-msgid "%d notes"
-msgstr "%d noter"
-
-#: templates/memo/memo.inc:26
+#: templates/memo/memo.inc:53
 #, php-format
 msgid "%s characters"
 msgstr "%s tegn"
 
-#: data.php:187
+#: data.php:200
 #, php-format
 msgid "%s file successfully imported"
 msgstr "%s-fil importeret"
 
-#: notepads.php:99 lib/base.php:104
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "%ss notesblok"
 
-#: templates/list/header.inc:3
-msgid "1 note"
-msgstr "1 note"
-
-#: memo.php:162
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "Adgang nægtet ved sletning af note."
 
-#: memo.php:112 memo.php:115
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "Adgang nægtet ved flytning af note."
 
-#: memo.php:84
+#: memo.php:120
 #, php-format
 msgid "Access denied saving note to %s."
 msgstr "Adgang nægtet ved lagring af note til %s."
 
-#: memo.php:82
+#: memo.php:118
 #, php-format
 msgid "Access denied saving note: %s"
 msgstr "Adgang nægtet ved lagring af note: %s"
 
-#: templates/prefs/showsummaryselect.inc:103
-msgid "Add category"
-msgstr "Tilføj kategori"
-
-#: memo.php:52
-msgid "Adding A New Note"
-msgstr "Tilføj en ny note"
-
-#: config/prefs.php.dist:51
+#: config/prefs.php.dist:70
 msgid "Ascending"
 msgstr "Stigende"
 
-#: templates/prefs/showsummaryselect.inc:99
-msgid "Available Categories:"
-msgstr "Tilgængelige kategorier:"
-
-#: templates/view/memo.inc:18
-msgid "Back to Notepad"
-msgstr "Tilbage til notesblok"
-
-#: templates/notepads/notepads.inc:97
-msgid "Back to Notepad Options"
-msgstr "Tilbage til notesblok-tilvalg"
-
-#: data.php:32 templates/data/import.inc:17
+#: data.php:32 templates/data/import.inc:11
 msgid "CSV"
 msgstr "CSV"
 
+#: lib/Forms/DeleteNotepad.php:45 lib/Forms/DeleteNotepad.php:51
+msgid "Cancel"
+msgstr "Annuller"
+
 #: data.php:54 templates/view/memo.inc:26
 msgid "Category"
 msgstr "Kategori"
 
-#: templates/notepads/notepads.inc:22
-msgid "Change"
-msgstr "Ændre"
+#: templates/notepad_list.php:29 notepads/index.php:32
+msgid "Change Permissions"
+msgstr "Ret rettigheder"
 
-#: config/prefs.php.dist:15
+#: config/prefs.php.dist:14
 msgid "Change your note sorting and display options."
 msgstr "Redigér måden, hvorpå dine noter sorteres og vises."
 
-#: templates/prefs/showsummaryselect.inc:93
-msgid "Choose the memo categories to list in the summary view."
-msgstr "Vælg de notat-kategorier, som skal listes i oversigtsvisning."
-
-#: config/prefs.php.dist:22
+#: config/prefs.php.dist:21
 msgid "Choose your default Notepad."
 msgstr "Vælg din standard notesblok."
 
-#: templates/search/search.inc:32
-msgid "Clear Form"
-msgstr "Slet formular"
+#: templates/list/header.inc:8
+msgid "Close Search"
+msgstr "Afslut søgning"
 
-#: templates/notepads/notepads.inc:17 templates/notepads/notepads.inc:94
-#: templates/notepads/notepads.inc:96
+#: lib/Forms/CreateNotepad.php:39
 msgid "Create"
 msgstr "Opret"
 
+#: lib/Forms/CreateNotepad.php:34
+msgid "Create Notepad"
+msgstr "Opret notesblok"
+
+#: templates/notepad_list.php:9
+msgid "Create a new Notepad"
+msgstr "Opret en ny notesblok"
+
 #: templates/view/memo.inc:32
 msgid "Created"
 msgstr "Oprettet"
 
-#: config/prefs.php.dist:21
+#: templates/view/memo.inc:54 templates/memo/memo.inc:23
+msgid "Decrypt"
+msgstr "Dekrypter:"
+
+#: config/prefs.php.dist:20
 msgid "Default Notepad"
 msgstr "Standard notesblok"
 
-#: config/prefs.php.dist:42
+#: config/prefs.php.dist:61
 msgid "Default sorting criteria:"
 msgstr "Standard sorteringskriterie:"
 
-#: config/prefs.php.dist:53
+#: config/prefs.php.dist:72
 msgid "Default sorting direction:"
 msgstr "Standard sorteringsretning:"
 
-#: templates/view/memo.inc:15 templates/notepads/notepads.inc:95
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
+#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
 msgid "Delete"
 msgstr "Slet"
 
-#: config/prefs.php.dist:28
+#: lib/Forms/DeleteNotepad.php:40
+#, php-format
+msgid "Delete %s"
+msgstr "Slet %s"
+
+#: config/prefs.php.dist:27
 msgid "Delete Confirmation"
 msgstr "Godkend sletning"
 
-#: config/prefs.php.dist:29
+#: config/prefs.php.dist:28
 msgid "Delete button behaviour"
 msgstr "Opførsel af slette-knap"
 
-#: templates/memo/memo.inc:67
+#: templates/memo/memo.inc:11
 msgid "Delete this note"
 msgstr "Slet denne note"
 
-#: config/prefs.php.dist:52
+#: config/prefs.php.dist:71
 msgid "Descending"
 msgstr "Faldende"
 
-#: templates/notepads/notepads.inc:85
-msgid "Description:"
-msgstr "Beskrivelse:"
+#: lib/Forms/CreateNotepad.php:37 lib/Forms/EditNotepad.php:44
+msgid "Description"
+msgstr "Beskrivelse"
 
-#: config/prefs.php.dist:14
+#: lib/Driver/kolab.php:556
+#, php-format
+msgid "Did not find note %s"
+msgstr "Fandt ikke note %s"
+
+#: config/prefs.php.dist:13
 msgid "Display Options"
 msgstr "Indstillinger for visning"
 
-#: config/prefs.php.dist:98
+#: config/prefs.php.dist:117
 msgid "Do you want to confirm deleting entries?"
 msgstr "Vil du godkende sletning af poster?"
 
-#: templates/view/memo.inc:11
+#: templates/notepad_list.php:27 templates/view/memo.inc:13
+#: notepads/index.php:31
 msgid "Edit"
 msgstr "Rediger"
 
@@ -173,48 +168,71 @@ msgstr "Rediger"
 msgid "Edit \"%s\""
 msgstr "Redigér \"%s\""
 
-#: templates/list/memo_headers.inc:42 lib/Block/summary.php:77
+#: lib/Forms/EditNotepad.php:40
+#, php-format
+msgid "Edit %s"
+msgstr "Ret %s"
+
+#: templates/list/memo_headers.inc:30 lib/Block/summary.php:79
+#: lib/Block/summary.php:80
 msgid "Edit Note"
 msgstr "Redigér note"
 
-#: templates/list/memo_headers.inc:52
+#: templates/list/memo_headers.inc:45
 msgid "Edit categories and colors"
 msgstr "Redigér kategorier og farver"
 
-#: templates/list/memo_summaries.inc:12
+#: memo.php:104
+#, php-format
+msgid "Edit: %s"
+msgstr "Ret: %s"
+
+#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:104
 msgid "Empty Note"
 msgstr "Tøm note"
 
-#: templates/data/export.inc:19
+#: lib/Driver.php:118
+msgid ""
+"Encryption support has not been configured, please contact your "
+"administrator."
+msgstr ""
+"Kryptering er ikke understøttet af den nuværende opsætning.  Kontakt din "
+"administrator."
+
+#: templates/data/export.inc:16
 msgid "Export"
 msgstr "Eksportér"
 
-#: templates/data/export.inc:8
+#: templates/data/export.inc:2
 msgid "Export Notes"
 msgstr "Eksportér noter"
 
-#: templates/search/search.inc:21
-msgid "F_ull Text"
-msgstr "Fuld text"
-
-#: config/prefs.php.dist:13 config/prefs.php.dist:20 config/prefs.php.dist:27
+#: config/prefs.php.dist:12 config/prefs.php.dist:19 config/prefs.php.dist:26
 msgid "General Options"
 msgstr "Grundlæggende indstillinger"
 
-#: templates/data/import.inc:8
+#: templates/data/import.inc:1
 #, php-format
 msgid "Import Notes, Step %d"
 msgstr "Importér noter, trin %d"
 
-#: data.php:193
+#: data.php:206
 msgid "Import/Export Notes"
 msgstr "Importér/eksportér noter"
 
+#: templates/search/search.inc:17
+msgid "In: "
+msgstr "I: "
+
 #: templates/view/memo.inc:39
 msgid "Last Modified"
 msgstr "Sidst ændret"
 
-#: lib/api.php:76
+#: templates/notepad_list.php:2 notepads/index.php:37
+msgid "Manage Notepads"
+msgstr "Mine notesblokke"
+
+#: lib/api.php:82
 msgid "Maximum Number of Notes"
 msgstr "Maksimalt antal noter"
 
@@ -222,237 +240,272 @@ msgstr "Maksimalt antal noter"
 msgid "Memo Text"
 msgstr "Teksten af huskeseddel"
 
-#: memo.php:68
-#, php-format
-msgid "Modifying %s"
-msgstr "Ændrer %s"
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Menuliste"
+
+#: templates/list/header.inc:9
+msgid "More Options..."
+msgstr "Flere valg..."
+
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+"Multiple iCalendar komponenter fundet; der er kun understøttelse for én "
+"vNote."
+
+#: templates/panel.inc:50
+msgid "My Notepads:"
+msgstr "Mine notesblokke:"
 
-#: list.php:35
+#: list.php:31
 msgid "My Notes"
 msgstr "Mine noter"
 
-#: lib/Block/summary.php:22
+#: lib/Forms/CreateNotepad.php:36 lib/Forms/EditNotepad.php:43
+msgid "Name"
+msgstr "Navn"
+
+#: memo.php:57 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "Ny note"
 
-#: templates/data/import.inc:40
+#: templates/data/import.inc:34
 msgid "Next"
 msgstr "Næste"
 
-#: lib/api.php:230
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "Ingen iCalendar-data fundet."
 
-#: templates/menu.inc:7
-msgid "No notepads are available to guests."
-msgstr "Der er ingen notesblokke tilgængelige til gæster."
-
-#: templates/list/header.inc:3
-msgid "No notes"
-msgstr "Ingen noter"
+#: templates/list/memo_footers.inc:4
+msgid "No notes match"
+msgstr "Ingen noter passer"
 
-#: templates/list/empty.inc:3
+#: templates/list/empty.inc:1
 msgid "No notes match the current criteria."
 msgstr "Ingen noter passer til de aktuelle kriterier."
 
-#: lib/Block/summary.php:103
+#: lib/Block/summary.php:112
 msgid "No notes to display"
 msgstr "Ingen noter at vise."
 
-#: templates/list/memo_headers.inc:44
+#: templates/list/memo_headers.inc:37
 msgid "No_te"
 msgstr "Note"
 
-#: config/prefs.php.dist:41
+#: lib/Driver/sql.php:198
+msgid "Not found"
+msgstr "Ikke fundet"
+
+#: config/prefs.php.dist:59
 msgid "Note Category"
 msgstr "Note-kategori"
 
-#: view.php:82 templates/view/memo.inc:21
+#: view.php:121
 msgid "Note Details"
 msgstr "Note-detaljer"
 
-#: notepads.php:110
-msgid "Note Lists"
-msgstr "Note-lister"
-
-#: templates/view/memo.inc:45 config/prefs.php.dist:40
+#: config/prefs.php.dist:58
 msgid "Note Text"
 msgstr "Notestekst"
 
-#: templates/memo/memo.inc:26
+#: templates/memo/memo.inc:53
 msgid "Note _Text"
 msgstr "Notestekst"
 
-#: memo.php:60 view.php:57
+#: memo.php:67 view.php:56 note/pdf.php:57
 msgid "Note not found."
 msgstr "Note ikke fundet."
 
-#: templates/memo/memo.inc:34
+#: templates/memo/memo.inc:60
 msgid "Note_pad"
 msgstr "Notesblok"
 
-#: templates/notepads/notepads.inc:79
-msgid "Notepad's name:"
-msgstr "Navn på notesblok:"
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
+#: config/prefs.php.dist:60
+msgid "Notepad"
+msgstr "Notesblok"
+
+#: templates/notepad_list.php:14
+msgid "Notepad List"
+msgstr "Note-lister"
 
-#: templates/notepads/notepads.inc:61
+#: templates/panel.inc:32 templates/panel.inc:33
 msgid "Notepads"
 msgstr "Notesblokke"
 
-#: notepads.php:33
-msgid "Notepads must have a name."
-msgstr "Notesblokke skal være navngivne."
-
 #: lib/Block/summary.php:3
 msgid "Notes Summary"
 msgstr "Opsummering over noter"
 
-#: lib/api.php:207 lib/api.php:303 lib/api.php:379 lib/api.php:408
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Tilladelse nægtet"
 
-#: templates/notepads/notepads.inc:82
-msgid "Permissions"
-msgstr "Tilladelser"
+#: lib/Forms/DeleteNotepad.php:56
+msgid "Permission denied"
+msgstr "Tilladelse nægtet"
+
+#: lib/Forms/DeleteNotepad.php:43
+#, php-format
+msgid ""
+"Really delete the notepad \"%s\"? This cannot be undone and all data on this "
+"notepad will be permanently removed."
+msgstr ""
+"Vil du virkelig slette notesblokken \"%s\"? Dette kan ikke fortrydes og alle "
+"notesblokkens data vil gå tabt."
 
-#: templates/view/memo.inc:15
+#: templates/view/memo.inc:16
 msgid "Really delete this note?"
 msgstr "Slet denne note uigenkaldeligt?"
 
-#: templates/list/header.inc:5 templates/list/header.inc:6
-msgid "Refresh List"
-msgstr "Opdater liste"
-
-#: templates/prefs/showsummaryselect.inc:105
-msgid "Remove category"
-msgstr "Fjern kategori"
-
-#: templates/notepads/notepads.inc:96
-msgid "Reset"
-msgstr "Nulstil"
-
-#: templates/memo/memo.inc:56
+#: templates/panel.inc:68 templates/memo/memo.inc:58
+#: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr "Gem"
 
-#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:31
+#: templates/view/memo.inc:11
+msgid "Save as PDF"
+msgstr "Gem som PDF"
+
+#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:27
+#: templates/list/header.inc:4 lib/Block/tree_menu.php:44
 msgid "Search"
 msgstr "Søg"
 
-#: list.php:57
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr "Resultat for søgning"
 
-#: templates/search/search.inc:17
-msgid "Search Scope"
-msgstr "Medtag i søgning"
-
-#: templates/search/search.inc:9
-msgid "Search _Text"
-msgstr "Søg tekst"
-
-#: templates/notepads/notepads.inc:67
-msgid "Select a notepad"
-msgstr "Vælg en notesblok"
+#: templates/panel.inc:38
+msgid "Search for Notepads:"
+msgstr "Søg efter notesblokke:"
 
-#: templates/menu.inc:16
-msgid "Select notepads to display:"
-msgstr "Vælg de notesblokke, der skal vises:"
-
-#: templates/data/export.inc:15
+#: templates/data/export.inc:9
 msgid "Select the export format:"
 msgstr "Vælg formatet, der skal eksporteres i:"
 
-#: templates/data/import.inc:37
+#: templates/data/import.inc:31
 msgid "Select the file to import:"
 msgstr "Vælg den fil, der skal importeres:"
 
-#: templates/data/import.inc:15
+#: templates/data/import.inc:9
 msgid "Select the format of the source file:"
 msgstr "Vælg formatet af oprindelsesfilen:"
 
-#: templates/prefs/showsummaryselect.inc:109
-msgid "Selected Categories:"
-msgstr "Valgte kategorier:"
+#: templates/panel.inc:59
+msgid "Shared Notepads:"
+msgstr "Delte notesblokke"
+
+#: config/prefs.php.dist:39
+msgid "Should the Notepad be shown in its own column in the List view?"
+msgstr "Skal notesblokken vises i sin egen kolonne i liste-visning?"
 
-#: lib/Block/summary.php:37
+#: lib/Block/summary.php:35
 msgid "Show action buttons?"
 msgstr "Vis handlingsknapper?"
 
-#: lib/Block/summary.php:40
+#: lib/Block/summary.php:39
 msgid "Show notepad name?"
 msgstr "Vis navnet på notesblok?"
 
+#: config/prefs.php.dist:49
+msgid "Show notepad options panel?"
+msgstr "Vis notesblok indstillinger?"
+
 #: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "Vis noter fra disse kategorier"
 
-#: templates/list/memo_headers.inc:48
+#: templates/list/memo_headers.inc:41
 msgid "Sort by Category"
 msgstr "Sorter efter kategori"
 
-#: templates/list/memo_headers.inc:44
+#: templates/list/memo_headers.inc:37
 msgid "Sort by Note Text"
 msgstr "Sortér efter notetekst"
 
-#: memo.php:135
+#: templates/list/memo_headers.inc:33
+msgid "Sort by Notepad"
+msgstr "Sorter efter notesblok"
+
+#: memo.php:174
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "\"%s\" lagret."
 
-#: memo.php:159
-msgid "The note was deleted."
-msgstr "Noten er slettet."
+#: data.php:194
+#, php-format
+msgid "The %s file didn't contain any notes."
+msgstr "Filen %s indeholdt ingen noter."
 
-#: notepads.php:46
+#: lib/Driver.php:53
+msgid "The Notes backend is not currently available."
+msgstr "Note-backenden er ikke tilgængelig."
+
+#: lib/Driver.php:227
 #, php-format
-msgid "The notepad \"%s\" couldn't be created: %s"
-msgstr "Notesblok \"%s\" kunne ikke oprettes: %s"
+msgid "The Notes backend is not currently available: %s"
+msgstr "Note-backenden er ikke tilgængelig: %s"
 
-#: notepads.php:48
+#: memo.php:197
+msgid "The note was deleted."
+msgstr "Noten er slettet."
+
+#: notepads/create.php:31
 #, php-format
 msgid "The notepad \"%s\" has been created."
 msgstr "Notesblokken \"%s\" er oprettet."
 
-#: notepads.php:85
+#: notepads/delete.php:48
 #, php-format
 msgid "The notepad \"%s\" has been deleted."
 msgstr "Notesblokken \"%s\" er slettet."
 
-#: notepads.php:56
+#: notepads/edit.php:42
+#, php-format
+msgid "The notepad \"%s\" has been renamed to \"%s\"."
+msgstr "Notesblokken \"%s\" er omdøbt til \"%s\"."
+
+#: notepads/edit.php:44
 #, php-format
 msgid "The notepad \"%s\" has been saved."
 msgstr "Notesblokken \"%s\" er lagret."
 
-#: data.php:184
+#: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "Der opstod en fejl under importeringen af data: %s"
 
-#: lib/api.php:224
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Der opstod en fejl under importeringen af iCalendar data."
 
-#: lib/api.php:427
-msgid "There was an error importing the vNote data."
-msgstr "Der opstod en fejl under importering af vNote-data."
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr ""
+"Der opstod en fejl under sletning af noterne for %s. Detaljerne er blevet "
+"logget."
 
-#: memo.php:157
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Der opstod en fejl under sletning af noten: %s"
 
-#: memo.php:133
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Der opstod en fejl under lagring af noten: %s"
 
-#: view.php:46
+#: view.php:45 note/pdf.php:46
 #, php-format
 msgid "There was an error viewing this notepad: %s"
 msgstr "Der opstod en fejl under læsning af denne notesblok: %s"
 
-#: data.php:79
+#: data.php:78
 msgid "There were no memos to export."
 msgstr "Der var ingen noter at eksportere."
 
@@ -460,101 +513,154 @@ msgstr "Der var ingen noter at eksportere."
 msgid "This file format is not supported."
 msgstr "Dette filformat er ikke understøttet."
 
-#: notepads.php:80
+#: memo.php:91 view.php:111
+msgid "This note cannot be decrypted:"
+msgstr "Denne note kan ikke dekrypteres:"
+
+#: memo.php:83 view.php:103
+msgid "This note has been encrypted, please provide the password below."
+msgstr "Denne note er blevet krypteret. Skriv kodeordet nedenfor."
+
+#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:461
+msgid "This note has been encrypted."
+msgstr "Noten er krypteret."
+
+#: notepads/delete.php:24
+msgid "This notepad cannot be deleted"
+msgstr "Denne notesblok kan ikke slettes."
+
+#: lib/Forms/DeleteNotepad.php:63
 #, php-format
 msgid "Unable to delete \"%s\": %s"
 msgstr "Kan ikke slette \"%s\": %s"
 
-#: templates/memo/memo.inc:58
-msgid "Undo changes"
-msgstr "Fortryd ændringer"
+#: lib/Driver.php:230
+#, php-format
+msgid "Unable to load the definition of %s."
+msgstr "Kan ikke indlæse definitionen af %s."
+
+#: lib/Forms/EditNotepad.php:55
+#, php-format
+msgid "Unable to save notepad \"%s\": %s"
+msgstr "Kan ikke gemme notesblok \"%s\": %s"
 
-#: templates/view/memo.inc:27 templates/list/memo_summaries.inc:14
-#: scripts/upgrades/2004-05-19_convert_categories_to_strings.php:49
-#: lib/Mnemo.php:206 lib/Mnemo.php:207 lib/Mnemo.php:221 lib/Mnemo.php:222
-#: lib/Block/summary.php:98
+#: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
+#: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr "Ikke anbragt"
 
-#: lib/api.php:260 lib/api.php:343 lib/api.php:435
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Ikke-understøttet Content-Type: %s"
 
-#: templates/data/import.inc:22
+#: templates/data/import.inc:16
 msgid "Which Notepad should the notes be added to?"
 msgstr "Hvilken notesblok skal noterne føjes til?"
 
-#: data.php:42 data.php:125 memo.php:35
+#: notepads/edit.php:28
+msgid "You are not allowed to change this notepad."
+msgstr "Du har ikke tilladelse til at ændre denne notesblok."
+
+#: data.php:42 data.php:129 memo.php:37
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "Du har ikke tilladelse til at oprette flere end %d noter."
 
-#: view.php:50
+#: notepads/delete.php:35
+msgid "You are not allowed to delete this notepad."
+msgstr "Du har ikke tilladelse til at slette denne notesblok."
+
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "Du har ikke tilladelse til at slette brugerdata."
+
+#: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
 msgstr "Du har ikke tilladelse til at se notesblokken %s."
 
-#: notepads.php:65
-msgid "You must select a notepad to be deleted."
-msgstr "Du skal vælge en notesblok, som skal slettes."
-
 #: templates/prefs/notepadselect.inc:10
 msgid "Your default notepad:"
 msgstr "Standard notesblok:"
 
-#: templates/notepads/notepads.inc:65
-msgid "Your notepads:"
-msgstr "Dine notesblokke:"
+#: templates/panel.inc:45
+msgid "[Manage Notepads]"
+msgstr "Mine notesblokke"
 
-#: templates/view/memo.inc:18
-msgid "_Back to Notepad"
-msgstr "Tilbage til notesblok"
+#: templates/search/search.inc:21
+msgid "_Body"
+msgstr "_Besked"
 
-#: templates/memo/memo.inc:51 templates/list/memo_headers.inc:48
+#: templates/memo/memo.inc:71 templates/list/memo_headers.inc:41
 msgid "_Category"
-msgstr "Kategori"
+msgstr "_Kategori"
 
-#: templates/view/memo.inc:15
+#: templates/view/memo.inc:16
 msgid "_Delete"
-msgstr "Slet"
+msgstr "_Slet"
 
-#: templates/view/memo.inc:11
+#: templates/view/memo.inc:13
 msgid "_Edit"
-msgstr "Redigér"
+msgstr "_Rediger"
 
-#: templates/search/search.inc:20
-msgid "_First Line"
-msgstr "Første linie"
+#: templates/memo/memo.inc:75
+msgid "_Encrypt?"
+msgstr "_Krypter?"
 
-#: lib/Mnemo.php:281
+#: templates/search/search.inc:9
+msgid "_For: "
+msgstr "_For: "
+
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
-msgstr "Import/Eksport"
+msgstr "_Import/Eksport"
 
-#: lib/Mnemo.php:264
+#: lib/Mnemo.php:481
 msgid "_List Notes"
 msgstr "List noter"
 
-#: lib/Mnemo.php:276
-msgid "_My Notepads"
-msgstr "Mine notesblokke"
-
-#: lib/Mnemo.php:269
+#: lib/Mnemo.php:486
 msgid "_New Note"
-msgstr "Ny note"
+msgstr "_Ny note"
 
-#: lib/Mnemo.php:286
+#: templates/view/memo.inc:52 templates/memo/memo.inc:21
+#: templates/memo/memo.inc:80
+msgid "_Password"
+msgstr "_Kodeord"
+
+#: lib/Mnemo.php:499
 msgid "_Print"
-msgstr "Udskriv"
+msgstr "_Udskriv"
 
-#: lib/Mnemo.php:272
+#: lib/Mnemo.php:490
 msgid "_Search"
-msgstr "Søg"
+msgstr "_Søg"
+
+#: templates/search/search.inc:20
+msgid "_Title"
+msgstr "_Titel"
+
+#: view.php:74 view.php:83
+#, php-format
+msgid "by %s"
+msgstr "af %s"
+
+#: view.php:76 view.php:85
+msgid "by me"
+msgstr "af mig"
+
+#: lib/Block/tree_menu.php:33
+#, php-format
+msgid "in %s"
+msgstr "i %s"
 
-#: data.php:91 templates/data/export.inc:1
+#: data.php:90 templates/data/export.inc:4
 msgid "notes.csv"
 msgstr "notes.csv"
 
-#: data.php:33 templates/data/import.inc:18
+#: data.php:33 templates/data/import.inc:12
 msgid "vNote"
 msgstr "vNote"
diff --git a/po/de_DE.po b/po/de_DE.po
index 1a0ed35..96f28a7 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -1,14 +1,14 @@
 # German translations for Mnemo.
-# Copyright (C) 2001-2008 Horde Project
+# Copyright 2001-2009 The Horde Project
 # This file is distributed under the same license as the Mnemo package.
-# Jan Schneider <jan at horde.org>, 2001-2008.
+# Jan Schneider <jan at horde.org>, 2001-2009.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Mnemo 2.2-cvs\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-09-06 11:11+0200\n"
-"PO-Revision-Date: 2008-07-12 18:49+0200\n"
+"POT-Creation-Date: 2009-09-12 10:09+0200\n"
+"PO-Revision-Date: 2009-09-12 10:33+0200\n"
 "Last-Translator: Jan Schneider <jan at horde.org>\n"
 "Language-Team: German <dev at horde.org>\n"
 "MIME-Version: 1.0\n"
@@ -25,30 +25,30 @@ msgstr "%s Zeichen"
 msgid "%s file successfully imported"
 msgstr "Die %s-Datei wurde erfolgreich importiert"
 
-#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "Notizblock von %s"
 
-#: memo.php:200
+#: memo.php:237
 msgid "Access denied deleting note."
 msgstr "Zugriff verweigert beim Löschen der Notiz."
 
-#: memo.php:143 memo.php:146
+#: memo.php:180 memo.php:183
 msgid "Access denied moving the note."
 msgstr "Zugriff verweigert beim Verschieben der Notiz."
 
-#: memo.php:120
+#: memo.php:135
 #, php-format
 msgid "Access denied saving note to %s."
 msgstr "Notiz konnte nicht nach %s gespeichert werden. Zugriff verweigert."
 
-#: memo.php:118
+#: memo.php:133
 #, php-format
 msgid "Access denied saving note: %s"
 msgstr "Zugriff verweigert beim Speichern der Notiz: %s"
 
-#: config/prefs.php.dist:70
+#: config/prefs.php.dist:69
 msgid "Ascending"
 msgstr "Aufsteigend"
 
@@ -104,11 +104,11 @@ msgstr "Entschl
 msgid "Default Notepad"
 msgstr "Standard-Notizblock"
 
-#: config/prefs.php.dist:61
+#: config/prefs.php.dist:60
 msgid "Default sorting criteria:"
 msgstr "Sortierreihenfolge:"
 
-#: config/prefs.php.dist:72
+#: config/prefs.php.dist:71
 msgid "Default sorting direction:"
 msgstr "Sortierrichtung:"
 
@@ -134,7 +134,7 @@ msgstr "Verhalten beim L
 msgid "Delete this note"
 msgstr "Diese Notiz löschen"
 
-#: config/prefs.php.dist:71
+#: config/prefs.php.dist:70
 msgid "Descending"
 msgstr "Absteigend"
 
@@ -151,7 +151,7 @@ msgstr "Notiz %s nicht gefunden"
 msgid "Display Options"
 msgstr "Anzeige-Einstellungen"
 
-#: config/prefs.php.dist:117
+#: config/prefs.php.dist:116
 msgid "Do you want to confirm deleting entries?"
 msgstr "Möchten Sie das Löschen von Einträgen bestätigen?"
 
@@ -179,7 +179,7 @@ msgstr "Notiz bearbeiten"
 msgid "Edit categories and colors"
 msgstr "Kategorien und Farben bearbeiten"
 
-#: memo.php:104
+#: memo.php:118 memo.php:149
 #, php-format
 msgid "Edit: %s"
 msgstr "Bearbeiten: %s"
@@ -245,6 +245,11 @@ msgstr "Men
 msgid "More Options..."
 msgstr "Weitere Optionen..."
 
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+"Mehrere iCalendar-Komponenten gefunden; nur ein vNote wird unterstützt."
+
 #: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr "Meine Notizblöcke:"
@@ -257,7 +262,7 @@ msgstr "Meine Notizen"
 msgid "Name"
 msgstr "Name"
 
-#: memo.php:57 lib/Block/tree_menu.php:23
+#: memo.php:95 memo.php:140 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "Neue Notiz"
 
@@ -265,7 +270,7 @@ msgstr "Neue Notiz"
 msgid "Next"
 msgstr "Weiter"
 
-#: lib/api.php:337
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "Es wurden keine iCalendar-Daten gefunden."
 
@@ -285,11 +290,11 @@ msgstr "Keine Notizen"
 msgid "No_te"
 msgstr "No_tiz"
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:198
 msgid "Not found"
 msgstr "Nicht gefunden"
 
-#: config/prefs.php.dist:59
+#: config/prefs.php.dist:58
 msgid "Note Category"
 msgstr "Notizkategorie"
 
@@ -297,7 +302,7 @@ msgstr "Notizkategorie"
 msgid "Note Details"
 msgstr "Notizdetails"
 
-#: config/prefs.php.dist:58
+#: config/prefs.php.dist:57
 msgid "Note Text"
 msgstr "Notiztext"
 
@@ -305,16 +310,16 @@ msgstr "Notiztext"
 msgid "Note _Text"
 msgstr "Notiz_text"
 
-#: view.php:56 memo.php:67 note/pdf.php:57
+#: view.php:56 memo.php:105 memo.php:145 note/pdf.php:57
 msgid "Note not found."
 msgstr "Notiz nicht gefunden."
 
-#: templates/memo/memo.inc:59
-msgid "Note_pad"
-msgstr "Notiz_block"
+#: templates/memo/memo.inc:63
+msgid "Note_pad:"
+msgstr "Notiz_block:"
 
 #: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
-#: config/prefs.php.dist:60
+#: config/prefs.php.dist:59
 msgid "Notepad"
 msgstr "Notizblock"
 
@@ -353,7 +358,7 @@ msgstr ""
 msgid "Really delete this note?"
 msgstr "Diese Notiz wirklich löschen?"
 
-#: templates/panel.inc:68 templates/memo/memo.inc:57
+#: templates/panel.inc:68 templates/memo/memo.inc:58
 #: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr "Speichern"
@@ -367,7 +372,7 @@ msgstr "Als PDF speichern"
 msgid "Search"
 msgstr "Suche"
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr "Suchergebnisse"
 
@@ -405,10 +410,6 @@ msgstr "Aktionskn
 msgid "Show notepad name?"
 msgstr "Notizblockname anzeigen?"
 
-#: config/prefs.php.dist:49
-msgid "Show notepad options panel?"
-msgstr "Kasten mit Notizblockeinstellungen anzeigen?"
-
 #: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "Notizen dieser Kategorien anzeigen"
@@ -425,7 +426,7 @@ msgstr "Sortieren nach Notiztext"
 msgid "Sort by Notepad"
 msgstr "Sortieren nach Notizblock"
 
-#: memo.php:174
+#: memo.php:211
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "\"%s\" wurde erfolgreich gespeichert."
@@ -444,7 +445,7 @@ msgstr "Der Notizenserver ist zur Zeit nicht verf
 msgid "The Notes backend is not currently available: %s"
 msgstr "Der Notizenserver ist zur Zeit nicht verfügbar: %s"
 
-#: memo.php:197
+#: memo.php:234
 msgid "The note was deleted."
 msgstr "Die Notiz wurde gelöscht."
 
@@ -468,19 +469,19 @@ msgstr "Der Notizblock \"%s\" wurde nach \"%s\" umbenannt."
 msgid "The notepad \"%s\" has been saved."
 msgstr "Der Notizblock \"%s\" wurde gespeichert."
 
+#: memo.php:137
+msgid "The passwords don't match."
+msgstr "Die Passwörter stimmen nicht überein."
+
 #: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "Beim Importieren der Daten ist ein Fehler aufgetreten: %s"
 
-#: lib/api.php:331
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Beim Importieren der iCalendar Daten ist ein Fehler aufgetreten."
 
-#: lib/api.php:518
-msgid "There was an error importing the vNote data."
-msgstr "Beim Importieren der vNote-Daten ist ein Fehler aufgetreten."
-
 #: lib/api.php:168
 #, php-format
 msgid "There was an error removing notes for %s. Details have been logged."
@@ -488,12 +489,12 @@ msgstr ""
 "Beim Löschen der Notizen von %s ist ein Fehler aufgetreten. Details wurden "
 "protokolliert."
 
-#: memo.php:195
+#: memo.php:232
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Beim Löschen der Notiz ist ein Fehler aufgetreten: %s"
 
-#: memo.php:172
+#: memo.php:209
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Beim Speichern der Notiz ist ein Fehler aufgetreten: %s"
@@ -511,17 +512,17 @@ msgstr "Es konnten keine Termine zum Exportieren gefunden werden."
 msgid "This file format is not supported."
 msgstr "Dieses Dateiformat wird nicht unterstützt."
 
-#: view.php:111 memo.php:91
+#: view.php:111 memo.php:43
 msgid "This note cannot be decrypted:"
 msgstr "Diese Notiz konnte nicht entschlüsselt werden:"
 
-#: view.php:103 memo.php:83
+#: view.php:103 memo.php:34
 msgid "This note has been encrypted, please provide the password below."
 msgstr ""
 "Diese Notiz wurde verschlüsselt, bitte geben Sie unten das Passwort ein."
 
-#: view.php:100 view.php:108 memo.php:80 memo.php:88 lib/api.php:408
-#: lib/Driver/kolab.php:766 lib/Driver/sql.php:458
+#: view.php:100 view.php:108 memo.php:30 memo.php:39 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:461
 msgid "This note has been encrypted."
 msgstr "Diese Notiz wurde verschlüsselt."
 
@@ -545,12 +546,12 @@ msgid "Unable to save notepad \"%s\": %s"
 msgstr "Der Notizblock \"%s\" kann nicht gespeichert werden: %s"
 
 #: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
 #: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr "Nicht zugeordnet"
 
-#: lib/api.php:367 lib/api.php:433 lib/api.php:526
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Nicht unterstützter Inhaltstyp: %s"
@@ -563,7 +564,7 @@ msgstr "Zu welchem Notizblock sollen die Notizen hinzugef
 msgid "You are not allowed to change this notepad."
 msgstr "Sie dürfen diesen Notizblock nicht ändern."
 
-#: data.php:42 data.php:129 memo.php:37
+#: data.php:42 data.php:129 memo.php:75
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "Sie dürfen nicht mehr als %d Notizen erstellen."
@@ -593,10 +594,14 @@ msgstr "[Notizbl
 msgid "_Body"
 msgstr "_Text"
 
-#: templates/memo/memo.inc:70 templates/list/memo_headers.inc:41
+#: templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr "_Kategorie"
 
+#: templates/memo/memo.inc:78
+msgid "_Category:"
+msgstr "_Kategorie:"
+
 #: templates/view/memo.inc:16
 msgid "_Delete"
 msgstr "_Löschen"
@@ -605,7 +610,7 @@ msgstr "_L
 msgid "_Edit"
 msgstr "_Bearbeiten"
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:84
 msgid "_Encrypt?"
 msgstr "_Verschlüsseln?"
 
@@ -613,28 +618,35 @@ msgstr "_Verschl
 msgid "_For: "
 msgstr "_Nach: "
 
-#: lib/Mnemo.php:488
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
 msgstr "_Import/Export"
 
-#: lib/Mnemo.php:475
+#: lib/Mnemo.php:481
 msgid "_List Notes"
 msgstr "Notizen _anzeigen"
 
-#: lib/Mnemo.php:480
+#: lib/Mnemo.php:486
 msgid "_New Note"
 msgstr "_Neue Notiz"
 
 #: templates/view/memo.inc:52 templates/memo/memo.inc:21
-#: templates/memo/memo.inc:79
 msgid "_Password"
 msgstr "_Passwort"
 
-#: lib/Mnemo.php:493
+#: templates/memo/memo.inc:89
+msgid "_Password:"
+msgstr "_Passwort:"
+
+#: lib/Mnemo.php:499
 msgid "_Print"
 msgstr "_Drucken"
 
-#: lib/Mnemo.php:484
+#: templates/memo/memo.inc:93
+msgid "_Repeat:"
+msgstr "_Wiederholen:"
+
+#: lib/Mnemo.php:490
 msgid "_Search"
 msgstr "_Suche"
 
diff --git a/po/el_GR.po b/po/el_GR.po
index 2ed577d..7502d59 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
@@ -1,5 +1,5 @@
 # Mnemo Greek translation
-# Copyright (C) 2002 Stefanos I. Dimitriou.
+# Copyright 2002 Stefanos I. Dimitriou.
 # Stefanos I. Dimitriou <support_webmail at teiath.gr>, 2002.
 # Silligardos Xristoforos, 2002.
 # Anagnostopoulos Apostolis, 2002.
diff --git a/po/es_ES.po b/po/es_ES.po
index be3fee3..2c1c0a5 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -1,6 +1,6 @@
 # Spanish translations for mnemo package
 # Traducciones al español para el paquete mnemo.
-# Copyright (C) 2008 Horde Project
+# Copyright 2008-2009 The Horde Project
 # This file is distributed under the same license as the mnemo package.
 # Automatically generated, 2008.
 #
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Mnemo 2.2-rc3\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-05-24 09:40+0200\n"
-"PO-Revision-Date: 2008-05-24 09:40+0200\n"
+"POT-Creation-Date: 2009-02-20 15:34+0100\n"
+"PO-Revision-Date: 2009-02-20 15:34+0100\n"
 "Last-Translator: Manuel P. Ayala <mayala at unex.es>\n"
 "Language-Team: i18n at lists.horde.org\n"
 "MIME-Version: 1.0\n"
@@ -27,16 +27,16 @@ msgstr "%s caracteres"
 msgid "%s file successfully imported"
 msgstr "El archivo %s se ha importado satisfactoriamente"
 
-#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "Libreta de %s"
 
-#: memo.php:201
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "Se ha denegado el acceso para eliminar la nota."
 
-#: memo.php:150 memo.php:153
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "Se ha denegado el acceso para trasladar la nota."
 
@@ -66,7 +66,7 @@ msgstr "Cancelar"
 msgid "Category"
 msgstr "Categoría"
 
-#: notepads/index.php:32 templates/notepad_list.php:31
+#: notepads/index.php:32 templates/notepad_list.php:29
 msgid "Change Permissions"
 msgstr "Cambiar permisos"
 
@@ -90,7 +90,7 @@ msgstr "Crear"
 msgid "Create Notepad"
 msgstr "Crear libreta"
 
-#: templates/notepad_list.php:8
+#: templates/notepad_list.php:9
 msgid "Create a new Notepad"
 msgstr "Crear una libreta"
 
@@ -114,8 +114,8 @@ msgstr "Criterio de clasificaci
 msgid "Default sorting direction:"
 msgstr "Sentido de clasificación por omisión:"
 
-#: notepads/index.php:33 templates/notepad_list.php:33
-#: templates/view/memo.inc:16 lib/Forms/DeleteNotepad.php:45
+#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -140,7 +140,7 @@ msgstr "Eliminar esta nota"
 msgid "Descending"
 msgstr "Descendente"
 
-#: lib/Forms/CreateNotepad.php:37 lib/Forms/EditNotepad.php:44
+#: lib/Forms/EditNotepad.php:44 lib/Forms/CreateNotepad.php:37
 msgid "Description"
 msgstr "Descripción"
 
@@ -157,7 +157,7 @@ msgstr "Opciones de Visualizaci
 msgid "Do you want to confirm deleting entries?"
 msgstr "¿Quiere confirmar la eliminación de entradas?"
 
-#: notepads/index.php:31 templates/notepad_list.php:29
+#: notepads/index.php:31 templates/notepad_list.php:27
 #: templates/view/memo.inc:13
 msgid "Edit"
 msgstr "Modificar"
@@ -172,8 +172,8 @@ msgstr "Modificar \"%s\""
 msgid "Edit %s"
 msgstr "Modificar %s"
 
-#: templates/list/memo_headers.inc:30 lib/Block/summary.php:79
-#: lib/Block/summary.php:80
+#: lib/Block/summary.php:79 lib/Block/summary.php:80
+#: templates/list/memo_headers.inc:30
 msgid "Edit Note"
 msgstr "Modificar nota"
 
@@ -186,7 +186,7 @@ msgstr "Modificar categor
 msgid "Edit: %s"
 msgstr "Modificar: %s"
 
-#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:104
+#: lib/Block/summary.php:104 templates/list/memo_summaries.inc:15
 msgid "Empty Note"
 msgstr "Vaciar nota"
 
@@ -247,6 +247,11 @@ msgstr "Listado de men
 msgid "More Options..."
 msgstr "Más opciones..."
 
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+"Se encontraron multiples componentes iCalendar; sólo se soporta una vNote."
+
 #: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr "Mis libretas:"
@@ -255,7 +260,7 @@ msgstr "Mis libretas:"
 msgid "My Notes"
 msgstr "Mis notas"
 
-#: lib/Forms/CreateNotepad.php:36 lib/Forms/EditNotepad.php:43
+#: lib/Forms/EditNotepad.php:43 lib/Forms/CreateNotepad.php:36
 msgid "Name"
 msgstr "Nombre"
 
@@ -267,7 +272,7 @@ msgstr "A
 msgid "Next"
 msgstr "Siguiente"
 
-#: lib/api.php:286
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "No se encontraron datos iCalendar."
 
@@ -287,7 +292,7 @@ msgstr "Sin notas visibles"
 msgid "No_te"
 msgstr "_Nota"
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:196
 msgid "Not found"
 msgstr "No encontrada"
 
@@ -307,20 +312,20 @@ msgstr "Texto de la nota"
 msgid "Note _Text"
 msgstr "_Texto de la nota"
 
-#: memo.php:67 view.php:56 note/pdf.php:57
+#: view.php:56 memo.php:67 note/pdf.php:57
 msgid "Note not found."
 msgstr "No se encontró la nota."
 
-#: templates/memo/memo.inc:59
+#: templates/memo/memo.inc:60
 msgid "Note_pad"
 msgstr "_Libreta"
 
-#: templates/notepad_list.php:15 templates/list/memo_headers.inc:33
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
 #: config/.bak/prefs.php.dist:60
 msgid "Notepad"
 msgstr "Libreta"
 
-#: templates/notepad_list.php:12
+#: templates/notepad_list.php:14
 msgid "Notepad List"
 msgstr "Lista de notas"
 
@@ -332,8 +337,8 @@ msgstr "Libretas"
 msgid "Notes Summary"
 msgstr "Resumen de notas"
 
-#: lib/api.php:161 lib/api.php:201 lib/api.php:234 lib/api.php:264
-#: lib/api.php:351 lib/api.php:419 lib/api.php:448
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Permiso denegado"
 
@@ -354,8 +359,8 @@ msgstr ""
 msgid "Really delete this note?"
 msgstr "¿Eliminar realmente esta nota?"
 
-#: templates/panel.inc:68 templates/memo/memo.inc:57
-#: lib/Forms/EditNotepad.php:46
+#: lib/Forms/EditNotepad.php:46 templates/panel.inc:68
+#: templates/memo/memo.inc:58
 msgid "Save"
 msgstr "Guardar"
 
@@ -363,12 +368,12 @@ msgstr "Guardar"
 msgid "Save as PDF"
 msgstr "Guardar como PDF"
 
-#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:27
-#: templates/list/header.inc:4 lib/Block/tree_menu.php:44
+#: search.php:17 lib/Block/tree_menu.php:44 templates/search/search.inc:4
+#: templates/search/search.inc:27 templates/list/header.inc:4
 msgid "Search"
 msgstr "Buscar"
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr "Resultados de la búsqueda"
 
@@ -424,7 +429,7 @@ msgstr "Ordenar por texto del comentario"
 msgid "Sort by Notepad"
 msgstr "Ordenar libreta"
 
-#: memo.php:175
+#: memo.php:174
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "Se ha guardado correctamente \"%s\"."
@@ -443,7 +448,7 @@ msgstr "El motor de Notas no est
 msgid "The Notes backend is not currently available: %s"
 msgstr "El motor de Notas no está disponible en este momento: %s"
 
-#: memo.php:198
+#: memo.php:197
 msgid "The note was deleted."
 msgstr "Se eliminó la nota."
 
@@ -472,20 +477,23 @@ msgstr "Se ha guardado la libreta \"%s\"."
 msgid "There was an error importing the data: %s"
 msgstr "Se produjo un error al importar los datos: %s"
 
-#: lib/api.php:280
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Se produjo un error al importar los datos iCalendar."
 
-#: lib/api.php:467
-msgid "There was an error importing the vNote data."
-msgstr "Se produjo un error al importar los datos vNote."
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr ""
+"Se produjo un error al eliminar las notass de %s. Se han registrado los "
+"detalles."
 
-#: memo.php:196
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Se produjo un error al eliminar la nota: %s"
 
-#: memo.php:173
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Se produjo un error al guardar la nota: %s"
@@ -503,16 +511,16 @@ msgstr "No hubo memorandos a exportar."
 msgid "This file format is not supported."
 msgstr "Este formato de archivo no está soportado."
 
-#: memo.php:91 view.php:111
+#: view.php:111 memo.php:91
 msgid "This note cannot be decrypted:"
 msgstr "Esta nota no se puede descifrar:"
 
-#: memo.php:83 view.php:103
+#: view.php:103 memo.php:83
 msgid "This note has been encrypted, please provide the password below."
 msgstr "Esta nota se ha cifrado, introduzca la contrasela a continuación."
 
-#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:357
-#: lib/Driver/sql.php:448 lib/Driver/kolab.php:766
+#: view.php:100 view.php:108 memo.php:80 memo.php:88 lib/api.php:408
+#: lib/Driver/sql.php:459 lib/Driver/kolab.php:766
 msgid "This note has been encrypted."
 msgstr "Esta nota se ha cifrado."
 
@@ -535,13 +543,13 @@ msgstr "Incapaz de cargar la definici
 msgid "Unable to save notepad \"%s\": %s"
 msgstr "Incapaz de guardar la libreta \"%s\": %s"
 
-#: templates/list/memo_summaries.inc:17 templates/view/memo.inc:27
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
-#: lib/Block/summary.php:107
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
+#: lib/Block/summary.php:107 templates/list/memo_summaries.inc:17
+#: templates/view/memo.inc:27
 msgid "Unfiled"
 msgstr "Sin categoría"
 
-#: lib/api.php:316 lib/api.php:382 lib/api.php:475
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Tipo de contenido no soportado: %s"
@@ -563,6 +571,10 @@ msgstr "Carece de permiso para crear m
 msgid "You are not allowed to delete this notepad."
 msgstr "Carece de permiso para eliminar esta libreta."
 
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "Carece de permiso para eliminar datos de usuario."
+
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
@@ -580,7 +592,7 @@ msgstr "[Gestionar libretas]"
 msgid "_Body"
 msgstr "_Cuerpo"
 
-#: templates/memo/memo.inc:70 templates/list/memo_headers.inc:41
+#: templates/memo/memo.inc:71 templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr "_Categoría"
 
@@ -592,7 +604,7 @@ msgstr "_Eliminar"
 msgid "_Edit"
 msgstr "Mo_dificar"
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:75
 msgid "_Encrypt?"
 msgstr "¿Ci_frar?"
 
@@ -600,28 +612,28 @@ msgstr "
 msgid "_For: "
 msgstr "Te_xto: "
 
-#: lib/Mnemo.php:488
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
 msgstr "_Importar/Exportar"
 
-#: lib/Mnemo.php:475
+#: lib/Mnemo.php:481
 msgid "_List Notes"
 msgstr "_Listar"
 
-#: lib/Mnemo.php:480
+#: lib/Mnemo.php:486
 msgid "_New Note"
 msgstr "_Añadir"
 
-#: templates/memo/memo.inc:21 templates/memo/memo.inc:79
+#: templates/memo/memo.inc:21 templates/memo/memo.inc:80
 #: templates/view/memo.inc:52
 msgid "_Password"
 msgstr "Contrase_ña"
 
-#: lib/Mnemo.php:493
+#: lib/Mnemo.php:499
 msgid "_Print"
 msgstr "Im_primir"
 
-#: lib/Mnemo.php:484
+#: lib/Mnemo.php:490
 msgid "_Search"
 msgstr "_Buscar"
 
diff --git a/po/eu_ES.po b/po/eu_ES.po
index 9ba613b..05a0f61 100644
--- a/po/eu_ES.po
+++ b/po/eu_ES.po
@@ -1,158 +1,160 @@
-# Basque translations for Mnemo.
-# Copyright (C) 2008 Horde Project
-# This file is distributed under the same license as the Mnemo package.
-# Euskal Herriko Unibertsitatea EHU/UPV <xabier.arrieta at ehu.es>, 2008.
+# Basque translation for mnemo package.
+# This file is distributed under the same license as the mnemo package.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Mnemo H3 (2.1)\n"
+"Project-Id-Version: mnemo\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-01-16 09:33+0100\n"
-"PO-Revision-Date: 2008-07-17 14:28+0200\n"
-"Last-Translator: Euskal Herriko Unibertsitatea EHU/UPV <xabier.arrieta at ehu."
-"es>\n"
-"Language-Team: Euskal Herriko Unibertsitatea EHU/UPV <xabier.arrieta at ehu."
-"es>\n"
+"POT-Creation-Date: 2009-09-12 10:09+0200\n"
+"PO-Revision-Date: 2009-11-20 12:25+0100\n"
+"Last-Translator: Euskal Herriko Unibertsitatea <webmaster at ehu.es>\n"
+"Language-Team: Euskal Herriko Unibertsitatea <webmaster at ehu.es>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: templates/list/header.inc:3
-#, php-format
-msgid "%d notes"
-msgstr "%d ohar"
-
-#: templates/memo/memo.inc:26
+#: templates/memo/memo.inc:53
 #, php-format
 msgid "%s characters"
 msgstr "%s karaktere"
 
-#: data.php:201
+#: data.php:200
 #, php-format
 msgid "%s file successfully imported"
 msgstr "%s fitxategi ondo inportatu dira"
 
-#: notepads.php:99 lib/base.php:106
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "%s(r)en Ohar-bloka"
 
-#: templates/list/header.inc:3
-msgid "1 note"
-msgstr "ohar bat"
-
-#: memo.php:162
+#: memo.php:237
 msgid "Access denied deleting note."
 msgstr "Oharra ezabatzeko sarbidea ukatu da."
 
-#: memo.php:112 memo.php:115
+#: memo.php:180 memo.php:183
 msgid "Access denied moving the note."
 msgstr "Oharra lekuz aldatzeko sarbidea ukatu da."
 
-#: memo.php:84
+#: memo.php:135
 #, php-format
 msgid "Access denied saving note to %s."
 msgstr "Oharra hemen gordetzeko sarbidea ukatu da: %s."
 
-#: memo.php:82
+#: memo.php:133
 #, php-format
 msgid "Access denied saving note: %s"
 msgstr "Oharra gordetzeko sarbidea ukatu da: %s."
 
-#: memo.php:52
-msgid "Adding A New Note"
-msgstr "Ohar berri bat gehitu"
-
-#: config/prefs.php.dist:51
+#: config/prefs.php.dist:69
 msgid "Ascending"
 msgstr "Gorantz"
 
-#: templates/view/memo.inc:18
-msgid "Back to Notepad"
-msgstr "Itzuli ohar-blokera"
-
-#: templates/notepads/notepads.inc:97
-msgid "Back to Notepad Options"
-msgstr "Itzuli ohar-blokaren aukeretara"
-
-#: data.php:32 templates/data/import.inc:17
+#: data.php:32 templates/data/import.inc:11
 msgid "CSV"
 msgstr "CSV"
 
+#: lib/Forms/DeleteNotepad.php:45 lib/Forms/DeleteNotepad.php:51
+msgid "Cancel"
+msgstr "Utzi"
+
 #: data.php:54 templates/view/memo.inc:26
 msgid "Category"
 msgstr "Kategoria"
 
-#: templates/notepads/notepads.inc:22
-msgid "Change"
-msgstr "Aldatu"
+#: templates/notepad_list.php:29 notepads/index.php:32
+msgid "Change Permissions"
+msgstr "Aldatu baimenak"
 
-#: config/prefs.php.dist:15
+#: config/prefs.php.dist:14
 msgid "Change your note sorting and display options."
 msgstr "Aldatu oharrak ordenatzeko eta bistaratzeko aukerak."
 
-#: config/prefs.php.dist:22
+#: config/prefs.php.dist:21
 msgid "Choose your default Notepad."
 msgstr "Aukeratu ohar-blok lehenetsia."
 
-#: templates/search/search.inc:32
-msgid "Clear Form"
-msgstr "Garbitu inprimakia"
+#: templates/list/header.inc:8
+msgid "Close Search"
+msgstr "Itxi bilaketa"
 
-#: templates/notepads/notepads.inc:17 templates/notepads/notepads.inc:94
-#: templates/notepads/notepads.inc:96
+#: lib/Forms/CreateNotepad.php:39
 msgid "Create"
 msgstr "Sortu"
 
+#: lib/Forms/CreateNotepad.php:34
+msgid "Create Notepad"
+msgstr "Sortu ohar-bloka"
+
+#: templates/notepad_list.php:9
+msgid "Create a new Notepad"
+msgstr "Sortu Ohar-blok berri bat"
+
 #: templates/view/memo.inc:32
 msgid "Created"
 msgstr "Sortua"
 
-#: config/prefs.php.dist:21
+#: templates/view/memo.inc:54 templates/memo/memo.inc:23
+msgid "Decrypt"
+msgstr "Desenkriptatu"
+
+#: config/prefs.php.dist:20
 msgid "Default Notepad"
 msgstr "Ohar-blok lehenetsia"
 
-#: config/prefs.php.dist:42
+#: config/prefs.php.dist:60
 msgid "Default sorting criteria:"
 msgstr "Ordenatze-irizpide lehenetsia:"
 
-#: config/prefs.php.dist:53
+#: config/prefs.php.dist:71
 msgid "Default sorting direction:"
 msgstr "Ordenatze-noranzko lehenetsia:"
 
-#: templates/notepads/notepads.inc:95 templates/view/memo.inc:15
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
+#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
 msgid "Delete"
 msgstr "Ezabatu"
 
-#: config/prefs.php.dist:28
+#: lib/Forms/DeleteNotepad.php:40
+#, php-format
+msgid "Delete %s"
+msgstr "Ezabatu %s"
+
+#: config/prefs.php.dist:27
 msgid "Delete Confirmation"
 msgstr "Ezabatzeko berrespena"
 
-#: config/prefs.php.dist:29
+#: config/prefs.php.dist:28
 msgid "Delete button behaviour"
 msgstr "Ezabatu botoiaren portaera."
 
-#: templates/memo/memo.inc:67
+#: templates/memo/memo.inc:11
 msgid "Delete this note"
 msgstr "Ezabatu ohar hau"
 
-#: config/prefs.php.dist:52
+#: config/prefs.php.dist:70
 msgid "Descending"
 msgstr "Beherantz"
 
-#: templates/notepads/notepads.inc:85
-msgid "Description:"
-msgstr "Azalpena:"
+#: lib/Forms/EditNotepad.php:44 lib/Forms/CreateNotepad.php:37
+msgid "Description"
+msgstr "Azalpena"
 
-#: config/prefs.php.dist:14
+#: lib/Driver/kolab.php:556
+#, php-format
+msgid "Did not find note %s"
+msgstr "Ez du aurkitu %s oharra"
+
+#: config/prefs.php.dist:13
 msgid "Display Options"
 msgstr "Bistaratzeko aukerak"
 
-#: config/prefs.php.dist:98
+#: config/prefs.php.dist:116
 msgid "Do you want to confirm deleting entries?"
 msgstr "Sarrerak ezabatzea berretsi nahi duzu?"
 
-#: templates/view/memo.inc:11
+#: templates/notepad_list.php:27 templates/view/memo.inc:13
+#: notepads/index.php:31
 msgid "Edit"
 msgstr "Editatu"
 
@@ -161,48 +163,71 @@ msgstr "Editatu"
 msgid "Edit \"%s\""
 msgstr "Editatu \"%s\""
 
-#: lib/Block/summary.php:77 templates/list/memo_headers.inc:42
+#: lib/Forms/EditNotepad.php:40
+#, php-format
+msgid "Edit %s"
+msgstr "Editatu %s"
+
+#: templates/list/memo_headers.inc:30 lib/Block/summary.php:79
+#: lib/Block/summary.php:80
 msgid "Edit Note"
 msgstr "Editatu oharra"
 
-#: templates/list/memo_headers.inc:52
+#: templates/list/memo_headers.inc:45
 msgid "Edit categories and colors"
 msgstr "Editatu kategoriak eta koloreak"
 
-#: templates/list/memo_summaries.inc:12
+#: memo.php:118 memo.php:149
+#, php-format
+msgid "Edit: %s"
+msgstr "Editatu: %s"
+
+#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:104
 msgid "Empty Note"
 msgstr "Hustu oharra"
 
-#: templates/data/export.inc:19
+#: lib/Driver.php:118
+msgid ""
+"Encryption support has not been configured, please contact your "
+"administrator."
+msgstr ""
+"Enkriptatze-euskarria ez da konfiguratu. Jarri harremanetan "
+"administratzailearekin."
+
+#: templates/data/export.inc:16
 msgid "Export"
 msgstr "Esportatu"
 
-#: templates/data/export.inc:8
+#: templates/data/export.inc:2
 msgid "Export Notes"
 msgstr "Esportatu oharrak"
 
-#: templates/search/search.inc:21
-msgid "F_ull Text"
-msgstr "_Testu osoa"
-
-#: config/prefs.php.dist:13 config/prefs.php.dist:20 config/prefs.php.dist:27
+#: config/prefs.php.dist:12 config/prefs.php.dist:19 config/prefs.php.dist:26
 msgid "General Options"
 msgstr "Aukera orokorrak"
 
-#: templates/data/import.inc:8
+#: templates/data/import.inc:1
 #, php-format
 msgid "Import Notes, Step %d"
 msgstr "Inportatu oharrak, %d. urratsa"
 
-#: data.php:207
+#: data.php:206
 msgid "Import/Export Notes"
 msgstr "Inportatu/esportatu oharrak"
 
+#: templates/search/search.inc:17
+msgid "In: "
+msgstr "Hemen: "
+
 #: templates/view/memo.inc:39
 msgid "Last Modified"
 msgstr "Aldatze-data"
 
-#: lib/api.php:73
+#: templates/notepad_list.php:2 notepads/index.php:37
+msgid "Manage Notepads"
+msgstr "Kudeatu ohar-blokak"
+
+#: lib/api.php:82
 msgid "Maximum Number of Notes"
 msgstr "Oharren gehieneko kopurua"
 
@@ -210,160 +235,173 @@ msgstr "Oharren gehieneko kopurua"
 msgid "Memo Text"
 msgstr "Oharraren testua"
 
-#: memo.php:68
-#, php-format
-msgid "Modifying %s"
-msgstr "%s aldatzen"
+#: lib/Block/tree_menu.php:3
+msgid "Menu List"
+msgstr "Menu-zerrenda"
+
+#: templates/list/header.inc:9
+msgid "More Options..."
+msgstr "Aukera gehiago..."
 
-#: list.php:35
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+"iCalendar osagai bat baino gehiago aurkitu dira; vNote bakarra onartzen da."
+
+#: templates/panel.inc:50
+msgid "My Notepads:"
+msgstr "Nire ohar-blokak:"
+
+#: list.php:31
 msgid "My Notes"
 msgstr "Nire oharrak"
 
-#: lib/Block/summary.php:22
+#: lib/Forms/EditNotepad.php:43 lib/Forms/CreateNotepad.php:36
+msgid "Name"
+msgstr "Izena"
+
+#: memo.php:95 memo.php:140 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "Ohar berria"
 
-#: templates/data/import.inc:40
+#: templates/data/import.inc:34
 msgid "Next"
 msgstr "Hurrengoa"
 
-#: lib/api.php:227
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "Ez da aurkitu iCalendar daturik."
 
-#: templates/menu.inc:7
-msgid "No notepads are available to guests."
-msgstr "Ez dago ohar-blok erabilgarririk gonbidatuentzat."
+#: templates/list/memo_footers.inc:4
+msgid "No notes match"
+msgstr "Ez dago bat datorren oharrik"
 
-#: templates/list/header.inc:3
-msgid "No notes"
-msgstr "Oharrik ez"
-
-#: templates/list/empty.inc:3
+#: templates/list/empty.inc:1
 msgid "No notes match the current criteria."
 msgstr "Ez dago uneko irizpideekin bat datorren oharrik."
 
-#: lib/Block/summary.php:103
+#: lib/Block/summary.php:112
 msgid "No notes to display"
 msgstr "Ez dago oharrik bistaratzeko"
 
-#: templates/list/memo_headers.inc:44
+#: templates/list/memo_headers.inc:37
 msgid "No_te"
 msgstr "O_harra"
 
-#: lib/Driver/sql.php:140
+#: lib/Driver/sql.php:198
 msgid "Not found"
 msgstr "Ez da aurkitu"
 
-#: config/prefs.php.dist:41
+#: config/prefs.php.dist:58
 msgid "Note Category"
 msgstr "Oharraren kategoria"
 
-#: view.php:82 templates/view/memo.inc:21
+#: view.php:121
 msgid "Note Details"
 msgstr "Oharraren xehetasunak"
 
-#: notepads.php:110
-msgid "Note Lists"
-msgstr "Ohar-zerrendak"
-
-#: templates/view/memo.inc:45 config/prefs.php.dist:40
+#: config/prefs.php.dist:57
 msgid "Note Text"
 msgstr "Oharraren testua"
 
-#: templates/memo/memo.inc:26
+#: templates/memo/memo.inc:53
 msgid "Note _Text"
 msgstr "Oha_rraren testua"
 
-#: view.php:57 memo.php:60
+#: view.php:56 memo.php:105 memo.php:145 note/pdf.php:57
 msgid "Note not found."
 msgstr "Oharra ez da aurkitu."
 
-#: templates/memo/memo.inc:34
-msgid "Note_pad"
-msgstr "Ohar-b_loka"
+#: templates/memo/memo.inc:63
+msgid "Note_pad:"
+msgstr "Ohar-b_loka:"
+
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
+#: config/prefs.php.dist:59
+msgid "Notepad"
+msgstr "Ohar-bloka"
 
-#: templates/notepads/notepads.inc:79
-msgid "Notepad's name:"
-msgstr "Ohar-blokaren izena:"
+#: templates/notepad_list.php:14
+msgid "Notepad List"
+msgstr "Ohar-bloken zerrenda"
 
-#: templates/notepads/notepads.inc:61
+#: templates/panel.inc:32 templates/panel.inc:33
 msgid "Notepads"
 msgstr "Ohar-blokak"
 
-#: notepads.php:33
-msgid "Notepads must have a name."
-msgstr "Ohar-blokek izen bat eduki behar dute."
-
 #: lib/Block/summary.php:3
 msgid "Notes Summary"
 msgstr "Oharren laburpena"
 
-#: lib/api.php:204 lib/api.php:292 lib/api.php:349 lib/api.php:378
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Baimena ukatu da"
 
-#: templates/notepads/notepads.inc:82
-msgid "Permissions"
-msgstr "Baimenak"
+#: lib/Forms/DeleteNotepad.php:56
+msgid "Permission denied"
+msgstr "Baimena ukatuta"
+
+#: lib/Forms/DeleteNotepad.php:43
+#, php-format
+msgid ""
+"Really delete the notepad \"%s\"? This cannot be undone and all data on this "
+"notepad will be permanently removed."
+msgstr ""
+"Ziur zaude \"%s\" ohar-bloka ezabatu nahi duzula? Ekintza ezingo da desegin, "
+"eta ohar-blokeko datu guztiak betiko ezabatuko dira."
 
-#: templates/view/memo.inc:15
+#: templates/view/memo.inc:16
 msgid "Really delete this note?"
 msgstr "Ziur zaude ohar hau ezabatu nahi duzula?"
 
-#: templates/list/header.inc:5 templates/list/header.inc:6
-msgid "Refresh List"
-msgstr "Freskatu zerrenda"
-
-#: templates/notepads/notepads.inc:96
-msgid "Reset"
-msgstr "Berrezarri"
-
-#: templates/memo/memo.inc:56
+#: templates/panel.inc:68 templates/memo/memo.inc:58
+#: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr "Gorde"
 
-#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:31
+#: templates/view/memo.inc:11
+msgid "Save as PDF"
+msgstr "Gorde PDF gisa"
+
+#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:27
+#: templates/list/header.inc:4 lib/Block/tree_menu.php:44
 msgid "Search"
 msgstr "Bilatu"
 
-#: list.php:57
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
-msgstr "Bilaketaren emaitza"
-
-#: templates/search/search.inc:17
-msgid "Search Scope"
-msgstr "Bilaketa-esparrua"
-
-#: templates/search/search.inc:9
-msgid "Search _Text"
-msgstr "Bilatzeko _testua"
+msgstr "Bilaketaren emaitzak"
 
-#: templates/notepads/notepads.inc:67
-msgid "Select a notepad"
-msgstr "Hautatu ohar-blok bat"
+#: templates/panel.inc:38
+msgid "Search for Notepads:"
+msgstr "Bilatu ohar-blokak:"
 
-#: templates/menu.inc:16
-msgid "Select notepads to display:"
-msgstr "Hautatu bistaratzeko ohar-blokak:"
-
-#: templates/data/export.inc:15
+#: templates/data/export.inc:9
 msgid "Select the export format:"
 msgstr "Hautatu esportazio-formatua:"
 
-#: templates/data/import.inc:37
+#: templates/data/import.inc:31
 msgid "Select the file to import:"
 msgstr "Hautatu inportatu beharreko fitxategia:"
 
-#: templates/data/import.inc:15
+#: templates/data/import.inc:9
 msgid "Select the format of the source file:"
 msgstr "Hautatu iturburu-fitxategiaren formatua:"
 
-#: lib/Block/summary.php:37
+#: templates/panel.inc:59
+msgid "Shared Notepads:"
+msgstr "Ohar-blok partekatuak:"
+
+#: config/prefs.php.dist:39
+msgid "Should the Notepad be shown in its own column in the List view?"
+msgstr "Ohar-bloka bere zutabean bertan bistaratu Zerrendaren ikuspegian?"
+
+#: lib/Block/summary.php:35
 msgid "Show action buttons?"
-msgstr "Hautatu ekintza-botoiak?"
+msgstr "Erakutsi ekintza-botoiak?"
 
-#: lib/Block/summary.php:40
+#: lib/Block/summary.php:39
 msgid "Show notepad name?"
 msgstr "Erakutsi ohar-blokaren izena?"
 
@@ -371,178 +409,263 @@ msgstr "Erakutsi ohar-blokaren izena?"
 msgid "Show notes from these categories"
 msgstr "Erakutsi kategoria hauetako oharrak"
 
-#: templates/list/memo_headers.inc:48
+#: templates/list/memo_headers.inc:41
 msgid "Sort by Category"
 msgstr "Ordenatu kategoriaren arabera"
 
-#: templates/list/memo_headers.inc:44
+#: templates/list/memo_headers.inc:37
 msgid "Sort by Note Text"
 msgstr "Ordenatu ohar-testuaren arabera"
 
-#: memo.php:135
+#: templates/list/memo_headers.inc:33
+msgid "Sort by Notepad"
+msgstr "Ordenatu ohar-bloken arabera"
+
+#: memo.php:211
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "Behar bezala gorde da \"%s\"."
 
-#: data.php:195
+#: data.php:194
 #, php-format
 msgid "The %s file didn't contain any notes."
 msgstr "%s fitxategiak ez dauka oharrik."
 
-#: memo.php:159
-msgid "The note was deleted."
-msgstr "Oharra ezabatu egin da."
+#: lib/Driver.php:53
+msgid "The Notes backend is not currently available."
+msgstr "Oharren euskarri-modulua ez dago erabilgarri une honetan."
 
-#: notepads.php:46
+#: lib/Driver.php:227
 #, php-format
-msgid "The notepad \"%s\" couldn't be created: %s"
-msgstr "Ezin izan da sortu \"%s\" ohar-bloka: %s"
+msgid "The Notes backend is not currently available: %s"
+msgstr "Oharren euskarri-modulua ez dago erabilgarri une honetan: %s"
 
-#: notepads.php:48
+#: memo.php:234
+msgid "The note was deleted."
+msgstr "Oharra ezabatu da."
+
+#: notepads/create.php:31
 #, php-format
 msgid "The notepad \"%s\" has been created."
 msgstr "\"%s\" ohar-bloka sortu da."
 
-#: notepads.php:85
+#: notepads/delete.php:48
 #, php-format
 msgid "The notepad \"%s\" has been deleted."
 msgstr "\"%s\" ohar-bloka ezabatu da."
 
-#: notepads.php:56
+#: notepads/edit.php:42
+#, php-format
+msgid "The notepad \"%s\" has been renamed to \"%s\"."
+msgstr "\"%s\" ohar-blokari izena aldatu zaio: \"%s\"."
+
+#: notepads/edit.php:44
 #, php-format
 msgid "The notepad \"%s\" has been saved."
 msgstr "\"%s\" ohar-bloka gorde da."
 
-#: data.php:198
+#: memo.php:137
+msgid "The passwords don't match."
+msgstr "Pasahitzak ez datoz bat."
+
+#: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "Errorea gertatu da datuak inportatzean: %s"
 
-#: lib/api.php:221
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Errorea gertatu da iCalendar datuak inportatzean."
 
-#: lib/api.php:397
-msgid "There was an error importing the vNote data."
-msgstr "Errorea gertatu da vNote datuak inportatzean."
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr ""
+"Errore bat gertatu da %s(r)en oharrak kentzean. Xehetasunak erregistratu "
+"dira."
 
-#: memo.php:157
+#: memo.php:232
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Errorea gertatu da oharra kentzean: %s"
 
-#: memo.php:133
+#: memo.php:209
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Errorea gertatu da oharra gordetzean: %s"
 
-#: view.php:46
+#: view.php:45 note/pdf.php:46
 #, php-format
 msgid "There was an error viewing this notepad: %s"
 msgstr "Errorea gertatu da ohar-blok hau ikustean: %s"
 
-#: data.php:79
+#: data.php:78
 msgid "There were no memos to export."
-msgstr "Ez dago zirkularrik esportatzeko."
+msgstr "Ez dago oharrik esportatzeko."
 
 #: data.php:105
 msgid "This file format is not supported."
 msgstr "Fitxategi-formatu hau ez da onartzen."
 
-#: notepads.php:80
+#: view.php:111 memo.php:43
+msgid "This note cannot be decrypted:"
+msgstr "Ohar hau ezin da desenkriptatu:"
+
+#: view.php:103 memo.php:34
+msgid "This note has been encrypted, please provide the password below."
+msgstr "Ohar hau enkriptatuta dago. Sartu pasahitza behean."
+
+#: view.php:100 view.php:108 memo.php:30 memo.php:39 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:461
+msgid "This note has been encrypted."
+msgstr "Ohar hau enkriptatuta dago."
+
+#: notepads/delete.php:24
+msgid "This notepad cannot be deleted"
+msgstr "Ohar-blok hau ezin da ezabatu"
+
+#: lib/Forms/DeleteNotepad.php:63
 #, php-format
 msgid "Unable to delete \"%s\": %s"
-msgstr "Ezin da \"%s\" ezabatu: %s"
+msgstr "Ezin da ezabatu \"%s\": %s"
 
-#: templates/memo/memo.inc:58
-msgid "Undo changes"
-msgstr "Desegin aldaketak"
+#: lib/Driver.php:230
+#, php-format
+msgid "Unable to load the definition of %s."
+msgstr "Ezin da %s(r)en definizioa kargatu."
+
+#: lib/Forms/EditNotepad.php:55
+#, php-format
+msgid "Unable to save notepad \"%s\": %s"
+msgstr "Ezin da gorde \"%s\" ohar-bloka: %s"
 
-#: lib/Mnemo.php:206 lib/Mnemo.php:207 lib/Mnemo.php:221 lib/Mnemo.php:222
-#: lib/Block/summary.php:98 templates/list/memo_summaries.inc:14
-#: templates/view/memo.inc:27
+#: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
+#: lib/Block/summary.php:107
 msgid "Unfiled"
-msgstr "Sailkatu gabe"
+msgstr "Sailkatu gabea"
 
-#: lib/api.php:257 lib/api.php:314 lib/api.php:405
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Eduki mota hau ez da onartzen: %s"
 
-#: templates/data/import.inc:22
+#: templates/data/import.inc:16
 msgid "Which Notepad should the notes be added to?"
 msgstr "Zein ohar-bloketan gehituko dira oharrak?"
 
-#: data.php:42 data.php:130 memo.php:35
+#: notepads/edit.php:28
+msgid "You are not allowed to change this notepad."
+msgstr "Ez daukazu baimenik ohar-blok hau aldatzeko."
+
+#: data.php:42 data.php:129 memo.php:75
 #, php-format
 msgid "You are not allowed to create more than %d notes."
-msgstr "Ez duzu baimenik %d ohar baino gehiago sortzeko."
+msgstr "Ez daukazu baimenik %d ohar baino gehiago sortzeko."
+
+#: notepads/delete.php:35
+msgid "You are not allowed to delete this notepad."
+msgstr "Ez daukazu baimenik ohar-blok hau ezabatzeko."
+
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "Ez daukazu baimenik erabiltzaile-daturik kentzeko."
 
-#: view.php:50
+#: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
-msgstr "Ez duzu baimenik %s ohar-bloka ikusteko."
-
-#: notepads.php:65
-msgid "You must select a notepad to be deleted."
-msgstr "Ohar-blok bat hautatu behar duzu ezabatzeko."
+msgstr "Ez daukazu baimenik %s ohar-bloka ikusteko."
 
 #: templates/prefs/notepadselect.inc:10
 msgid "Your default notepad:"
 msgstr "Ohar-blok lehenetsia:"
 
-#: templates/notepads/notepads.inc:65
-msgid "Your notepads:"
-msgstr "Zure ohar-blokak:"
+#: templates/panel.inc:45
+msgid "[Manage Notepads]"
+msgstr "[Kudeatu ohar-blokak]"
 
-#: templates/view/memo.inc:18
-msgid "_Back to Notepad"
-msgstr "_Itzuli ohar-blokera"
+#: templates/search/search.inc:21
+msgid "_Body"
+msgstr "_Gorputza"
 
-#: templates/memo/memo.inc:51 templates/list/memo_headers.inc:48
+#: templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr "_Kategoria"
 
-#: templates/view/memo.inc:15
+#: templates/memo/memo.inc:78
+msgid "_Category:"
+msgstr "_Kategoria:"
+
+#: templates/view/memo.inc:16
 msgid "_Delete"
 msgstr "E_zabatu"
 
-#: templates/view/memo.inc:11
+#: templates/view/memo.inc:13
 msgid "_Edit"
 msgstr "E_ditatu"
 
-#: templates/search/search.inc:20
-msgid "_First Line"
-msgstr "_Lehen lerroa"
+#: templates/memo/memo.inc:84
+msgid "_Encrypt?"
+msgstr "_Enkriptatu?"
+
+#: templates/search/search.inc:9
+msgid "_For: "
+msgstr "_Honentzat: "
 
-#: lib/Mnemo.php:281
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
 msgstr "_Inportatu/esportatu"
 
-#: lib/Mnemo.php:264
+#: lib/Mnemo.php:481
 msgid "_List Notes"
-msgstr "_Zerrendatu oharrak"
-
-#: lib/Mnemo.php:276
-msgid "_My Notepads"
-msgstr "_Nire ohar-blokak"
+msgstr "Zerre_ndatu oharrak"
 
-#: lib/Mnemo.php:269
+#: lib/Mnemo.php:486
 msgid "_New Note"
 msgstr "_Ohar berria"
 
-#: lib/Mnemo.php:286
+#: templates/view/memo.inc:52 templates/memo/memo.inc:21
+msgid "_Password"
+msgstr "_Pasahitza"
+
+#: templates/memo/memo.inc:89
+msgid "_Password:"
+msgstr "_Pasahitza:"
+
+#: lib/Mnemo.php:499
 msgid "_Print"
 msgstr "I_nprimatu"
 
-#: lib/Mnemo.php:272
+#: templates/memo/memo.inc:93
+msgid "_Repeat:"
+msgstr "E_rrepikatu:"
+
+#: lib/Mnemo.php:490
 msgid "_Search"
 msgstr "_Bilatu"
 
-#: data.php:91 templates/data/export.inc:1
+#: templates/search/search.inc:20
+msgid "_Title"
+msgstr "_Izenburua"
+
+#: view.php:74 view.php:83
+#, php-format
+msgid "by %s"
+msgstr "- %s"
+
+#: view.php:76 view.php:85
+msgid "by me"
+msgstr "nik"
+
+#: lib/Block/tree_menu.php:33
+#, php-format
+msgid "in %s"
+msgstr "Hemen: %s"
+
+#: data.php:90 templates/data/export.inc:4
 msgid "notes.csv"
-msgstr "oharrak.csv"
+msgstr "notes.csv"
 
-#: data.php:33 templates/data/import.inc:18
+#: data.php:33 templates/data/import.inc:12
 msgid "vNote"
 msgstr "vNote"
diff --git a/po/fi_FI.po b/po/fi_FI.po
index eca9ced..28560b7 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -1,13 +1,13 @@
 # Finnish translation for Mnemo.
-# Copyright (C)
+# Copyright
 # Leena Heino <liinu at uta.fi>, 2002-2008.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Mnemo 3.0-cvs\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-08-20 17:49+0300\n"
-"PO-Revision-Date: 2008-08-20 12:59+0200\n"
+"POT-Creation-Date: 2009-01-29 16:00+0200\n"
+"PO-Revision-Date: 2008-11-03 12:59+0200\n"
 "Last-Translator: Leena Heino <liinu at uta.fi>\n"
 "Language-Team: Finnish <i18n at lists.horde.org>\n"
 "MIME-Version: 1.0\n"
@@ -25,16 +25,16 @@ msgstr "%s merkki
 msgid "%s file successfully imported"
 msgstr "%s tiedoston tuonti onnistui"
 
-#: lib/Mnemo.php:453 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:459 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "%s:n muistilista"
 
-#: memo.php:201
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "Sinulla ei ole oikeuksia poistaa muistiinpanoa."
 
-#: memo.php:150 memo.php:153
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "Sinulla ei ole oikeuksia poistaa muistiinpanoa."
 
@@ -243,6 +243,10 @@ msgstr "Valikkolista"
 msgid "More Options..."
 msgstr "Lisää asetuksia..."
 
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr "Löytyi useita iCalendar komponentteja; vain yksi vNote on tuettu."
+
 #: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr "Omat muistilistani:"
@@ -263,7 +267,7 @@ msgstr "Uusi muistiinpano"
 msgid "Next"
 msgstr "Seuraava"
 
-#: lib/api.php:337
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "iCalendar tietoja ei löytynyt."
 
@@ -283,7 +287,7 @@ msgstr "Ei muistiinpanoja n
 msgid "No_te"
 msgstr "Mu_istiinpano"
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:196
 msgid "Not found"
 msgstr "Ei löytynyt."
 
@@ -307,7 +311,7 @@ msgstr "Muistiinpanon _teksti"
 msgid "Note not found."
 msgstr "Muistiinpanoa ei löytynyt."
 
-#: templates/memo/memo.inc:59
+#: templates/memo/memo.inc:60
 msgid "Note_pad"
 msgstr "Muisti_lista"
 
@@ -350,7 +354,7 @@ msgstr ""
 msgid "Really delete this note?"
 msgstr "Poistetaanko tämä muistiinpano?"
 
-#: templates/panel.inc:68 templates/memo/memo.inc:57
+#: templates/panel.inc:68 templates/memo/memo.inc:58
 #: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr "Talleta"
@@ -364,7 +368,7 @@ msgstr "Talleta PDF-muodossa"
 msgid "Search"
 msgstr "Haku"
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr "Haun tulokset"
 
@@ -420,7 +424,7 @@ msgstr "J
 msgid "Sort by Notepad"
 msgstr "Järjestä muistlistan mukaan"
 
-#: memo.php:175
+#: memo.php:174
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "'%s':n talletus onnistui."
@@ -439,7 +443,7 @@ msgstr "Muistiinpanojen taustaj
 msgid "The Notes backend is not currently available: %s"
 msgstr "Muistiinpanojen taustajärjestelmä ei ole käytettävissä: %s"
 
-#: memo.php:198
+#: memo.php:197
 msgid "The note was deleted."
 msgstr "Muistiinpano on poistettu."
 
@@ -468,14 +472,10 @@ msgstr "Muistilista \"%s\" on talletettu."
 msgid "There was an error importing the data: %s"
 msgstr "Tapahtui virhe tuotaessa tietoa: %s"
 
-#: lib/api.php:331
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Tapahtui virhe tuotaessa iCalendar tietoja."
 
-#: lib/api.php:518
-msgid "There was an error importing the vNote data."
-msgstr "Tapahtui virhe tuotaessa vNote tietoja."
-
 #: lib/api.php:168
 #, php-format
 msgid "There was an error removing notes for %s. Details have been logged."
@@ -483,12 +483,12 @@ msgstr ""
 "Tapahtui virhe poistettaessa muistiinpanoa %s. Tarkemmat tiedot on "
 "talletettu lokitietoihin."
 
-#: memo.php:196
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Muistiinpanon poistamisessa tapahtui virhe: %s"
 
-#: memo.php:173
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Muistiinpanon talletetuksessa tapahtui virhe: %s"
@@ -515,7 +515,7 @@ msgid "This note has been encrypted, please provide the password below."
 msgstr "Tämä muistiinpano on salattu, anna salasana alla olevaan tilaan."
 
 #: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:408
-#: lib/Driver/kolab.php:766 lib/Driver/sql.php:448
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:459
 msgid "This note has been encrypted."
 msgstr "Tämä muistiinpano on salattu."
 
@@ -539,12 +539,12 @@ msgid "Unable to save notepad \"%s\": %s"
 msgstr "Ei voi tallentaa muistilistaa \"%s\": %s"
 
 #: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
 #: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr "Luokittelematon"
 
-#: lib/api.php:367 lib/api.php:433 lib/api.php:526
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Ei tuettu Content-Type: %s"
@@ -587,7 +587,7 @@ msgstr "[Hallinnoi muistilistoja]"
 msgid "_Body"
 msgstr "_Leipäteksti"
 
-#: templates/memo/memo.inc:70 templates/list/memo_headers.inc:41
+#: templates/memo/memo.inc:71 templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr "_Kategoria"
 
@@ -599,7 +599,7 @@ msgstr "_Poista"
 msgid "_Edit"
 msgstr "_Muokkaa"
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:75
 msgid "_Encrypt?"
 msgstr "_Salaa?"
 
@@ -607,28 +607,28 @@ msgstr "_Salaa?"
 msgid "_For: "
 msgstr "_Syy:"
 
-#: lib/Mnemo.php:490
+#: lib/Mnemo.php:496
 msgid "_Import/Export"
 msgstr "_Tuo/Vie"
 
-#: lib/Mnemo.php:477
+#: lib/Mnemo.php:483
 msgid "_List Notes"
 msgstr "_Listaa muistiinpanot"
 
-#: lib/Mnemo.php:482
+#: lib/Mnemo.php:488
 msgid "_New Note"
 msgstr "_Uusi muistiinpano"
 
 #: templates/view/memo.inc:52 templates/memo/memo.inc:21
-#: templates/memo/memo.inc:79
+#: templates/memo/memo.inc:80
 msgid "_Password"
 msgstr "S_alasana"
 
-#: lib/Mnemo.php:495
+#: lib/Mnemo.php:501
 msgid "_Print"
 msgstr "_Tulosta"
 
-#: lib/Mnemo.php:486
+#: lib/Mnemo.php:492
 msgid "_Search"
 msgstr "_Haku"
 
diff --git a/po/fr_FR.po b/po/fr_FR.po
index 4f0aa54..9921477 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -7,13 +7,13 @@
 # Benoit St-André <ben at benoitst-andre.net>, 2004.
 # Patrick Abiven <patrick.abiven at apitech.fr>, 2006.
 # Vincent Vinet <vvinet at revolutionlinux.com>, 2007.
-# Yannick Sebastia <yannick.sebastia at ecole-navale.fr>, 2008.
+# Yannick Sebastia <yannick.sebastia at ecole-navale.fr>, 2008, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: fr_FR\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-03-18 09:02+0100\n"
-"PO-Revision-Date: 2008-03-18 08:25+0100\n"
+"POT-Creation-Date: 2009-05-22 08:29+0200\n"
+"PO-Revision-Date: 2009-05-22 08:29+0200\n"
 "Last-Translator: Yannick Sebastia <yannick.sebastia at ecole-navale.fr>\n"
 "Language-Team: Francais <i18n at lists.horde.org>\n"
 "MIME-Version: 1.0\n"
@@ -27,21 +27,21 @@ msgstr ""
 msgid "%s characters"
 msgstr "%s caractères"
 
-#: data.php:199
+#: data.php:200
 #, php-format
 msgid "%s file successfully imported"
 msgstr "%s fichiers importés avec succès"
 
-#: lib/Mnemo.php:429 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "Bloc-notes de %s"
 
-#: memo.php:199
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "Suppression de la note interdite."
 
-#: memo.php:150 memo.php:153
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "Accès refusé en déplaçant la note."
 
@@ -71,7 +71,7 @@ msgstr "Annuler"
 msgid "Category"
 msgstr "Catégorie"
 
-#: notepads/index.php:32 templates/notepad_list.php:31
+#: notepads/index.php:32 templates/notepad_list.php:29
 msgid "Change Permissions"
 msgstr "Modifier les permissions"
 
@@ -95,7 +95,7 @@ msgstr "Cr
 msgid "Create Notepad"
 msgstr "Créer un Bloc-notes"
 
-#: templates/notepad_list.php:8
+#: templates/notepad_list.php:9
 msgid "Create a new Notepad"
 msgstr "Créer un nouveau Bloc-notes"
 
@@ -120,7 +120,7 @@ msgid "Default sorting direction:"
 msgstr "Sens du tri par défaut :"
 
 #: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
-#: templates/notepad_list.php:33 templates/view/memo.inc:16
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -162,7 +162,7 @@ msgstr "Options d'affichage"
 msgid "Do you want to confirm deleting entries?"
 msgstr "Voulez-vous confirmer la suppression des entrées ?"
 
-#: notepads/index.php:31 templates/notepad_list.php:29
+#: notepads/index.php:31 templates/notepad_list.php:27
 #: templates/view/memo.inc:13
 msgid "Edit"
 msgstr "Modifier"
@@ -177,7 +177,8 @@ msgstr "Modifier \"%s\""
 msgid "Edit %s"
 msgstr "Modifier %s"
 
-#: lib/Block/summary.php:74 templates/list/memo_headers.inc:30
+#: lib/Block/summary.php:79 lib/Block/summary.php:80
+#: templates/list/memo_headers.inc:30
 msgid "Edit Note"
 msgstr "Modifier la note"
 
@@ -190,7 +191,7 @@ msgstr "Modifier les cat
 msgid "Edit: %s"
 msgstr "Modifier: \"%s\""
 
-#: lib/Block/summary.php:93 templates/list/memo_summaries.inc:15
+#: lib/Block/summary.php:104 templates/list/memo_summaries.inc:15
 msgid "Empty Note"
 msgstr "Vider la note"
 
@@ -219,7 +220,7 @@ msgstr "Options g
 msgid "Import Notes, Step %d"
 msgstr "Importation des notes, étape %d"
 
-#: data.php:205
+#: data.php:206
 msgid "Import/Export Notes"
 msgstr "Importer/Exporter des notes"
 
@@ -235,7 +236,7 @@ msgstr "Derni
 msgid "Manage Notepads"
 msgstr "Mes bloc-notes"
 
-#: lib/api.php:77
+#: lib/api.php:82
 msgid "Maximum Number of Notes"
 msgstr "Nombre maximum de notes"
 
@@ -271,7 +272,7 @@ msgstr "Nouvelle note"
 msgid "Next"
 msgstr "Suivant"
 
-#: lib/api.php:272
+#: lib/api.php:337
 msgid "No iCalendar data was found."
 msgstr "Aucune donnée iCalendar n'a été trouvée."
 
@@ -283,7 +284,7 @@ msgstr "Aucune note correspondante"
 msgid "No notes match the current criteria."
 msgstr "Aucune note ne correspond au présent critère."
 
-#: lib/Block/summary.php:101
+#: lib/Block/summary.php:112
 msgid "No notes to display"
 msgstr "Aucune note à afficher"
 
@@ -299,7 +300,7 @@ msgstr "Non trouv
 msgid "Note Category"
 msgstr "Catégorie de note"
 
-#: view.php:108
+#: view.php:121
 msgid "Note Details"
 msgstr "Détails de la note"
 
@@ -319,12 +320,12 @@ msgstr "Note non trouv
 msgid "Note_pad"
 msgstr "_Bloc-notes"
 
-#: templates/notepad_list.php:15 templates/list/memo_headers.inc:33
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
 #: config/prefs.php.dist:60
 msgid "Notepad"
 msgstr "Bloc-notes"
 
-#: templates/notepad_list.php:12
+#: templates/notepad_list.php:14
 msgid "Notepad List"
 msgstr "Listes des notes"
 
@@ -336,8 +337,8 @@ msgstr "Blocs-notes"
 msgid "Notes Summary"
 msgstr "Sommaire des notes"
 
-#: lib/api.php:147 lib/api.php:187 lib/api.php:220 lib/api.php:250
-#: lib/api.php:337 lib/api.php:396 lib/api.php:425
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Accès refusé"
 
@@ -402,11 +403,11 @@ msgstr ""
 "Le bloc-notes doit-il être affiché dans sa propre colonne dans la liste de "
 "consultation ?"
 
-#: lib/Block/summary.php:34
+#: lib/Block/summary.php:35
 msgid "Show action buttons?"
 msgstr "Afficher boutons d'action ?"
 
-#: lib/Block/summary.php:37
+#: lib/Block/summary.php:39
 msgid "Show notepad name?"
 msgstr "Afficher le nom du bloc-notes ?"
 
@@ -414,7 +415,7 @@ msgstr "Afficher le nom du bloc-notes
 msgid "Show notepad options panel?"
 msgstr "Afficher le panneau des options du bloc-notes ?"
 
-#: lib/Block/summary.php:40
+#: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "Afficher les notes de ces catégories"
 
@@ -430,12 +431,12 @@ msgstr "Tri selon le texte de la note"
 msgid "Sort by Notepad"
 msgstr "Tri par bloc-notes"
 
-#: memo.php:173
-#, fuzzy, php-format
+#: memo.php:174
+#, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "« %s » a été enregistré avec succès."
 
-#: data.php:193
+#: data.php:194
 #, php-format
 msgid "The %s file didn't contain any notes."
 msgstr "Le fichier %s ne contient aucune note."
@@ -449,7 +450,7 @@ msgstr "Le support des bloc-notes n'est actuellement pas disponible."
 msgid "The Notes backend is not currently available: %s"
 msgstr "Le support des bloc-notes n'est actuellement pas disponible : %s"
 
-#: memo.php:196
+#: memo.php:197
 msgid "The note was deleted."
 msgstr "La note a été supprimée."
 
@@ -473,26 +474,32 @@ msgstr "Le bloc-notes \"%s\" a 
 msgid "The notepad \"%s\" has been saved."
 msgstr "Le bloc-notes « %s » a été enregistré."
 
-#: data.php:196
+#: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "Une erreur est apparue lors de l'importation des données : %s"
 
-#: lib/api.php:266
-#, fuzzy
+#: lib/api.php:331
 msgid "There was an error importing the iCalendar data."
 msgstr "Une erreur s'est produite lors de l'importation des données iCalendar."
 
-#: lib/api.php:444
+#: lib/api.php:518
 msgid "There was an error importing the vNote data."
 msgstr "Une erreur s'est produite lors de l'importation des données vNote."
 
-#: memo.php:194
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr ""
+"Une erreur est apparue lors de la suppression de la note pour %s. Les "
+"détails ont été journalisés."
+
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Une erreur est apparue lors du retrait de la note : %s"
 
-#: memo.php:171
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Une erreur s'est produite lors de l'enregistrement de la note : %s"
@@ -506,21 +513,21 @@ msgstr "Il y a eu une erreur lors de l'ouverture de ce bloc-notes
 msgid "There were no memos to export."
 msgstr "Aucune note à exporter n'a été trouvée."
 
-#: data.php:104
+#: data.php:105
 msgid "This file format is not supported."
 msgstr "Ce format de fichier n'est pas pris en compte."
 
-#: memo.php:91 view.php:98
+#: memo.php:91 view.php:111
 msgid "This note cannot be decrypted:"
 msgstr "Cette note ne peut être chiffée : "
 
-#: memo.php:83 view.php:90
+#: memo.php:83 view.php:103
 msgid "This note has been encrypted, please provide the password below."
 msgstr ""
 "Cette note a été chiffrée, merci de fournir le mot de passe ci-dessous."
 
-#: memo.php:80 memo.php:88 view.php:87 view.php:95 lib/Driver/sql.php:448
-#: lib/Driver/kolab.php:752
+#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:408
+#: lib/Driver/sql.php:458 lib/Driver/kolab.php:766
 msgid "This note has been encrypted."
 msgstr "La note a été chiffrée."
 
@@ -543,13 +550,13 @@ msgstr "Impossible de charger la d
 msgid "Unable to save notepad \"%s\": %s"
 msgstr "Impossible de sauvegarder le bloc-notes \"%s\": %s"
 
-#: lib/Mnemo.php:245 lib/Mnemo.php:246 lib/Mnemo.php:260 lib/Mnemo.php:261
-#: lib/Block/summary.php:96 templates/list/memo_summaries.inc:17
+#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Block/summary.php:107 templates/list/memo_summaries.inc:17
 #: templates/view/memo.inc:27
 msgid "Unfiled"
 msgstr "Hors catégorie"
 
-#: lib/api.php:302 lib/api.php:359 lib/api.php:452
+#: lib/api.php:367 lib/api.php:433 lib/api.php:526
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Type de contenu non-supporté : %s"
@@ -562,7 +569,7 @@ msgstr "
 msgid "You are not allowed to change this notepad."
 msgstr "Vous n'êtes pas autorisé à modifier ce bloc-notes."
 
-#: data.php:42 data.php:128 memo.php:37
+#: data.php:42 data.php:129 memo.php:37
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "Vous n'êtes pas autorisé à créer plus de %d notes."
@@ -571,6 +578,10 @@ msgstr "Vous n'
 msgid "You are not allowed to delete this notepad."
 msgstr "Vous n'êtes pas autorisé à supprimer ce bloc-notes."
 
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "Vous n'êtes pas autorisé à supprimer des données utilisateur."
+
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
@@ -608,15 +619,15 @@ msgstr "_Chiffrer ?"
 msgid "_For: "
 msgstr "_Pour: "
 
-#: lib/Mnemo.php:466
+#: lib/Mnemo.php:488
 msgid "_Import/Export"
 msgstr "_Importer/Exporter"
 
-#: lib/Mnemo.php:453
+#: lib/Mnemo.php:475
 msgid "_List Notes"
 msgstr "Afficher _les notes"
 
-#: lib/Mnemo.php:458
+#: lib/Mnemo.php:480
 msgid "_New Note"
 msgstr "_Nouvelle note"
 
@@ -625,11 +636,11 @@ msgstr "_Nouvelle note"
 msgid "_Password"
 msgstr "_Mot de passe"
 
-#: lib/Mnemo.php:471
+#: lib/Mnemo.php:493
 msgid "_Print"
 msgstr "Im_primer"
 
-#: lib/Mnemo.php:462
+#: lib/Mnemo.php:484
 msgid "_Search"
 msgstr "_Recherche"
 
@@ -637,6 +648,15 @@ msgstr "_Recherche"
 msgid "_Title"
 msgstr "_Titre"
 
+#: view.php:74 view.php:83
+#, php-format
+msgid "by %s"
+msgstr "Tri par %s"
+
+#: view.php:76 view.php:85
+msgid "by me"
+msgstr "par moi"
+
 #: lib/Block/tree_menu.php:33
 #, php-format
 msgid "in %s"
diff --git a/po/nl_NL.po b/po/hr_HR.po
similarity index 55%
copy from po/nl_NL.po
copy to po/hr_HR.po
index c49efc6..0a2513f 100644
--- a/po/nl_NL.po
+++ b/po/hr_HR.po
@@ -1,56 +1,58 @@
-# Mnemo Dutch translation.
-# Copyright (C) 2002 Jan Kuipers.
-# Jan Kuipers <jrkuipers at lauwerscollege.nl>, 2002-2008.
+# Croatian translations for Mnemo.
+# Copyright (C) 2008 Horde Project
+# This file is distributed under the same license as the horde package.
+# Matej Vela <Matej.Vela at CARNet.hr>, 2008.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Mneno H3 (2.2.1-cvs)\n"
+"Project-Id-Version: horde 3\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-08-08 23:32+0200\n"
-"PO-Revision-Date: 2008-08-09 12:48+0200\n"
-"Last-Translator: Jan Kuipers <jrkuipers at lauwerscollege.nl>\n"
-"Language-Team: Dutch <i18n at lists.horde.org>\n"
+"POT-Creation-Date: 2009-09-16 13:45+0200\n"
+"PO-Revision-Date: 2008-02-26 16:13+0100\n"
+"Last-Translator: Matej Vela <Matej.Vela at CARNet.hr>\n"
+"Language-Team: i18n at lists.horde.org\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
 #: templates/memo/memo.inc:53
 #, php-format
 msgid "%s characters"
-msgstr "%s tekens"
+msgstr "%s znakova"
 
 #: data.php:200
 #, php-format
 msgid "%s file successfully imported"
-msgstr "%s bestand met succes geimporteerd"
+msgstr "%s datoteka uspješno uvezena"
 
-#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
-msgstr "%s's notitieboek"
+msgstr "%s - Bilježnica"
 
-#: memo.php:201
+#: memo.php:237
 msgid "Access denied deleting note."
-msgstr "Toegang geweigerd bij verwijderen van notitie."
+msgstr "Pristup odbijen pri brisanju bilješke."
 
-#: memo.php:150 memo.php:153
+#: memo.php:180 memo.php:183
 msgid "Access denied moving the note."
-msgstr "Toegang geweigerd bij verplaatsen van de notitie."
+msgstr "Pristup odbijen pri preimenovanju bilješke."
 
-#: memo.php:120
+#: memo.php:135
 #, php-format
 msgid "Access denied saving note to %s."
-msgstr "Toegang geweigerd bij opslaan van notitie in %s."
+msgstr "Pristup odbijen pri spremanju bilješke u %s."
 
-#: memo.php:118
+#: memo.php:133
 #, php-format
 msgid "Access denied saving note: %s"
-msgstr "Toegang geweigerd bij opslaan van notitie: %s"
+msgstr "Pristup odbijen pri spremanju bilješke: %s"
 
-#: config/prefs.php.dist:70
+#: config/prefs.php.dist:69
 msgid "Ascending"
-msgstr "Toenemend"
+msgstr "uzlazno"
 
 #: data.php:32 templates/data/import.inc:11
 msgid "CSV"
@@ -58,286 +60,289 @@ msgstr "CSV"
 
 #: lib/Forms/DeleteNotepad.php:45 lib/Forms/DeleteNotepad.php:51
 msgid "Cancel"
-msgstr "Afbreken"
+msgstr "Odustani"
 
 #: data.php:54 templates/view/memo.inc:26
 msgid "Category"
-msgstr "Categorie"
+msgstr "Kategorija"
 
 #: notepads/index.php:32 templates/notepad_list.php:29
 msgid "Change Permissions"
-msgstr "Rechten wijzigen"
+msgstr "Promijeni dozvole"
 
 #: config/prefs.php.dist:14
 msgid "Change your note sorting and display options."
-msgstr "Wijzig uw notitie sorteer- en weergaveopties."
+msgstr "Prilagodite opcije sortiranja i prikazivanja bilješki."
 
 #: config/prefs.php.dist:21
 msgid "Choose your default Notepad."
-msgstr "Kies standaard notitieboek."
+msgstr "Izaberite podrazumijevanu Bilježnicu."
 
 #: templates/list/header.inc:8
 msgid "Close Search"
-msgstr "Zoeken afsluiten"
+msgstr "Zatvori pretragu"
 
 #: lib/Forms/CreateNotepad.php:39
 msgid "Create"
-msgstr "Maken"
+msgstr "Kreiraj"
 
 #: lib/Forms/CreateNotepad.php:34
 msgid "Create Notepad"
-msgstr "Notitieboek maken"
+msgstr "Kreiraj Bilježnicu"
 
 #: templates/notepad_list.php:9
 msgid "Create a new Notepad"
-msgstr "Een nieuw notitieboek maken"
+msgstr "Kreiraj novu Bilježnicu"
 
 #: templates/view/memo.inc:32
 msgid "Created"
-msgstr "Gemaakt"
+msgstr "Kreirano"
 
 #: templates/view/memo.inc:54 templates/memo/memo.inc:23
 msgid "Decrypt"
-msgstr "Decoderen"
+msgstr "Dešifriraj"
 
 #: config/prefs.php.dist:20
 msgid "Default Notepad"
-msgstr "Standaard notitieboek"
+msgstr "Podrazumijevana Bilježnica"
 
-#: config/prefs.php.dist:61
+#: config/prefs.php.dist:60
 msgid "Default sorting criteria:"
-msgstr "Standaard sorteercriteria:"
+msgstr "Podrazumijevani kriteriji sortiranja:"
 
-#: config/prefs.php.dist:72
+#: config/prefs.php.dist:71
 msgid "Default sorting direction:"
-msgstr "Standaard sorteervolgorde:"
+msgstr "Podrazumijevani smjer sortiranja:"
 
-#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
+#: lib/Forms/DeleteNotepad.php:45 notepads/index.php:33
 #: templates/notepad_list.php:31 templates/view/memo.inc:16
 msgid "Delete"
-msgstr "Verwijderen"
+msgstr "Obriši"
 
 #: lib/Forms/DeleteNotepad.php:40
 #, php-format
 msgid "Delete %s"
-msgstr "Verwijder %s"
+msgstr "Obriši %s"
 
 #: config/prefs.php.dist:27
 msgid "Delete Confirmation"
-msgstr "Verwijderbevestiging"
+msgstr "Obriši potvrdu"
 
 #: config/prefs.php.dist:28
 msgid "Delete button behaviour"
-msgstr "Verwijderknopgedrag"
+msgstr "Ponašanje gumba Obriši"
 
 #: templates/memo/memo.inc:11
 msgid "Delete this note"
-msgstr "Verwijder deze notitie"
+msgstr "Obriši ovu bilješku"
 
-#: config/prefs.php.dist:71
+#: config/prefs.php.dist:70
 msgid "Descending"
-msgstr "Afnemend"
+msgstr "silazno"
 
 #: lib/Forms/CreateNotepad.php:37 lib/Forms/EditNotepad.php:44
 msgid "Description"
-msgstr "Beschrijving"
+msgstr "Opis"
 
 #: lib/Driver/kolab.php:556
 #, php-format
 msgid "Did not find note %s"
-msgstr "Notitie %s niet gevonden"
+msgstr "Nije pronađena bilješka %s"
 
 #: config/prefs.php.dist:13
 msgid "Display Options"
-msgstr "Weergaveopties"
+msgstr "Opcije prikaza"
 
-#: config/prefs.php.dist:117
+#: config/prefs.php.dist:116
 msgid "Do you want to confirm deleting entries?"
-msgstr "Wilt u het verwijderen van invoer bevestigen?"
+msgstr "Želite li potvrđivati brisanje zapisa?"
 
 #: notepads/index.php:31 templates/notepad_list.php:27
 #: templates/view/memo.inc:13
 msgid "Edit"
-msgstr "Bewerken"
+msgstr "Uredi"
 
 #: templates/list/memo_summaries.inc:5
 #, php-format
 msgid "Edit \"%s\""
-msgstr "\"%s\" bewerken"
+msgstr "Uredi \"%s\""
 
 #: lib/Forms/EditNotepad.php:40
 #, php-format
 msgid "Edit %s"
-msgstr "%s bewerken"
+msgstr "Uredi %s"
 
 #: lib/Block/summary.php:79 lib/Block/summary.php:80
 #: templates/list/memo_headers.inc:30
 msgid "Edit Note"
-msgstr "Notitie bewerken"
+msgstr "Uredi bilješku"
 
 #: templates/list/memo_headers.inc:45
 msgid "Edit categories and colors"
-msgstr "Categorieën en kleuren bewerken"
+msgstr "Uredi kategorije i boje"
 
-#: memo.php:104
+#: memo.php:118 memo.php:149
 #, php-format
 msgid "Edit: %s"
-msgstr "Bewerken: %s"
+msgstr "Uredi: %s"
 
 #: lib/Block/summary.php:104 templates/list/memo_summaries.inc:15
 msgid "Empty Note"
-msgstr "Lege notitie"
+msgstr "Prazna bilješka"
 
 #: lib/Driver.php:118
 msgid ""
 "Encryption support has not been configured, please contact your "
 "administrator."
 msgstr ""
-"Codering wordt in de huidige configuratie niet ondersteund. Neem contact op "
-"met de beheerder, a.u.b."
+"Podrška za šifriranje nije podešena, molimo kontaktirajte administratora."
 
 #: templates/data/export.inc:16
 msgid "Export"
-msgstr "Exporteren"
+msgstr "Izvoz"
 
 #: templates/data/export.inc:2
 msgid "Export Notes"
-msgstr "Notities exporteren"
+msgstr "Izvoz bilješki"
 
 #: config/prefs.php.dist:12 config/prefs.php.dist:19 config/prefs.php.dist:26
 msgid "General Options"
-msgstr "Algemene opties"
+msgstr "Općenite opcije"
 
 #: templates/data/import.inc:1
 #, php-format
 msgid "Import Notes, Step %d"
-msgstr "Notities importeren, stap %d"
+msgstr "Uvoz bilješki, korak %d"
 
 #: data.php:206
 msgid "Import/Export Notes"
-msgstr "Notities importeren/exporteren"
+msgstr "Uvoz/izvoz bilješki"
 
 #: templates/search/search.inc:17
 msgid "In: "
-msgstr "In: "
+msgstr "U: "
 
 #: templates/view/memo.inc:39
 msgid "Last Modified"
-msgstr "Laatst gewijzigd"
+msgstr "Zadnja promjena"
 
 #: notepads/index.php:37 templates/notepad_list.php:2
 msgid "Manage Notepads"
-msgstr "Notitieboeken beheren"
+msgstr "Upravljaj bilježnicama"
 
 #: lib/api.php:82
 msgid "Maximum Number of Notes"
-msgstr "Maximum aantal notities"
+msgstr "Maksimalni broj bilješki"
 
 #: data.php:53
 msgid "Memo Text"
-msgstr "Notitietekst"
+msgstr "Tekst dopisa"
 
 #: lib/Block/tree_menu.php:3
 msgid "Menu List"
-msgstr "Menulijst"
+msgstr "Izbornik"
 
 #: templates/list/header.inc:9
 msgid "More Options..."
-msgstr "Meer opties..."
+msgstr "Još opcija..."
+
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr "Nađeno više iCalendar komponenti; podržan je samo jedan vTodo."
 
 #: templates/panel.inc:50
 msgid "My Notepads:"
-msgstr "Mijn notitieboeken:"
+msgstr "Moje bilježnice:"
 
 #: list.php:31
 msgid "My Notes"
-msgstr "Mijn notities"
+msgstr "Moje bilješke"
 
 #: lib/Forms/CreateNotepad.php:36 lib/Forms/EditNotepad.php:43
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
-#: memo.php:57 lib/Block/tree_menu.php:23
+#: memo.php:95 memo.php:140 lib/Block/tree_menu.php:23
 msgid "New Note"
-msgstr "Nieuwe notitie"
+msgstr "Nova bilješka"
 
 #: templates/data/import.inc:34
 msgid "Next"
-msgstr "Volgende"
+msgstr "Dalje"
 
-#: lib/api.php:332
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
-msgstr "Geen iCalendardata gevonden."
+msgstr "Nisu pronađeni podaci u iCalendar formatu."
 
 #: templates/list/memo_footers.inc:4
 msgid "No notes match"
-msgstr "Geen notities komen overeen"
+msgstr "Nije nađena nijedna bilješka"
 
 #: templates/list/empty.inc:1
 msgid "No notes match the current criteria."
-msgstr "Geen notities die overeen komen met de huidige criteria."
+msgstr "Nijedna bilješka ne zadovoljava trenutne uvjete."
 
 #: lib/Block/summary.php:112
 msgid "No notes to display"
-msgstr "Geen notities weer te geven"
+msgstr "Nema bilješki za prikaz"
 
 #: templates/list/memo_headers.inc:37
 msgid "No_te"
-msgstr "No_titie"
+msgstr "_Bilješka"
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:198
 msgid "Not found"
-msgstr "Niet gevonden"
+msgstr "Nije nađeno"
 
-#: config/prefs.php.dist:59
+#: config/prefs.php.dist:58
 msgid "Note Category"
-msgstr "Notitiecategorie"
+msgstr "Kategorija bilješke"
 
 #: view.php:121
 msgid "Note Details"
-msgstr "Notitiedetails"
+msgstr "Detalji bilješke"
 
-#: config/prefs.php.dist:58
+#: config/prefs.php.dist:57
 msgid "Note Text"
-msgstr "Notitietekst"
+msgstr "Tekst bilješke"
 
 #: templates/memo/memo.inc:53
 msgid "Note _Text"
-msgstr "Notitiet_ekst"
+msgstr "_Tekst bilješke"
 
-#: memo.php:67 view.php:56 note/pdf.php:57
+#: memo.php:105 memo.php:145 view.php:56 note/pdf.php:57
 msgid "Note not found."
-msgstr "Notitie niet gevonden."
+msgstr "Bilješka nije nađena"
 
-#: templates/memo/memo.inc:59
-msgid "Note_pad"
-msgstr "Notitie_boek"
+#: templates/memo/memo.inc:63
+msgid "Note_pad:"
+msgstr "B_ilježnica"
 
 #: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
-#: config/prefs.php.dist:60
+#: config/prefs.php.dist:59
 msgid "Notepad"
-msgstr "Notitieboek"
+msgstr "Bilježnica"
 
 #: templates/notepad_list.php:14
 msgid "Notepad List"
-msgstr "Notitieboek lijst"
+msgstr "Popis bilježnica"
 
 #: templates/panel.inc:32 templates/panel.inc:33
 msgid "Notepads"
-msgstr "Notitieboeken"
+msgstr "Bilježnice"
 
 #: lib/Block/summary.php:3
 msgid "Notes Summary"
-msgstr "Notitiesamenvatting"
+msgstr "Pregled bilješki"
 
-#: lib/api.php:207 lib/api.php:247 lib/api.php:280 lib/api.php:310
-#: lib/api.php:397 lib/api.php:465 lib/api.php:494
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
-msgstr "Toegang geweigerd"
+msgstr "Pristup odbijen"
 
 #: lib/Forms/DeleteNotepad.php:56
 msgid "Permission denied"
-msgstr "Toegang geweigerd"
+msgstr "Pristup odbijen"
 
 #: lib/Forms/DeleteNotepad.php:43
 #, php-format
@@ -345,317 +350,323 @@ msgid ""
 "Really delete the notepad \"%s\"? This cannot be undone and all data on this "
 "notepad will be permanently removed."
 msgstr ""
-"Notitieboek \"%s\" echt verwijderen? Dit kan niet ongedaan worden gemaakt en "
-"alle data in dit notitieboek zal definitief worden verwijderd."
+"Stvarno obrisati bilježnicu \"%s\"? Ovo se ne može opozvati i svi podaci u "
+"ovoj bilježnici će biti nepovratno obrisani."
 
 #: templates/view/memo.inc:16
 msgid "Really delete this note?"
-msgstr "Echt deze notitie verwijderen?"
+msgstr "Stvarno obrisati ovu bilješku?"
 
 #: lib/Forms/EditNotepad.php:46 templates/panel.inc:68
-#: templates/memo/memo.inc:57
+#: templates/memo/memo.inc:58
 msgid "Save"
-msgstr "Opslaan"
+msgstr "Spremi"
 
 #: templates/view/memo.inc:11
 msgid "Save as PDF"
-msgstr "Opslaan als PDF"
+msgstr "Spremi kao PDF"
 
 #: search.php:17 lib/Block/tree_menu.php:44 templates/list/header.inc:4
 #: templates/search/search.inc:4 templates/search/search.inc:27
 msgid "Search"
-msgstr "Zoeken"
+msgstr "Pretraga"
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
-msgstr "Zoekresultaten"
+msgstr "Rezultati pretrage"
 
 #: templates/panel.inc:38
 msgid "Search for Notepads:"
-msgstr "Zoek naar notitieboeken:"
+msgstr "Traži bilježnice:"
 
 #: templates/data/export.inc:9
 msgid "Select the export format:"
-msgstr "Selecteer het exportformaat:"
+msgstr "Odaberite izvozni format:"
 
 #: templates/data/import.inc:31
 msgid "Select the file to import:"
-msgstr "Selecteer het importbestand:"
+msgstr "Odaberite datoteku za uvoz:"
 
 #: templates/data/import.inc:9
 msgid "Select the format of the source file:"
-msgstr "Selecteer het formaat van het bronbestand:"
+msgstr "Odaberite format izvorne datoteke:"
 
 #: templates/panel.inc:59
 msgid "Shared Notepads:"
-msgstr "Gedeelde notitieboeken:"
+msgstr "Zajedničke bilježnice:"
 
 #: config/prefs.php.dist:39
 msgid "Should the Notepad be shown in its own column in the List view?"
-msgstr ""
-"Dient het notitieboek in een eigen kolom in de lijstweergave weergegeven te "
-"worden?"
+msgstr "Treba li prikazati bilježnicu u posebnom stupcu pregleda?"
 
 #: lib/Block/summary.php:35
 msgid "Show action buttons?"
-msgstr "Bewerkingsknoppen weergeven?"
+msgstr "Prikazati akcijske gumbe?"
 
 #: lib/Block/summary.php:39
 msgid "Show notepad name?"
-msgstr "Notitieboeknamen weergeven?"
-
-#: config/prefs.php.dist:49
-msgid "Show notepad options panel?"
-msgstr "Notitieboekoptiespaneel weergeven?"
+msgstr "Prikazati ime bilježnice?"
 
 #: lib/Block/summary.php:43
 msgid "Show notes from these categories"
-msgstr "Notities van deze categorieen weergeven"
+msgstr "Prikaži bilješke iz sljedećih kategorija"
 
 #: templates/list/memo_headers.inc:41
 msgid "Sort by Category"
-msgstr "Sorteren op categorie"
+msgstr "Sortiraj po kategoriji"
 
 #: templates/list/memo_headers.inc:37
 msgid "Sort by Note Text"
-msgstr "Sorteren op notitietekst"
+msgstr "Sortiraj po tekstu bilješke"
 
 #: templates/list/memo_headers.inc:33
 msgid "Sort by Notepad"
-msgstr "Sorteren op notitieboek"
+msgstr "Sortiraj po bilježnici"
 
-#: memo.php:175
+#: memo.php:211
 #, php-format
 msgid "Successfully saved \"%s\"."
-msgstr "\"%s\" met succes opgeslagen."
+msgstr "\"%s\" uspješno spremljeno."
 
 #: data.php:194
 #, php-format
 msgid "The %s file didn't contain any notes."
-msgstr "Het %s bestand bevatte geen notities."
+msgstr "U %s datoteci nije bilo bilješki."
 
 #: lib/Driver.php:53
 msgid "The Notes backend is not currently available."
-msgstr "Het notitie backend is momenteel niet beschikbaar."
+msgstr "Pohrana bilješki trenutno nije dostupna."
 
 #: lib/Driver.php:227
 #, php-format
 msgid "The Notes backend is not currently available: %s"
-msgstr "Het notitie backend is momenteel niet beschikbaar: %s"
+msgstr "Pohrana bilješki trenutno nije dostupna: %s"
 
-#: memo.php:198
+#: memo.php:234
 msgid "The note was deleted."
-msgstr "De notitie is verwijderd."
+msgstr "Bilješka je obrisana."
 
 #: notepads/create.php:31
 #, php-format
 msgid "The notepad \"%s\" has been created."
-msgstr "Het notitieboek \"%s\" is aangemaakt."
+msgstr "Bilježnica \"%s\" je kreirana."
 
 #: notepads/delete.php:48
 #, php-format
 msgid "The notepad \"%s\" has been deleted."
-msgstr "Het notitieboek \"%s\" is verwijderd."
+msgstr "Bilježnica \"%s\" je obrisana."
 
 #: notepads/edit.php:42
 #, php-format
 msgid "The notepad \"%s\" has been renamed to \"%s\"."
-msgstr "Het notitieboek \"%s\" is hernoemd naar \"%s\"."
+msgstr "Bilježnica \"%s\" je preimenovana u \"%s\"."
 
 #: notepads/edit.php:44
 #, php-format
 msgid "The notepad \"%s\" has been saved."
-msgstr "Het notitieboek \"%s\" is opgeslagen."
+msgstr "Bilježnica \"%s\" je spremljena."
+
+#: memo.php:137
+msgid "The passwords don't match."
+msgstr "Nove lozinke se ne podudaraju."
 
 #: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
-msgstr "Een fout bij het importeren van de data: %s"
+msgstr "Došlo je do greške prilikom uvoza podataka: %s"
 
-#: lib/api.php:326
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
-msgstr "Een fout bij het importeren van de iCalendardata."
-
-#: lib/api.php:513
-msgid "There was an error importing the vNote data."
-msgstr "Een fout bij het importeren van de vNote data."
+msgstr "Došlo je do greške prilikom uvoza iCalendar podataka."
 
-#: lib/api.php:163
+#: lib/api.php:168
 #, php-format
 msgid "There was an error removing notes for %s. Details have been logged."
 msgstr ""
-"Een fout bij het verwijderen van notities voor %s. Details zijn gelogd."
+"Došlo je do greške prilikom brisanja bilješki za %s. Detalji su zabilježeni "
+"u log."
 
-#: memo.php:196
+#: memo.php:232
 #, php-format
 msgid "There was an error removing the note: %s"
-msgstr "Een probleem bij het verwijderen van de notitie: %s"
+msgstr "Došlo je do greške prilikom brisanja bilješke: %s"
 
-#: memo.php:173
+#: memo.php:209
 #, php-format
 msgid "There was an error saving the note: %s"
-msgstr "Een probleem bij het opslaan van de notitie: %s"
+msgstr "Došlo je do greške prilikom spremanja bilješke: %s"
 
 #: view.php:45 note/pdf.php:46
 #, php-format
 msgid "There was an error viewing this notepad: %s"
-msgstr "Een probleem bij het bekijken van dit notitieboek: %s"
+msgstr "Došlo je do greške prilikom pregleda bilježnice: %s"
 
 #: data.php:78
 msgid "There were no memos to export."
-msgstr "Er waren geen notities om te exporteren."
+msgstr "Nema dopisa za izvoz."
 
 #: data.php:105
 msgid "This file format is not supported."
-msgstr "Dit bestandsformaat wordt niet ondersteund."
+msgstr "Ovaj datotečni format nije podržan."
 
-#: memo.php:91 view.php:111
+#: memo.php:43 view.php:111
 msgid "This note cannot be decrypted:"
-msgstr "Deze notitie kan niet worden gedecodeerd:"
+msgstr "Ova bilješka se ne može dešifrirati:"
 
-#: memo.php:83 view.php:103
+#: memo.php:34 view.php:103
 msgid "This note has been encrypted, please provide the password below."
-msgstr "Deze notitie is gecodeerd, geef hieronder het wachtwoord, a.u.b."
+msgstr "Ova bilješka je šifrirana, molimo unesite lozinku."
 
-#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:403
-#: lib/Driver/kolab.php:766 lib/Driver/sql.php:448
+#: memo.php:30 memo.php:39 view.php:100 view.php:108 lib/api.php:408
+#: lib/Driver/sql.php:461 lib/Driver/kolab.php:766
 msgid "This note has been encrypted."
-msgstr "Deze notitie is gecodeerd."
+msgstr "Ova bilješka je šifrirana."
 
 #: notepads/delete.php:24
 msgid "This notepad cannot be deleted"
-msgstr "Dit notitieboek kan niet worden verwijderd"
+msgstr "Ova bilješka se ne može obrisati"
 
 #: lib/Forms/DeleteNotepad.php:63
 #, php-format
 msgid "Unable to delete \"%s\": %s"
-msgstr "Niet in staat om \"%s\": %s te verwijderen"
+msgstr "Nije uspjelo brisanje \"%s\": %s"
 
 #: lib/Driver.php:230
 #, php-format
 msgid "Unable to load the definition of %s."
-msgstr "Niet in staat om de definitie van %s te laden."
+msgstr "Nije uspjelo učitavanje definicije %s."
 
 #: lib/Forms/EditNotepad.php:55
 #, php-format
 msgid "Unable to save notepad \"%s\": %s"
-msgstr "Niet in staat notitieboek \"%s\" op te slaan: %s"
+msgstr "Nije uspjelo spremanje bilježnice \"%s\": %s"
 
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
 #: lib/Block/summary.php:107 templates/list/memo_summaries.inc:17
 #: templates/view/memo.inc:27
 msgid "Unfiled"
-msgstr "Onbenoemd"
+msgstr "Ostalo"
 
-#: lib/api.php:362 lib/api.php:428 lib/api.php:521
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
-msgstr "Niet ondersteund Content-Type: %s"
+msgstr "Content-Type nije podržan: %s"
 
 #: templates/data/import.inc:16
 msgid "Which Notepad should the notes be added to?"
-msgstr "Aan welk notitieboek dienen de notities toegevoegd te worden?"
+msgstr "Kojoj bilježnici treba dodavati bilješke?"
 
 #: notepads/edit.php:28
 msgid "You are not allowed to change this notepad."
-msgstr "Het is u niet toegestaan dit notitieboek te wijzigen."
+msgstr "Nemate ovlasti za mijenjanje ove bilježnice."
 
-#: memo.php:37 data.php:42 data.php:129
+#: data.php:42 data.php:129 memo.php:75
 #, php-format
 msgid "You are not allowed to create more than %d notes."
-msgstr "Het is u niet toegestaan om meer dan %d notities te maken."
+msgstr "Nemate ovlasti za kreiranje više od %d bilješki."
 
 #: notepads/delete.php:35
 msgid "You are not allowed to delete this notepad."
-msgstr "Het is u niet toegestaan dit notitieboek te verwijderen."
+msgstr "Nemate ovlasti za brisanje ove bilježnice."
 
 #: lib/api.php:100
 msgid "You are not allowed to remove user data."
-msgstr "Het is u niet toegestaan gebruikersdata te verwijderen."
+msgstr "Nemate ovlasti za brisanje korisničkih podataka."
 
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
-msgstr "U heeft geen recht om het notitieboek %s te bekijken."
+msgstr "Nemate dozvole za pregled bilježnice %s."
 
 #: templates/prefs/notepadselect.inc:10
 msgid "Your default notepad:"
-msgstr "Uw standaard notitieboek:"
+msgstr "Vaša podrazumijevana bilježnica:"
 
 #: templates/panel.inc:45
 msgid "[Manage Notepads]"
-msgstr "[Notitieboeken beheren]"
+msgstr "[Upravljaj bilježnicama]"
 
 #: templates/search/search.inc:21
 msgid "_Body"
-msgstr "_Body"
+msgstr "_Tijelu"
 
-#: templates/list/memo_headers.inc:41 templates/memo/memo.inc:70
+#: templates/list/memo_headers.inc:41
 msgid "_Category"
-msgstr "_Categorie"
+msgstr "_Kategorija"
+
+#: templates/memo/memo.inc:78
+msgid "_Category:"
+msgstr "_Kategorija:"
 
 #: templates/view/memo.inc:16
 msgid "_Delete"
-msgstr "Ver_wijderen"
+msgstr "_Obriši"
 
 #: templates/view/memo.inc:13
 msgid "_Edit"
-msgstr "_Bewerken"
+msgstr "_Uredi"
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:84
 msgid "_Encrypt?"
-msgstr "_Coderen?"
+msgstr "Å _ifriraj?"
 
 #: templates/search/search.inc:9
 msgid "_For: "
-msgstr "_Voor: "
+msgstr "_Sadrži: "
 
-#: lib/Mnemo.php:488
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
-msgstr "_Import/Export"
+msgstr "_Uvoz/izvoz"
 
-#: lib/Mnemo.php:475
+#: lib/Mnemo.php:481
 msgid "_List Notes"
-msgstr "Notities weer_geven"
+msgstr "_Popis bilješki"
 
-#: lib/Mnemo.php:480
+#: lib/Mnemo.php:486
 msgid "_New Note"
-msgstr "_Nieuwe notitie"
+msgstr "_Nova bilješka"
 
 #: templates/view/memo.inc:52 templates/memo/memo.inc:21
-#: templates/memo/memo.inc:79
 msgid "_Password"
-msgstr "_Wachtwoord"
+msgstr "_Lozinka"
 
-#: lib/Mnemo.php:493
+#: templates/memo/memo.inc:89
+msgid "_Password:"
+msgstr "_Lozinka:"
+
+#: lib/Mnemo.php:499
 msgid "_Print"
-msgstr "A_fdrukken"
+msgstr "_Ispiši"
+
+#: templates/memo/memo.inc:93
+msgid "_Repeat:"
+msgstr "_Ponovi:"
 
-#: lib/Mnemo.php:484
+#: lib/Mnemo.php:490
 msgid "_Search"
-msgstr "_Zoeken"
+msgstr "_Traži"
 
 #: templates/search/search.inc:20
 msgid "_Title"
-msgstr "_Titel"
+msgstr "_Naslovu"
 
 #: view.php:74 view.php:83
 #, php-format
 msgid "by %s"
-msgstr "door %s"
+msgstr "%s"
 
 #: view.php:76 view.php:85
 msgid "by me"
-msgstr "door mij"
+msgstr "ja"
 
 #: lib/Block/tree_menu.php:33
 #, php-format
 msgid "in %s"
-msgstr "in %s"
+msgstr "u %s"
 
 #: data.php:90 templates/data/export.inc:4
 msgid "notes.csv"
-msgstr "notes.csv"
+msgstr "biljeske.csv"
 
 #: data.php:33 templates/data/import.inc:12
 msgid "vNote"
diff --git a/po/hu_HU.po b/po/hu_HU.po
index d55da34..e832f21 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -1,5 +1,5 @@
 # Mnemo Hungarian translation file.
-# Copyright (C) 2002-2008 Laszlo L. Tornoci
+# Copyright 2002-2008 Laszlo L. Tornoci
 # This file is distributed under the same license as the Mnemo Horde package.
 # Latest versions: ftp://xenia.sote.hu/pub/linux/horde/
 #
diff --git a/po/it_IT.po b/po/it_IT.po
index 3bb473b..6f4c429 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -1,8 +1,8 @@
 # Italian translations for op package.
-# Copyright (C) 2003 Horde Project
-# Copyright (c) 2003 Sergio G. Caredda.
+# Copyright 2003-2009 The Horde Project
+# Copyright 2003 Sergio G. Caredda.
 # Sergio G. Caredda <scaredda at tiscali.it>, 2003.
-# Copyright (c) 2007 nethesis srl.
+# Copyright 2007 nethesis srl.
 # Cristian Manoni, Alessio Fattorini, Davide marini 2007
 #
 msgid ""
diff --git a/po/ja_JP.po b/po/ja_JP.po
index ca17da5..ea5b804 100644
--- a/po/ja_JP.po
+++ b/po/ja_JP.po
@@ -1,41 +1,40 @@
 # Japanese translation for Mnemo.
-# Copyright (C) 2004 Horde Project
+# Copyright 2004-2009 Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # Hiromi Kimura <hiromi at tac.tsukuba.ac.jp>
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Mnemo 2.2-RC1\n"
+"Project-Id-Version: Mnemo 2.2.1\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2007-08-03 12:47+0100\n"
-"PO-Revision-Date: 2007-11-30 20:37+0900\n"
+"POT-Creation-Date: 2008-09-06 11:11+0200\n"
+"PO-Revision-Date: 2009-02-10 20:46+0900\n"
 "Last-Translator: Hiromi Kimura <hiromi at tac.tsukuba.ac.jp>\n"
 "Language-Team: i18n at lists.horde.org\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=SHIFT_JIS\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
 
 #: templates/memo/memo.inc:53
 #, php-format
 msgid "%s characters"
 msgstr "%s •¶Žš"
 
-#: data.php:201
+#: data.php:200
 #, php-format
 msgid "%s file successfully imported"
 msgstr "ƒtƒ@ƒCƒ‹ %s ‚̓Cƒ“ƒ|[ƒg‚³‚ê‚Ü‚µ‚½"
 
-#: notepads.php:102 lib/Mnemo.php:429
+#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "%s ‚̃ƒ‚’ "
 
-#: memo.php:201
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "ƒƒ‚‚̍폜‚̓AƒNƒZƒX‹‘”Û‚³‚ê‚Ü‚µ‚½B"
 
-#: memo.php:152 memo.php:155
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "ƒƒ‚‚̈ړ®‚̓AƒNƒZƒX‹‘”Û‚³‚ê‚Ü‚µ‚½B"
 
@@ -49,7 +48,7 @@ msgstr "
 msgid "Access denied saving note: %s"
 msgstr "ƒƒ‚‚Ì•Û‘¶‚̓AƒNƒZƒX‹‘”Û‚³‚ê‚Ü‚µ‚½F%s"
 
-#: config/prefs.php.dist:71
+#: config/prefs.php.dist:70
 msgid "Ascending"
 msgstr "¸‡"
 
@@ -57,19 +56,23 @@ msgstr "
 msgid "CSV"
 msgstr "CSV"
 
+#: lib/Forms/DeleteNotepad.php:45 lib/Forms/DeleteNotepad.php:51
+msgid "Cancel"
+msgstr "Žæ‚èÁ‚µ"
+
 #: data.php:54 templates/view/memo.inc:26
 msgid "Category"
 msgstr "•ª—Þ"
 
-#: templates/notepads/notepads.inc:22
-msgid "Change"
-msgstr "•ÏX"
+#: templates/notepad_list.php:29 notepads/index.php:32
+msgid "Change Permissions"
+msgstr "ƒAƒNƒZƒXŒ •ÏX"
 
-#: config/prefs.php.dist:15
+#: config/prefs.php.dist:14
 msgid "Change your note sorting and display options."
 msgstr "ƒƒ‚‚Ì•À‚я‡‚Æ•\Ž¦ƒIƒvƒVƒ‡ƒ“‚ð•ÏX‚·‚éB"
 
-#: config/prefs.php.dist:22
+#: config/prefs.php.dist:21
 msgid "Choose your default Notepad."
 msgstr "ƒfƒtƒHƒ‹ƒg‚̃ƒ‚’ ‚ð‘I‘ð‚µ‚Ä‰º‚³‚¢B"
 
@@ -77,10 +80,18 @@ msgstr "
 msgid "Close Search"
 msgstr "ŒŸõ‚ð•Â‚¶‚é"
 
-#: templates/notepads/notepads.inc:15 templates/notepads/notepads.inc:64
+#: lib/Forms/CreateNotepad.php:39
 msgid "Create"
 msgstr "ì¬"
 
+#: lib/Forms/CreateNotepad.php:34
+msgid "Create Notepad"
+msgstr "ƒƒ‚’ ‚̍쐬"
+
+#: templates/notepad_list.php:9
+msgid "Create a new Notepad"
+msgstr "V‚µ‚¢ƒƒ‚’ ‚̍쐬"
+
 #: templates/view/memo.inc:32
 msgid "Created"
 msgstr "ì¬“úŽž"
@@ -89,27 +100,33 @@ msgstr "
 msgid "Decrypt"
 msgstr "•œ†"
 
-#: config/prefs.php.dist:21
+#: config/prefs.php.dist:20
 msgid "Default Notepad"
 msgstr "ƒfƒtƒHƒ‹ƒg‚̃ƒ‚’ "
 
-#: config/prefs.php.dist:62
+#: config/prefs.php.dist:61
 msgid "Default sorting criteria:"
 msgstr "ƒfƒtƒHƒ‹ƒg‚Ì•À‚ъF"
 
-#: config/prefs.php.dist:73
+#: config/prefs.php.dist:72
 msgid "Default sorting direction:"
 msgstr "ƒfƒtƒHƒ‹ƒg‚Ì•À‚Ñ•ûŒüF"
 
-#: templates/notepads/notepads.inc:65 templates/view/memo.inc:16
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
+#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
 msgid "Delete"
 msgstr "íœ"
 
-#: config/prefs.php.dist:28
+#: lib/Forms/DeleteNotepad.php:40
+#, php-format
+msgid "Delete %s"
+msgstr "%s ‚ðíœ"
+
+#: config/prefs.php.dist:27
 msgid "Delete Confirmation"
 msgstr "íœ‚ÌŠm”F"
 
-#: config/prefs.php.dist:29
+#: config/prefs.php.dist:28
 msgid "Delete button behaviour"
 msgstr "íœƒ{ƒ^ƒ“‚Ì“®ì"
 
@@ -117,28 +134,29 @@ msgstr "
 msgid "Delete this note"
 msgstr "ƒƒ‚‚ðíœ"
 
-#: config/prefs.php.dist:72
+#: config/prefs.php.dist:71
 msgid "Descending"
 msgstr "~‡"
 
-#: templates/notepads/notepads.inc:60
-msgid "Description:"
-msgstr "à–¾F"
+#: lib/Forms/EditNotepad.php:44 lib/Forms/CreateNotepad.php:37
+msgid "Description"
+msgstr "à–¾"
 
 #: lib/Driver/kolab.php:556
 #, php-format
 msgid "Did not find note %s"
 msgstr "ƒƒ‚ %s ‚ª‚ ‚è‚Ü‚¹‚ñ"
 
-#: config/prefs.php.dist:14
+#: config/prefs.php.dist:13
 msgid "Display Options"
 msgstr "•\Ž¦ƒIƒvƒVƒ‡ƒ“"
 
-#: config/prefs.php.dist:118
+#: config/prefs.php.dist:117
 msgid "Do you want to confirm deleting entries?"
 msgstr "íœ‚·‚éÛ‚ÉŠm”F‚µ‚Ü‚·‚©H"
 
-#: templates/view/memo.inc:13
+#: templates/notepad_list.php:27 templates/view/memo.inc:13
+#: notepads/index.php:31
 msgid "Edit"
 msgstr "•ÒW"
 
@@ -147,7 +165,13 @@ msgstr "
 msgid "Edit \"%s\""
 msgstr "\"%s\" ‚ð•ÒW"
 
-#: templates/list/memo_headers.inc:30 lib/Block/summary.php:74
+#: lib/Forms/EditNotepad.php:40
+#, php-format
+msgid "Edit %s"
+msgstr "%s ‚ð•ÒW"
+
+#: templates/list/memo_headers.inc:30 lib/Block/summary.php:79
+#: lib/Block/summary.php:80
 msgid "Edit Note"
 msgstr "ƒƒ‚‚̕ҏW"
 
@@ -160,7 +184,7 @@ msgstr "
 msgid "Edit: %s"
 msgstr "•ÒWF%s"
 
-#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:93
+#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:104
 msgid "Empty Note"
 msgstr "‹ó‚̃ƒ‚"
 
@@ -178,7 +202,7 @@ msgstr "
 msgid "Export Notes"
 msgstr "ƒƒ‚‚̃GƒNƒXƒ|[ƒg"
 
-#: config/prefs.php.dist:13 config/prefs.php.dist:20 config/prefs.php.dist:27
+#: config/prefs.php.dist:12 config/prefs.php.dist:19 config/prefs.php.dist:26
 msgid "General Options"
 msgstr "ˆê”ʃIƒvƒVƒ‡ƒ“"
 
@@ -187,7 +211,7 @@ msgstr "
 msgid "Import Notes, Step %d"
 msgstr "ƒƒ‚‚̃Cƒ“ƒ|[ƒgAƒXƒeƒbƒv %d"
 
-#: data.php:207
+#: data.php:206
 msgid "Import/Export Notes"
 msgstr "ƒƒ‚‚̃Cƒ“ƒ|[ƒg^ƒGƒNƒXƒ|[ƒg"
 
@@ -199,7 +223,11 @@ msgstr "In: "
 msgid "Last Modified"
 msgstr "ÅI•ÏX“ú"
 
-#: lib/api.php:77
+#: templates/notepad_list.php:2 notepads/index.php:37
+msgid "Manage Notepads"
+msgstr "ƒƒ‚’ ‚ÌŠÇ—"
+
+#: lib/api.php:82
 msgid "Maximum Number of Notes"
 msgstr "ƒƒ‚‚̍ő吔"
 
@@ -215,7 +243,7 @@ msgstr "
 msgid "More Options..."
 msgstr "‘¼‚̃IƒvƒVƒ‡ƒ“"
 
-#: templates/panel.inc:40
+#: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr "Ž„‚̃ƒ‚’ F"
 
@@ -223,11 +251,11 @@ msgstr "
 msgid "My Notes"
 msgstr "Ž„‚̃ƒ‚’ "
 
-#: templates/notepads/notepads.inc:53
-msgid "Name:"
-msgstr "–¼‘OF"
+#: lib/Forms/EditNotepad.php:43 lib/Forms/CreateNotepad.php:36
+msgid "Name"
+msgstr "–¼‘O"
 
-#: memo.php:57 lib/Block/tree_menu.php:24
+#: memo.php:57 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "V‹Kƒƒ‚"
 
@@ -235,7 +263,7 @@ msgstr "
 msgid "Next"
 msgstr "ŽŸ"
 
-#: lib/api.php:258
+#: lib/api.php:337
 msgid "No iCalendar data was found."
 msgstr "iCalendar ‚̃f[ƒ^‚ªŒ©•t‚©‚è‚Ü‚¹‚ñB"
 
@@ -247,7 +275,7 @@ msgstr "
 msgid "No notes match the current criteria."
 msgstr "Œ»Ý‚̊‚Ɉê’v‚·‚郁ƒ‚‚Í‚ ‚è‚Ü‚¹‚ñB"
 
-#: lib/Block/summary.php:101
+#: lib/Block/summary.php:112
 msgid "No notes to display"
 msgstr "•\Ž¦‚·‚郁ƒ‚‚Í‚ ‚è‚Ü‚¹‚ñB"
 
@@ -255,23 +283,19 @@ msgstr "
 msgid "No_te"
 msgstr "_Tƒƒ‚"
 
-#: lib/Driver/sql.php:175
+#: lib/Driver/sql.php:195
 msgid "Not found"
 msgstr "Œ©•t‚©‚è‚Ü‚¹‚ñ"
 
-#: config/prefs.php.dist:60
+#: config/prefs.php.dist:59
 msgid "Note Category"
 msgstr "ƒƒ‚‚Ì•ª—Þ"
 
-#: view.php:108
+#: view.php:121
 msgid "Note Details"
 msgstr "ƒƒ‚‚̏ڍ×"
 
-#: notepads.php:113
-msgid "Note Lists"
-msgstr "ƒƒ‚ˆê——"
-
-#: config/prefs.php.dist:59
+#: config/prefs.php.dist:58
 msgid "Note Text"
 msgstr "ƒƒ‚‚Ì“à—e"
 
@@ -287,40 +311,47 @@ msgstr "
 msgid "Note_pad"
 msgstr "_Pƒƒ‚’ "
 
-#: templates/list/memo_headers.inc:33 config/prefs.php.dist:61
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
+#: config/prefs.php.dist:60
 msgid "Notepad"
 msgstr "ƒƒ‚’ "
 
+#: templates/notepad_list.php:14
+msgid "Notepad List"
+msgstr "ƒƒ‚’ ˆê——"
+
 #: templates/panel.inc:32 templates/panel.inc:33
-#: templates/notepads/notepads.inc:42
 msgid "Notepads"
 msgstr "ƒƒ‚’ "
 
-#: notepads.php:32
-msgid "Notepads must have a name."
-msgstr "ƒƒ‚’ ‚É‚Í–¼‘O‚ª•K—v‚Å‚·B"
-
-#: templates/notepads/notepads.inc:45
-msgid "Notepads:"
-msgstr "ƒƒ‚’ F"
-
 #: lib/Block/summary.php:3
 msgid "Notes Summary"
 msgstr "ƒƒ‚ŠT—v"
 
-#: lib/api.php:235 lib/api.php:323 lib/api.php:382 lib/api.php:411
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "ƒAƒNƒZƒX‹‘”Û"
 
-#: templates/notepads/notepads.inc:56
-msgid "Permissions"
-msgstr "ƒAƒNƒZƒXŒ "
+#: lib/Forms/DeleteNotepad.php:56
+msgid "Permission denied"
+msgstr "ƒAƒNƒZƒX‚ª‹‘”Û‚³‚ê‚Ü‚µ‚½"
+
+#: lib/Forms/DeleteNotepad.php:43
+#, php-format
+msgid ""
+"Really delete the notepad \"%s\"? This cannot be undone and all data on this "
+"notepad will be permanently removed."
+msgstr ""
+"–{“–‚Ƀƒ‚’  \"%s\" ‚ðíœ‚µ‚Ü‚·‚©H‚±‚Ì‘€ì‚ÍŽæ‚èÁ‚¹‚¸Aƒƒ‚’ ‚Ì“à—e‚Í‘S‚Ä"
+"Á‹Ž‚³‚ê‚Ü‚·B"
 
 #: templates/view/memo.inc:16
 msgid "Really delete this note?"
 msgstr "‚±‚̃ƒ‚‚ð–{“–‚ɍ폜‚µ‚Ü‚·‚©H"
 
-#: templates/panel.inc:59 templates/memo/memo.inc:57
+#: templates/panel.inc:68 templates/memo/memo.inc:57
+#: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr "•Û‘¶"
 
@@ -329,7 +360,7 @@ msgid "Save as PDF"
 msgstr "PDF ‚Æ‚µ‚Ä•Û‘¶"
 
 #: search.php:17 templates/search/search.inc:4 templates/search/search.inc:27
-#: templates/list/header.inc:4 lib/Block/tree_menu.php:45
+#: templates/list/header.inc:4 lib/Block/tree_menu.php:44
 msgid "Search"
 msgstr "ŒŸõ"
 
@@ -337,9 +368,9 @@ msgstr "
 msgid "Search Results"
 msgstr "ŒŸõŒ‹‰Ê"
 
-#: templates/notepads/notepads.inc:47
-msgid "Select a notepad"
-msgstr "ƒƒ‚’ ‚Ì‘I‘ð"
+#: templates/panel.inc:38
+msgid "Search for Notepads:"
+msgstr "ƒƒ‚’ ‚ÌŒŸõF"
 
 #: templates/data/export.inc:9
 msgid "Select the export format:"
@@ -353,27 +384,27 @@ msgstr "
 msgid "Select the format of the source file:"
 msgstr "ƒ\[ƒXƒtƒ@ƒCƒ‹‚ÌŒ`Ž®‚ð‘I‘ðF"
 
-#: templates/panel.inc:50
+#: templates/panel.inc:59
 msgid "Shared Notepads:"
 msgstr "‹¤—Lƒƒ‚’ F"
 
-#: config/prefs.php.dist:40
+#: config/prefs.php.dist:39
 msgid "Should the Notepad be shown in its own column in the List view?"
 msgstr "ˆê——•\Ž¦‚сƒ‚’ ‚Ì–¼‘O‚à•\Ž¦‚µ‚Ü‚·‚©H"
 
-#: lib/Block/summary.php:34
+#: lib/Block/summary.php:35
 msgid "Show action buttons?"
 msgstr "“®ìƒ{ƒ^ƒ“‚ð•\Ž¦H"
 
-#: lib/Block/summary.php:37
+#: lib/Block/summary.php:39
 msgid "Show notepad name?"
 msgstr "ƒƒ‚’ ‚Ì–¼‘O‚ð•\Ž¦H"
 
-#: config/prefs.php.dist:50
+#: config/prefs.php.dist:49
 msgid "Show notepad options panel?"
 msgstr "ƒƒ‚’ ‚̃IƒvƒVƒ‡ƒ“‚ð•\Ž¦H"
 
-#: lib/Block/summary.php:40
+#: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "‚±‚Ì•ª—ނ̃ƒ‚‚ð•\Ž¦"
 
@@ -389,12 +420,12 @@ msgstr "
 msgid "Sort by Notepad"
 msgstr "ƒƒ‚‚Å•À‚Ñ‘Ö‚¦"
 
-#: memo.php:175
+#: memo.php:174
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "\"%s\" ‚É•Û‘¶‚³‚ê‚Ü‚µ‚½B"
 
-#: data.php:195
+#: data.php:194
 #, php-format
 msgid "The %s file didn't contain any notes."
 msgstr "ƒtƒ@ƒCƒ‹ %s ‚Ƀƒ‚‚͈ê‚‚àŠÜ‚Ü‚ê‚Ä‚¢‚Ü‚¹‚ñB"
@@ -408,49 +439,54 @@ msgstr "
 msgid "The Notes backend is not currently available: %s"
 msgstr "ƒƒ‚‚̃oƒbƒNƒGƒ“ƒh‚ÍŒ»ÝŽg—p‚Å‚«‚Ü‚¹‚ñF%s"
 
-#: memo.php:198
+#: memo.php:197
 msgid "The note was deleted."
 msgstr "ƒƒ‚‚͍폜‚³‚ê‚Ü‚µ‚½B"
 
-#: notepads.php:45 notepads.php:56
-#, php-format
-msgid "The notepad \"%s\" couldn't be created: %s"
-msgstr "ƒƒ‚ \"%s\" ‚͍쐬‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½F %s"
-
-#: notepads.php:47
+#: notepads/create.php:31
 #, php-format
 msgid "The notepad \"%s\" has been created."
 msgstr "ƒƒ‚ \"%s\" ‚͍쐬‚³‚ê‚Ü‚µ‚½B"
 
-#: notepads.php:88
+#: notepads/delete.php:48
 #, php-format
 msgid "The notepad \"%s\" has been deleted."
 msgstr "ƒƒ‚ \"%s\" ‚͍폜‚³‚ê‚Ü‚µ‚½B"
 
-#: notepads.php:58
+#: notepads/edit.php:42
+#, php-format
+msgid "The notepad \"%s\" has been renamed to \"%s\"."
+msgstr "ƒƒ‚ \"%s\" ‚Í \"%s\" ‚ɕύX‚³‚ê‚Ü‚µ‚½B"
+
+#: notepads/edit.php:44
 #, php-format
 msgid "The notepad \"%s\" has been saved."
 msgstr "ƒƒ‚ \"%s\" ‚Í•Û‘¶‚³‚ê‚Ü‚µ‚½B"
 
-#: data.php:198
+#: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "ƒf[ƒ^‚̃Cƒ“ƒ|[ƒg’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½F%s"
 
-#: lib/api.php:252
+#: lib/api.php:331
 msgid "There was an error importing the iCalendar data."
 msgstr "iCalendar ‚̃Cƒ“ƒ|[ƒg’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½B"
 
-#: lib/api.php:430
+#: lib/api.php:518
 msgid "There was an error importing the vNote data."
 msgstr "vNote ‚̃Cƒ“ƒ|[ƒg’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½B"
 
-#: memo.php:196
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr "ƒƒ‚ %s ‚̍폜’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½BÚ×‚Í‹L˜^‚³‚ê‚Ü‚µ‚½B"
+
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "ƒƒ‚‚̍폜’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½F%s"
 
-#: memo.php:173
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "ƒƒ‚‚Ì•Û‘¶’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½F%s"
@@ -460,7 +496,7 @@ msgstr "
 msgid "There was an error viewing this notepad: %s"
 msgstr "ƒƒ‚‚Ì•\Ž¦’†‚ɃGƒ‰[‚ª”­¶‚µ‚Ü‚µ‚½F%s"
 
-#: data.php:79
+#: data.php:78
 msgid "There were no memos to export."
 msgstr "ƒGƒNƒXƒ|[ƒg‚·‚郁ƒ‚‚ª‚ ‚è‚Ü‚¹‚ñB"
 
@@ -468,20 +504,24 @@ msgstr "
 msgid "This file format is not supported."
 msgstr "‚±‚ÌŒ`Ž®‚̓Tƒ|[ƒg‚³‚ê‚Ä‚¢‚Ü‚¹‚ñB"
 
-#: view.php:98 memo.php:91
+#: view.php:111 memo.php:91
 msgid "This note cannot be decrypted:"
 msgstr "ƒƒ‚‚Í•¡‡‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½F"
 
-#: view.php:90 memo.php:83
+#: view.php:103 memo.php:83
 msgid "This note has been encrypted, please provide the password below."
 msgstr "ƒƒ‚‚͈͆‰»‚³‚ê‚Ä‚¢‚Ü‚·BƒpƒXƒ[ƒh‚ð“ü—Í‚µ‚ĉº‚³‚¢B"
 
-#: view.php:87 view.php:95 memo.php:80 memo.php:88 lib/Driver/kolab.php:752
-#: lib/Driver/sql.php:438
+#: view.php:100 view.php:108 memo.php:80 memo.php:88 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:458
 msgid "This note has been encrypted."
 msgstr "ƒƒ‚‚͈͆‰»‚³‚ê‚Ü‚µ‚½B"
 
-#: notepads.php:83
+#: notepads/delete.php:24
+msgid "This notepad cannot be deleted"
+msgstr "‚±‚̃ƒ‚‚͍폜‚Å‚«‚Ü‚¹‚ñ‚Å‚µ‚½"
+
+#: lib/Forms/DeleteNotepad.php:63
 #, php-format
 msgid "Unable to delete \"%s\": %s"
 msgstr "íœ‚Å‚«‚Ü‚¹‚ñ \"%s\": %s"
@@ -491,13 +531,18 @@ msgstr "
 msgid "Unable to load the definition of %s."
 msgstr "’è‹` %s ‚ªƒ[ƒh‚Å‚«‚Ü‚¹‚ñB"
 
+#: lib/Forms/EditNotepad.php:55
+#, php-format
+msgid "Unable to save notepad \"%s\": %s"
+msgstr "•Û‘¶‚Å‚«‚Ü‚¹‚ñ \"%s\": %s"
+
 #: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
-#: lib/Mnemo.php:245 lib/Mnemo.php:246 lib/Mnemo.php:260 lib/Mnemo.php:261
-#: lib/Block/summary.php:96
+#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr "–¢®—"
 
-#: lib/api.php:288 lib/api.php:345 lib/api.php:438
+#: lib/api.php:367 lib/api.php:433 lib/api.php:526
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "ƒTƒ|[ƒg‚³‚ê‚Ä‚¢‚È‚¢ Content-Type ‚Å‚·F%s"
@@ -506,27 +551,35 @@ msgstr "
 msgid "Which Notepad should the notes be added to?"
 msgstr "‚ǂ̃ƒ‚’ ‚ɒljÁ‚µ‚Ü‚·‚©H"
 
-#: data.php:42 data.php:130 memo.php:37
+#: notepads/edit.php:28
+msgid "You are not allowed to change this notepad."
+msgstr "‚ ‚È‚½‚Í‚±‚̃ƒ‚‚ð•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB"
+
+#: data.php:42 data.php:129 memo.php:37
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "‚ ‚È‚½‚Í %d ˆÈã‚̃ƒ‚‚ðì¬‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB"
 
+#: notepads/delete.php:35
+msgid "You are not allowed to delete this notepad."
+msgstr "‚ ‚È‚½‚Í‚±‚̃ƒ‚‚ðíœ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB"
+
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "‚ ‚È‚½‚̓†[ƒUƒf[ƒ^‚ðÁ‹Ž‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚¹‚ñB"
+
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
 msgstr "‚ ‚È‚½‚ɂ̓ƒ‚’  %s ‚ð•\Ž¦‚·‚éƒAƒNƒZƒXŒ ‚ª‚ ‚è‚Ü‚¹‚ñB"
 
-#: notepads.php:68
-msgid "You must select a notepad to be deleted."
-msgstr "íœ‚·‚郁ƒ‚’ ‚ð‘I‘ð‚µ‚Ä‰º‚³‚¢B"
-
 #: templates/prefs/notepadselect.inc:10
 msgid "Your default notepad:"
 msgstr "‚ ‚È‚½‚̃fƒtƒHƒ‹ƒg‚̃ƒ‚’ F"
 
 #: templates/panel.inc:45
-msgid "[Manage My Notepads]"
-msgstr "[Ž„‚̃ƒ‚’ ‚ÌŠÇ—]"
+msgid "[Manage Notepads]"
+msgstr "[ƒƒ‚’ ‚ÌŠÇ—]"
 
 #: templates/search/search.inc:21
 msgid "_Body"
@@ -552,15 +605,15 @@ msgstr "_
 msgid "_For: "
 msgstr "_For: "
 
-#: lib/Mnemo.php:466
+#: lib/Mnemo.php:488
 msgid "_Import/Export"
 msgstr "_IƒCƒ“/ƒAƒEƒg"
 
-#: lib/Mnemo.php:453
+#: lib/Mnemo.php:475
 msgid "_List Notes"
 msgstr "_Lƒƒ‚ˆê——"
 
-#: lib/Mnemo.php:458
+#: lib/Mnemo.php:480
 msgid "_New Note"
 msgstr "_NV‹Kƒƒ‚"
 
@@ -569,11 +622,11 @@ msgstr "_N
 msgid "_Password"
 msgstr "_PƒpƒXƒ[ƒh"
 
-#: lib/Mnemo.php:471
+#: lib/Mnemo.php:493
 msgid "_Print"
 msgstr "_Pˆóü"
 
-#: lib/Mnemo.php:462
+#: lib/Mnemo.php:484
 msgid "_Search"
 msgstr "_SŒŸõ"
 
@@ -581,12 +634,21 @@ msgstr "_S
 msgid "_Title"
 msgstr "_T‘è–¼"
 
-#: lib/Block/tree_menu.php:34
+#: view.php:74 view.php:83
+#, php-format
+msgid "by %s"
+msgstr "%s ì"
+
+#: view.php:76 view.php:85
+msgid "by me"
+msgstr "Ž©ì"
+
+#: lib/Block/tree_menu.php:33
 #, php-format
 msgid "in %s"
-msgstr ""
+msgstr "in %s"
 
-#: data.php:91 templates/data/export.inc:4
+#: data.php:90 templates/data/export.inc:4
 msgid "notes.csv"
 msgstr "notes.csv"
 
diff --git a/po/lt_LT.po b/po/lt_LT.po
index 6b53f26..ee9ce48 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
@@ -1,5 +1,5 @@
 # Lithuanian translations for Mnemo package.
-# Copyright (C) 2007 Horde Project
+# Copyright 2007-2009 The Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # Darius Matuliauskas <darius at lnk.lt>, 2002.
 # Vilius Sumskas <vilius at lnk.lt>, 2003, 2004, 2007.
diff --git a/po/lv_LV.po b/po/lv_LV.po
index 9acc14d..137bbca 100644
--- a/po/lv_LV.po
+++ b/po/lv_LV.po
@@ -1,5 +1,5 @@
 # Latvian translations for Mnemo package.
-# Copyright (C) 2004 Horde Project
+# Copyright 2004-2009 The Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # Automatically generated, 2004.
 #
diff --git a/po/mnemo.pot b/po/mnemo.pot
index a5a64f8..c874bdd 100644
--- a/po/mnemo.pot
+++ b/po/mnemo.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-09-06 11:11+0200\n"
+"POT-Creation-Date: 2009-09-12 10:09+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -26,30 +26,30 @@ msgstr ""
 msgid "%s file successfully imported"
 msgstr ""
 
-#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr ""
 
-#: memo.php:200
+#: memo.php:237
 msgid "Access denied deleting note."
 msgstr ""
 
-#: memo.php:143 memo.php:146
+#: memo.php:180 memo.php:183
 msgid "Access denied moving the note."
 msgstr ""
 
-#: memo.php:120
+#: memo.php:135
 #, php-format
 msgid "Access denied saving note to %s."
 msgstr ""
 
-#: memo.php:118
+#: memo.php:133
 #, php-format
 msgid "Access denied saving note: %s"
 msgstr ""
 
-#: config/prefs.php.dist:70
+#: config/prefs.php.dist:69
 msgid "Ascending"
 msgstr ""
 
@@ -105,11 +105,11 @@ msgstr ""
 msgid "Default Notepad"
 msgstr ""
 
-#: config/prefs.php.dist:61
+#: config/prefs.php.dist:60
 msgid "Default sorting criteria:"
 msgstr ""
 
-#: config/prefs.php.dist:72
+#: config/prefs.php.dist:71
 msgid "Default sorting direction:"
 msgstr ""
 
@@ -135,7 +135,7 @@ msgstr ""
 msgid "Delete this note"
 msgstr ""
 
-#: config/prefs.php.dist:71
+#: config/prefs.php.dist:70
 msgid "Descending"
 msgstr ""
 
@@ -152,7 +152,7 @@ msgstr ""
 msgid "Display Options"
 msgstr ""
 
-#: config/prefs.php.dist:117
+#: config/prefs.php.dist:116
 msgid "Do you want to confirm deleting entries?"
 msgstr ""
 
@@ -180,7 +180,7 @@ msgstr ""
 msgid "Edit categories and colors"
 msgstr ""
 
-#: memo.php:104
+#: memo.php:118 memo.php:149
 #, php-format
 msgid "Edit: %s"
 msgstr ""
@@ -244,6 +244,10 @@ msgstr ""
 msgid "More Options..."
 msgstr ""
 
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+
 #: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr ""
@@ -256,7 +260,7 @@ msgstr ""
 msgid "Name"
 msgstr ""
 
-#: memo.php:57 lib/Block/tree_menu.php:23
+#: memo.php:95 memo.php:140 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr ""
 
@@ -264,7 +268,7 @@ msgstr ""
 msgid "Next"
 msgstr ""
 
-#: lib/api.php:337
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr ""
 
@@ -284,11 +288,11 @@ msgstr ""
 msgid "No_te"
 msgstr ""
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:198
 msgid "Not found"
 msgstr ""
 
-#: config/prefs.php.dist:59
+#: config/prefs.php.dist:58
 msgid "Note Category"
 msgstr ""
 
@@ -296,7 +300,7 @@ msgstr ""
 msgid "Note Details"
 msgstr ""
 
-#: config/prefs.php.dist:58
+#: config/prefs.php.dist:57
 msgid "Note Text"
 msgstr ""
 
@@ -304,16 +308,16 @@ msgstr ""
 msgid "Note _Text"
 msgstr ""
 
-#: view.php:56 memo.php:67 note/pdf.php:57
+#: view.php:56 memo.php:105 memo.php:145 note/pdf.php:57
 msgid "Note not found."
 msgstr ""
 
-#: templates/memo/memo.inc:59
-msgid "Note_pad"
+#: templates/memo/memo.inc:63
+msgid "Note_pad:"
 msgstr ""
 
 #: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
-#: config/prefs.php.dist:60
+#: config/prefs.php.dist:59
 msgid "Notepad"
 msgstr ""
 
@@ -349,7 +353,7 @@ msgstr ""
 msgid "Really delete this note?"
 msgstr ""
 
-#: templates/panel.inc:68 templates/memo/memo.inc:57
+#: templates/panel.inc:68 templates/memo/memo.inc:58
 #: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr ""
@@ -363,7 +367,7 @@ msgstr ""
 msgid "Search"
 msgstr ""
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr ""
 
@@ -399,10 +403,6 @@ msgstr ""
 msgid "Show notepad name?"
 msgstr ""
 
-#: config/prefs.php.dist:49
-msgid "Show notepad options panel?"
-msgstr ""
-
 #: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr ""
@@ -419,7 +419,7 @@ msgstr ""
 msgid "Sort by Notepad"
 msgstr ""
 
-#: memo.php:174
+#: memo.php:211
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr ""
@@ -438,7 +438,7 @@ msgstr ""
 msgid "The Notes backend is not currently available: %s"
 msgstr ""
 
-#: memo.php:197
+#: memo.php:234
 msgid "The note was deleted."
 msgstr ""
 
@@ -462,30 +462,30 @@ msgstr ""
 msgid "The notepad \"%s\" has been saved."
 msgstr ""
 
+#: memo.php:137
+msgid "The passwords don't match."
+msgstr ""
+
 #: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr ""
 
-#: lib/api.php:331
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr ""
 
-#: lib/api.php:518
-msgid "There was an error importing the vNote data."
-msgstr ""
-
 #: lib/api.php:168
 #, php-format
 msgid "There was an error removing notes for %s. Details have been logged."
 msgstr ""
 
-#: memo.php:195
+#: memo.php:232
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr ""
 
-#: memo.php:172
+#: memo.php:209
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr ""
@@ -503,16 +503,16 @@ msgstr ""
 msgid "This file format is not supported."
 msgstr ""
 
-#: view.php:111 memo.php:91
+#: view.php:111 memo.php:43
 msgid "This note cannot be decrypted:"
 msgstr ""
 
-#: view.php:103 memo.php:83
+#: view.php:103 memo.php:34
 msgid "This note has been encrypted, please provide the password below."
 msgstr ""
 
-#: view.php:100 view.php:108 memo.php:80 memo.php:88 lib/api.php:408
-#: lib/Driver/kolab.php:766 lib/Driver/sql.php:458
+#: view.php:100 view.php:108 memo.php:30 memo.php:39 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:461
 msgid "This note has been encrypted."
 msgstr ""
 
@@ -536,12 +536,12 @@ msgid "Unable to save notepad \"%s\": %s"
 msgstr ""
 
 #: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
 #: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr ""
 
-#: lib/api.php:367 lib/api.php:433 lib/api.php:526
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr ""
@@ -554,7 +554,7 @@ msgstr ""
 msgid "You are not allowed to change this notepad."
 msgstr ""
 
-#: data.php:42 data.php:129 memo.php:37
+#: data.php:42 data.php:129 memo.php:75
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr ""
@@ -584,10 +584,14 @@ msgstr ""
 msgid "_Body"
 msgstr ""
 
-#: templates/memo/memo.inc:70 templates/list/memo_headers.inc:41
+#: templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr ""
 
+#: templates/memo/memo.inc:78
+msgid "_Category:"
+msgstr ""
+
 #: templates/view/memo.inc:16
 msgid "_Delete"
 msgstr ""
@@ -596,7 +600,7 @@ msgstr ""
 msgid "_Edit"
 msgstr ""
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:84
 msgid "_Encrypt?"
 msgstr ""
 
@@ -604,28 +608,35 @@ msgstr ""
 msgid "_For: "
 msgstr ""
 
-#: lib/Mnemo.php:488
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
 msgstr ""
 
-#: lib/Mnemo.php:475
+#: lib/Mnemo.php:481
 msgid "_List Notes"
 msgstr ""
 
-#: lib/Mnemo.php:480
+#: lib/Mnemo.php:486
 msgid "_New Note"
 msgstr ""
 
 #: templates/view/memo.inc:52 templates/memo/memo.inc:21
-#: templates/memo/memo.inc:79
 msgid "_Password"
 msgstr ""
 
-#: lib/Mnemo.php:493
+#: templates/memo/memo.inc:89
+msgid "_Password:"
+msgstr ""
+
+#: lib/Mnemo.php:499
 msgid "_Print"
 msgstr ""
 
-#: lib/Mnemo.php:484
+#: templates/memo/memo.inc:93
+msgid "_Repeat:"
+msgstr ""
+
+#: lib/Mnemo.php:490
 msgid "_Search"
 msgstr ""
 
diff --git a/po/nb_NO.po b/po/nb_NO.po
index eefa7bd..e0b88e1 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -1,5 +1,5 @@
 # Norwegian Mnemo Translation.
-# Copyright (C) 2002 Horde Project.
+# Copyright 2002-2009 The Horde Project.
 # This file is distributed under the same license as the Mnemo package.
 # Torstein S. Hansen <huleboer at techbee.no>, 2002.
 #
diff --git a/po/nl_NL.po b/po/nl_NL.po
index c49efc6..5f6899c 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -1,13 +1,13 @@
 # Mnemo Dutch translation.
-# Copyright (C) 2002 Jan Kuipers.
-# Jan Kuipers <jrkuipers at lauwerscollege.nl>, 2002-2008.
+# Copyright 2002 Jan Kuipers.
+# Jan Kuipers <jrkuipers at lauwerscollege.nl>, 2002-2009.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Mneno H3 (2.2.1-cvs)\n"
+"Project-Id-Version: Mneno H3 (2.2.3-cvs)\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-08-08 23:32+0200\n"
-"PO-Revision-Date: 2008-08-09 12:48+0200\n"
+"POT-Creation-Date: 2009-12-14 08:18+0100\n"
+"PO-Revision-Date: 2009-12-14 20:51+0100\n"
 "Last-Translator: Jan Kuipers <jrkuipers at lauwerscollege.nl>\n"
 "Language-Team: Dutch <i18n at lists.horde.org>\n"
 "MIME-Version: 1.0\n"
@@ -25,30 +25,30 @@ msgstr "%s tekens"
 msgid "%s file successfully imported"
 msgstr "%s bestand met succes geimporteerd"
 
-#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "%s's notitieboek"
 
-#: memo.php:201
+#: memo.php:237
 msgid "Access denied deleting note."
 msgstr "Toegang geweigerd bij verwijderen van notitie."
 
-#: memo.php:150 memo.php:153
+#: memo.php:180 memo.php:183
 msgid "Access denied moving the note."
 msgstr "Toegang geweigerd bij verplaatsen van de notitie."
 
-#: memo.php:120
+#: memo.php:135
 #, php-format
 msgid "Access denied saving note to %s."
 msgstr "Toegang geweigerd bij opslaan van notitie in %s."
 
-#: memo.php:118
+#: memo.php:133
 #, php-format
 msgid "Access denied saving note: %s"
 msgstr "Toegang geweigerd bij opslaan van notitie: %s"
 
-#: config/prefs.php.dist:70
+#: config/prefs.php.dist:69
 msgid "Ascending"
 msgstr "Toenemend"
 
@@ -104,15 +104,15 @@ msgstr "Decoderen"
 msgid "Default Notepad"
 msgstr "Standaard notitieboek"
 
-#: config/prefs.php.dist:61
+#: config/prefs.php.dist:60
 msgid "Default sorting criteria:"
 msgstr "Standaard sorteercriteria:"
 
-#: config/prefs.php.dist:72
+#: config/prefs.php.dist:71
 msgid "Default sorting direction:"
 msgstr "Standaard sorteervolgorde:"
 
-#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
+#: lib/Forms/DeleteNotepad.php:45 notepads/index.php:33
 #: templates/notepad_list.php:31 templates/view/memo.inc:16
 msgid "Delete"
 msgstr "Verwijderen"
@@ -134,7 +134,7 @@ msgstr "Verwijderknopgedrag"
 msgid "Delete this note"
 msgstr "Verwijder deze notitie"
 
-#: config/prefs.php.dist:71
+#: config/prefs.php.dist:70
 msgid "Descending"
 msgstr "Afnemend"
 
@@ -151,7 +151,7 @@ msgstr "Notitie %s niet gevonden"
 msgid "Display Options"
 msgstr "Weergaveopties"
 
-#: config/prefs.php.dist:117
+#: config/prefs.php.dist:116
 msgid "Do you want to confirm deleting entries?"
 msgstr "Wilt u het verwijderen van invoer bevestigen?"
 
@@ -179,7 +179,7 @@ msgstr "Notitie bewerken"
 msgid "Edit categories and colors"
 msgstr "Categorieën en kleuren bewerken"
 
-#: memo.php:104
+#: memo.php:118 memo.php:149
 #, php-format
 msgid "Edit: %s"
 msgstr "Bewerken: %s"
@@ -245,6 +245,11 @@ msgstr "Menulijst"
 msgid "More Options..."
 msgstr "Meer opties..."
 
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+"Meerdere iCalendar onderdelen gevonden; slecht één vNote wordt ondersteund."
+
 #: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr "Mijn notitieboeken:"
@@ -257,7 +262,7 @@ msgstr "Mijn notities"
 msgid "Name"
 msgstr "Naam"
 
-#: memo.php:57 lib/Block/tree_menu.php:23
+#: memo.php:95 memo.php:140 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "Nieuwe notitie"
 
@@ -265,7 +270,7 @@ msgstr "Nieuwe notitie"
 msgid "Next"
 msgstr "Volgende"
 
-#: lib/api.php:332
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "Geen iCalendardata gevonden."
 
@@ -285,11 +290,11 @@ msgstr "Geen notities weer te geven"
 msgid "No_te"
 msgstr "No_titie"
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:198
 msgid "Not found"
 msgstr "Niet gevonden"
 
-#: config/prefs.php.dist:59
+#: config/prefs.php.dist:58
 msgid "Note Category"
 msgstr "Notitiecategorie"
 
@@ -297,7 +302,7 @@ msgstr "Notitiecategorie"
 msgid "Note Details"
 msgstr "Notitiedetails"
 
-#: config/prefs.php.dist:58
+#: config/prefs.php.dist:57
 msgid "Note Text"
 msgstr "Notitietekst"
 
@@ -305,16 +310,16 @@ msgstr "Notitietekst"
 msgid "Note _Text"
 msgstr "Notitiet_ekst"
 
-#: memo.php:67 view.php:56 note/pdf.php:57
+#: memo.php:105 memo.php:145 view.php:56 note/pdf.php:57
 msgid "Note not found."
 msgstr "Notitie niet gevonden."
 
-#: templates/memo/memo.inc:59
-msgid "Note_pad"
-msgstr "Notitie_boek"
+#: templates/memo/memo.inc:63
+msgid "Note_pad:"
+msgstr "Notitie_boek:"
 
 #: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
-#: config/prefs.php.dist:60
+#: config/prefs.php.dist:59
 msgid "Notepad"
 msgstr "Notitieboek"
 
@@ -330,8 +335,8 @@ msgstr "Notitieboeken"
 msgid "Notes Summary"
 msgstr "Notitiesamenvatting"
 
-#: lib/api.php:207 lib/api.php:247 lib/api.php:280 lib/api.php:310
-#: lib/api.php:397 lib/api.php:465 lib/api.php:494
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Toegang geweigerd"
 
@@ -353,7 +358,7 @@ msgid "Really delete this note?"
 msgstr "Echt deze notitie verwijderen?"
 
 #: lib/Forms/EditNotepad.php:46 templates/panel.inc:68
-#: templates/memo/memo.inc:57
+#: templates/memo/memo.inc:58
 msgid "Save"
 msgstr "Opslaan"
 
@@ -366,7 +371,7 @@ msgstr "Opslaan als PDF"
 msgid "Search"
 msgstr "Zoeken"
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr "Zoekresultaten"
 
@@ -404,10 +409,6 @@ msgstr "Bewerkingsknoppen weergeven?"
 msgid "Show notepad name?"
 msgstr "Notitieboeknamen weergeven?"
 
-#: config/prefs.php.dist:49
-msgid "Show notepad options panel?"
-msgstr "Notitieboekoptiespaneel weergeven?"
-
 #: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "Notities van deze categorieen weergeven"
@@ -424,7 +425,7 @@ msgstr "Sorteren op notitietekst"
 msgid "Sort by Notepad"
 msgstr "Sorteren op notitieboek"
 
-#: memo.php:175
+#: memo.php:211
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "\"%s\" met succes opgeslagen."
@@ -443,7 +444,7 @@ msgstr "Het notitie backend is momenteel niet beschikbaar."
 msgid "The Notes backend is not currently available: %s"
 msgstr "Het notitie backend is momenteel niet beschikbaar: %s"
 
-#: memo.php:198
+#: memo.php:234
 msgid "The note was deleted."
 msgstr "De notitie is verwijderd."
 
@@ -467,31 +468,31 @@ msgstr "Het notitieboek \"%s\" is hernoemd naar \"%s\"."
 msgid "The notepad \"%s\" has been saved."
 msgstr "Het notitieboek \"%s\" is opgeslagen."
 
+#: memo.php:137
+msgid "The passwords don't match."
+msgstr "De wachtwoorden komen niet overeen."
+
 #: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "Een fout bij het importeren van de data: %s"
 
-#: lib/api.php:326
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Een fout bij het importeren van de iCalendardata."
 
-#: lib/api.php:513
-msgid "There was an error importing the vNote data."
-msgstr "Een fout bij het importeren van de vNote data."
-
-#: lib/api.php:163
+#: lib/api.php:168
 #, php-format
 msgid "There was an error removing notes for %s. Details have been logged."
 msgstr ""
 "Een fout bij het verwijderen van notities voor %s. Details zijn gelogd."
 
-#: memo.php:196
+#: memo.php:232
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Een probleem bij het verwijderen van de notitie: %s"
 
-#: memo.php:173
+#: memo.php:209
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Een probleem bij het opslaan van de notitie: %s"
@@ -509,16 +510,16 @@ msgstr "Er waren geen notities om te exporteren."
 msgid "This file format is not supported."
 msgstr "Dit bestandsformaat wordt niet ondersteund."
 
-#: memo.php:91 view.php:111
+#: memo.php:43 view.php:111
 msgid "This note cannot be decrypted:"
 msgstr "Deze notitie kan niet worden gedecodeerd:"
 
-#: memo.php:83 view.php:103
+#: memo.php:34 view.php:103
 msgid "This note has been encrypted, please provide the password below."
 msgstr "Deze notitie is gecodeerd, geef hieronder het wachtwoord, a.u.b."
 
-#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:403
-#: lib/Driver/kolab.php:766 lib/Driver/sql.php:448
+#: memo.php:30 memo.php:39 view.php:100 view.php:108 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:461
 msgid "This note has been encrypted."
 msgstr "Deze notitie is gecodeerd."
 
@@ -541,13 +542,13 @@ msgstr "Niet in staat om de definitie van %s te laden."
 msgid "Unable to save notepad \"%s\": %s"
 msgstr "Niet in staat notitieboek \"%s\" op te slaan: %s"
 
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
 #: lib/Block/summary.php:107 templates/list/memo_summaries.inc:17
 #: templates/view/memo.inc:27
 msgid "Unfiled"
 msgstr "Onbenoemd"
 
-#: lib/api.php:362 lib/api.php:428 lib/api.php:521
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Niet ondersteund Content-Type: %s"
@@ -560,7 +561,7 @@ msgstr "Aan welk notitieboek dienen de notities toegevoegd te worden?"
 msgid "You are not allowed to change this notepad."
 msgstr "Het is u niet toegestaan dit notitieboek te wijzigen."
 
-#: memo.php:37 data.php:42 data.php:129
+#: memo.php:75 data.php:42 data.php:129
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "Het is u niet toegestaan om meer dan %d notities te maken."
@@ -590,10 +591,14 @@ msgstr "[Notitieboeken beheren]"
 msgid "_Body"
 msgstr "_Body"
 
-#: templates/list/memo_headers.inc:41 templates/memo/memo.inc:70
+#: templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr "_Categorie"
 
+#: templates/memo/memo.inc:78
+msgid "_Category:"
+msgstr "_Categorie:"
+
 #: templates/view/memo.inc:16
 msgid "_Delete"
 msgstr "Ver_wijderen"
@@ -602,7 +607,7 @@ msgstr "Ver_wijderen"
 msgid "_Edit"
 msgstr "_Bewerken"
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:84
 msgid "_Encrypt?"
 msgstr "_Coderen?"
 
@@ -610,28 +615,35 @@ msgstr "_Coderen?"
 msgid "_For: "
 msgstr "_Voor: "
 
-#: lib/Mnemo.php:488
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
 msgstr "_Import/Export"
 
-#: lib/Mnemo.php:475
+#: lib/Mnemo.php:481
 msgid "_List Notes"
 msgstr "Notities weer_geven"
 
-#: lib/Mnemo.php:480
+#: lib/Mnemo.php:486
 msgid "_New Note"
 msgstr "_Nieuwe notitie"
 
 #: templates/view/memo.inc:52 templates/memo/memo.inc:21
-#: templates/memo/memo.inc:79
 msgid "_Password"
 msgstr "_Wachtwoord"
 
-#: lib/Mnemo.php:493
+#: templates/memo/memo.inc:89
+msgid "_Password:"
+msgstr "_Wachtwoord:"
+
+#: lib/Mnemo.php:499
 msgid "_Print"
 msgstr "A_fdrukken"
 
-#: lib/Mnemo.php:484
+#: templates/memo/memo.inc:93
+msgid "_Repeat:"
+msgstr "_Herhalen:"
+
+#: lib/Mnemo.php:490
 msgid "_Search"
 msgstr "_Zoeken"
 
diff --git a/po/nn_NO.po b/po/nn_NO.po
index badb5c7..0fd1674 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -1,5 +1,5 @@
 # Mnemo Norwegian Nynorsk translation.
-# Copyright (C) 2002 Per-Stian Vatne
+# Copyright 2002 Per-Stian Vatne
 # This file is distributed under the same license as the Mnemo package.
 # Per-Stian Vatne <psv at orsta.org>, 2002.
 # 
diff --git a/po/pl_PL.po b/po/pl_PL.po
index b1daa24..b55590d 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -1,6 +1,6 @@
 # Polish translations for Mnemo package
 # Polskie tlumaczenia dla pakietu Mnemo.
-# Copyright (C) 2005-2007 Horde Project
+# Copyright 2005-2009 The Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # Mateusz Kaminski <matipl at pld-linux.org>, 2005.
 # Piotr Tarnowski <drfugazi at drfugazi.eu.org>, 2007.
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 5e4b128..7e901d4 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -1,6 +1,6 @@
 # translation of pt_BR.po to Português brasileiro
 # This file is distributed under the same license as the Mnemo package.
-# Copyright (C) YEAR Horde Project.
+# Copyright YEAR Horde Project.
 #
 # Fabio Gomes <flgomes at fazenda.sp.gov.br>, 2005.
 # Luis Felipe Marzagao <duli at fedoraproject.org>, 2008.
@@ -8,15 +8,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pt_BR\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-08-31 21:29-0300\n"
-"PO-Revision-Date: 2008-07-06 23:36-0300\n"
-"Last-Translator: Luis Felipe Marzagao <duli at fedoraproject.org>\n"
+"POT-Creation-Date: 2009-09-17 00:07-0300\n"
+"PO-Revision-Date: 2009-09-19 01:40-0300\n"
+"Last-Translator: Luis Felipe Marzagao <duli at easylifeproject.org>\n"
 "Language-Team: Português brasileiro <i18n at lists.horde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms:  nplurals=2; plural=(n > 1);\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 #: templates/memo/memo.inc:53
 #, php-format
@@ -28,30 +28,30 @@ msgstr "%s caracteres"
 msgid "%s file successfully imported"
 msgstr "Arquivo %s importado com sucesso"
 
-#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:457 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "Anotações de %s"
 
-#: memo.php:201
+#: memo.php:237
 msgid "Access denied deleting note."
 msgstr "Acesso negado ao excluir anotação."
 
-#: memo.php:150 memo.php:153
+#: memo.php:180 memo.php:183
 msgid "Access denied moving the note."
 msgstr "Acesso negado ao mover a anotação."
 
-#: memo.php:120
+#: memo.php:135
 #, php-format
 msgid "Access denied saving note to %s."
 msgstr "Acesso negado ao gravar a anotação em %s."
 
-#: memo.php:118
+#: memo.php:133
 #, php-format
 msgid "Access denied saving note: %s"
 msgstr "Acesso negado ao gravar a anotação: %s"
 
-#: config/prefs.php.dist:70
+#: config/prefs.php.dist:69
 msgid "Ascending"
 msgstr "Ascendente"
 
@@ -67,7 +67,7 @@ msgstr "Cancelar"
 msgid "Category"
 msgstr "Categoria"
 
-#: notepads/index.php:32 templates/notepad_list.php:31
+#: templates/notepad_list.php:29 notepads/index.php:32
 msgid "Change Permissions"
 msgstr "Alterar Permissões"
 
@@ -91,7 +91,7 @@ msgstr "Criar"
 msgid "Create Notepad"
 msgstr "Criar Bloco de Anotações"
 
-#: templates/notepad_list.php:8
+#: templates/notepad_list.php:9
 msgid "Create a new Notepad"
 msgstr "Criar um novo Bloco de Anotações"
 
@@ -99,7 +99,7 @@ msgstr "Criar um novo Bloco de Anota
 msgid "Created"
 msgstr "Criado"
 
-#: templates/memo/memo.inc:23 templates/view/memo.inc:54
+#: templates/view/memo.inc:54 templates/memo/memo.inc:23
 msgid "Decrypt"
 msgstr "Descriptografar"
 
@@ -107,16 +107,16 @@ msgstr "Descriptografar"
 msgid "Default Notepad"
 msgstr "Bloco de Anotações Padrão"
 
-#: config/prefs.php.dist:61
+#: config/prefs.php.dist:60
 msgid "Default sorting criteria:"
 msgstr "Critério padrão de ordenação:"
 
-#: config/prefs.php.dist:72
+#: config/prefs.php.dist:71
 msgid "Default sorting direction:"
 msgstr "Direção de ordenação padrão:"
 
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
 #: lib/Forms/DeleteNotepad.php:45 notepads/index.php:33
-#: templates/notepad_list.php:33 templates/view/memo.inc:16
 msgid "Delete"
 msgstr "Excluir"
 
@@ -137,7 +137,7 @@ msgstr "Comportamento do bot
 msgid "Delete this note"
 msgstr "Excluir esta anotação"
 
-#: config/prefs.php.dist:71
+#: config/prefs.php.dist:70
 msgid "Descending"
 msgstr "Descendente"
 
@@ -154,12 +154,12 @@ msgstr "N
 msgid "Display Options"
 msgstr "Opções de Exibição"
 
-#: config/prefs.php.dist:117
+#: config/prefs.php.dist:116
 msgid "Do you want to confirm deleting entries?"
 msgstr "Você deseja confirmar a exclusão de registros?"
 
-#: notepads/index.php:31 templates/notepad_list.php:29
-#: templates/view/memo.inc:13
+#: templates/notepad_list.php:27 templates/view/memo.inc:13
+#: notepads/index.php:31
 msgid "Edit"
 msgstr "Editar"
 
@@ -173,8 +173,8 @@ msgstr "Editar \"%s\""
 msgid "Edit %s"
 msgstr "Editar %s"
 
-#: lib/Block/summary.php:79 lib/Block/summary.php:80
-#: templates/list/memo_headers.inc:30
+#: templates/list/memo_headers.inc:30 lib/Block/summary.php:79
+#: lib/Block/summary.php:80
 msgid "Edit Note"
 msgstr "Editar Anotação"
 
@@ -182,12 +182,12 @@ msgstr "Editar Anota
 msgid "Edit categories and colors"
 msgstr "Editar categorias e cores"
 
-#: memo.php:104
+#: memo.php:118 memo.php:149
 #, php-format
 msgid "Edit: %s"
 msgstr "Editar: %s"
 
-#: lib/Block/summary.php:104 templates/list/memo_summaries.inc:15
+#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:104
 msgid "Empty Note"
 msgstr "Anotação em Branco"
 
@@ -228,7 +228,7 @@ msgstr "Em: "
 msgid "Last Modified"
 msgstr "Última Modificação"
 
-#: notepads/index.php:37 templates/notepad_list.php:2
+#: templates/notepad_list.php:2 notepads/index.php:37
 msgid "Manage Notepads"
 msgstr "Gerenciar Blocos de Anotações"
 
@@ -248,6 +248,11 @@ msgstr "Lista de Menu"
 msgid "More Options..."
 msgstr "Mais Opções..."
 
+#: lib/api.php:524
+msgid "Multiple iCalendar components found; only one vNote is supported."
+msgstr ""
+"Encontrados múltiplos componentes iCalendar; somente um vNote é suportado."
+
 #: templates/panel.inc:50
 msgid "My Notepads:"
 msgstr "Meus Blocos de Anotações:"
@@ -260,7 +265,7 @@ msgstr "Minhas Anota
 msgid "Name"
 msgstr "Nome"
 
-#: memo.php:57 lib/Block/tree_menu.php:23
+#: memo.php:95 memo.php:140 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "Nova Anotação"
 
@@ -268,7 +273,7 @@ msgstr "Nova Anota
 msgid "Next"
 msgstr "Próxima"
 
-#: lib/api.php:286
+#: lib/api.php:337 lib/api.php:517
 msgid "No iCalendar data was found."
 msgstr "Nenhum dado iCalendar foi encontrado."
 
@@ -288,11 +293,11 @@ msgstr "Nenhuma anota
 msgid "No_te"
 msgstr "Ano_tação"
 
-#: lib/Driver/sql.php:195
+#: lib/Driver/sql.php:198
 msgid "Not found"
 msgstr "Não encontrado"
 
-#: config/prefs.php.dist:59
+#: config/prefs.php.dist:58
 msgid "Note Category"
 msgstr "Categoria da Anotação"
 
@@ -300,7 +305,7 @@ msgstr "Categoria da Anota
 msgid "Note Details"
 msgstr "Detalhes da Nota"
 
-#: config/prefs.php.dist:58
+#: config/prefs.php.dist:57
 msgid "Note Text"
 msgstr "Texto da Anotação"
 
@@ -308,20 +313,20 @@ msgstr "Texto da Anota
 msgid "Note _Text"
 msgstr "_Texto da Anotação"
 
-#: memo.php:67 view.php:56 note/pdf.php:57
+#: memo.php:105 memo.php:145 view.php:56 note/pdf.php:57
 msgid "Note not found."
 msgstr "Anotação não encontrada."
 
-#: templates/memo/memo.inc:59
-msgid "Note_pad"
-msgstr "Bloco de _Notas"
+#: templates/memo/memo.inc:63
+msgid "Note_pad:"
+msgstr "Bloco de _Notas:"
 
-#: templates/notepad_list.php:15 templates/list/memo_headers.inc:33
-#: config/prefs.php.dist:60
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
+#: config/prefs.php.dist:59
 msgid "Notepad"
 msgstr "Bloco de Anotações"
 
-#: templates/notepad_list.php:12
+#: templates/notepad_list.php:14
 msgid "Notepad List"
 msgstr "Lista de Bloco de Anotações"
 
@@ -333,8 +338,8 @@ msgstr "Blocos de Anota
 msgid "Notes Summary"
 msgstr "Resumo das Anotações"
 
-#: lib/api.php:161 lib/api.php:201 lib/api.php:234 lib/api.php:264
-#: lib/api.php:351 lib/api.php:419 lib/api.php:448
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Permissão Negada"
 
@@ -355,8 +360,8 @@ msgstr ""
 msgid "Really delete this note?"
 msgstr "Realmente excluir esta anotação?"
 
-#: lib/Forms/EditNotepad.php:46 templates/panel.inc:68
-#: templates/memo/memo.inc:57
+#: templates/panel.inc:68 templates/memo/memo.inc:58
+#: lib/Forms/EditNotepad.php:46
 msgid "Save"
 msgstr "Gravar"
 
@@ -364,12 +369,12 @@ msgstr "Gravar"
 msgid "Save as PDF"
 msgstr "Gravar como PDF"
 
-#: search.php:17 lib/Block/tree_menu.php:44 templates/search/search.inc:4
-#: templates/search/search.inc:27 templates/list/header.inc:4
+#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:27
+#: templates/list/header.inc:4 lib/Block/tree_menu.php:44
 msgid "Search"
 msgstr "Pesquisar"
 
-#: list.php:54
+#: list.php:54 notes/index.php:35
 msgid "Search Results"
 msgstr "Resultados da Pesquisa"
 
@@ -407,10 +412,6 @@ msgstr "Exibir bot
 msgid "Show notepad name?"
 msgstr "Exibir o nome do bloco de anotações?"
 
-#: config/prefs.php.dist:49
-msgid "Show notepad options panel?"
-msgstr "Exibir o painel de opções de bloco de anotações?"
-
 #: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "Exibir anotações destas categorias"
@@ -427,7 +428,7 @@ msgstr "Ordenar pelo texto da anota
 msgid "Sort by Notepad"
 msgstr "Ordenar por Bloco de Anotações"
 
-#: memo.php:175
+#: memo.php:211
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "\"%s\" foi gravado com sucesso."
@@ -446,7 +447,7 @@ msgstr "A estrutura de Anota
 msgid "The Notes backend is not currently available: %s"
 msgstr "A estrutura de Anotações não está disponível: %s"
 
-#: memo.php:198
+#: memo.php:234
 msgid "The note was deleted."
 msgstr "A anotação foi excluída."
 
@@ -470,25 +471,32 @@ msgstr "O bloco de anota
 msgid "The notepad \"%s\" has been saved."
 msgstr "O bloco de anotações \"%s\" foi gravado."
 
+#: memo.php:137
+msgid "The passwords don't match."
+msgstr "As senhas não batem."
+
 #: data.php:197
 #, php-format
 msgid "There was an error importing the data: %s"
 msgstr "Houve um erro ao importar os dados: %s"
 
-#: lib/api.php:280
+#: lib/api.php:331 lib/api.php:511
 msgid "There was an error importing the iCalendar data."
 msgstr "Houve um erro ao importar os dados do iCalendar."
 
-#: lib/api.php:467
-msgid "There was an error importing the vNote data."
-msgstr "Houve um erro ao importar os dados vNote."
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr ""
+"Houve um erro ao remover anotações para %s. Detalhes foram registrados no "
+"log."
 
-#: memo.php:196
+#: memo.php:232
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Houve um erro ao remover a anotação: %s"
 
-#: memo.php:173
+#: memo.php:209
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Houve um erro ao gravar a anotação: %s"
@@ -506,16 +514,16 @@ msgstr "N
 msgid "This file format is not supported."
 msgstr "Este formato de arquivo não é suportado."
 
-#: memo.php:91 view.php:111
+#: memo.php:43 view.php:111
 msgid "This note cannot be decrypted:"
 msgstr "Esta anotação não pode ser descriptografada:"
 
-#: memo.php:83 view.php:103
+#: memo.php:34 view.php:103
 msgid "This note has been encrypted, please provide the password below."
 msgstr "Esta anotação foi criptografada, por favor forneça a senha abaixo."
 
-#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:357
-#: lib/Driver/kolab.php:766 lib/Driver/sql.php:448
+#: memo.php:30 memo.php:39 view.php:100 view.php:108 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:461
 msgid "This note has been encrypted."
 msgstr "Esta anotação foi criptografada."
 
@@ -538,13 +546,13 @@ msgstr "Imposs
 msgid "Unable to save notepad \"%s\": %s"
 msgstr "Impossível gravar bloco de anotações \"%s\": %s"
 
-#: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
-#: lib/Block/summary.php:107 templates/view/memo.inc:27
-#: templates/list/memo_summaries.inc:17
+#: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
+#: lib/Mnemo.php:273 lib/Mnemo.php:274 lib/Mnemo.php:288 lib/Mnemo.php:289
+#: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr "Sem categoria"
 
-#: lib/api.php:316 lib/api.php:382 lib/api.php:475
+#: lib/api.php:367 lib/api.php:433 lib/api.php:533
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Tipo de Conteúdo não suportado: %s"
@@ -557,7 +565,7 @@ msgstr "Em qual Bloco de Anota
 msgid "You are not allowed to change this notepad."
 msgstr "Você não ter permissão para alterar este Bloco de Anotações."
 
-#: memo.php:37 data.php:42 data.php:129
+#: data.php:42 data.php:129 memo.php:75
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "Você não pode criar mais do que %d anotações."
@@ -566,6 +574,10 @@ msgstr "Voc
 msgid "You are not allowed to delete this notepad."
 msgstr "Voc? não tem permissão para apagar este bloco de anotações."
 
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "Você não tem permissão para remover dados de usuário."
+
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
@@ -583,10 +595,14 @@ msgstr "[Gerenciar Blocos de Anota
 msgid "_Body"
 msgstr "_Corpo"
 
-#: templates/memo/memo.inc:70 templates/list/memo_headers.inc:41
+#: templates/list/memo_headers.inc:41
 msgid "_Category"
 msgstr "_Categoria"
 
+#: templates/memo/memo.inc:78
+msgid "_Category:"
+msgstr "_Categoria:"
+
 #: templates/view/memo.inc:16
 msgid "_Delete"
 msgstr "E_xcluir"
@@ -595,7 +611,7 @@ msgstr "E_xcluir"
 msgid "_Edit"
 msgstr "_Editar"
 
-#: templates/memo/memo.inc:74
+#: templates/memo/memo.inc:84
 msgid "_Encrypt?"
 msgstr "_Criptografar?"
 
@@ -603,28 +619,35 @@ msgstr "_Criptografar?"
 msgid "_For: "
 msgstr "_Para: "
 
-#: lib/Mnemo.php:488
+#: lib/Mnemo.php:494
 msgid "_Import/Export"
 msgstr "_Importar/Exportar"
 
-#: lib/Mnemo.php:475
+#: lib/Mnemo.php:481
 msgid "_List Notes"
 msgstr "_Listar Anotações"
 
-#: lib/Mnemo.php:480
+#: lib/Mnemo.php:486
 msgid "_New Note"
 msgstr "_Nova Anotação"
 
-#: templates/memo/memo.inc:21 templates/memo/memo.inc:79
-#: templates/view/memo.inc:52
+#: templates/view/memo.inc:52 templates/memo/memo.inc:21
 msgid "_Password"
 msgstr "_Senha"
 
-#: lib/Mnemo.php:493
+#: templates/memo/memo.inc:89
+msgid "_Password:"
+msgstr "_Senha:"
+
+#: lib/Mnemo.php:499
 msgid "_Print"
 msgstr "_Imprimir"
 
-#: lib/Mnemo.php:484
+#: templates/memo/memo.inc:93
+msgid "_Repeat:"
+msgstr "_Repetir:"
+
+#: lib/Mnemo.php:490
 msgid "_Search"
 msgstr "Pes_quisar"
 
diff --git a/po/ro_RO.po b/po/ro_RO.po
index e203468..a4f8052 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -1,5 +1,5 @@
 # Mnemo Romanian Translation
-# Copyright (C) 2003 Horde Project
+# Copyright 2003-2009 The Horde Project
 # Eugen Hoanca <eugenh at urban-grafx.ro>, 2003.
 # Marius Dragulescu <mariusd at urban-grafx.ro>, 2003.
 #
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 13181b1..ea758b6 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -1,5 +1,5 @@
 # Russian translations for Mnemo package
-# Copyright (C)
+# Copyright
 # Alexey Zakharov <baber at mosga.net>, 2008
 #
 msgid ""
diff --git a/po/sk_SK.po b/po/sk_SK.po
index ec2bb36..61cb0fe 100644
--- a/po/sk_SK.po
+++ b/po/sk_SK.po
@@ -1,5 +1,5 @@
 # Mnemo Slovak translation
-# Copyright (C) 2002, 2004 Ivan Noris
+# Copyright 2002, 2004 Ivan Noris
 # Ivan Noris <vix at vazka.sk>, 2002, 2004
 # Martin Matu¹ka <martin at matuska.org>, 2008
 #
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Mnemo 2.0\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-05-12 11:43+0200\n"
-"PO-Revision-Date: 2008-03-19 12:00+0100\n"
+"POT-Creation-Date: 2008-09-06 11:11+0200\n"
+"PO-Revision-Date: 2008-09-17 12:51+0100\n"
 "Last-Translator: Martin Matuska <martin at matuska.org>\n"
 "Language-Team: Slovak <vix at vazka.sk>\n"
 "MIME-Version: 1.0\n"
@@ -26,16 +26,16 @@ msgstr "%s znakov"
 msgid "%s file successfully imported"
 msgstr "súbor %s úspe¹ne importovaný"
 
-#: notepads.php:102 lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
+#: lib/Mnemo.php:451 lib/Forms/DeleteNotepad.php:86
 #, php-format
 msgid "%s's Notepad"
 msgstr "Poznámky pou¾ívateµa %s"
 
-#: memo.php:201
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "Pri vymazávaní poznámky bol zamietnutý prístup."
 
-#: memo.php:150 memo.php:153
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "Pri presúvaní poznámky bol zamietnutý prístup."
 
@@ -65,11 +65,7 @@ msgstr "Zru
 msgid "Category"
 msgstr "Kategória"
 
-#: templates/notepads/notepads.inc:22
-msgid "Change"
-msgstr "Zmeni»"
-
-#: notepads/index.php:32 templates/notepad_list.php:31
+#: templates/notepad_list.php:29 notepads/index.php:32
 msgid "Change Permissions"
 msgstr "Zmeni» práva"
 
@@ -85,7 +81,6 @@ msgstr "Vybra
 msgid "Close Search"
 msgstr "Zavrie» hµadanie"
 
-#: templates/notepads/notepads.inc:15 templates/notepads/notepads.inc:64
 #: lib/Forms/CreateNotepad.php:39
 msgid "Create"
 msgstr "Vytvori»"
@@ -94,7 +89,7 @@ msgstr "Vytvori
 msgid "Create Notepad"
 msgstr "Vytvori» poznámkový blok"
 
-#: templates/notepad_list.php:8
+#: templates/notepad_list.php:9
 msgid "Create a new Notepad"
 msgstr "Vytvori» nový poznámkový blok"
 
@@ -118,9 +113,8 @@ msgstr "Prednastaven
 msgid "Default sorting direction:"
 msgstr "Prednastavený smer triedenia:"
 
-#: notepads/index.php:33 templates/notepad_list.php:33
-#: templates/notepads/notepads.inc:65 templates/view/memo.inc:16
-#: lib/Forms/DeleteNotepad.php:45
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
+#: notepads/index.php:33 lib/Forms/DeleteNotepad.php:45
 msgid "Delete"
 msgstr "Vymaza»"
 
@@ -145,14 +139,10 @@ msgstr "Vymaza
 msgid "Descending"
 msgstr "Zostupne"
 
-#: lib/Forms/CreateNotepad.php:37 lib/Forms/EditNotepad.php:44
+#: lib/Forms/EditNotepad.php:44 lib/Forms/CreateNotepad.php:37
 msgid "Description"
 msgstr "Popis"
 
-#: templates/notepads/notepads.inc:60
-msgid "Description:"
-msgstr "Popis:"
-
 #: lib/Driver/kolab.php:556
 #, php-format
 msgid "Did not find note %s"
@@ -166,8 +156,8 @@ msgstr "Nastavenie zobrazenia"
 msgid "Do you want to confirm deleting entries?"
 msgstr "Chcete potvrdi» vymazanie záznamov?"
 
-#: notepads/index.php:31 templates/notepad_list.php:29
-#: templates/view/memo.inc:13
+#: templates/notepad_list.php:27 templates/view/memo.inc:13
+#: notepads/index.php:31
 msgid "Edit"
 msgstr "Upravi»"
 
@@ -181,7 +171,8 @@ msgstr "Upravi
 msgid "Edit %s"
 msgstr "Upravi» %s"
 
-#: templates/list/memo_headers.inc:30 lib/Block/summary.php:74
+#: templates/list/memo_headers.inc:30 lib/Block/summary.php:79
+#: lib/Block/summary.php:80
 msgid "Edit Note"
 msgstr "Upravi» poznámku"
 
@@ -194,7 +185,7 @@ msgstr "Upravi
 msgid "Edit: %s"
 msgstr "Upravi»: %s"
 
-#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:93
+#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:104
 msgid "Empty Note"
 msgstr "Prázdna poznámka"
 
@@ -235,7 +226,7 @@ msgstr "V: "
 msgid "Last Modified"
 msgstr "Posledná aktualizácia"
 
-#: notepads/index.php:37 templates/notepad_list.php:2
+#: templates/notepad_list.php:2 notepads/index.php:37
 msgid "Manage Notepads"
 msgstr "Spravova» poznámkové bloky"
 
@@ -263,14 +254,10 @@ msgstr "Moje pozn
 msgid "My Notes"
 msgstr "Moje poznámky"
 
-#: lib/Forms/CreateNotepad.php:36 lib/Forms/EditNotepad.php:43
+#: lib/Forms/EditNotepad.php:43 lib/Forms/CreateNotepad.php:36
 msgid "Name"
 msgstr "Meno"
 
-#: templates/notepads/notepads.inc:53
-msgid "Name:"
-msgstr "Meno:"
-
 #: memo.php:57 lib/Block/tree_menu.php:23
 msgid "New Note"
 msgstr "Nová poznámka"
@@ -279,7 +266,7 @@ msgstr "Nov
 msgid "Next"
 msgstr "Ïalej"
 
-#: lib/api.php:286
+#: lib/api.php:337
 msgid "No iCalendar data was found."
 msgstr "Neboli nájdené ¾iadne údaje iCalendar."
 
@@ -291,7 +278,7 @@ msgstr "
 msgid "No notes match the current criteria."
 msgstr "®iadne poznámky nevyhovujú aktuálnym kritériám."
 
-#: lib/Block/summary.php:101
+#: lib/Block/summary.php:112
 msgid "No notes to display"
 msgstr "®iadne poznámky na zobrazenie"
 
@@ -311,10 +298,6 @@ msgstr "Kateg
 msgid "Note Details"
 msgstr "Detaily poznámky"
 
-#: notepads.php:113
-msgid "Note Lists"
-msgstr "Zoznamy poznámkových blokov"
-
 #: config/prefs.php.dist:58
 msgid "Note Text"
 msgstr "Text poznámky"
@@ -331,34 +314,25 @@ msgstr "Pozn
 msgid "Note_pad"
 msgstr "_Poznámkový blok"
 
-#: templates/notepad_list.php:15 templates/list/memo_headers.inc:33
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
 #: config/prefs.php.dist:60
 msgid "Notepad"
 msgstr "Poznámkový blok"
 
-#: templates/notepad_list.php:12
+#: templates/notepad_list.php:14
 msgid "Notepad List"
 msgstr "Zoznam poznámkových blokov"
 
 #: templates/panel.inc:32 templates/panel.inc:33
-#: templates/notepads/notepads.inc:42
 msgid "Notepads"
 msgstr "Poznámkové bloky"
 
-#: notepads.php:32
-msgid "Notepads must have a name."
-msgstr "Poznámkové bloky musia ma» názov."
-
-#: templates/notepads/notepads.inc:45
-msgid "Notepads:"
-msgstr "Poznámkové bloky:"
-
 #: lib/Block/summary.php:3
 msgid "Notes Summary"
 msgstr "Súhrn poznámok"
 
-#: lib/api.php:161 lib/api.php:201 lib/api.php:234 lib/api.php:264
-#: lib/api.php:351 lib/api.php:410 lib/api.php:439
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "Prístup zamietnutý"
 
@@ -366,10 +340,6 @@ msgstr "Pr
 msgid "Permission denied"
 msgstr "Prístup zamietnutý"
 
-#: templates/notepads/notepads.inc:56
-msgid "Permissions"
-msgstr "Práva"
-
 #: lib/Forms/DeleteNotepad.php:43
 #, php-format
 msgid ""
@@ -405,10 +375,6 @@ msgstr "V
 msgid "Search for Notepads:"
 msgstr "Hµada» poznámkové bloky:"
 
-#: templates/notepads/notepads.inc:47
-msgid "Select a notepad"
-msgstr "Vyberte poznámkový blok"
-
 #: templates/data/export.inc:9
 msgid "Select the export format:"
 msgstr "Vyberte formát exportu:"
@@ -429,11 +395,11 @@ msgstr "Zdie
 msgid "Should the Notepad be shown in its own column in the List view?"
 msgstr "Má by» poznámkový blok zobrazený vo vlastnom ståpci v prehµade?"
 
-#: lib/Block/summary.php:34
+#: lib/Block/summary.php:35
 msgid "Show action buttons?"
 msgstr "Zobrazi» tlaèidlá akcií?"
 
-#: lib/Block/summary.php:37
+#: lib/Block/summary.php:39
 msgid "Show notepad name?"
 msgstr "Zobrazi» meno poznámkového bloku?"
 
@@ -441,7 +407,7 @@ msgstr "Zobrazi
 msgid "Show notepad options panel?"
 msgstr "Zobrazi» panel s nastaveniami poznámkového bloku?"
 
-#: lib/Block/summary.php:40
+#: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "Zobrazi» poznámky z týchto kategórií"
 
@@ -457,7 +423,7 @@ msgstr "Triedi
 msgid "Sort by Notepad"
 msgstr "Triedi» podµa poznámkového bloku"
 
-#: memo.php:175
+#: memo.php:174
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "Úspe¹ne ulo¾ené: \"%s\"."
@@ -476,21 +442,16 @@ msgstr "Backend pre pozn
 msgid "The Notes backend is not currently available: %s"
 msgstr "Backend pre poznámky nie je k dispozícii: %s"
 
-#: memo.php:198
+#: memo.php:197
 msgid "The note was deleted."
 msgstr "Poznámka bola vymazaná."
 
-#: notepads.php:45 notepads.php:56
-#, php-format
-msgid "The notepad \"%s\" couldn't be created: %s"
-msgstr "Poznámkový blok \"%s\" sa nepodarilo vytvori»: %s"
-
-#: notepads.php:47 notepads/create.php:31
+#: notepads/create.php:31
 #, php-format
 msgid "The notepad \"%s\" has been created."
 msgstr "Poznámkový blok \"%s\" bol vytvorený."
 
-#: notepads.php:88 notepads/delete.php:48
+#: notepads/delete.php:48
 #, php-format
 msgid "The notepad \"%s\" has been deleted."
 msgstr "Poznámkový blok \"%s\" bol vymazaný."
@@ -500,7 +461,7 @@ msgstr "Pozn
 msgid "The notepad \"%s\" has been renamed to \"%s\"."
 msgstr "Poznámkový blok \"%s\" bol premenovaný na \"%s\"."
 
-#: notepads.php:58 notepads/edit.php:44
+#: notepads/edit.php:44
 #, php-format
 msgid "The notepad \"%s\" has been saved."
 msgstr "Poznámkový blok \"%s\" bol ulo¾ený."
@@ -510,20 +471,26 @@ msgstr "Pozn
 msgid "There was an error importing the data: %s"
 msgstr "Nastala chyba pri importe údajov: %s"
 
-#: lib/api.php:280
+#: lib/api.php:331
 msgid "There was an error importing the iCalendar data."
 msgstr "Nastala chyba pri importe údajov iCalendar."
 
-#: lib/api.php:458
+#: lib/api.php:518
 msgid "There was an error importing the vNote data."
 msgstr "Nastala chyba pri importe údajov vNote."
 
-#: memo.php:196
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr ""
+"Nastala chyba pri odstraòovaní poznámky pre %s. Podrobnosti boli zaznamenané."
+
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "Nastala chyba pri odstraòovaní poznámky: %s"
 
-#: memo.php:173
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Nastala chyba pri ukladaní poznámky: %s"
@@ -549,8 +516,8 @@ msgstr "T
 msgid "This note has been encrypted, please provide the password below."
 msgstr "Táto poznámka bola za¹ifrovaná, prosím zadajte heslo ni¾¹ie."
 
-#: view.php:100 view.php:108 memo.php:80 memo.php:88 lib/Driver/sql.php:448
-#: lib/Driver/kolab.php:766
+#: view.php:100 view.php:108 memo.php:80 memo.php:88 lib/api.php:408
+#: lib/Driver/kolab.php:766 lib/Driver/sql.php:458
 msgid "This note has been encrypted."
 msgstr "Táto poznámka bola za¹ifrovaná."
 
@@ -558,7 +525,7 @@ msgstr "T
 msgid "This notepad cannot be deleted"
 msgstr "Tento poznámkový blok nemô¾e by» vymazaný."
 
-#: notepads.php:83 lib/Forms/DeleteNotepad.php:63
+#: lib/Forms/DeleteNotepad.php:63
 #, php-format
 msgid "Unable to delete \"%s\": %s"
 msgstr "Nepodarilo sa vymaza» \"%s\": %s"
@@ -575,11 +542,11 @@ msgstr "Nepodarilo sa ulo
 
 #: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
 #: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
-#: lib/Block/summary.php:96
+#: lib/Block/summary.php:107
 msgid "Unfiled"
 msgstr "Nenastavená"
 
-#: lib/api.php:316 lib/api.php:373 lib/api.php:466
+#: lib/api.php:367 lib/api.php:433 lib/api.php:526
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "Nepodporovaný typ obsahu (Content-Type): %s"
@@ -601,15 +568,15 @@ msgstr "Nem
 msgid "You are not allowed to delete this notepad."
 msgstr "Nemáte právo na zmazanie tohto poznámkového bloku."
 
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "Nemáte právo na vymazanie pou¾ívateµských údajov."
+
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
 msgstr "Nemáte právo na zobrazenie poznámkového bloku %s."
 
-#: notepads.php:68
-msgid "You must select a notepad to be deleted."
-msgstr "Musíte oznaèi» poznámkový blok, ktorý má by» vymazaný."
-
 #: templates/prefs/notepadselect.inc:10
 msgid "Your default notepad:"
 msgstr "Prednastavený poznámkový blok:"
diff --git a/po/sl_SI.po b/po/sl_SI.po
index cc54238..5d7941d 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
@@ -1,6 +1,6 @@
 # Slovenian translations for mnemo packaga
 # Slovenski prevod mnemo paketa
-# Copyright (C) 2006 Horde Project
+# Copyright 2006-2009 The Horde Project
 # This file is distributed under the same license as the horde package.
 # Automatically generated, 2006.
 #
diff --git a/po/sv_SE.po b/po/sv_SE.po
index 1485d3d..34d8fad 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
@@ -1,5 +1,5 @@
 # Swedish translations for Mnemo package.
-# Copyright (C) 2005 Horde Project
+# Copyright 2005-2009 The Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # Andreas Dahlen <andreas at dahlen.ws>, 2002-2005.
 #
diff --git a/po/tr_TR.po b/po/tr_TR.po
index bbb98f3..206ee10 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -1,6 +1,6 @@
 # Turkish translations for Mnemo package
 # Not defteri paketi için Türkçe çeviriler.
-# Copyright (C) 2008 Horde Project
+# Copyright 2008-2009 The Horde Project
 # This file is distributed under the same license as the Mnemo package.
 # horde-tr at metu.edu.tr, 2007-2008.
 #
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 0022de7..5008c22 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -1,5 +1,5 @@
 # Mnemo Simplified Chinese Translation
-# Copyright (C) 2002 Peter Wang
+# Copyright 2002 Peter Wang
 # Peter Wang <whw at oulink.net>, 2002
 #
 msgid ""
diff --git a/po/zh_TW.po b/po/zh_TW.po
index df428ae..b9b9cc6 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -1,12 +1,12 @@
 # MNEMO Traditional Chinese Translation
-# Copyright (C) 2002 David Chang.±i¨}¤å,¥xÆW
+# Copyright 2002 David Chang.±i¨}¤å,¥xÆW
 # David Chang <david at tmv.gov.tw>, 2002.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Mnemo 2.2\n"
 "Report-Msgid-Bugs-To: dev at lists.horde.org\n"
-"POT-Creation-Date: 2008-05-11 18:39+0800\n"
+"POT-Creation-Date: 2008-12-15 13:56+0800\n"
 "PO-Revision-Date: 2008-03-28 12:00+0800\n"
 "Last-Translator: David Chang <david at tmv.gov.tw>\n"
 "Language-Team: Traditional Chinese <i18n at lists.horde.org>\n"
@@ -30,11 +30,11 @@ msgstr "
 msgid "%s's Notepad"
 msgstr "%sªº³Æ§Ñ¿ý"
 
-#: memo.php:201
+#: memo.php:200
 msgid "Access denied deleting note."
 msgstr "§R°£ºK­n®É,¦s¨ú¾D©Ú."
 
-#: memo.php:150 memo.php:153
+#: memo.php:143 memo.php:146
 msgid "Access denied moving the note."
 msgstr "·h²¾¦¹ºK­n®É,¦s¨ú¾D©Ú."
 
@@ -64,7 +64,7 @@ msgstr "
 msgid "Category"
 msgstr "¤ÀÃþ"
 
-#: notepads/index.php:32 templates/notepad_list.php:31
+#: notepads/index.php:32 templates/notepad_list.php:29
 msgid "Change Permissions"
 msgstr "Åܧó¦s¨ú¼Ò¦¡"
 
@@ -88,7 +88,7 @@ msgstr "
 msgid "Create Notepad"
 msgstr "«Ø¥ß³Æ§Ñ¿ý"
 
-#: templates/notepad_list.php:8
+#: templates/notepad_list.php:9
 msgid "Create a new Notepad"
 msgstr "«Ø¥ß·sªº³Æ§Ñ¿ý"
 
@@ -112,8 +112,8 @@ msgstr "
 msgid "Default sorting direction:"
 msgstr "¹w³]ªº±Æ§Ç¤è¦V:"
 
-#: notepads/index.php:33 templates/notepad_list.php:33
-#: templates/view/memo.inc:16 lib/Forms/DeleteNotepad.php:45
+#: lib/Forms/DeleteNotepad.php:45 notepads/index.php:33
+#: templates/notepad_list.php:31 templates/view/memo.inc:16
 msgid "Delete"
 msgstr "§R°£"
 
@@ -155,7 +155,7 @@ msgstr "
 msgid "Do you want to confirm deleting entries?"
 msgstr "§A½T©w­n§R°£°O¿ý¶Ü?"
 
-#: notepads/index.php:31 templates/notepad_list.php:29
+#: notepads/index.php:31 templates/notepad_list.php:27
 #: templates/view/memo.inc:13
 msgid "Edit"
 msgstr "½s¿è"
@@ -170,7 +170,8 @@ msgstr "
 msgid "Edit %s"
 msgstr "½s¿è %s"
 
-#: templates/list/memo_headers.inc:30 lib/Block/summary.php:74
+#: lib/Block/summary.php:79 lib/Block/summary.php:80
+#: templates/list/memo_headers.inc:30
 msgid "Edit Note"
 msgstr "½s¿èºK­n"
 
@@ -183,7 +184,7 @@ msgstr "
 msgid "Edit: %s"
 msgstr "½s¿è: %s"
 
-#: templates/list/memo_summaries.inc:15 lib/Block/summary.php:93
+#: lib/Block/summary.php:104 templates/list/memo_summaries.inc:15
 msgid "Empty Note"
 msgstr "²MªÅºK­n"
 
@@ -262,7 +263,7 @@ msgstr "
 msgid "Next"
 msgstr "¤U¤@¨B"
 
-#: lib/api.php:286
+#: lib/api.php:337
 msgid "No iCalendar data was found."
 msgstr "§ä¤£¨ì iCalendar ¸ê®Æ."
 
@@ -274,7 +275,7 @@ msgstr "
 msgid "No notes match the current criteria."
 msgstr "¨S¦³ºK­n²Å¦X·j´M±ø¥ó."
 
-#: lib/Block/summary.php:101
+#: lib/Block/summary.php:112
 msgid "No notes to display"
 msgstr "µLºK­n¥i¨ÑÅã¥Ü"
 
@@ -310,12 +311,12 @@ msgstr "
 msgid "Note_pad"
 msgstr "³Æ§Ñ¿ý_p"
 
-#: templates/notepad_list.php:15 templates/list/memo_headers.inc:33
+#: templates/notepad_list.php:17 templates/list/memo_headers.inc:33
 #: config/prefs.php.dist:60
 msgid "Notepad"
 msgstr "³Æ§Ñ¿ý"
 
-#: templates/notepad_list.php:12
+#: templates/notepad_list.php:14
 msgid "Notepad List"
 msgstr "ÂsÄý"
 
@@ -327,8 +328,8 @@ msgstr "
 msgid "Notes Summary"
 msgstr "ºK­n¤ÀÃþ"
 
-#: lib/api.php:161 lib/api.php:201 lib/api.php:234 lib/api.php:264
-#: lib/api.php:351 lib/api.php:410 lib/api.php:439
+#: lib/api.php:212 lib/api.php:252 lib/api.php:285 lib/api.php:315
+#: lib/api.php:402 lib/api.php:470 lib/api.php:499
 msgid "Permission Denied"
 msgstr "¦s¨ú¾D©Ú"
 
@@ -349,8 +350,8 @@ msgstr ""
 msgid "Really delete this note?"
 msgstr "½T©w§R°£¦¹ºK­n?"
 
-#: templates/panel.inc:68 templates/memo/memo.inc:57
-#: lib/Forms/EditNotepad.php:46
+#: lib/Forms/EditNotepad.php:46 templates/panel.inc:68
+#: templates/memo/memo.inc:57
 msgid "Save"
 msgstr "Àx¦s"
 
@@ -358,8 +359,8 @@ msgstr "
 msgid "Save as PDF"
 msgstr "Àx¦s¬° PDF ÀÉ®×"
 
-#: search.php:17 templates/search/search.inc:4 templates/search/search.inc:27
-#: templates/list/header.inc:4 lib/Block/tree_menu.php:44
+#: search.php:17 lib/Block/tree_menu.php:44 templates/search/search.inc:4
+#: templates/search/search.inc:27 templates/list/header.inc:4
 msgid "Search"
 msgstr "·j´M"
 
@@ -391,11 +392,11 @@ msgstr "
 msgid "Should the Notepad be shown in its own column in the List view?"
 msgstr "¦b¦C¥XºK­nªºµe­±¤¤Åã¥Ü³Æ§Ñ¿ý¦WºÙ?"
 
-#: lib/Block/summary.php:34
+#: lib/Block/summary.php:35
 msgid "Show action buttons?"
 msgstr "Åã¥Ü§@¥Î«ö¶s?"
 
-#: lib/Block/summary.php:37
+#: lib/Block/summary.php:39
 msgid "Show notepad name?"
 msgstr "Åã¥Ü³Æ§Ñ¿ý¦WºÙ?"
 
@@ -403,7 +404,7 @@ msgstr "
 msgid "Show notepad options panel?"
 msgstr "Åã¥Ü¶i¶¥¥\¯à­±ªO?"
 
-#: lib/Block/summary.php:40
+#: lib/Block/summary.php:43
 msgid "Show notes from these categories"
 msgstr "±q³o¨Ç¤ÀÃþÅã¥ÜºK­n"
 
@@ -419,7 +420,7 @@ msgstr "
 msgid "Sort by Notepad"
 msgstr "¥H³Æ§Ñ¿ý±Æ¦C"
 
-#: memo.php:175
+#: memo.php:174
 #, php-format
 msgid "Successfully saved \"%s\"."
 msgstr "\"%s\"¤wÀx¦s§¹¦¨."
@@ -438,7 +439,7 @@ msgstr "
 msgid "The Notes backend is not currently available: %s"
 msgstr "¥Ø«e¨S¦³¥i¥Îªº³Æ§Ñ¿ý¦øªAºÝ: %s"
 
-#: memo.php:198
+#: memo.php:197
 msgid "The note was deleted."
 msgstr "ºK­n¤w§R°£."
 
@@ -467,20 +468,25 @@ msgstr "
 msgid "There was an error importing the data: %s"
 msgstr "¶×¤J³o­Ó¸ê®Æ: %s ®Éµo¥Í¤@­Ó¿ù»~"
 
-#: lib/api.php:280
+#: lib/api.php:331
 msgid "There was an error importing the iCalendar data."
 msgstr "¶×¤J iCalendar ¸ê®Æ®Éµo¥Í¤@­Ó¿ù»~."
 
-#: lib/api.php:458
+#: lib/api.php:518
 msgid "There was an error importing the vNote data."
 msgstr "¶×¤J vNote ¸ê®Æ®Éµo¥Í¤@­Ó¿ù»~."
 
-#: memo.php:196
+#: lib/api.php:168
+#, php-format
+msgid "There was an error removing notes for %s. Details have been logged."
+msgstr "¦Û %s ²¾°£ºK­n®Éµo¥Í¤@­Ó¿ù»~. ²Ó¸`¤wµn¸ü."
+
+#: memo.php:195
 #, php-format
 msgid "There was an error removing the note: %s"
 msgstr "²¾°£ºK­n: %s ®Éµo¥Í¤@­Ó¿ù»~."
 
-#: memo.php:173
+#: memo.php:172
 #, php-format
 msgid "There was an error saving the note: %s"
 msgstr "Àx¦sºK­n: %s ®Éµo¥Í¤@­Ó¿ù»~."
@@ -506,8 +512,8 @@ msgstr "
 msgid "This note has been encrypted, please provide the password below."
 msgstr "¦¹ºK­n¤w³Q¥[±K³B²z, ½Ð©ó¤U¤è¿é¤J±K½X."
 
-#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/Driver/kolab.php:766
-#: lib/Driver/sql.php:448
+#: memo.php:80 memo.php:88 view.php:100 view.php:108 lib/api.php:408
+#: lib/Driver/sql.php:458 lib/Driver/kolab.php:766
 msgid "This note has been encrypted."
 msgstr "¦¹ºK­n¤w³Q¥[±K³B²z."
 
@@ -530,13 +536,13 @@ msgstr "
 msgid "Unable to save notepad \"%s\": %s"
 msgstr "µLªkÀx¦s³Æ§Ñ¿ý \"%s\": %s"
 
-#: templates/view/memo.inc:27 templates/list/memo_summaries.inc:17
 #: lib/Mnemo.php:267 lib/Mnemo.php:268 lib/Mnemo.php:282 lib/Mnemo.php:283
-#: lib/Block/summary.php:96
+#: lib/Block/summary.php:107 templates/list/memo_summaries.inc:17
+#: templates/view/memo.inc:27
 msgid "Unfiled"
 msgstr "¥¼¤ÀÃþ"
 
-#: lib/api.php:316 lib/api.php:373 lib/api.php:466
+#: lib/api.php:367 lib/api.php:433 lib/api.php:526
 #, php-format
 msgid "Unsupported Content-Type: %s"
 msgstr "¥¼¤ä´©ªº¤º®e«¬ºA: %s. (Unsupported Content-Type)"
@@ -549,7 +555,7 @@ msgstr "
 msgid "You are not allowed to change this notepad."
 msgstr "§A¨S¦³Åܧ󦹳ƧѿýªºÅv­­."
 
-#: data.php:42 data.php:129 memo.php:37
+#: memo.php:37 data.php:42 data.php:129
 #, php-format
 msgid "You are not allowed to create more than %d notes."
 msgstr "§A¨S¦³«Ø¥ß¶W¹L %d ­ÓºK­nªºÅv­­."
@@ -558,6 +564,10 @@ msgstr "
 msgid "You are not allowed to delete this notepad."
 msgstr "§A¨S¦³§R°£¦¹³Æ§Ñ¿ýªºÅv­­."
 
+#: lib/api.php:100
+msgid "You are not allowed to remove user data."
+msgstr "§A¨S¦³²¾°£¥Î¤á¸ê®ÆªºÅv­­."
+
 #: view.php:49 note/pdf.php:50
 #, php-format
 msgid "You do not have permission to view the notepad %s."
@@ -575,7 +585,7 @@ msgstr "[
 msgid "_Body"
 msgstr "¤º®e_B"
 
-#: templates/memo/memo.inc:70 templates/list/memo_headers.inc:41
+#: templates/list/memo_headers.inc:41 templates/memo/memo.inc:70
 msgid "_Category"
 msgstr "¤ÀÃþ_C"
 
diff --git a/pref_api.php b/pref_api.php
index 6a91cf0..c0732a6 100644
--- a/pref_api.php
+++ b/pref_api.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/pref_api.php,v 1.1.2.4 2008/01/02 11:32:26 jan Exp $
+ * $Horde: mnemo/pref_api.php,v 1.1.2.5 2009-01-06 15:24:57 jan Exp $
  *
- * Copyright 2006-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2006-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file COPYING for license information (LGPL). If you
  * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
diff --git a/scripts/import_text_note.php b/scripts/import_text_note.php
index 7e8b1b7..4af0875 100755
--- a/scripts/import_text_note.php
+++ b/scripts/import_text_note.php
@@ -5,9 +5,9 @@
  * The data is read from standard input, the notepad and user name passed as
  * parameters.
  *
- * $Horde: mnemo/scripts/import_text_note.php,v 1.1.2.1 2008/06/24 19:35:37 chuck Exp $
+ * $Horde: mnemo/scripts/import_text_note.php,v 1.1.2.2 2009-01-06 15:25:03 jan Exp $
  *
- * Copyright 2005-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2005-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/scripts/import_vnotes.php b/scripts/import_vnotes.php
index de2ea9c..07e76b6 100755
--- a/scripts/import_vnotes.php
+++ b/scripts/import_vnotes.php
@@ -5,9 +5,9 @@
  * The data is read from standard input, the notepad and user name passed as
  * parameters.
  *
- * $Horde: mnemo/scripts/import_vnotes.php,v 1.3.2.5 2008/01/02 11:32:28 jan Exp $
+ * $Horde: mnemo/scripts/import_vnotes.php,v 1.3.2.6 2009-01-06 15:25:03 jan Exp $
  *
- * Copyright 2005-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2005-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/scripts/sql/mnemo.mssql.sql b/scripts/sql/mnemo.mssql.sql
index 7528156..fc386dc 100644
--- a/scripts/sql/mnemo.mssql.sql
+++ b/scripts/sql/mnemo.mssql.sql
@@ -1,4 +1,4 @@
--- $Horde: mnemo/scripts/sql/mnemo.mssql.sql,v 1.1.2.5 2008/06/18 00:42:10 mrubinsk Exp $
+-- $Horde: mnemo/scripts/sql/mnemo.mssql.sql,v 1.1.2.8 2009-10-20 21:44:35 jan Exp $
 
 CREATE TABLE mnemo_memos (
     memo_owner      VARCHAR(255) NOT NULL,
@@ -18,11 +18,11 @@ CREATE INDEX mnemo_uid_idx ON mnemo_memos (memo_uid);
 CREATE TABLE mnemo_shares (
     share_id INT NOT NULL,
     share_name VARCHAR(255) NOT NULL,
-    share_owner VARCHAR(32) NOT NULL,
-    share_flags SMALLINT NOT NULL DEFAULT 0,
-    perm_creator SMALLINT NOT NULL DEFAULT 0,
-    perm_default SMALLINT NOT NULL DEFAULT 0,
-    perm_guest SMALLINT NOT NULL DEFAULT 0,
+    share_owner VARCHAR(255) NOT NULL,
+    share_flags SMALLINT DEFAULT 0 NOT NULL,
+    perm_creator SMALLINT DEFAULT 0 NOT NULL,
+    perm_default SMALLINT DEFAULT 0 NOT NULL,
+    perm_guest SMALLINT DEFAULT 0 NOT NULL,
     attribute_name VARCHAR(255) NOT NULL,
     attribute_desc VARCHAR(255),
     PRIMARY KEY (share_id)
@@ -36,7 +36,7 @@ CREATE INDEX mnemo_shares_perm_guest_idx ON mnemo_shares (perm_guest);
 
 CREATE TABLE mnemo_shares_groups (
     share_id INT NOT NULL,
-    group_uid INT NOT NULL,
+    group_uid VARCHAR(255) NOT NULL,
     perm SMALLINT NOT NULL
 );
 
diff --git a/scripts/sql/mnemo.oci8.sql b/scripts/sql/mnemo.oci8.sql
index 91ff46b..c46f156 100644
--- a/scripts/sql/mnemo.oci8.sql
+++ b/scripts/sql/mnemo.oci8.sql
@@ -1,4 +1,4 @@
--- $Horde: mnemo/scripts/sql/mnemo.oci8.sql,v 1.1.2.7 2008/06/18 00:42:10 mrubinsk Exp $
+-- $Horde: mnemo/scripts/sql/mnemo.oci8.sql,v 1.1.2.12 2009-10-20 21:44:35 jan Exp $
 
 CREATE TABLE mnemo_memos (
     memo_owner      VARCHAR2(255) NOT NULL,
@@ -7,7 +7,7 @@ CREATE TABLE mnemo_memos (
     memo_desc       VARCHAR2(64) NOT NULL,
     memo_body       VARCHAR2(4000),
     memo_category   VARCHAR2(80),
-    memo_private    NUMBER(6) DEFAULT 0 NOT NULL,
+    memo_private    NUMBER(1) DEFAULT 0 NOT NULL,
 --
     PRIMARY KEY (memo_owner, memo_id)
 );
@@ -16,40 +16,40 @@ CREATE INDEX mnemo_notepad_idx ON mnemo_memos (memo_owner);
 CREATE INDEX mnemo_uid_idx ON mnemo_memos (memo_uid);
 
 CREATE TABLE mnemo_shares (
-    share_id INT NOT NULL,
+    share_id NUMBER(16) NOT NULL,
     share_name VARCHAR2(255) NOT NULL,
-    share_owner VARCHAR2(32) NOT NULL,
-    share_flags SMALLINT NOT NULL DEFAULT 0,
-    perm_creator SMALLINT NOT NULL DEFAULT 0,
-    perm_default SMALLINT NOT NULL DEFAULT 0,
-    perm_guest SMALLINT NOT NULL DEFAULT 0,
+    share_owner VARCHAR2(255) NOT NULL,
+    share_flags NUMBER(8) DEFAULT 0 NOT NULL,
+    perm_creator NUMBER(8) DEFAULT 0 NOT NULL,
+    perm_default NUMBER(8) DEFAULT 0 NOT NULL,
+    perm_guest NUMBER(8) DEFAULT 0 NOT NULL,
     attribute_name VARCHAR2(255) NOT NULL,
     attribute_desc VARCHAR2(255),
     PRIMARY KEY (share_id)
 );
 
-CREATE INDEX mnemo_shares_share_name_idx ON mnemo_shares (share_name);
-CREATE INDEX mnemo_shares_share_owner_idx ON mnemo_shares (share_owner);
-CREATE INDEX mnemo_shares_perm_creator_idx ON mnemo_shares (perm_creator);
-CREATE INDEX mnemo_shares_perm_default_idx ON mnemo_shares (perm_default);
-CREATE INDEX mnemo_shares_perm_guest_idx ON mnemo_shares (perm_guest);
+CREATE INDEX mnemo_shares_name_idx ON mnemo_shares (share_name);
+CREATE INDEX mnemo_shares_owner_idx ON mnemo_shares (share_owner);
+CREATE INDEX mnemo_shares_creator_idx ON mnemo_shares (perm_creator);
+CREATE INDEX mnemo_shares_default_idx ON mnemo_shares (perm_default);
+CREATE INDEX mnemo_shares_guest_idx ON mnemo_shares (perm_guest);
 
 CREATE TABLE mnemo_shares_groups (
-    share_id INT NOT NULL,
-    group_uid INT NOT NULL,
-    perm SMALLINT NOT NULL
+    share_id NUMBER(16) NOT NULL,
+    group_uid VARCHAR2(255) NOT NULL,
+    perm NUMBER(8) NOT NULL
 );
 
-CREATE INDEX mnemo_shares_groups_share_id_idx ON mnemo_shares_groups (share_id);
-CREATE INDEX mnemo_shares_groups_group_uid_idx ON mnemo_shares_groups (group_uid);
-CREATE INDEX mnemo_shares_groups_perm_idx ON mnemo_shares_groups (perm);
+CREATE INDEX mnemo_groups_share_id_idx ON mnemo_shares_groups (share_id);
+CREATE INDEX mnemo_groups_group_uid_idx ON mnemo_shares_groups (group_uid);
+CREATE INDEX mnemo_groups_perm_idx ON mnemo_shares_groups (perm);
 
 CREATE TABLE mnemo_shares_users (
-    share_id INT NOT NULL,
+    share_id NUMBER(16) NOT NULL,
     user_uid VARCHAR2(255) NOT NULL,
-    perm SMALLINT NOT NULL
+    perm NUMBER(8) NOT NULL
 );
 
-CREATE INDEX mnemo_shares_users_share_id_idx ON mnemo_shares_users (share_id);
-CREATE INDEX mnemo_shares_users_user_uid_idx ON mnemo_shares_users (user_uid);
-CREATE INDEX mnemo_shares_users_perm_idx ON mnemo_shares_users (perm);
+CREATE INDEX mnemo_users_share_id_idx ON mnemo_shares_users (share_id);
+CREATE INDEX mnemo_users_user_uid_idx ON mnemo_shares_users (user_uid);
+CREATE INDEX mnemo_users_perm_idx ON mnemo_shares_users (perm);
diff --git a/scripts/sql/mnemo.sql b/scripts/sql/mnemo.sql
index e07b1f3..9eec1c8 100644
--- a/scripts/sql/mnemo.sql
+++ b/scripts/sql/mnemo.sql
@@ -1,4 +1,4 @@
--- $Horde: mnemo/scripts/sql/mnemo.sql,v 1.5.2.5 2008/06/18 00:42:10 mrubinsk Exp $
+-- $Horde: mnemo/scripts/sql/mnemo.sql,v 1.5.2.8 2009-10-20 21:44:35 jan Exp $
 
 CREATE TABLE mnemo_memos (
     memo_owner      VARCHAR(255) NOT NULL,
@@ -18,11 +18,11 @@ CREATE INDEX mnemo_uid_idx ON mnemo_memos (memo_uid);
 CREATE TABLE mnemo_shares (
     share_id INT NOT NULL,
     share_name VARCHAR(255) NOT NULL,
-    share_owner VARCHAR(32) NOT NULL,
-    share_flags SMALLINT NOT NULL DEFAULT 0,
-    perm_creator SMALLINT NOT NULL DEFAULT 0,
-    perm_default SMALLINT NOT NULL DEFAULT 0,
-    perm_guest SMALLINT NOT NULL DEFAULT 0,
+    share_owner VARCHAR(255) NOT NULL,
+    share_flags SMALLINT DEFAULT 0 NOT NULL,
+    perm_creator SMALLINT DEFAULT 0 NOT NULL,
+    perm_default SMALLINT DEFAULT 0 NOT NULL,
+    perm_guest SMALLINT DEFAULT 0 NOT NULL,
     attribute_name VARCHAR(255) NOT NULL,
     attribute_desc VARCHAR(255),
     PRIMARY KEY (share_id)
@@ -36,7 +36,7 @@ CREATE INDEX mnemo_shares_perm_guest_idx ON mnemo_shares (perm_guest);
 
 CREATE TABLE mnemo_shares_groups (
     share_id INT NOT NULL,
-    group_uid INT NOT NULL,
+    group_uid VARCHAR(255) NOT NULL,
     perm SMALLINT NOT NULL
 );
 
diff --git a/scripts/sql/mnemo.xml b/scripts/sql/mnemo.xml
index 332b43e..8000746 100644
--- a/scripts/sql/mnemo.xml
+++ b/scripts/sql/mnemo.xml
@@ -116,7 +116,7 @@
     <type>text</type>
     <default></default>
     <notnull>true</notnull>
-    <length>32</length>
+    <length>255</length>
    </field>
 
    <field>
@@ -168,7 +168,7 @@
    </field>
 
    <index>
-    <name>mnemo_shares_share_name</name>
+    <name>mnemo_shares_name</name>
     <field>
      <name>share_name</name>
      <sorting>ascending</sorting>
@@ -176,7 +176,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_share_owner</name>
+    <name>mnemo_shares_owner</name>
     <field>
      <name>share_owner</name>
      <sorting>ascending</sorting>
@@ -184,7 +184,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_perm_creator</name>
+    <name>mnemo_shares_creator</name>
     <field>
      <name>perm_creator</name>
      <sorting>ascending</sorting>
@@ -192,7 +192,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_perm_default</name>
+    <name>mnemo_shares_default</name>
     <field>
      <name>perm_default</name>
      <sorting>ascending</sorting>
@@ -200,7 +200,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_perm_guest</name>
+    <name>mnemo_shares_guest</name>
     <field>
      <name>perm_guest</name>
      <sorting>ascending</sorting>
@@ -236,10 +236,10 @@
 
    <field>
     <name>group_uid</name>
-    <type>integer</type>
+    <type>text</type>
     <default></default>
     <notnull>true</notnull>
-    <length>4</length>
+    <length>255</length>
    </field>
 
    <field>
@@ -251,7 +251,7 @@
    </field>
 
    <index>
-    <name>mnemo_shares_groups_share_id</name>
+    <name>mnemo_groups_share_id</name>
     <field>
      <name>share_id</name>
      <sorting>ascending</sorting>
@@ -259,7 +259,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_groups_group_uid</name>
+    <name>mnemo_groups_group_uid</name>
     <field>
      <name>group_uid</name>
      <sorting>ascending</sorting>
@@ -267,7 +267,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_groups_perm</name>
+    <name>mnemo_groups_perm</name>
     <field>
      <name>perm</name>
      <sorting>ascending</sorting>
@@ -309,7 +309,7 @@
    </field>
 
    <index>
-    <name>mnemo_shares_users_share_id</name>
+    <name>mnemo_users_share_id</name>
     <field>
      <name>share_id</name>
      <sorting>ascending</sorting>
@@ -317,7 +317,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_users_user_uid</name>
+    <name>mnemo_users_user_uid</name>
     <field>
      <name>user_uid</name>
      <sorting>ascending</sorting>
@@ -325,7 +325,7 @@
    </index>
 
    <index>
-    <name>mnemo_shares_users_perm</name>
+    <name>mnemo_users_perm</name>
     <field>
      <name>perm</name>
      <sorting>ascending</sorting>
diff --git a/scripts/upgrades/1.1_to_2.0.mysql.sql b/scripts/upgrades/1.1_to_2.0.mysql.sql
index e2d8125..dcccb99 100644
--- a/scripts/upgrades/1.1_to_2.0.mysql.sql
+++ b/scripts/upgrades/1.1_to_2.0.mysql.sql
@@ -1,4 +1,4 @@
--- $Horde: mnemo/scripts/upgrades/1.1_to_2.0.mysql.sql,v 1.4 2004/12/21 15:26:47 chuck Exp $
+-- $Horde: mnemo/scripts/upgrades/1.1_to_2.0.mysql.sql,v 1.4.2.1 2009-10-20 21:44:35 jan Exp $
 --
 -- You can simply execute this file in your database.
 --
@@ -12,6 +12,6 @@ ALTER TABLE mnemo_memos ADD COLUMN memo_uid VARCHAR(255) NOT NULL;
 
 ALTER TABLE mnemo_memos CHANGE COLUMN memo_id memo_id VARCHAR(32) NOT NULL;
 ALTER TABLE mnemo_memos CHANGE COLUMN memo_category memo_category VARCHAR(80);
-ALTER TABLE mnemo_memos CHANGE COLUMN memo_private memo_private SMALLINT NOT NULL default 0;
+ALTER TABLE mnemo_memos CHANGE COLUMN memo_private memo_private SMALLINT DEFAULT 0 NOT NULL;
 
 CREATE INDEX mnemo_uid_idx ON mnemo_memos (memo_uid);
diff --git a/scripts/upgrades/1.1_to_2.0.pgsq.sql b/scripts/upgrades/1.1_to_2.0.pgsql.sql
similarity index 100%
rename from scripts/upgrades/1.1_to_2.0.pgsq.sql
rename to scripts/upgrades/1.1_to_2.0.pgsql.sql
diff --git a/scripts/upgrades/2.1_to_2.2.oci8.sql b/scripts/upgrades/2.1_to_2.2.oci8.sql
new file mode 100644
index 0000000..8d73a37
--- /dev/null
+++ b/scripts/upgrades/2.1_to_2.2.oci8.sql
@@ -0,0 +1,40 @@
+-- $Horde: mnemo/scripts/upgrades/2.1_to_2.2.oci8.sql,v 1.1.2.3 2009-10-20 21:44:35 jan Exp $
+
+CREATE TABLE mnemo_shares (
+    share_id NUMBER(16) NOT NULL,
+    share_name VARCHAR2(255) NOT NULL,
+    share_owner VARCHAR2(32) NOT NULL,
+    share_flags NUMBER(8) DEFAULT 0 NOT NULL,
+    perm_creator NUMBER(8) DEFAULT 0 NOT NULL,
+    perm_default NUMBER(8) DEFAULT 0 NOT NULL,
+    perm_guest NUMBER(8) DEFAULT 0 NOT NULL,
+    attribute_name VARCHAR2(255) NOT NULL,
+    attribute_desc VARCHAR2(255),
+    PRIMARY KEY (share_id)
+);
+
+CREATE INDEX mnemo_shares_name_idx ON mnemo_shares (share_name);
+CREATE INDEX mnemo_shares_owner_idx ON mnemo_shares (share_owner);
+CREATE INDEX mnemo_shares_creator_idx ON mnemo_shares (perm_creator);
+CREATE INDEX mnemo_shares_default_idx ON mnemo_shares (perm_default);
+CREATE INDEX mnemo_shares_guest_idx ON mnemo_shares (perm_guest);
+
+CREATE TABLE mnemo_shares_groups (
+    share_id NUMBER(16) NOT NULL,
+    group_uid NUMBER(16) NOT NULL,
+    perm NUMBER(8) NOT NULL
+);
+
+CREATE INDEX mnemo_groups_share_id_idx ON mnemo_shares_groups (share_id);
+CREATE INDEX mnemo_groups_group_uid_idx ON mnemo_shares_groups (group_uid);
+CREATE INDEX mnemo_groups_perm_idx ON mnemo_shares_groups (perm);
+
+CREATE TABLE mnemo_shares_users (
+    share_id NUMBER(16) NOT NULL,
+    user_uid VARCHAR2(32) NOT NULL,
+    perm NUMBER(8) NOT NULL
+);
+
+CREATE INDEX mnemo_users_share_id_idx ON mnemo_shares_users (share_id);
+CREATE INDEX mnemo_users_user_uid_idx ON mnemo_shares_users (user_uid);
+CREATE INDEX mnemo_users_perm_idx ON mnemo_shares_users (perm);
diff --git a/scripts/upgrades/2.1_to_2.2.sql b/scripts/upgrades/2.1_to_2.2.sql
index 8cfce3d..8e6f649 100644
--- a/scripts/upgrades/2.1_to_2.2.sql
+++ b/scripts/upgrades/2.1_to_2.2.sql
@@ -1,13 +1,13 @@
--- $Horde: mnemo/scripts/upgrades/2.1_to_2.2.sql,v 1.1.2.2 2008/04/29 19:33:22 chuck Exp $
+-- $Horde: mnemo/scripts/upgrades/2.1_to_2.2.sql,v 1.1.2.3 2009-10-20 21:44:35 jan Exp $
 
 CREATE TABLE mnemo_shares (
     share_id INT NOT NULL,
     share_name VARCHAR(255) NOT NULL,
     share_owner VARCHAR(32) NOT NULL,
-    share_flags SMALLINT NOT NULL DEFAULT 0,
-    perm_creator SMALLINT NOT NULL DEFAULT 0,
-    perm_default SMALLINT NOT NULL DEFAULT 0,
-    perm_guest SMALLINT NOT NULL DEFAULT 0,
+    share_flags SMALLINT DEFAULT 0 NOT NULL,
+    perm_creator SMALLINT DEFAULT 0 NOT NULL,
+    perm_default SMALLINT DEFAULT 0 NOT NULL,
+    perm_guest SMALLINT DEFAULT 0 NOT NULL,
     attribute_name VARCHAR(255) NOT NULL,
     attribute_desc VARCHAR(255),
     PRIMARY KEY (share_id)
diff --git a/scripts/upgrades/2.2.1_to_2.2.2.oci8.sql b/scripts/upgrades/2.2.1_to_2.2.2.oci8.sql
new file mode 100644
index 0000000..a89526b
--- /dev/null
+++ b/scripts/upgrades/2.2.1_to_2.2.2.oci8.sql
@@ -0,0 +1 @@
+ALTER TABLE mnemo_shares_groups MODIFY group_uid VARCHAR2(255);
diff --git a/scripts/upgrades/2.2.1_to_2.2.2.pgsql.sql b/scripts/upgrades/2.2.1_to_2.2.2.pgsql.sql
new file mode 100644
index 0000000..c1fe815
--- /dev/null
+++ b/scripts/upgrades/2.2.1_to_2.2.2.pgsql.sql
@@ -0,0 +1 @@
+ALTER TABLE mnemo_shares_groups ALTER group_uid TYPE VARCHAR(255);
diff --git a/scripts/upgrades/2.2.1_to_2.2.2.sql b/scripts/upgrades/2.2.1_to_2.2.2.sql
new file mode 100644
index 0000000..f46a8c6
--- /dev/null
+++ b/scripts/upgrades/2.2.1_to_2.2.2.sql
@@ -0,0 +1 @@
+ALTER TABLE mnemo_shares_groups CHANGE group_uid group_uid VARCHAR(255);
diff --git a/scripts/upgrades/2.2_to_2.2.1.oci8.sql b/scripts/upgrades/2.2_to_2.2.1.oci8.sql
new file mode 100644
index 0000000..02f1fa0
--- /dev/null
+++ b/scripts/upgrades/2.2_to_2.2.1.oci8.sql
@@ -0,0 +1,2 @@
+ALTER TABLE mnemo_shares MODIFY share_owner VARCHAR2(255);
+ALTER TABLE mnemo_shares_users MODIFY user_uid VARCHAR2(255);
diff --git a/scripts/upgrades/2.2_to_2.2.1.pgsql.sql b/scripts/upgrades/2.2_to_2.2.1.pgsql.sql
new file mode 100644
index 0000000..13d6efd
--- /dev/null
+++ b/scripts/upgrades/2.2_to_2.2.1.pgsql.sql
@@ -0,0 +1,2 @@
+ALTER TABLE mnemo_shares ALTER share_owner TYPE VARCHAR(255);
+ALTER TABLE mnemo_shares_users ALTER user_uid TYPE VARCHAR(255);
diff --git a/scripts/upgrades/2008-09-23_fix_group_uid.sql b/scripts/upgrades/2008-09-23_fix_group_uid.sql
new file mode 100644
index 0000000..f46a8c6
--- /dev/null
+++ b/scripts/upgrades/2008-09-23_fix_group_uid.sql
@@ -0,0 +1 @@
+ALTER TABLE mnemo_shares_groups CHANGE group_uid group_uid VARCHAR(255);
diff --git a/scripts/upgrades/convert_datatree_shares_to_sql.php b/scripts/upgrades/convert_datatree_shares_to_sql.php
index 6eafbce..551c917 100755
--- a/scripts/upgrades/convert_datatree_shares_to_sql.php
+++ b/scripts/upgrades/convert_datatree_shares_to_sql.php
@@ -5,7 +5,7 @@
  * driver to the new SQL Horde_Share driver. You should run the 2.1_to_2.2.sql
  * upgrade script before executing this script.
  *
- * $Horde: mnemo/scripts/upgrades/convert_datatree_shares_to_sql.php,v 1.1.2.4 2008/06/06 15:08:03 mrubinsk Exp $
+ * $Horde: mnemo/scripts/upgrades/convert_datatree_shares_to_sql.php,v 1.1.2.6 2009-07-20 11:16:56 jan Exp $
  */
 
 @define('AUTH_HANDLER', true);
@@ -27,6 +27,7 @@ require_once 'MDB2.php';
 $config = $GLOBALS['conf']['sql'];
 unset($config['charset']);
 $db = MDB2::factory($config);
+$db->setOption('seqcol_name', 'id');
 
 $error_cnt = 0;
 $delete_dt_data = false;
@@ -40,23 +41,26 @@ if ($answer != 'y') {
 }
 
 /* Get the share entries */
-$sql = 'SELECT datatree_id, datatree_name FROM horde_datatree WHERE '
-    . 'group_uid = \'horde.shares.mnemo\'';
-$shares_result = $db->query($sql);
+$shares_result = $db->query('SELECT datatree_id, datatree_name FROM horde_datatree WHERE group_uid = \'horde.shares.mnemo\'');
 if (is_a($shares_result, 'PEAR_Error')) {
     die($shares_result->toString());
 }
 
+$query = $db->prepare('SELECT attribute_name, attribute_key, attribute_value FROM horde_datatree_attributes WHERE datatree_id = ?');
 while ($row = $shares_result->fetchRow(MDB2_FETCHMODE_ASSOC)) {
     $share_id = $row['datatree_id'];
     $share_name = $row['datatree_name'];
 
     /* Build an array to hold the new row data */
-    $data = array('share_id' => $db->nextId('mnemo_shares'),
+    $nextId = $db->nextId('mnemo_shares');
+    if (is_a($nextId, 'PEAR_Error')) {
+        $cli->message($nextId->toString(), 'cli.error');
+        $error_cnt++;
+        continue;
+    }
+    $data = array('share_id' => $nextId,
                   'share_name' => $share_name);
 
-    $sql = 'SELECT attribute_name, attribute_key, attribute_value FROM horde_datatree_attributes WHERE datatree_id = ?';
-    $query = $db->prepare($sql);
     $query_result = $query->execute($share_id);
     $rows = $query_result->fetchAll(MDB2_FETCHMODE_ASSOC);
     $users = array();
@@ -110,17 +114,19 @@ while ($row = $shares_result->fetchRow(MDB2_FETCHMODE_ASSOC)) {
 
     /* Insert the new data */
     $cli->message('Migrating share data for share_id: ' . $share_id, 'cli.message');
+    $error = false;
+    $db->beginTransaction();
     $result = insertData('mnemo_shares', $data);
     if (is_a($result, 'PEAR_Error')) {
-        ++$error_cnt;
-        $cli->message($result->getMessage(), 'cli.error');
+        $cli->message($result->toString(), 'cli.error');
+        $error = true;
     }
     if (count($groups)) {
         foreach ($groups as $group) {
             $result = insertData('mnemo_shares_groups', $group);
             if (is_a($result, 'PEAR_Error')) {
-                ++$error_cnt;
-                $cli->message($result->getMessage(), 'cli.error');
+                $cli->message($result->toString(), 'cli.error');
+                $error = true;
             }
         }
     }
@@ -128,30 +134,56 @@ while ($row = $shares_result->fetchRow(MDB2_FETCHMODE_ASSOC)) {
         foreach ($users as $user) {
             $result = insertData('mnemo_shares_users', $user);
             if (is_a($result, 'PEAR_Error')) {
-                ++$error_cnt;
-                $cli->message($result->getMessage(), 'cli.error');
+                $cli->message($result->toString(), 'cli.error');
+                $error = true;
             }
         }
     }
 
     /* Delete the datatree data, but ONLY if it was requested */
-    if ($delete_dt_data && !$error_cnt) {
+    if ($delete_dt_data && !$error) {
         $cli->message('DELETING datatree data for share_id: ' . $share_id, 'cli.message');
         $delete = $db->prepare('DELETE FROM horde_datatree_attributes WHERE datatree_id = ?', null, MDB2_PREPARE_MANIP);
-        $delete->execute(array($share_id));
+        if (is_a($delete, 'PEAR_Error')) {
+            $cli->message($delete->toString(), 'cli.error');
+            $error = true;
+        } else {
+            $delete_result = $delete->execute(array($share_id));
+            if (is_a($delete_result, 'PEAR_Error')) {
+                $cli->message($delete_result->toString(), 'cli.error');
+                $error = true;
+            }
+        }
         $delete->free();
 
         $delete = $db->prepare('DELETE FROM horde_datatree WHERE datatree_id = ?', null, MDB2_PREPARE_MANIP);
-        $delete->execute(array($share_id));
+        if (is_a($delete, 'PEAR_Error')) {
+            $cli->message($delete->toString(), 'cli.error');
+            $error = true;
+        } else {
+            $delete_result = $delete->execute(array($share_id));
+            if (is_a($delete_result, 'PEAR_Error')) {
+                $cli->message($delete_result->toString(), 'cli.error');
+                $error = true;
+            }
+        }
         $delete->free();
     }
 
     /* Cleanup */
     $query_result->free();
     unset($row, $rows, $data, $groups, $users);
+    if ($error) {
+        $db->rollback();
+        $cli->message('Rollback for share data for share_id: ' . $share_id, 'cli.message');
+        ++$error_cnt;
+    } else {
+        $db->commit();
+        $cli->message('Commit for share data for share_id: ' . $share_id, 'cli.message');
+    }
 }
 if ($error_cnt) {
-    $cli->message(sprintf("Encountered %u errors. No data was deleted from your database.", $error_cnt));
+    $cli->message(sprintf("Encountered %u errors.", $error_cnt));
 }
 echo "\nDone.\n";
 
@@ -165,6 +197,9 @@ function insertData($table, $data)
 
     $insert = $GLOBALS['db']->prepare('INSERT INTO ' . $table . ' (' . implode(', ', $fields) . ') VALUES (' . str_repeat('?, ', count($values) - 1) . '?)',
                                       null, MDB2_PREPARE_MANIP);
+    if (is_a($insert,'PEAR_Error')) {
+        return $insert;
+    }
     $insert_result = $insert->execute($values);
     $insert->free();
     return $insert_result;
diff --git a/search.php b/search.php
index 4b2c2a9..82fadd5 100644
--- a/search.php
+++ b/search.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/search.php,v 1.9.8.7 2008/01/02 11:32:26 jan Exp $
+ * $Horde: mnemo/search.php,v 1.9.8.8 2009-01-06 15:24:57 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.
diff --git a/templates/common-header.inc b/templates/common-header.inc
index 82a13d2..5809c9e 100644
--- a/templates/common-header.inc
+++ b/templates/common-header.inc
@@ -5,7 +5,7 @@ if (isset($language)) {
 }
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
-<!-- Mnemo: Copyright 2002-2008 The Horde Project.  Mnemo is under a Horde license. -->
+<!-- Mnemo: Copyright 2002-2009 The Horde Project.  Mnemo is under a Horde license. -->
 <!--   Horde Project: http://www.horde.org/ | Mnemo: http://www.horde.org/mnemo/    -->
 <!--              Horde Licenses: http://www.horde.org/licenses/                    -->
 <?php echo !empty($language) ? '<html lang="' . strtr($language, '_', '-') . '">' : '<html>' ?>
diff --git a/templates/data/import.inc b/templates/data/import.inc
index 40c6007..59adad4 100644
--- a/templates/data/import.inc
+++ b/templates/data/import.inc
@@ -12,7 +12,7 @@
             <option value="vnote"><?php echo _("vNote") ?></option>
         </select><br />
 
-<?php if (!$prefs->isLocked('default_notepad') && count($notepads = &Mnemo::listNotepads(false, PERMS_EDIT)) > 1): ?>
+<?php if (!$prefs->isLocked('default_notepad') && count($notepads = Mnemo::listNotepads(false, PERMS_EDIT)) > 1): ?>
         <br /><?php echo Horde::label('notepad_target', _("Which Notepad should the notes be added to?")) ?><br />
         <select id="notepad_target" name="notepad_target">
         <?php
diff --git a/templates/memo/memo.inc b/templates/memo/memo.inc
index c84282d..fcc1204 100644
--- a/templates/memo/memo.inc
+++ b/templates/memo/memo.inc
@@ -52,35 +52,49 @@ if ($memo_id):
 <?php endif; ?>
  <p><?php echo Horde::label('memo_body', _("Note _Text")) ?>&nbsp;(<?php printf(_("%s characters"), '<span id="charcount">' . String::length(str_replace(array("\r", "\n"), '', $memo_body)) . '</span>') ?>):</p>
  <textarea name="memo_body" id="memo_body" class="fixed" rows="20" onchange="updateCharCount()" onclick="updateCharCount()" onkeypress="setTimeout('updateCharCount()', 1)"><?php echo htmlspecialchars($memo_body) ?></textarea>
+ <?php echo Horde::callHook('_mnemo_hook_description_help', null, 'mnemo', '') ?>
 
  <p>
   <input type="submit" class="button" value="<?php echo _("Save") ?>" onclick="return checkCategory();" />
-<?php if (!$prefs->isLocked('default_notepad') && count($notepads) > 1): ?>
-<?php echo Horde::label('notepad_target', _("Note_pad")) ?>
-  <select id="notepad_target" name="notepad_target">
-  <?php
-  foreach (array_keys($notepads) as $id) {
-      $sel = ($id == $memolist_id) ? ' selected="selected"' : '';
-      printf('<option value="%s"%s>%s</option>',
-             htmlspecialchars($id), $sel, htmlspecialchars($notepads[$id]->get('name'))) . "\n";
-  } ?>
-  </select>
-<?php
-endif;
-echo Horde::label('memo_category', _("_Category")) . ' ' .
-    $cManager->getSelect('memo_category', $memo_category);
-if ($storage->encryptionSupported()):
-    if ($actionID == 'modify_memo' && $memo_encrypted && !$show_passphrase):
-        echo ' ' . Horde::label('memo_encrypt', _("_Encrypt?"));
-?>
-  <input type="checkbox" id="memo_encrypt" name="memo_encrypt" checked="checked" />
-<?php
-    endif;
-    echo ' ' . Horde::label('memo_passphrase', _("_Password"));
-?>
-  <input type="password" id="memo_passphrase" name="memo_passphrase" />
-<?php endif; ?>
  </p>
+ <table>
+  <?php if (!$prefs->isLocked('default_notepad') && count($notepads) > 1): ?>
+  <tr>
+   <td class="rightAlign"><?php echo Horde::label('notepad_target', _("Note_pad:")) ?></td>
+   <td>
+    <select id="notepad_target" name="notepad_target">
+     <?php
+     foreach (array_keys($notepads) as $id) {
+         $sel = ($id == $memolist_id) ? ' selected="selected"' : '';
+         printf('<option value="%s"%s>%s</option>',
+                htmlspecialchars($id), $sel, htmlspecialchars($notepads[$id]->get('name'))) . "\n";
+     }
+     ?>
+    </select>
+   </td>
+  </tr>
+  <?php endif; ?>
+  <tr>
+   <td class="rightAlign"><?php echo Horde::label('memo_category', _("_Category:")) ?></td>
+   <td><?php echo $cManager->getSelect('memo_category', $memo_category) ?>
+  </tr>
+  <?php if ($storage->encryptionSupported()): ?>
+  <?php if ($actionID == 'modify_memo' && $memo_encrypted && !$show_passphrase): ?>
+  <tr>
+   <td class="rightAlign"><?php echo Horde::label('memo_encrypt', _("_Encrypt?")) ?></td>
+   <td><input type="checkbox" id="memo_encrypt" name="memo_encrypt" checked="checked" /></td>
+  </tr>
+  <?php endif; ?>
+  <tr>
+   <td class="rightAlign"><?php echo Horde::label('memo_passphrase', _("_Password:")) ?></td>
+   <td><input type="password" id="memo_passphrase" name="memo_passphrase" /></td>
+  </tr>
+  <tr>
+   <td class="rightAlign"><?php echo Horde::label('memo_passphrase2', _("_Repeat:")) ?></td>
+   <td><input type="password" id="memo_passphrase2" name="memo_passphrase2" /></td>
+  </tr>
+  <?php endif; ?>
+ </table>
 </form>
 <script type="text/javascript" >
 document.memo.memo_body.focus();
diff --git a/templates/panel.inc b/templates/panel.inc
index 46c2d63..fba1c04 100644
--- a/templates/panel.inc
+++ b/templates/panel.inc
@@ -2,7 +2,7 @@
 $current_user = Auth::getAuth();
 $my_notepads = array();
 $shared_notepads = array();
-$all_notepads = &Mnemo::listNotepads();
+$all_notepads = Mnemo::listNotepads();
 foreach (array_keys($all_notepads) as $id) {
     if ($all_notepads[$id]->get('owner') == $current_user) {
         $my_notepads[$id] = &$all_notepads[$id];
@@ -59,7 +59,7 @@ function sbarToggle()
  <h4><?php echo _("Shared Notepads:") ?></h4>
  <ul id="sharednotepads">
 <?php foreach (array_keys($shared_notepads) as $id): ?>
-  <li><label><input type="checkbox" class="checkbox" name="display_notepad[]" value="<?php echo htmlspecialchars($id) ?>"<?php echo (in_array($id, $display_notepads) ? ' checked="checked"' : '') . ' /> [' . htmlspecialchars($shared_notepads[$id]->get('owner')) . '] ' . htmlspecialchars($shared_notepads[$id]->get('name')) ?></label></li>
+  <li><label><input type="checkbox" class="checkbox" name="display_notepad[]" value="<?php echo htmlspecialchars($id) ?>"<?php echo (in_array($id, $display_notepads) ? ' checked="checked"' : '') . ' /> [' . htmlspecialchars(Auth::removeHook($shared_notepads[$id]->get('owner'))) . '] ' . htmlspecialchars($shared_notepads[$id]->get('name')) ?></label></li>
 <?php endforeach; ?>
  </ul>
 <?php endif; ?>
diff --git a/templates/prefs/notepadselect.inc b/templates/prefs/notepadselect.inc
index 6d20563..aca3d7d 100644
--- a/templates/prefs/notepadselect.inc
+++ b/templates/prefs/notepadselect.inc
@@ -1,6 +1,6 @@
 <?php
 if (!$prefs->isLocked('default_notepad')):
-    $notepads = &Mnemo::listNotepads();
+    $notepads = Mnemo::listNotepads();
     if (($default_notepad = $prefs->getValue('default_notepad')) == null ||
         !isset($notepads[$default_notepad])) {
         $default_notepad = Auth::getAuth();
diff --git a/templates/view/memo.inc b/templates/view/memo.inc
index f3f373d..bc9b048 100644
--- a/templates/view/memo.inc
+++ b/templates/view/memo.inc
@@ -56,7 +56,7 @@ if (!$print_view) {
    </div>
 <?php else: ?>
    <div class="noteBody">
-    <?php echo Text_Filter::filter($memo['body'], 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'class' => null)) ?>
+    <?php $body = Text_Filter::filter($memo['body'], 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'class' => null)); echo Horde::callHook('_mnemo_hook_format_description', array($body), 'mnemo', $body); ?>
    </div>
 <?php endif; ?>
   </td>
diff --git a/themes/bluewhite/screen.css b/themes/bluewhite/screen.css
index b2108d6..43d08dd 100644
--- a/themes/bluewhite/screen.css
+++ b/themes/bluewhite/screen.css
@@ -1,5 +1,5 @@
 /**
- * $Horde: mnemo/themes/bluewhite/screen.css,v 1.1.2.1 2007/12/20 14:18:30 jan Exp $
+ * $Horde: mnemo/themes/bluewhite/screen.css,v 1.1.2.1 2007-12-20 14:18:30 jan Exp $
  */
 
 #quicksearch a {
diff --git a/themes/categoryCSS.php b/themes/categoryCSS.php
index d1009ee..dc04516 100644
--- a/themes/categoryCSS.php
+++ b/themes/categoryCSS.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/themes/categoryCSS.php,v 1.1.2.1 2008/05/20 22:00:25 jan Exp $
+ * $Horde: mnemo/themes/categoryCSS.php,v 1.1.2.2 2009-01-06 15:25:04 jan Exp $
  *
- * Copyright 2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2008-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file COPYING for license information (GPL). If you
  * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
diff --git a/themes/screen.css b/themes/screen.css
index 0460e2c..b4c9162 100644
--- a/themes/screen.css
+++ b/themes/screen.css
@@ -1,5 +1,5 @@
 /**
- * $Horde: mnemo/themes/screen.css,v 1.4.2.5 2008/04/08 18:13:39 chuck Exp $
+ * $Horde: mnemo/themes/screen.css,v 1.4.2.6 2009-08-05 23:03:25 jan Exp $
  */
 
 /* Menu bottom margin, added for BC. */
@@ -67,19 +67,13 @@ th {
     padding: 10px;
     background: #e9e9e9;
 }
-.noteArea p {
+.noteArea p, .noteArea td {
     font-weight: bold;
-    margin: 5px 0 5px 0;
+    margin: 5px 0;
 }
 .noteArea textarea {
     width: 100%;
 }
-.noteArea p select {
-    margin-right: 5px;
-}
-.noteArea .button {
-    margin-right: 1em;
-}
 
 body.rightPanel #page {
     margin-right: 10em;
diff --git a/themes/silver/screen.css b/themes/silver/screen.css
index 40f177e..35b6a8b 100644
--- a/themes/silver/screen.css
+++ b/themes/silver/screen.css
@@ -1,5 +1,5 @@
 /**
- * $Horde: mnemo/themes/silver/screen.css,v 1.1.2.2 2008/03/27 17:56:28 jan Exp $
+ * $Horde: mnemo/themes/silver/screen.css,v 1.1.2.2 2008-03-27 17:56:28 jan Exp $
  */
 
 .sortup {
diff --git a/view.php b/view.php
index 5be8482..4fac9d6 100644
--- a/view.php
+++ b/view.php
@@ -1,8 +1,8 @@
 <?php
 /**
- * $Horde: mnemo/view.php,v 1.27.2.11 2008/02/29 04:38:10 chuck Exp $
+ * $Horde: mnemo/view.php,v 1.27.2.12 2009-01-06 15:24:57 jan Exp $
  *
- * Copyright 2001-2008 The Horde Project (http://www.horde.org/)
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
  *
  * See the enclosed file LICENSE for license information (ASL). If you
  * did not receive this file, see http://www.horde.org/licenses/asl.php.

-- 
Debian Horde Packages repository: mnemo2 package



More information about the pkg-horde-hackers mailing list