Index: /extensions/paMOOramics/farbtastic/LICENSE.txt
===================================================================
--- /extensions/paMOOramics/farbtastic/LICENSE.txt	(revision 3700)
+++ /extensions/paMOOramics/farbtastic/LICENSE.txt	(revision 3700)
@@ -0,0 +1,341 @@
+
+        GNU GENERAL PUBLIC LICENSE
+           Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+        GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+          NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+         END OF TERMS AND CONDITIONS
+
+      How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
Index: /extensions/paMOOramics/farbtastic/farbtastic.css
===================================================================
--- /extensions/paMOOramics/farbtastic/farbtastic.css	(revision 3700)
+++ /extensions/paMOOramics/farbtastic/farbtastic.css	(revision 3700)
@@ -0,0 +1,33 @@
+.farbtastic {
+  position: relative;
+}
+.farbtastic * {
+  position: absolute;
+  cursor: crosshair;
+}
+.farbtastic, .farbtastic .wheel {
+  width: 195px;
+  height: 195px;
+}
+.farbtastic .color, .farbtastic .overlay {
+  top: 47px;
+  left: 47px;
+  width: 101px;
+  height: 101px;
+}
+.farbtastic .wheel {
+  background: url(wheel.png) no-repeat;
+  width: 195px;
+  height: 195px;
+}
+.farbtastic .overlay {
+  background: url(mask.png) no-repeat;
+}
+.farbtastic .marker {
+  width: 17px;
+  height: 17px;
+  margin: -8px 0 0 -8px;
+  overflow: hidden; 
+  background: url(marker.png) no-repeat;
+}
+
Index: /extensions/paMOOramics/farbtastic/farbtastic.js
===================================================================
--- /extensions/paMOOramics/farbtastic/farbtastic.js	(revision 3700)
+++ /extensions/paMOOramics/farbtastic/farbtastic.js	(revision 3700)
@@ -0,0 +1,329 @@
+// $Id: farbtastic.js,v 1.2 2007/01/08 22:53:01 unconed Exp $
+// Farbtastic 1.2
+
+jQuery.fn.farbtastic = function (callback) {
+  $.farbtastic(this, callback);
+  return this;
+};
+
+jQuery.farbtastic = function (container, callback) {
+  var container = $(container).get(0);
+  return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
+}
+
+jQuery._farbtastic = function (container, callback) {
+  // Store farbtastic object
+  var fb = this;
+
+  // Insert markup
+  $(container).html('<div class="farbtastic"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
+  var e = $('.farbtastic', container);
+  fb.wheel = $('.wheel', container).get(0);
+  // Dimensions
+  fb.radius = 84;
+  fb.square = 100;
+  fb.width = 194;
+
+  // Fix background PNGs in IE6
+  if (navigator.appVersion.match(/MSIE [0-6]\./)) {
+    $('*', e).each(function () {
+      if (this.currentStyle.backgroundImage != 'none') {
+        var image = this.currentStyle.backgroundImage;
+        image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
+        $(this).css({
+          'backgroundImage': 'none',
+          'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+        });
+      }
+    });
+  }
+
+  /**
+   * Link to the given element(s) or callback.
+   */
+  fb.linkTo = function (callback) {
+    // Unbind previous nodes
+    if (typeof fb.callback == 'object') {
+      $(fb.callback).unbind('keyup', fb.updateValue);
+    }
+
+    // Reset color
+    fb.color = null;
+
+    // Bind callback or elements
+    if (typeof callback == 'function') {
+      fb.callback = callback;
+    }
+    else if (typeof callback == 'object' || typeof callback == 'string') {
+      fb.callback = $(callback);
+      fb.callback.bind('keyup', fb.updateValue);
+      if (fb.callback.get(0).value) {
+        fb.setColor(fb.callback.get(0).value);
+      }
+    }
+    return this;
+  }
+  fb.updateValue = function (event) {
+    if (this.value && this.value != fb.color) {
+      fb.setColor(this.value);
+    }
+  }
+
+  /**
+   * Change color with HTML syntax #123456
+   */
+  fb.setColor = function (color) {
+    var unpack = fb.unpack(color);
+    if (fb.color != color && unpack) {
+      fb.color = color;
+      fb.rgb = unpack;
+      fb.hsl = fb.RGBToHSL(fb.rgb);
+      fb.updateDisplay();
+    }
+    return this;
+  }
+
+  /**
+   * Change color with HSL triplet [0..1, 0..1, 0..1]
+   */
+  fb.setHSL = function (hsl) {
+    fb.hsl = hsl;
+    fb.rgb = fb.HSLToRGB(hsl);
+    fb.color = fb.pack(fb.rgb);
+    fb.updateDisplay();
+    return this;
+  }
+
+  /////////////////////////////////////////////////////
+
+  /**
+   * Retrieve the coordinates of the given event relative to the center
+   * of the widget.
+   */
+  fb.widgetCoords = function (event) {
+    var x, y;
+    var el = event.target || event.srcElement;
+    var reference = fb.wheel;
+
+    if (typeof event.offsetX != 'undefined') {
+      // Use offset coordinates and find common offsetParent
+      var pos = { x: event.offsetX, y: event.offsetY };
+
+      // Send the coordinates upwards through the offsetParent chain.
+      var e = el;
+      while (e) {
+        e.mouseX = pos.x;
+        e.mouseY = pos.y;
+        pos.x += e.offsetLeft;
+        pos.y += e.offsetTop;
+        e = e.offsetParent;
+      }
+
+      // Look for the coordinates starting from the wheel widget.
+      var e = reference;
+      var offset = { x: 0, y: 0 }
+      while (e) {
+        if (typeof e.mouseX != 'undefined') {
+          x = e.mouseX - offset.x;
+          y = e.mouseY - offset.y;
+          break;
+        }
+        offset.x += e.offsetLeft;
+        offset.y += e.offsetTop;
+        e = e.offsetParent;
+      }
+
+      // Reset stored coordinates
+      e = el;
+      while (e) {
+        e.mouseX = undefined;
+        e.mouseY = undefined;
+        e = e.offsetParent;
+      }
+    }
+    else {
+      // Use absolute coordinates
+      var pos = fb.absolutePosition(reference);
+      x = (event.pageX || 0*(event.clientX + $('html').get(0).scrollLeft)) - pos.x;
+      y = (event.pageY || 0*(event.clientY + $('html').get(0).scrollTop)) - pos.y;
+    }
+    // Subtract distance to middle
+    return { x: x - fb.width / 2, y: y - fb.width / 2 };
+  }
+
+  /**
+   * Mousedown handler
+   */
+  fb.mousedown = function (event) {
+    // Capture mouse
+    if (!document.dragging) {
+      $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
+      document.dragging = true;
+    }
+
+    // Check which area is being dragged
+    var pos = fb.widgetCoords(event);
+    fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;
+
+    // Process
+    fb.mousemove(event);
+    return false;
+  }
+
+  /**
+   * Mousemove handler
+   */
+  fb.mousemove = function (event) {
+    // Get coordinates relative to color picker center
+    var pos = fb.widgetCoords(event);
+
+    // Set new HSL parameters
+    if (fb.circleDrag) {
+      var hue = Math.atan2(pos.x, -pos.y) / 6.28;
+      if (hue < 0) hue += 1;
+      fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
+    }
+    else {
+      var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
+      var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
+      fb.setHSL([fb.hsl[0], sat, lum]);
+    }
+    return false;
+  }
+
+  /**
+   * Mouseup handler
+   */
+  fb.mouseup = function () {
+    // Uncapture mouse
+    $(document).unbind('mousemove', fb.mousemove);
+    $(document).unbind('mouseup', fb.mouseup);
+    document.dragging = false;
+  }
+
+  /**
+   * Update the markers and styles
+   */
+  fb.updateDisplay = function () {
+    // Markers
+    var angle = fb.hsl[0] * 6.28;
+    $('.h-marker', e).css({
+      left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
+      top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
+    });
+
+    $('.sl-marker', e).css({
+      left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
+      top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
+    });
+
+    // Saturation/Luminance gradient
+    $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));
+
+    // Linked elements or callback
+    if (typeof fb.callback == 'object') {
+      // Set background/foreground color
+      $(fb.callback).css({
+        backgroundColor: fb.color,
+        color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
+      });
+
+      // Change linked value
+      $(fb.callback).each(function() {
+        if (this.value && this.value != fb.color) {
+          this.value = fb.color;
+        }
+      });
+    }
+    else if (typeof fb.callback == 'function') {
+      fb.callback.call(fb, fb.color);
+    }
+  }
+
+  /**
+   * Get absolute position of element
+   */
+  fb.absolutePosition = function (el) {
+    var r = { x: el.offsetLeft, y: el.offsetTop };
+    // Resolve relative to offsetParent
+    if (el.offsetParent) {
+      var tmp = fb.absolutePosition(el.offsetParent);
+      r.x += tmp.x;
+      r.y += tmp.y;
+    }
+    return r;
+  };
+
+  /* Various color utility functions */
+  fb.pack = function (rgb) {
+    var r = Math.round(rgb[0] * 255);
+    var g = Math.round(rgb[1] * 255);
+    var b = Math.round(rgb[2] * 255);
+    return '#' + (r < 16 ? '0' : '') + r.toString(16) +
+           (g < 16 ? '0' : '') + g.toString(16) +
+           (b < 16 ? '0' : '') + b.toString(16);
+  }
+
+  fb.unpack = function (color) {
+    if (color.length == 7) {
+      return [parseInt('0x' + color.substring(1, 3)) / 255,
+        parseInt('0x' + color.substring(3, 5)) / 255,
+        parseInt('0x' + color.substring(5, 7)) / 255];
+    }
+    else if (color.length == 4) {
+      return [parseInt('0x' + color.substring(1, 2)) / 15,
+        parseInt('0x' + color.substring(2, 3)) / 15,
+        parseInt('0x' + color.substring(3, 4)) / 15];
+    }
+  }
+
+  fb.HSLToRGB = function (hsl) {
+    var m1, m2, r, g, b;
+    var h = hsl[0], s = hsl[1], l = hsl[2];
+    m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
+    m1 = l * 2 - m2;
+    return [this.hueToRGB(m1, m2, h+0.33333),
+        this.hueToRGB(m1, m2, h),
+        this.hueToRGB(m1, m2, h-0.33333)];
+  }
+
+  fb.hueToRGB = function (m1, m2, h) {
+    h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
+    if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
+    if (h * 2 < 1) return m2;
+    if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
+    return m1;
+  }
+
+  fb.RGBToHSL = function (rgb) {
+    var min, max, delta, h, s, l;
+    var r = rgb[0], g = rgb[1], b = rgb[2];
+    min = Math.min(r, Math.min(g, b));
+    max = Math.max(r, Math.max(g, b));
+    delta = max - min;
+    l = (min + max) / 2;
+    s = 0;
+    if (l > 0 && l < 1) {
+      s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
+    }
+    h = 0;
+    if (delta > 0) {
+      if (max == r && max != g) h += (g - b) / delta;
+      if (max == g && max != b) h += (2 + (b - r) / delta);
+      if (max == b && max != r) h += (4 + (r - g) / delta);
+      h /= 6;
+    }
+    return [h, s, l];
+  }
+
+  // Install mousedown handler (the others are set on the document on-demand)
+  $('*', e).mousedown(fb.mousedown);
+
+    // Init color
+  fb.setColor('#000000');
+
+  // Set linked elements/callback
+  if (callback) {
+    fb.linkTo(callback);
+  }
+}
Index: /extensions/paMOOramics/farbtastic/index.php
===================================================================
--- /extensions/paMOOramics/farbtastic/index.php	(revision 3700)
+++ /extensions/paMOOramics/farbtastic/index.php	(revision 3700)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/paMOOramics/index.php
===================================================================
--- /extensions/paMOOramics/index.php	(revision 3700)
+++ /extensions/paMOOramics/index.php	(revision 3700)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/paMOOramics/js/Copie de pamoorama0.3.js
===================================================================
--- /extensions/paMOOramics/js/Copie de pamoorama0.3.js	(revision 3700)
+++ /extensions/paMOOramics/js/Copie de pamoorama0.3.js	(revision 3700)
@@ -0,0 +1,334 @@
+// Pamoorama 0.3
+// By: Jean-Nicolas Jolivet 
+// www.silverscripting.com/pamoorama/
+// Feel free to do whatever you want with the script! Give credits if you like it
+// if you don't like it, don't use it ;)
+var pamoorama = new Class({
+	
+	initialize: function(element, options) {
+		this.options = Object.extend({
+			activateSlider:		true,
+			footercolor:		'#000',
+			captioncolor:		'#fff',
+			caption:			'',
+			width:				650,
+			enableAutoscroll:	true,
+			autoscrollSpeed: 	10000,
+			autoscrollOnLoad: 	false
+		}, options || {});
+		
+		this.el = $(element);
+		this.elid = element;
+		this.el.setStyle('width', this.options.width + 'px');
+		this.el.setStyle('font-family', 'sans-serif');
+		this.skipInit = false;
+		
+		
+		
+		this.loading = new Element('div', {
+			'id': this.elid + '_footer'
+		});
+		this.loading.setHTML('Loading Panorama...');
+		this.loading.injectInside(this.el);
+		
+		this.picturename = this.el.getProperty('alt');
+		if(this.options.caption == '')
+		{
+			this.options.caption = this.picturename;
+		}
+		
+		this.area = Math.floor(this.options.width / 2) - 20;
+		
+		
+		this.image = new Asset.image(this.picturename, {
+			onload: this.continueInit.bind(this)
+		});
+		this.image.setStyles({'left': '-10000px', 'position': 'relative'});
+		
+		this.image.injectInside(document.body);
+	
+	},
+	
+	continueInit: function()
+	{
+		if(! this.skipInit)
+		{
+			
+			this.imageWidth = this.image.getSize().size.x;
+			this.imageHeight = this.image.getSize().size.y;
+			this.ratio = this.imageWidth / 200;
+			this.image.remove();
+			this.loading.remove();
+			
+			
+			this.outter = new Element('div', {
+				'id': this.elid + '_outter',
+				'styles': {
+					'width' : this.options.width + 'px',
+					'height': this.imageHeight + 'px',
+					'overflow': 'hidden'
+				}
+			});
+			
+			this.inner = new Element('div', {
+				'id': this.elid + '_inner',
+				'styles' : {
+					'width': this.imageWidth + 'px',
+					'height': this.imageHeight + 'px',
+					'background': 'transparent url(' + this.picturename + ') no-repeat top left'
+				}
+			});
+			
+			this.footer = new Element('div', {
+				'id': this.elid + '_footer',
+				'styles': {
+					'width' : this.options.width + 'px',
+					'height': (Math.floor(this.imageHeight / this.ratio) + 22) + 'px',
+					'background-color': this.options.footercolor
+				}
+			});
+			
+			this.caption = new Element('div', {
+				'id': this.elid + '_caption',
+				'styles': {
+					'float': 'left',
+					'margin-top': '11px',
+					'padding-left': '8px',
+					'color' : this.options.captioncolor,
+					'font-family': "Trebuchet MS",
+					'text-align':'left',
+					'font-size': '13px'
+				}
+			});
+			this.caption.setHTML(this.options.caption);
+			
+			this.thumb = new Element('div', {
+				'id': this.elid + '_thumb',
+				'styles': {
+					'float': 'right',
+					'margin': '10px 8px 0px 0px',
+					'overflow' : 'hidden',
+					'padding' : '0px',
+					'height': (Math.floor(this.imageHeight / this.ratio) + 1) +'px',
+					'width': '200px',
+					'text-align': 'left',
+					'border': '2px solid #fff',
+					'cursor': 'pointer'
+				},
+				'title': 'Click to move the frame!'
+			});
+			
+			if(window.ie)
+			{
+				this.ieheightadjust = 0;
+			}
+			else
+			{
+				this.ieheightadjust = 3;
+			}
+			this.frame = new Element('div', {
+				'id': this.elid + '_frame',
+				'styles': {
+					'height': (Math.floor(this.imageHeight / this.ratio) + 1) +'px',
+					'width': (Math.floor(this.options.width / this.ratio) + 1) + 'px',
+					'position': 'relative',
+					'top': '-' + (Math.floor(this.imageHeight / this.ratio) + this.ieheightadjust +1) +'px',
+					'left' : '0px',
+					'padding' : '0px',
+					'margin' : '0px',
+					'background-color': 'lightblue',
+					'cursor': 'move',
+					'z-index': '1000',
+					'opacity': '0.4',
+					'-moz-opacity': '0.8',
+					'filter': 'alpha(opacity=80)'
+				},
+				'title': 'Drag me to move the panorama!'
+			});
+			
+			if(this.options.enableAutoscroll)
+			{
+				this.playpause = new Element('div', {
+					'id': this.elid + '_playpause',
+					'styles': {
+						
+						'padding-left': '1px',
+						'color' : this.options.captioncolor,
+						'font-family': "Trebuchet MS",
+						'font-size': '11px',
+						'text-align':'left',
+						'cursor': 'pointer'
+					}
+				});
+				this.playpause.setHTML('Start Autoscroll');
+				this.playpause.addEvent('click', this.playpauseClicked.bind(this));
+			}
+			
+			this.halfFrame = (this.options.width / this.ratio) / 2;
+			
+			this.image.setProperty('width', 200);
+			this.image.setProperty('height', Math.floor(this.imageHeight / this.ratio) + 1);
+			this.image.setStyle('left', '0px');
+			this.image.setStyle('border', '0px');
+			this.image.setStyle('padding', '0px');
+			this.image.setStyle('margin', '0px');
+			
+			//Inject everything
+			this.outter.injectInside(this.el);
+			this.inner.injectInside(this.outter);
+			this.footer.injectInside(this.el);
+			this.caption.injectInside(this.footer);
+			
+			if(this.options.enableAutoscroll)
+			{
+				this.playpause.injectInside(this.caption);
+			}
+			this.thumb.injectInside(this.footer);
+			
+			this.image.injectInside(this.thumb);
+			this.frame.injectInside(this.thumb);
+			
+			
+			// reset the scroll
+			this.outter.scrollTo(0, 0);
+			
+			//AutoScroll Effects
+			this.autoScrollFx = new Fx.Scroll(this.outter, {duration:this.options.autoscrollSpeed, onComplete: this.animCompleted.bind(this)});
+			this.autoSlideFx = new Fx.Style(this.frame, 'left', {duration: this.options.autoscrollSpeed});
+			
+			//do the scrollthing!
+			if(this.options.activateSlider)
+			{
+				this.scroll = new Scroller(this.outter, {area: this.area, velocity: 0.3, onChange:function(x, y) {
+					newleft = (x / this.ratio);
+					
+					this.outter.scrollTo(x, y);
+					
+					if(x <= 0)
+					{
+						this.frame.setStyle('left', 0);
+					}
+					else if(x >= this.imageWidth)
+					{
+						this.frame.setStyle('left', 200 - this.frame.getStyle('width').toInt());
+					}
+					else
+					{
+						if( (newleft >= 0) && (newleft < 200 - this.frame.getStyle('width').toInt()) ) 
+						{
+							this.frame.setStyle('left', newleft);
+							
+						}
+					}
+				}.bind(this)});
+				
+				this.outter.addEvent('mouseover', this.scroll.start.bind(this.scroll));
+				this.outter.addEvent('mouseout', this.scroll.stop.bind(this.scroll));
+			}
+			
+			this.createDraggable();
+			
+			this.addImageEvent();
+			
+			if(this.options.autoscrollOnLoad)
+			{
+				this.playpauseClicked();
+			}
+			this.skipInit = true;
+		}
+		
+	},
+	
+	startAnimRight: function() {
+		var limitRight = 200 - this.frame.getStyle('width').toInt();
+		
+		this.outter.scrollTo(0, 0);
+		this.frame.setStyle('left', 0);
+		
+		this.autoSlideFx.start(limitRight);
+		this.autoScrollFx.toRight();
+		this.direction = 'right';
+		
+		//stop the scroller/drag etc..
+		this.outter.removeEvents('mouseover');
+		this.dragHandle.detach();
+		this.image.removeEvents('click');
+		
+	},
+	startAnimLeft: function() {
+		this.autoSlideFx.start(0);
+		this.autoScrollFx.scrollTo(0);
+		this.direction = 'left';
+		
+	},
+	
+	stopAnim: function() {
+		this.autoSlideFx.stop();
+		this.autoScrollFx.stop();
+		
+		//reconnect events
+		this.outter.addEvent('mouseover', this.scroll.start.bind(this.scroll));
+		this.createDraggable();
+		this.addImageEvent();
+	},
+	
+	animCompleted: function() {
+		if(this.direction=='right')
+		{
+			this.startAnimLeft();
+		}
+		else
+		{
+			this.startAnimRight();
+		}
+	},
+	
+	playpauseClicked: function() {
+		if(this.playpause.getText() == 'Start Autoscroll')
+		{
+			this.playpause.setHTML('Stop Autoscroll');
+			this.startAnimRight();
+		}
+		else
+		{
+			this.playpause.setHTML('Start Autoscroll');
+			this.stopAnim();
+		}
+	},
+	
+	createDraggable: function() {
+		this.dragHandle = this.frame.makeDraggable({
+				modifiers: {x : 'left', y : false}, 
+				limit: {x : [0, 200 - this.frame.getStyle('width').toInt() ]}, 
+				onDrag: function() {
+					frameleft = this.frame.getStyle('left').toInt();
+					newscroll = frameleft * this.ratio;
+					
+					this.outter.scrollTo(newscroll, 0);
+					
+				}.bind(this)
+		});
+	},
+		
+	addImageEvent: function() {
+		this.image.addEvent('click', function(event){
+				var event = new Event(event);
+				var slideEffect = new Fx.Style(this.frame, 'left',{duration:1000, transition: Fx.Transitions.Sine.easeInOut});
+				var scrollEffect = new Fx.Scroll(this.outter, {duration:1000, transition: Fx.Transitions.Sine.easeInOut});
+				
+				newleft = (event.page.x - this.thumb.getLeft().toInt()) - this.halfFrame;
+				if(newleft < 0)
+				{
+					newleft = 0;
+				}
+				else if(newleft > 200 - this.frame.getStyle('width').toInt())
+				{
+					newleft = 200 - this.frame.getStyle('width').toInt();
+				}
+				
+				slideEffect.start(newleft);
+				scrollEffect.scrollTo(newleft * this.ratio);
+		}.bind(this));
+	}
+	
+});
Index: /extensions/paMOOramics/js/index.php
===================================================================
--- /extensions/paMOOramics/js/index.php	(revision 3700)
+++ /extensions/paMOOramics/js/index.php	(revision 3700)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/paMOOramics/js/mootools.js
===================================================================
--- /extensions/paMOOramics/js/mootools.js	(revision 3700)
+++ /extensions/paMOOramics/js/mootools.js	(revision 3700)
@@ -0,0 +1,208 @@
+var MooTools={version:"1.11"};function $defined(A){return(A!=undefined);}function $type(B){if(!$defined(B)){return false;}if(B.htmlElement){return"element";
+}var A=typeof B;if(A=="object"&&B.nodeName){switch(B.nodeType){case 1:return"element";case 3:return(/\S/).test(B.nodeValue)?"textnode":"whitespace";}}if(A=="object"||A=="function"){switch(B.constructor){case Array:return"array";
+case RegExp:return"regexp";case Class:return"class";}if(typeof B.length=="number"){if(B.item){return"collection";}if(B.callee){return"arguments";}}}return A;
+}function $merge(){var C={};for(var B=0;B<arguments.length;B++){for(var E in arguments[B]){var A=arguments[B][E];var D=C[E];if(D&&$type(A)=="object"&&$type(D)=="object"){C[E]=$merge(D,A);
+}else{C[E]=A;}}}return C;}var $extend=function(){var A=arguments;if(!A[1]){A=[this,A[0]];}for(var B in A[1]){A[0][B]=A[1][B];}return A[0];};var $native=function(){for(var B=0,A=arguments.length;
+B<A;B++){arguments[B].extend=function(C){for(var D in C){if(!this.prototype[D]){this.prototype[D]=C[D];}if(!this[D]){this[D]=$native.generic(D);}}};}};
+$native.generic=function(A){return function(B){return this.prototype[A].apply(B,Array.prototype.slice.call(arguments,1));};};$native(Function,Array,String,Number);
+function $chk(A){return !!(A||A===0);}function $pick(B,A){return $defined(B)?B:A;}function $random(B,A){return Math.floor(Math.random()*(A-B+1)+B);}function $time(){return new Date().getTime();
+}function $clear(A){clearTimeout(A);clearInterval(A);return null;}var Abstract=function(A){A=A||{};A.extend=$extend;return A;};var Window=new Abstract(window);
+var Document=new Abstract(document);document.head=document.getElementsByTagName("head")[0];window.xpath=!!(document.evaluate);if(window.ActiveXObject){window.ie=window[window.XMLHttpRequest?"ie7":"ie6"]=true;
+}else{if(document.childNodes&&!document.all&&!navigator.taintEnabled){window.webkit=window[window.xpath?"webkit420":"webkit419"]=true;}else{if(document.getBoxObjectFor!=null){window.gecko=true;
+}}}window.khtml=window.webkit;Object.extend=$extend;if(typeof HTMLElement=="undefined"){var HTMLElement=function(){};if(window.webkit){document.createElement("iframe");
+}HTMLElement.prototype=(window.webkit)?window["[[DOMElement.prototype]]"]:{};}HTMLElement.prototype.htmlElement=function(){};if(window.ie6){try{document.execCommand("BackgroundImageCache",false,true);
+}catch(e){}}var Class=function(B){var A=function(){return(arguments[0]!==null&&this.initialize&&$type(this.initialize)=="function")?this.initialize.apply(this,arguments):this;
+};$extend(A,this);A.prototype=B;A.constructor=Class;return A;};Class.empty=function(){};Class.prototype={extend:function(B){var C=new this(null);for(var D in B){var A=C[D];
+C[D]=Class.Merge(A,B[D]);}return new Class(C);},implement:function(){for(var B=0,A=arguments.length;B<A;B++){$extend(this.prototype,arguments[B]);}}};Class.Merge=function(C,D){if(C&&C!=D){var B=$type(D);
+if(B!=$type(C)){return D;}switch(B){case"function":var A=function(){this.parent=arguments.callee.parent;return D.apply(this,arguments);};A.parent=C;return A;
+case"object":return $merge(C,D);}}return D;};var Chain=new Class({chain:function(A){this.chains=this.chains||[];this.chains.push(A);return this;},callChain:function(){if(this.chains&&this.chains.length){this.chains.shift().delay(10,this);
+}},clearChain:function(){this.chains=[];}});var Events=new Class({addEvent:function(B,A){if(A!=Class.empty){this.$events=this.$events||{};this.$events[B]=this.$events[B]||[];
+this.$events[B].include(A);}return this;},fireEvent:function(C,B,A){if(this.$events&&this.$events[C]){this.$events[C].each(function(D){D.create({bind:this,delay:A,"arguments":B})();
+},this);}return this;},removeEvent:function(B,A){if(this.$events&&this.$events[B]){this.$events[B].remove(A);}return this;}});var Options=new Class({setOptions:function(){this.options=$merge.apply(null,[this.options].extend(arguments));
+if(this.addEvent){for(var A in this.options){if($type(this.options[A]=="function")&&(/^on[A-Z]/).test(A)){this.addEvent(A,this.options[A]);}}}return this;
+}});Array.extend({forEach:function(C,D){for(var B=0,A=this.length;B<A;B++){C.call(D,this[B],B,this);}},filter:function(D,E){var C=[];for(var B=0,A=this.length;
+B<A;B++){if(D.call(E,this[B],B,this)){C.push(this[B]);}}return C;},map:function(D,E){var C=[];for(var B=0,A=this.length;B<A;B++){C[B]=D.call(E,this[B],B,this);
+}return C;},every:function(C,D){for(var B=0,A=this.length;B<A;B++){if(!C.call(D,this[B],B,this)){return false;}}return true;},some:function(C,D){for(var B=0,A=this.length;
+B<A;B++){if(C.call(D,this[B],B,this)){return true;}}return false;},indexOf:function(C,D){var A=this.length;for(var B=(D<0)?Math.max(0,A+D):D||0;B<A;B++){if(this[B]===C){return B;
+}}return -1;},copy:function(D,C){D=D||0;if(D<0){D=this.length+D;}C=C||(this.length-D);var A=[];for(var B=0;B<C;B++){A[B]=this[D++];}return A;},remove:function(C){var B=0;
+var A=this.length;while(B<A){if(this[B]===C){this.splice(B,1);A--;}else{B++;}}return this;},contains:function(A,B){return this.indexOf(A,B)!=-1;},associate:function(C){var D={},B=Math.min(this.length,C.length);
+for(var A=0;A<B;A++){D[C[A]]=this[A];}return D;},extend:function(C){for(var B=0,A=C.length;B<A;B++){this.push(C[B]);}return this;},merge:function(C){for(var B=0,A=C.length;
+B<A;B++){this.include(C[B]);}return this;},include:function(A){if(!this.contains(A)){this.push(A);}return this;},getRandom:function(){return this[$random(0,this.length-1)]||null;
+},getLast:function(){return this[this.length-1]||null;}});Array.prototype.each=Array.prototype.forEach;Array.each=Array.forEach;function $A(A){return Array.copy(A);
+}function $each(C,B,D){if(C&&typeof C.length=="number"&&$type(C)!="object"){Array.forEach(C,B,D);}else{for(var A in C){B.call(D||C,C[A],A);}}}Array.prototype.test=Array.prototype.contains;
+String.extend({test:function(A,B){return(($type(A)=="string")?new RegExp(A,B):A).test(this);},toInt:function(){return parseInt(this,10);},toFloat:function(){return parseFloat(this);
+},camelCase:function(){return this.replace(/-\D/g,function(A){return A.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/\w[A-Z]/g,function(A){return(A.charAt(0)+"-"+A.charAt(1).toLowerCase());
+});},capitalize:function(){return this.replace(/\b[a-z]/g,function(A){return A.toUpperCase();});},trim:function(){return this.replace(/^\s+|\s+$/g,"");
+},clean:function(){return this.replace(/\s{2,}/g," ").trim();},rgbToHex:function(B){var A=this.match(/\d{1,3}/g);return(A)?A.rgbToHex(B):false;},hexToRgb:function(B){var A=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+return(A)?A.slice(1).hexToRgb(B):false;},contains:function(A,B){return(B)?(B+this+B).indexOf(B+A+B)>-1:this.indexOf(A)>-1;},escapeRegExp:function(){return this.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1");
+}});Array.extend({rgbToHex:function(D){if(this.length<3){return false;}if(this.length==4&&this[3]==0&&!D){return"transparent";}var B=[];for(var A=0;A<3;
+A++){var C=(this[A]-0).toString(16);B.push((C.length==1)?"0"+C:C);}return D?B:"#"+B.join("");},hexToRgb:function(C){if(this.length!=3){return false;}var A=[];
+for(var B=0;B<3;B++){A.push(parseInt((this[B].length==1)?this[B]+this[B]:this[B],16));}return C?A:"rgb("+A.join(",")+")";}});Function.extend({create:function(A){var B=this;
+A=$merge({bind:B,event:false,"arguments":null,delay:false,periodical:false,attempt:false},A);if($chk(A.arguments)&&$type(A.arguments)!="array"){A.arguments=[A.arguments];
+}return function(E){var C;if(A.event){E=E||window.event;C=[(A.event===true)?E:new A.event(E)];if(A.arguments){C.extend(A.arguments);}}else{C=A.arguments||arguments;
+}var F=function(){return B.apply($pick(A.bind,B),C);};if(A.delay){return setTimeout(F,A.delay);}if(A.periodical){return setInterval(F,A.periodical);}if(A.attempt){try{return F();
+}catch(D){return false;}}return F();};},pass:function(A,B){return this.create({"arguments":A,bind:B});},attempt:function(A,B){return this.create({"arguments":A,bind:B,attempt:true})();
+},bind:function(B,A){return this.create({bind:B,"arguments":A});},bindAsEventListener:function(B,A){return this.create({bind:B,event:true,"arguments":A});
+},delay:function(B,C,A){return this.create({delay:B,bind:C,"arguments":A})();},periodical:function(A,C,B){return this.create({periodical:A,bind:C,"arguments":B})();
+}});Number.extend({toInt:function(){return parseInt(this);},toFloat:function(){return parseFloat(this);},limit:function(B,A){return Math.min(A,Math.max(B,this));
+},round:function(A){A=Math.pow(10,A||0);return Math.round(this*A)/A;},times:function(B){for(var A=0;A<this;A++){B(A);}}});var Element=new Class({initialize:function(D,C){if($type(D)=="string"){if(window.ie&&C&&(C.name||C.type)){var A=(C.name)?' name="'+C.name+'"':"";
+var B=(C.type)?' type="'+C.type+'"':"";delete C.name;delete C.type;D="<"+D+A+B+">";}D=document.createElement(D);}D=$(D);return(!C||!D)?D:D.set(C);}});var Elements=new Class({initialize:function(A){return(A)?$extend(A,this):this;
+}});Elements.extend=function(A){for(var B in A){this.prototype[B]=A[B];this[B]=$native.generic(B);}};function $(B){if(!B){return null;}if(B.htmlElement){return Garbage.collect(B);
+}if([window,document].contains(B)){return B;}var A=$type(B);if(A=="string"){B=document.getElementById(B);A=(B)?"element":false;}if(A!="element"){return null;
+}if(B.htmlElement){return Garbage.collect(B);}if(["object","embed"].contains(B.tagName.toLowerCase())){return B;}$extend(B,Element.prototype);B.htmlElement=function(){};
+return Garbage.collect(B);}document.getElementsBySelector=document.getElementsByTagName;function $$(){var D=[];for(var C=0,B=arguments.length;C<B;C++){var A=arguments[C];
+switch($type(A)){case"element":D.push(A);case"boolean":break;case false:break;case"string":A=document.getElementsBySelector(A,true);default:D.extend(A);
+}}return $$.unique(D);}$$.unique=function(G){var D=[];for(var C=0,A=G.length;C<A;C++){if(G[C].$included){continue;}var B=$(G[C]);if(B&&!B.$included){B.$included=true;
+D.push(B);}}for(var F=0,E=D.length;F<E;F++){D[F].$included=null;}return new Elements(D);};Elements.Multi=function(A){return function(){var D=arguments;
+var B=[];var G=true;for(var E=0,C=this.length,F;E<C;E++){F=this[E][A].apply(this[E],D);if($type(F)!="element"){G=false;}B.push(F);}return(G)?$$.unique(B):B;
+};};Element.extend=function(A){for(var B in A){HTMLElement.prototype[B]=A[B];Element.prototype[B]=A[B];Element[B]=$native.generic(B);var C=(Array.prototype[B])?B+"Elements":B;
+Elements.prototype[C]=Elements.Multi(B);}};Element.extend({set:function(A){for(var C in A){var B=A[C];switch(C){case"styles":this.setStyles(B);break;case"events":if(this.addEvents){this.addEvents(B);
+}break;case"properties":this.setProperties(B);break;default:this.setProperty(C,B);}}return this;},inject:function(C,A){C=$(C);switch(A){case"before":C.parentNode.insertBefore(this,C);
+break;case"after":var B=C.getNext();if(!B){C.parentNode.appendChild(this);}else{C.parentNode.insertBefore(this,B);}break;case"top":var D=C.firstChild;if(D){C.insertBefore(this,D);
+break;}default:C.appendChild(this);}return this;},injectBefore:function(A){return this.inject(A,"before");},injectAfter:function(A){return this.inject(A,"after");
+},injectInside:function(A){return this.inject(A,"bottom");},injectTop:function(A){return this.inject(A,"top");},adopt:function(){var A=[];$each(arguments,function(B){A=A.concat(B);
+});$$(A).inject(this);return this;},remove:function(){return this.parentNode.removeChild(this);},clone:function(C){var B=$(this.cloneNode(C!==false));if(!B.$events){return B;
+}B.$events={};for(var A in this.$events){B.$events[A]={keys:$A(this.$events[A].keys),values:$A(this.$events[A].values)};}return B.removeEvents();},replaceWith:function(A){A=$(A);
+this.parentNode.replaceChild(A,this);return A;},appendText:function(A){this.appendChild(document.createTextNode(A));return this;},hasClass:function(A){return this.className.contains(A," ");
+},addClass:function(A){if(!this.hasClass(A)){this.className=(this.className+" "+A).clean();}return this;},removeClass:function(A){this.className=this.className.replace(new RegExp("(^|\\s)"+A+"(?:\\s|$)"),"$1").clean();
+return this;},toggleClass:function(A){return this.hasClass(A)?this.removeClass(A):this.addClass(A);},setStyle:function(B,A){switch(B){case"opacity":return this.setOpacity(parseFloat(A));
+case"float":B=(window.ie)?"styleFloat":"cssFloat";}B=B.camelCase();switch($type(A)){case"number":if(!["zIndex","zoom"].contains(B)){A+="px";}break;case"array":A="rgb("+A.join(",")+")";
+}this.style[B]=A;return this;},setStyles:function(A){switch($type(A)){case"object":Element.setMany(this,"setStyle",A);break;case"string":this.style.cssText=A;
+}return this;},setOpacity:function(A){if(A==0){if(this.style.visibility!="hidden"){this.style.visibility="hidden";}}else{if(this.style.visibility!="visible"){this.style.visibility="visible";
+}}if(!this.currentStyle||!this.currentStyle.hasLayout){this.style.zoom=1;}if(window.ie){this.style.filter=(A==1)?"":"alpha(opacity="+A*100+")";}this.style.opacity=this.$tmp.opacity=A;
+return this;},getStyle:function(C){C=C.camelCase();var A=this.style[C];if(!$chk(A)){if(C=="opacity"){return this.$tmp.opacity;}A=[];for(var B in Element.Styles){if(C==B){Element.Styles[B].each(function(F){var E=this.getStyle(F);
+A.push(parseInt(E)?E:"0px");},this);if(C=="border"){var D=A.every(function(E){return(E==A[0]);});return(D)?A[0]:false;}return A.join(" ");}}if(C.contains("border")){if(Element.Styles.border.contains(C)){return["Width","Style","Color"].map(function(E){return this.getStyle(C+E);
+},this).join(" ");}else{if(Element.borderShort.contains(C)){return["Top","Right","Bottom","Left"].map(function(E){return this.getStyle("border"+E+C.replace("border",""));
+},this).join(" ");}}}if(document.defaultView){A=document.defaultView.getComputedStyle(this,null).getPropertyValue(C.hyphenate());}else{if(this.currentStyle){A=this.currentStyle[C];
+}}}if(window.ie){A=Element.fixStyle(C,A,this);}if(A&&C.test(/color/i)&&A.contains("rgb")){return A.split("rgb").splice(1,4).map(function(E){return E.rgbToHex();
+}).join(" ");}return A;},getStyles:function(){return Element.getMany(this,"getStyle",arguments);},walk:function(A,C){A+="Sibling";var B=(C)?this[C]:this[A];
+while(B&&$type(B)!="element"){B=B[A];}return $(B);},getPrevious:function(){return this.walk("previous");},getNext:function(){return this.walk("next");},getFirst:function(){return this.walk("next","firstChild");
+},getLast:function(){return this.walk("previous","lastChild");},getParent:function(){return $(this.parentNode);},getChildren:function(){return $$(this.childNodes);
+},hasChild:function(A){return !!$A(this.getElementsByTagName("*")).contains(A);},getProperty:function(D){var B=Element.Properties[D];if(B){return this[B];
+}var A=Element.PropertiesIFlag[D]||0;if(!window.ie||A){return this.getAttribute(D,A);}var C=this.attributes[D];return(C)?C.nodeValue:null;},removeProperty:function(B){var A=Element.Properties[B];
+if(A){this[A]="";}else{this.removeAttribute(B);}return this;},getProperties:function(){return Element.getMany(this,"getProperty",arguments);},setProperty:function(C,B){var A=Element.Properties[C];
+if(A){this[A]=B;}else{this.setAttribute(C,B);}return this;},setProperties:function(A){return Element.setMany(this,"setProperty",A);},setHTML:function(){this.innerHTML=$A(arguments).join("");
+return this;},setText:function(B){var A=this.getTag();if(["style","script"].contains(A)){if(window.ie){if(A=="style"){this.styleSheet.cssText=B;}else{if(A=="script"){this.setProperty("text",B);
+}}return this;}else{this.removeChild(this.firstChild);return this.appendText(B);}}this[$defined(this.innerText)?"innerText":"textContent"]=B;return this;
+},getText:function(){var A=this.getTag();if(["style","script"].contains(A)){if(window.ie){if(A=="style"){return this.styleSheet.cssText;}else{if(A=="script"){return this.getProperty("text");
+}}}else{return this.innerHTML;}}return($pick(this.innerText,this.textContent));},getTag:function(){return this.tagName.toLowerCase();},empty:function(){Garbage.trash(this.getElementsByTagName("*"));
+return this.setHTML("");}});Element.fixStyle=function(E,A,D){if($chk(parseInt(A))){return A;}if(["height","width"].contains(E)){var B=(E=="width")?["left","right"]:["top","bottom"];
+var C=0;B.each(function(F){C+=D.getStyle("border-"+F+"-width").toInt()+D.getStyle("padding-"+F).toInt();});return D["offset"+E.capitalize()]-C+"px";}else{if(E.test(/border(.+)Width|margin|padding/)){return"0px";
+}}return A;};Element.Styles={border:[],padding:[],margin:[]};["Top","Right","Bottom","Left"].each(function(B){for(var A in Element.Styles){Element.Styles[A].push(A+B);
+}});Element.borderShort=["borderWidth","borderStyle","borderColor"];Element.getMany=function(B,D,C){var A={};$each(C,function(E){A[E]=B[D](E);});return A;
+};Element.setMany=function(B,D,C){for(var A in C){B[D](A,C[A]);}return B;};Element.Properties=new Abstract({"class":"className","for":"htmlFor",colspan:"colSpan",rowspan:"rowSpan",accesskey:"accessKey",tabindex:"tabIndex",maxlength:"maxLength",readonly:"readOnly",frameborder:"frameBorder",value:"value",disabled:"disabled",checked:"checked",multiple:"multiple",selected:"selected"});
+Element.PropertiesIFlag={href:2,src:2};Element.Methods={Listeners:{addListener:function(B,A){if(this.addEventListener){this.addEventListener(B,A,false);
+}else{this.attachEvent("on"+B,A);}return this;},removeListener:function(B,A){if(this.removeEventListener){this.removeEventListener(B,A,false);}else{this.detachEvent("on"+B,A);
+}return this;}}};window.extend(Element.Methods.Listeners);document.extend(Element.Methods.Listeners);Element.extend(Element.Methods.Listeners);var Garbage={elements:[],collect:function(A){if(!A.$tmp){Garbage.elements.push(A);
+A.$tmp={opacity:1};}return A;},trash:function(D){for(var B=0,A=D.length,C;B<A;B++){if(!(C=D[B])||!C.$tmp){continue;}if(C.$events){C.fireEvent("trash").removeEvents();
+}for(var E in C.$tmp){C.$tmp[E]=null;}for(var F in Element.prototype){C[F]=null;}Garbage.elements[Garbage.elements.indexOf(C)]=null;C.htmlElement=C.$tmp=C=null;
+}Garbage.elements.remove(null);},empty:function(){Garbage.collect(window);Garbage.collect(document);Garbage.trash(Garbage.elements);}};window.addListener("beforeunload",function(){window.addListener("unload",Garbage.empty);
+if(window.ie){window.addListener("unload",CollectGarbage);}});var Event=new Class({initialize:function(C){if(C&&C.$extended){return C;}this.$extended=true;
+C=C||window.event;this.event=C;this.type=C.type;this.target=C.target||C.srcElement;if(this.target.nodeType==3){this.target=this.target.parentNode;}this.shift=C.shiftKey;
+this.control=C.ctrlKey;this.alt=C.altKey;this.meta=C.metaKey;if(["DOMMouseScroll","mousewheel"].contains(this.type)){this.wheel=(C.wheelDelta)?C.wheelDelta/120:-(C.detail||0)/3;
+}else{if(this.type.contains("key")){this.code=C.which||C.keyCode;for(var B in Event.keys){if(Event.keys[B]==this.code){this.key=B;break;}}if(this.type=="keydown"){var A=this.code-111;
+if(A>0&&A<13){this.key="f"+A;}}this.key=this.key||String.fromCharCode(this.code).toLowerCase();}else{if(this.type.test(/(click|mouse|menu)/)){this.page={x:C.pageX||C.clientX+document.documentElement.scrollLeft,y:C.pageY||C.clientY+document.documentElement.scrollTop};
+this.client={x:C.pageX?C.pageX-window.pageXOffset:C.clientX,y:C.pageY?C.pageY-window.pageYOffset:C.clientY};this.rightClick=(C.which==3)||(C.button==2);
+switch(this.type){case"mouseover":this.relatedTarget=C.relatedTarget||C.fromElement;break;case"mouseout":this.relatedTarget=C.relatedTarget||C.toElement;
+}this.fixRelatedTarget();}}}return this;},stop:function(){return this.stopPropagation().preventDefault();},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();
+}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault();}else{this.event.returnValue=false;
+}return this;}});Event.fix={relatedTarget:function(){if(this.relatedTarget&&this.relatedTarget.nodeType==3){this.relatedTarget=this.relatedTarget.parentNode;
+}},relatedTargetGecko:function(){try{Event.fix.relatedTarget.call(this);}catch(A){this.relatedTarget=this.target;}}};Event.prototype.fixRelatedTarget=(window.gecko)?Event.fix.relatedTargetGecko:Event.fix.relatedTarget;
+Event.keys=new Abstract({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Element.Methods.Events={addEvent:function(C,B){this.$events=this.$events||{};
+this.$events[C]=this.$events[C]||{keys:[],values:[]};if(this.$events[C].keys.contains(B)){return this;}this.$events[C].keys.push(B);var A=C;var D=Element.Events[C];
+if(D){if(D.add){D.add.call(this,B);}if(D.map){B=D.map;}if(D.type){A=D.type;}}if(!this.addEventListener){B=B.create({bind:this,event:true});}this.$events[C].values.push(B);
+return(Element.NativeEvents.contains(A))?this.addListener(A,B):this;},removeEvent:function(C,B){if(!this.$events||!this.$events[C]){return this;}var F=this.$events[C].keys.indexOf(B);
+if(F==-1){return this;}var A=this.$events[C].keys.splice(F,1)[0];var E=this.$events[C].values.splice(F,1)[0];var D=Element.Events[C];if(D){if(D.remove){D.remove.call(this,B);
+}if(D.type){C=D.type;}}return(Element.NativeEvents.contains(C))?this.removeListener(C,E):this;},addEvents:function(A){return Element.setMany(this,"addEvent",A);
+},removeEvents:function(A){if(!this.$events){return this;}if(!A){for(var B in this.$events){this.removeEvents(B);}this.$events=null;}else{if(this.$events[A]){this.$events[A].keys.each(function(C){this.removeEvent(A,C);
+},this);this.$events[A]=null;}}return this;},fireEvent:function(C,B,A){if(this.$events&&this.$events[C]){this.$events[C].keys.each(function(D){D.create({bind:this,delay:A,"arguments":B})();
+},this);}return this;},cloneEvents:function(C,A){if(!C.$events){return this;}if(!A){for(var B in C.$events){this.cloneEvents(C,B);}}else{if(C.$events[A]){C.$events[A].keys.each(function(D){this.addEvent(A,D);
+},this);}}return this;}};window.extend(Element.Methods.Events);document.extend(Element.Methods.Events);Element.extend(Element.Methods.Events);Element.Events=new Abstract({mouseenter:{type:"mouseover",map:function(A){A=new Event(A);
+if(A.relatedTarget!=this&&!this.hasChild(A.relatedTarget)){this.fireEvent("mouseenter",A);}}},mouseleave:{type:"mouseout",map:function(A){A=new Event(A);
+if(A.relatedTarget!=this&&!this.hasChild(A.relatedTarget)){this.fireEvent("mouseleave",A);}}},mousewheel:{type:(window.gecko)?"DOMMouseScroll":"mousewheel"}});
+Element.NativeEvents=["click","dblclick","mouseup","mousedown","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","keydown","keypress","keyup","load","unload","beforeunload","resize","move","focus","blur","change","submit","reset","select","error","abort","contextmenu","scroll"];
+Function.extend({bindWithEvent:function(B,A){return this.create({bind:B,"arguments":A,event:Event});}});Element.extend({scrollTo:function(A,B){this.scrollLeft=A;
+this.scrollTop=B;},getSize:function(){return{scroll:{x:this.scrollLeft,y:this.scrollTop},size:{x:this.offsetWidth,y:this.offsetHeight},scrollSize:{x:this.scrollWidth,y:this.scrollHeight}};
+},getPosition:function(A){A=A||[];var B=this,D=0,C=0;do{D+=B.offsetLeft||0;C+=B.offsetTop||0;B=B.offsetParent;}while(B);A.each(function(E){D-=E.scrollLeft||0;
+C-=E.scrollTop||0;});return{x:D,y:C};},getTop:function(A){return this.getPosition(A).y;},getLeft:function(A){return this.getPosition(A).x;},getCoordinates:function(B){var A=this.getPosition(B);
+var C={width:this.offsetWidth,height:this.offsetHeight,left:A.x,top:A.y};C.right=C.left+C.width;C.bottom=C.top+C.height;return C;}});Element.Events.domready={add:function(B){if(window.loaded){B.call(this);
+return ;}var A=function(){if(window.loaded){return ;}window.loaded=true;window.timer=$clear(window.timer);this.fireEvent("domready");}.bind(this);if(document.readyState&&window.webkit){window.timer=function(){if(["loaded","complete"].contains(document.readyState)){A();
+}}.periodical(50);}else{if(document.readyState&&window.ie){if(!$("ie_ready")){var C=(window.location.protocol=="https:")?"://0":"javascript:void(0)";document.write('<script id="ie_ready" defer src="'+C+'"><\/script>');
+$("ie_ready").onreadystatechange=function(){if(this.readyState=="complete"){A();}};}}else{window.addListener("load",A);document.addListener("DOMContentLoaded",A);
+}}}};window.onDomReady=function(A){return this.addEvent("domready",A);};window.extend({getWidth:function(){if(this.webkit419){return this.innerWidth;}if(this.opera){return document.body.clientWidth;
+}return document.documentElement.clientWidth;},getHeight:function(){if(this.webkit419){return this.innerHeight;}if(this.opera){return document.body.clientHeight;
+}return document.documentElement.clientHeight;},getScrollWidth:function(){if(this.ie){return Math.max(document.documentElement.offsetWidth,document.documentElement.scrollWidth);
+}if(this.webkit){return document.body.scrollWidth;}return document.documentElement.scrollWidth;},getScrollHeight:function(){if(this.ie){return Math.max(document.documentElement.offsetHeight,document.documentElement.scrollHeight);
+}if(this.webkit){return document.body.scrollHeight;}return document.documentElement.scrollHeight;},getScrollLeft:function(){return this.pageXOffset||document.documentElement.scrollLeft;
+},getScrollTop:function(){return this.pageYOffset||document.documentElement.scrollTop;},getSize:function(){return{size:{x:this.getWidth(),y:this.getHeight()},scrollSize:{x:this.getScrollWidth(),y:this.getScrollHeight()},scroll:{x:this.getScrollLeft(),y:this.getScrollTop()}};
+},getPosition:function(){return{x:0,y:0};}});var Fx={};Fx.Base=new Class({options:{onStart:Class.empty,onComplete:Class.empty,onCancel:Class.empty,transition:function(A){return -(Math.cos(Math.PI*A)-1)/2;
+},duration:500,unit:"px",wait:true,fps:50},initialize:function(A){this.element=this.element||null;this.setOptions(A);if(this.options.initialize){this.options.initialize.call(this);
+}},step:function(){var A=$time();if(A<this.time+this.options.duration){this.delta=this.options.transition((A-this.time)/this.options.duration);this.setNow();
+this.increase();}else{this.stop(true);this.set(this.to);this.fireEvent("onComplete",this.element,10);this.callChain();}},set:function(A){this.now=A;this.increase();
+return this;},setNow:function(){this.now=this.compute(this.from,this.to);},compute:function(B,A){return(A-B)*this.delta+B;},start:function(B,A){if(!this.options.wait){this.stop();
+}else{if(this.timer){return this;}}this.from=B;this.to=A;this.change=this.to-this.from;this.time=$time();this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);
+this.fireEvent("onStart",this.element);return this;},stop:function(A){if(!this.timer){return this;}this.timer=$clear(this.timer);if(!A){this.fireEvent("onCancel",this.element);
+}return this;},custom:function(B,A){return this.start(B,A);},clearTimer:function(A){return this.stop(A);}});Fx.Base.implement(new Chain,new Events,new Options);
+Fx.CSS={select:function(B,C){if(B.test(/color/i)){return this.Color;}var A=$type(C);if((A=="array")||(A=="string"&&C.contains(" "))){return this.Multi;
+}return this.Single;},parse:function(C,D,A){if(!A.push){A=[A];}var F=A[0],E=A[1];if(!$chk(E)){E=F;F=C.getStyle(D);}var B=this.select(D,E);return{from:B.parse(F),to:B.parse(E),css:B};
+}};Fx.CSS.Single={parse:function(A){return parseFloat(A);},getNow:function(C,B,A){return A.compute(C,B);},getValue:function(C,A,B){if(A=="px"&&B!="opacity"){C=Math.round(C);
+}return C+A;}};Fx.CSS.Multi={parse:function(A){return A.push?A:A.split(" ").map(function(B){return parseFloat(B);});},getNow:function(E,D,C){var A=[];for(var B=0;
+B<E.length;B++){A[B]=C.compute(E[B],D[B]);}return A;},getValue:function(C,A,B){if(A=="px"&&B!="opacity"){C=C.map(Math.round);}return C.join(A+" ")+A;}};
+Fx.CSS.Color={parse:function(A){return A.push?A:A.hexToRgb(true);},getNow:function(E,D,C){var A=[];for(var B=0;B<E.length;B++){A[B]=Math.round(C.compute(E[B],D[B]));
+}return A;},getValue:function(A){return"rgb("+A.join(",")+")";}};Fx.Style=Fx.Base.extend({initialize:function(B,C,A){this.element=$(B);this.property=C;
+this.parent(A);},hide:function(){return this.set(0);},setNow:function(){this.now=this.css.getNow(this.from,this.to,this);},set:function(A){this.css=Fx.CSS.select(this.property,A);
+return this.parent(this.css.parse(A));},start:function(C,B){if(this.timer&&this.options.wait){return this;}var A=Fx.CSS.parse(this.element,this.property,[C,B]);
+this.css=A.css;return this.parent(A.from,A.to);},increase:function(){this.element.setStyle(this.property,this.css.getValue(this.now,this.options.unit,this.property));
+}});Element.extend({effect:function(B,A){return new Fx.Style(this,B,A);}});Fx.Scroll=Fx.Base.extend({options:{overflown:[],offset:{x:0,y:0},wheelStops:true},initialize:function(B,A){this.now=[];
+this.element=$(B);this.bound={stop:this.stop.bind(this,false)};this.parent(A);if(this.options.wheelStops){this.addEvent("onStart",function(){document.addEvent("mousewheel",this.bound.stop);
+}.bind(this));this.addEvent("onComplete",function(){document.removeEvent("mousewheel",this.bound.stop);}.bind(this));}},setNow:function(){for(var A=0;A<2;
+A++){this.now[A]=this.compute(this.from[A],this.to[A]);}},scrollTo:function(B,F){if(this.timer&&this.options.wait){return this;}var D=this.element.getSize();
+var C={x:B,y:F};for(var E in D.size){var A=D.scrollSize[E]-D.size[E];if($chk(C[E])){C[E]=($type(C[E])=="number")?C[E].limit(0,A):A;}else{C[E]=D.scroll[E];
+}C[E]+=this.options.offset[E];}return this.start([D.scroll.x,D.scroll.y],[C.x,C.y]);},toTop:function(){return this.scrollTo(false,0);},toBottom:function(){return this.scrollTo(false,"full");
+},toLeft:function(){return this.scrollTo(0,false);},toRight:function(){return this.scrollTo("full",false);},toElement:function(B){var A=this.element.getPosition(this.options.overflown);
+var C=$(B).getPosition(this.options.overflown);return this.scrollTo(C.x-A.x,C.y-A.y);},increase:function(){this.element.scrollTo(this.now[0],this.now[1]);
+}});Fx.Transition=function(B,A){A=A||[];if($type(A)!="array"){A=[A];}return $extend(B,{easeIn:function(C){return B(C,A);},easeOut:function(C){return 1-B(1-C,A);
+},easeInOut:function(C){return(C<=0.5)?B(2*C,A)/2:(2-B(2*(1-C),A))/2;}});};Fx.Transitions=new Abstract({linear:function(A){return A;}});Fx.Transitions.extend=function(A){for(var B in A){Fx.Transitions[B]=new Fx.Transition(A[B]);
+Fx.Transitions.compat(B);}};Fx.Transitions.compat=function(A){["In","Out","InOut"].each(function(B){Fx.Transitions[A.toLowerCase()+B]=Fx.Transitions[A]["ease"+B];
+});};Fx.Transitions.extend({Pow:function(B,A){return Math.pow(B,A[0]||6);},Expo:function(A){return Math.pow(2,8*(A-1));},Circ:function(A){return 1-Math.sin(Math.acos(A));
+},Sine:function(A){return 1-Math.sin((1-A)*Math.PI/2);},Back:function(B,A){A=A[0]||1.618;return Math.pow(B,2)*((A+1)*B-A);},Bounce:function(D){var C;for(var B=0,A=1;
+1;B+=A,A/=2){if(D>=(7-4*B)/11){C=-Math.pow((11-6*B-11*D)/4,2)+A*A;break;}}return C;},Elastic:function(B,A){return Math.pow(2,10*--B)*Math.cos(20*B*Math.PI*(A[0]||1)/3);
+}});["Quad","Cubic","Quart","Quint"].each(function(B,A){Fx.Transitions[B]=new Fx.Transition(function(C){return Math.pow(C,[A+2]);});Fx.Transitions.compat(B);
+});var Drag={};Drag.Base=new Class({options:{handle:false,unit:"px",onStart:Class.empty,onBeforeStart:Class.empty,onComplete:Class.empty,onSnap:Class.empty,onDrag:Class.empty,limit:false,modifiers:{x:"left",y:"top"},grid:false,snap:6},initialize:function(B,A){this.setOptions(A);
+this.element=$(B);this.handle=$(this.options.handle)||this.element;this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.bound={start:this.start.bindWithEvent(this),check:this.check.bindWithEvent(this),drag:this.drag.bindWithEvent(this),stop:this.stop.bind(this)};
+this.attach();if(this.options.initialize){this.options.initialize.call(this);}},attach:function(){this.handle.addEvent("mousedown",this.bound.start);return this;
+},detach:function(){this.handle.removeEvent("mousedown",this.bound.start);return this;},start:function(C){this.fireEvent("onBeforeStart",this.element);
+this.mouse.start=C.page;var A=this.options.limit;this.limit={x:[],y:[]};for(var D in this.options.modifiers){if(!this.options.modifiers[D]){continue;}this.value.now[D]=this.element.getStyle(this.options.modifiers[D]).toInt();
+this.mouse.pos[D]=C.page[D]-this.value.now[D];if(A&&A[D]){for(var B=0;B<2;B++){if($chk(A[D][B])){this.limit[D][B]=($type(A[D][B])=="function")?A[D][B]():A[D][B];
+}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid};}document.addListener("mousemove",this.bound.check);
+document.addListener("mouseup",this.bound.stop);this.fireEvent("onStart",this.element);C.stop();},check:function(A){var B=Math.round(Math.sqrt(Math.pow(A.page.x-this.mouse.start.x,2)+Math.pow(A.page.y-this.mouse.start.y,2)));
+if(B>this.options.snap){document.removeListener("mousemove",this.bound.check);document.addListener("mousemove",this.bound.drag);this.drag(A);this.fireEvent("onSnap",this.element);
+}A.stop();},drag:function(A){this.out=false;this.mouse.now=A.page;for(var B in this.options.modifiers){if(!this.options.modifiers[B]){continue;}this.value.now[B]=this.mouse.now[B]-this.mouse.pos[B];
+if(this.limit[B]){if($chk(this.limit[B][1])&&(this.value.now[B]>this.limit[B][1])){this.value.now[B]=this.limit[B][1];this.out=true;}else{if($chk(this.limit[B][0])&&(this.value.now[B]<this.limit[B][0])){this.value.now[B]=this.limit[B][0];
+this.out=true;}}}if(this.options.grid[B]){this.value.now[B]-=(this.value.now[B]%this.options.grid[B]);}this.element.setStyle(this.options.modifiers[B],this.value.now[B]+this.options.unit);
+}this.fireEvent("onDrag",this.element);A.stop();},stop:function(){document.removeListener("mousemove",this.bound.check);document.removeListener("mousemove",this.bound.drag);
+document.removeListener("mouseup",this.bound.stop);this.fireEvent("onComplete",this.element);}});Drag.Base.implement(new Events,new Options);Element.extend({makeResizable:function(A){return new Drag.Base(this,$merge({modifiers:{x:"width",y:"height"}},A));
+}});Drag.Move=Drag.Base.extend({options:{droppables:[],container:false,overflown:[]},initialize:function(B,A){this.setOptions(A);this.element=$(B);this.droppables=$$(this.options.droppables);
+this.container=$(this.options.container);this.position={element:this.element.getStyle("position"),container:false};if(this.container){this.position.container=this.container.getStyle("position");
+}if(!["relative","absolute","fixed"].contains(this.position.element)){this.position.element="absolute";}var D=this.element.getStyle("top").toInt();var C=this.element.getStyle("left").toInt();
+if(this.position.element=="absolute"&&!["relative","absolute","fixed"].contains(this.position.container)){D=$chk(D)?D:this.element.getTop(this.options.overflown);
+C=$chk(C)?C:this.element.getLeft(this.options.overflown);}else{D=$chk(D)?D:0;C=$chk(C)?C:0;}this.element.setStyles({top:D,left:C,position:this.position.element});
+this.parent(this.element);},start:function(C){this.overed=null;if(this.container){var A=this.container.getCoordinates();var B=this.element.getCoordinates();
+if(this.position.element=="absolute"&&!["relative","absolute","fixed"].contains(this.position.container)){this.options.limit={x:[A.left,A.right-B.width],y:[A.top,A.bottom-B.height]};
+}else{this.options.limit={y:[0,A.height-B.height],x:[0,A.width-B.width]};}}this.parent(C);},drag:function(A){this.parent(A);var B=this.out?false:this.droppables.filter(this.checkAgainst,this).getLast();
+if(this.overed!=B){if(this.overed){this.overed.fireEvent("leave",[this.element,this]);}this.overed=B?B.fireEvent("over",[this.element,this]):null;}return this;
+},checkAgainst:function(B){B=B.getCoordinates(this.options.overflown);var A=this.mouse.now;return(A.x>B.left&&A.x<B.right&&A.y<B.bottom&&A.y>B.top);},stop:function(){if(this.overed&&!this.out){this.overed.fireEvent("drop",[this.element,this]);
+}else{this.element.fireEvent("emptydrop",this);}this.parent();return this;}});Element.extend({makeDraggable:function(A){return new Drag.Move(this,A);}});
+var Asset=new Abstract({javascript:function(C,B){B=$merge({onload:Class.empty},B);var A=new Element("script",{src:C}).addEvents({load:B.onload,readystatechange:function(){if(this.readyState=="complete"){this.fireEvent("load");
+}}});delete B.onload;return A.setProperties(B).inject(document.head);},css:function(B,A){return new Element("link",$merge({rel:"stylesheet",media:"screen",type:"text/css",href:B},A)).inject(document.head);
+},image:function(C,B){B=$merge({onload:Class.empty,onabort:Class.empty,onerror:Class.empty},B);var D=new Image();D.src=C;var A=new Element("img",{src:C});
+["load","abort","error"].each(function(E){var F=B["on"+E];delete B["on"+E];A.addEvent(E,function(){this.removeEvent(E,arguments.callee);F.call(this);});
+});if(D.width&&D.height){A.fireEvent("load",A,1);}return A.setProperties(B);},images:function(D,C){C=$merge({onComplete:Class.empty,onProgress:Class.empty},C);
+if(!D.push){D=[D];}var A=[];var B=0;D.each(function(F){var E=new Asset.image(F,{onload:function(){C.onProgress.call(this,B);B++;if(B==D.length){C.onComplete();
+}}});A.push(E);});return new Elements(A);}});var Scroller=new Class({options:{area:20,velocity:1,onChange:function(A,B){this.element.scrollTo(A,B);}},initialize:function(B,A){this.setOptions(A);
+this.element=$(B);this.mousemover=([window,document].contains(B))?$(document.body):this.element;},start:function(){this.coord=this.getCoords.bindWithEvent(this);
+this.mousemover.addListener("mousemove",this.coord);},stop:function(){this.mousemover.removeListener("mousemove",this.coord);this.timer=$clear(this.timer);
+},getCoords:function(A){this.page=(this.element==window)?A.client:A.page;if(!this.timer){this.timer=this.scroll.periodical(50,this);}},scroll:function(){var A=this.element.getSize();
+var D=this.element.getPosition();var C={x:0,y:0};for(var B in this.page){if(this.page[B]<(this.options.area+D[B])&&A.scroll[B]!=0){C[B]=(this.page[B]-this.options.area-D[B])*this.options.velocity;
+}else{if(this.page[B]+this.options.area>(A.size[B]+D[B])&&A.scroll[B]+A.size[B]!=A.scrollSize[B]){C[B]=(this.page[B]-A.size[B]+this.options.area-D[B])*this.options.velocity;
+}}}if(C.y||C.x){this.fireEvent("onChange",[A.scroll.x+C.x,A.scroll.y+C.y]);}}});Scroller.implement(new Events,new Options);
Index: /extensions/paMOOramics/js/pamoorama0.3.js
===================================================================
--- /extensions/paMOOramics/js/pamoorama0.3.js	(revision 3700)
+++ /extensions/paMOOramics/js/pamoorama0.3.js	(revision 3700)
@@ -0,0 +1,339 @@
+// Pamoorama 0.3
+// By: Jean-Nicolas Jolivet 
+// www.silverscripting.com/pamoorama/
+// Feel free to do whatever you want with the script! Give credits if you like it
+// if you don't like it, don't use it ;)
+var pamoorama = new Class({
+	
+	initialize: function(element, options) {
+		this.options = Object.extend({
+			activateSlider:		true,
+			footercolor:		'#000',
+			captioncolor:		'#fff',
+			caption:			'',
+			width:				650,
+			enableAutoscroll:	true,
+			autoscrollSpeed: 	10000,
+			autoscrollOnLoad: 	false,
+			startAutoscroll:	'Start Autoscroll',
+			stopAutoscroll:		'Stop Autoscroll',
+			loadingMessage:		'Loading Panorama...',
+			clickMessage:		'Click to move the frame!',
+			dragMessage:		'Drag me to move the panorama!'
+		}, options || {});
+		
+		this.el = $(element);
+		this.elid = element;
+		this.el.setStyle('width', this.options.width + 'px');
+		this.el.setStyle('font-family', 'sans-serif');
+		this.skipInit = false;
+		
+		
+		
+		this.loading = new Element('div', {
+			'id': this.elid + '_footer'
+		});
+		this.loading.setHTML(this.options.loadingMessage);
+		this.loading.injectInside(this.el);
+		
+		this.picturename = this.el.getProperty('alt');
+		if(this.options.caption == '')
+		{
+			this.options.caption = this.picturename;
+		}
+		
+		this.area = Math.floor(this.options.width / 2) - 20;
+		
+		
+		this.image = new Asset.image(this.picturename, {
+			onload: this.continueInit.bind(this)
+		});
+		this.image.setStyles({'left': '-10000px', 'position': 'relative'});
+		
+		this.image.injectInside(document.body);
+	
+	},
+	
+	continueInit: function()
+	{
+		if(! this.skipInit)
+		{
+			
+			this.imageWidth = this.image.getSize().size.x;
+			this.imageHeight = this.image.getSize().size.y;
+			this.ratio = this.imageWidth / 200;
+			this.image.remove();
+			this.loading.remove();
+			
+			
+			this.outter = new Element('div', {
+				'id': this.elid + '_outter',
+				'styles': {
+					'width' : this.options.width + 'px',
+					'height': this.imageHeight + 'px',
+					'overflow': 'hidden'
+				}
+			});
+			
+			this.inner = new Element('div', {
+				'id': this.elid + '_inner',
+				'styles' : {
+					'width': this.imageWidth + 'px',
+					'height': this.imageHeight + 'px',
+					'background': 'transparent url(' + this.picturename + ') no-repeat top left'
+				}
+			});
+			
+			this.footer = new Element('div', {
+				'id': this.elid + '_footer',
+				'styles': {
+					'width' : this.options.width + 'px',
+					'height': (Math.floor(this.imageHeight / this.ratio) + 22) + 'px',
+					'background-color': this.options.footercolor
+				}
+			});
+			
+			this.caption = new Element('div', {
+				'id': this.elid + '_caption',
+				'styles': {
+					'float': 'left',
+					'margin-top': '11px',
+					'padding-left': '8px',
+					'color' : this.options.captioncolor,
+					'font-family': "Trebuchet MS",
+					'text-align':'left',
+					'font-size': '13px'
+				}
+			});
+			this.caption.setHTML(this.options.caption);
+			
+			this.thumb = new Element('div', {
+				'id': this.elid + '_thumb',
+				'styles': {
+					'float': 'right',
+					'margin': '10px 8px 0px 0px',
+					'overflow' : 'hidden',
+					'padding' : '0px',
+					'height': (Math.floor(this.imageHeight / this.ratio) + 1) +'px',
+					'width': '200px',
+					'text-align': 'left',
+					'border': '2px solid #fff',
+					'cursor': 'pointer'
+				},
+				'title': this.options.clickMessage
+			});
+			
+			if(window.ie)
+			{
+				this.ieheightadjust = 0;
+			}
+			else
+			{
+				this.ieheightadjust = 3;
+			}
+			this.frame = new Element('div', {
+				'id': this.elid + '_frame',
+				'styles': {
+					'height': (Math.floor(this.imageHeight / this.ratio) + 1) +'px',
+					'width': (Math.floor(this.options.width / this.ratio) + 1) + 'px',
+					'position': 'relative',
+					'top': '-' + (Math.floor(this.imageHeight / this.ratio) + this.ieheightadjust +1) +'px',
+					'left' : '0px',
+					'padding' : '0px',
+					'margin' : '0px',
+					'background-color': 'lightblue',
+					'cursor': 'move',
+					'z-index': '1000',
+					'opacity': '0.4',
+					'-moz-opacity': '0.8',
+					'filter': 'alpha(opacity=80)'
+				},
+				'title': this.options.dragMessage
+			});
+			
+			if(this.options.enableAutoscroll)
+			{
+				this.playpause = new Element('div', {
+					'id': this.elid + '_playpause',
+					'styles': {
+						
+						'padding-left': '1px',
+						'color' : this.options.captioncolor,
+						'font-family': "Trebuchet MS",
+						'font-size': '11px',
+						'text-align':'left',
+						'cursor': 'pointer'
+					}
+				});
+				this.playpause.setHTML(this.options.startAutoscroll);
+				this.playpause.addEvent('click', this.playpauseClicked.bind(this));
+			}
+			
+			this.halfFrame = (this.options.width / this.ratio) / 2;
+			
+			this.image.setProperty('width', 200);
+			this.image.setProperty('height', Math.floor(this.imageHeight / this.ratio) + 1);
+			this.image.setStyle('left', '0px');
+			this.image.setStyle('border', '0px');
+			this.image.setStyle('padding', '0px');
+			this.image.setStyle('margin', '0px');
+			
+			//Inject everything
+			this.outter.injectInside(this.el);
+			this.inner.injectInside(this.outter);
+			this.footer.injectInside(this.el);
+			this.caption.injectInside(this.footer);
+			
+			if(this.options.enableAutoscroll)
+			{
+				this.playpause.injectInside(this.caption);
+			}
+			this.thumb.injectInside(this.footer);
+			
+			this.image.injectInside(this.thumb);
+			this.frame.injectInside(this.thumb);
+			
+			
+			// reset the scroll
+			this.outter.scrollTo(0, 0);
+			
+			//AutoScroll Effects
+			this.autoScrollFx = new Fx.Scroll(this.outter, {duration:this.options.autoscrollSpeed, onComplete: this.animCompleted.bind(this)});
+			this.autoSlideFx = new Fx.Style(this.frame, 'left', {duration: this.options.autoscrollSpeed});
+			
+			//do the scrollthing!
+			if(this.options.activateSlider)
+			{
+				this.scroll = new Scroller(this.outter, {area: this.area, velocity: 0.3, onChange:function(x, y) {
+					newleft = (x / this.ratio);
+					
+					this.outter.scrollTo(x, y);
+					
+					if(x <= 0)
+					{
+						this.frame.setStyle('left', 0);
+					}
+					else if(x >= this.imageWidth)
+					{
+						this.frame.setStyle('left', 200 - this.frame.getStyle('width').toInt());
+					}
+					else
+					{
+						if( (newleft >= 0) && (newleft < 200 - this.frame.getStyle('width').toInt()) ) 
+						{
+							this.frame.setStyle('left', newleft);
+							
+						}
+					}
+				}.bind(this)});
+				
+				this.outter.addEvent('mouseover', this.scroll.start.bind(this.scroll));
+				this.outter.addEvent('mouseout', this.scroll.stop.bind(this.scroll));
+			}
+			
+			this.createDraggable();
+			
+			this.addImageEvent();
+			
+			if(this.options.autoscrollOnLoad)
+			{
+				this.playpauseClicked();
+			}
+			this.skipInit = true;
+		}
+		
+	},
+	
+	startAnimRight: function() {
+		var limitRight = 200 - this.frame.getStyle('width').toInt();
+		
+		this.outter.scrollTo(0, 0);
+		this.frame.setStyle('left', 0);
+		
+		this.autoSlideFx.start(limitRight);
+		this.autoScrollFx.toRight();
+		this.direction = 'right';
+		
+		//stop the scroller/drag etc..
+		this.outter.removeEvents('mouseover');
+		this.dragHandle.detach();
+		this.image.removeEvents('click');
+		
+	},
+	startAnimLeft: function() {
+		this.autoSlideFx.start(0);
+		this.autoScrollFx.scrollTo(0);
+		this.direction = 'left';
+		
+	},
+	
+	stopAnim: function() {
+		this.autoSlideFx.stop();
+		this.autoScrollFx.stop();
+		
+		//reconnect events
+		this.outter.addEvent('mouseover', this.scroll.start.bind(this.scroll));
+		this.createDraggable();
+		this.addImageEvent();
+	},
+	
+	animCompleted: function() {
+		if(this.direction=='right')
+		{
+			this.startAnimLeft();
+		}
+		else
+		{
+			this.startAnimRight();
+		}
+	},
+	
+	playpauseClicked: function() {
+		if(this.playpause.getText() == this.options.startAutoscroll)
+		{
+			this.playpause.setHTML(this.options.stopAutoscroll);
+			this.startAnimRight();
+		}
+		else
+		{
+			this.playpause.setHTML(this.options.startAutoscroll);
+			this.stopAnim();
+		}
+	},
+	
+	createDraggable: function() {
+		this.dragHandle = this.frame.makeDraggable({
+				modifiers: {x : 'left', y : false}, 
+				limit: {x : [0, 200 - this.frame.getStyle('width').toInt() ]}, 
+				onDrag: function() {
+					frameleft = this.frame.getStyle('left').toInt();
+					newscroll = frameleft * this.ratio;
+					
+					this.outter.scrollTo(newscroll, 0);
+					
+				}.bind(this)
+		});
+	},
+		
+	addImageEvent: function() {
+		this.image.addEvent('click', function(event){
+				var event = new Event(event);
+				var slideEffect = new Fx.Style(this.frame, 'left',{duration:1000, transition: Fx.Transitions.Sine.easeInOut});
+				var scrollEffect = new Fx.Scroll(this.outter, {duration:1000, transition: Fx.Transitions.Sine.easeInOut});
+				
+				newleft = (event.page.x - this.thumb.getLeft().toInt()) - this.halfFrame;
+				if(newleft < 0)
+				{
+					newleft = 0;
+				}
+				else if(newleft > 200 - this.frame.getStyle('width').toInt())
+				{
+					newleft = 200 - this.frame.getStyle('width').toInt();
+				}
+				
+				slideEffect.start(newleft);
+				scrollEffect.scrollTo(newleft * this.ratio);
+		}.bind(this));
+	}
+	
+});
Index: /extensions/paMOOramics/language/en_UK/index.php
===================================================================
--- /extensions/paMOOramics/language/en_UK/index.php	(revision 3700)
+++ /extensions/paMOOramics/language/en_UK/index.php	(revision 3700)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/paMOOramics/language/en_UK/plugin.lang.php
===================================================================
--- /extensions/paMOOramics/language/en_UK/plugin.lang.php	(revision 3700)
+++ /extensions/paMOOramics/language/en_UK/plugin.lang.php	(revision 3700)
@@ -0,0 +1,61 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['pamooramics_description'] 		= 'paMOOramics  allow to display and scroll in your panorama in piwigo thanks to :';
+$lang['pamooramics_and'] 				= 'and';
+$lang['pamooramics_by'] 				= 'by';
+
+$lang['pamooramics_admin_form_legend'] 	= 'paMOOramics Configuration';
+$lang['pamooramics_use_name'] 			= 'Activate paMOOramics on filename';
+$lang['pamooramics_name'] 				= 'Text to search to display images in panoramic mode';
+$lang['pamooramics_use_ratio'] 			= 'Activate paMOOramics on w/h ratio';
+$lang['pamooramics_ratio'] 				= 'Minimum ratio (width/height) to display images in panoramic mode';
+$lang['pamooramics_width'] 				= 'Panoramic display width';
+$lang['pamooramics_border_size'] 		= 'Panoramic border size';
+$lang['pamooramics_border_color']		= 'Panoramic border color';
+$lang['pamooramics_activateslider'] 	= 'Activate scrolling on mouse over';
+$lang['pamooramics_footer_color'] 		= 'Caption background color';
+$lang['pamooramics_caption_color'] 		= 'Description text color';
+$lang['pamooramics_enable_autoscroll'] 	= 'Allow autoscroll';
+$lang['pamooramics_autoscroll_speed'] 	= 'Autoscroll speed';
+$lang['pamooramics_autoscroll_onload'] 	= 'Start autoscroll on load';
+
+
+$lang['pamooramics_picture_high'] 		= 'Click here to view high definition panorama';
+$lang['pamooramics_displayfooter'] 		= 'Do not display caption';
+$lang['pamooramics_Slideshow_displayfooter'] = 'Do not display caption for the slideshow';
+
+$lang['pamooramics_save_config'] 		= 'Save';
+
+
+
+
+$lang['pamooramics_startAutoscroll'] 	= 'Start autoscroll';
+$lang['pamooramics_stopAutoscroll'] 	= 'Stop autoscroll';
+$lang['pamooramics_loading'] 			= 'Loading ...';
+$lang['pamooramics_clickMessage'] 		= 'Click to move the frame !';
+$lang['pamooramics_dragMessage'] 		= 'Drag me to move the panorama !';
+
+
+?>
Index: /extensions/paMOOramics/language/fr_FR/index.php
===================================================================
--- /extensions/paMOOramics/language/fr_FR/index.php	(revision 3700)
+++ /extensions/paMOOramics/language/fr_FR/index.php	(revision 3700)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/paMOOramics/language/fr_FR/plugin.lang.php
===================================================================
--- /extensions/paMOOramics/language/fr_FR/plugin.lang.php	(revision 3700)
+++ /extensions/paMOOramics/language/fr_FR/plugin.lang.php	(revision 3700)
@@ -0,0 +1,59 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['pamooramics_description'] 		= 'paMOOramics permet d\'afficher et de faire defiler vos photos panoramiques dans piwigo grace à ';
+$lang['pamooramics_and'] 				= 'et';
+$lang['pamooramics_by'] 				= 'par';
+
+$lang['pamooramics_admin_form_legend'] 	= 'Configuration de paMOOramics';
+$lang['pamooramics_use_name'] 			= 'Activer paMOOramics grace au nom du fichier';
+$lang['pamooramics_name'] 				= 'Texte a detecter pour afficher les images en mode panoramique';
+$lang['pamooramics_use_ratio'] 			= 'Activer paMOOramics grace au ratio l/h';
+$lang['pamooramics_ratio'] 				= 'Ratio (largeur/hauteur) minimum pour afficher les images en mode panoramique';
+$lang['pamooramics_width'] 				= 'Largeur d\'affichage du panoramique';
+$lang['pamooramics_border_size'] 		= 'Epaisseur de la bordure du panoramique';
+$lang['pamooramics_border_color']		= 'Couleur de la bordure du panoramique';
+$lang['pamooramics_activateslider'] 	= 'Activer le déplacement au survol de la souris';
+$lang['pamooramics_footer_color'] 		= 'Couleur de fond de la partie légende';
+$lang['pamooramics_caption_color'] 		= 'Couleur du text descriptif';
+$lang['pamooramics_enable_autoscroll'] 	= 'Autoriser de défilement automatique (autoscroll)';
+$lang['pamooramics_autoscroll_speed'] 	= 'Vitesse du défilement automatique (pour un défilement)';
+$lang['pamooramics_autoscroll_onload'] 	= 'Lancer le défilement automatique au chargement';
+
+
+$lang['pamooramics_picture_high'] 		= 'Cliquer ici pour visualiser la photo en haute définition';
+$lang['pamooramics_displayfooter'] 		= 'Ne pas afficher la partie legende';
+$lang['pamooramics_Slideshow_displayfooter'] = 'Ne pas afficher la partie legende pour le diaporama';
+
+$lang['pamooramics_save_config'] 		= 'Enregistrer';
+
+
+
+
+$lang['pamooramics_startAutoscroll'] 	= 'Démarrer le défilement auto';
+$lang['pamooramics_stopAutoscroll'] 	= 'Arrêter le défilement auto';
+$lang['pamooramics_loading'] 			= 'Chargement du panorama en cours ...';
+$lang['pamooramics_clickMessage'] 		= 'Cliquez pour déplacer le cadre';
+$lang['pamooramics_dragMessage'] 		= 'Faites moi coulisser pour bouger le panorama';
+
+?>
Index: /extensions/paMOOramics/language/index.php
===================================================================
--- /extensions/paMOOramics/language/index.php	(revision 3700)
+++ /extensions/paMOOramics/language/index.php	(revision 3700)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: /extensions/paMOOramics/main.inc.php
===================================================================
--- /extensions/paMOOramics/main.inc.php	(revision 3700)
+++ /extensions/paMOOramics/main.inc.php	(revision 3700)
@@ -0,0 +1,179 @@
+<?php
+/*
+Plugin Name: paMOOramics
+Version: 2.0
+Description: Display panoramics images using pamoorama script by silvertab (powered by mootools)
+Plugin URI: http://phpwebgallery.net/ext/extension_view.php?eid=213
+Author: Repié38
+Author URI: http://www.pierre-b.com
+*/
+
+/*
+Changelog :
+	since 0.2.b:
+	- smarty compatible (Dont use it with PhpWebGallery 1.7.x)
+	- fix bug on image name with quotes
+	- fully multilingual (even in javascript)
+	- jQuery color picker in admin panel
+	- checkbox instead of field for true/false
+	- impossible to check "start autoscroll onload" when "allow autoscroll" isnt checked (ie:not logic, and cause a bug)
+	- compatibility with panoramas 2.0.b (priority to panoramas when an image is interpreted as panoramic by the 2 plugins
+	- paMOOramics can be activated on 2 modes : on name (as panoramas), or on width/height ration (as on previous version)
+*/
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+define('PAMOORAMICS_PATH' , PHPWG_PLUGINS_PATH . basename(dirname(__FILE__)) . '/');
+
+
+class paMOOramics
+{
+	function paMOOramics_menu($menu)
+	    {
+	        array_push($menu,
+	            array(
+	                'NAME' => 'paMOOramics',
+	                'URL' => get_admin_plugin_menu_link(dirname(__FILE__).'/paMOOramics_admin.php')
+	            )
+	        );
+	        return $menu;
+	    }
+
+
+	var $my_config;
+	    function load_config()
+	    {
+	        $x = @file_get_contents( dirname(__FILE__).'/data.dat' );
+	        if ($x!==false)
+	        {
+	            $c = unserialize($x);
+	            $this->my_config = $c;
+	        }
+
+	        if ( !isset($this->my_config)
+	            or empty($this->my_config['paMOOramics_ratio']) )
+	        {
+	            //default values
+
+	            $this->my_config['paMOOramics_mode'] = 'moderatio';
+	            $this->my_config['paMOOramics_name'] = 'paMOOramics';
+	            $this->my_config['paMOOramics_ratio'] = 2;
+	            $this->my_config['paMOOramics_border'] = 2;
+				$this->my_config['paMOOramics_bordercolor'] = '#FFFFFF';
+	            $this->my_config['paMOOramics_width'] = 650;
+	            $this->my_config['paMOOramics_activateSlider'] = 'true';
+	            $this->my_config['paMOOramics_footercolor'] = '#000000';
+	            $this->my_config['paMOOramics_captioncolor'] = '#FFFFFF';
+	            $this->my_config['paMOOramics_enableAutoscroll'] = 'true';
+	            $this->my_config['paMOOramics_autoscrollSpeed'] = 10000;
+	            $this->my_config['paMOOramics_autoscrollOnLoad'] = 'false';
+				$this->my_config['paMOOramics_displayfooter'] = '';
+				$this->my_config['pamooramics_Slideshow_displayfooter']= 'display:none;';
+	            $this->save_config();
+	        }
+	    }
+	    function save_config()
+	    {
+	        $file = fopen( dirname(__FILE__).'/data.dat', 'w' );
+	        fwrite($file, serialize($this->my_config) );
+	        fclose( $file );
+	    }
+
+
+
+	function paMOOramics_load ($content) {
+		global $template,$picture,$page;
+
+		if (isset($picture['current']['scaled_width']) && isset($picture['current']['scaled_height'])) {
+			$current_ratio=$picture['current']['scaled_width']/$picture['current']['scaled_height'];
+		}
+
+		if ((isset($current_ratio))&&(empty($content))) {
+			if  (($this->my_config['paMOOramics_mode']=='modename' && stristr($picture['current']['name'],$this->my_config['paMOOramics_name']))
+				or
+				($current_ratio >= ($this->my_config['paMOOramics_ratio']) && $this->my_config['paMOOramics_mode']=='moderatio')
+				) {
+
+					$template->append('head_elements',
+					   '<script src="plugins/paMOOramics/js/mootools.js" type="text/javascript" charset="utf-8"></script>
+						<script src="plugins/paMOOramics/js/pamoorama0.3.js" type="text/javascript" charset="utf-8"></script>');
+
+					$template->set_filenames(
+							array('pamooramics_content'=> dirname(__FILE__).'/picture_content.tpl')
+						);
+					$template->assign( array(
+					   'SRC_IMG' 				=> $picture['current']['image_url'],
+					   'ALT_IMG' 				=> htmlspecialchars($picture['current']['name'], ENT_QUOTES),
+					   'WIDTH_IMG' 				=> $picture['current']['scaled_width'],
+					   'HEIGHT_IMG' 			=> $picture['current']['scaled_height'],
+					   'PANO_BORDER' 			=> $this->my_config['paMOOramics_border'],
+					   'PANO_BORDERCOLOR' 		=> $this->my_config['paMOOramics_bordercolor'],
+					   'PANO_WIDTH' 			=> $this->my_config['paMOOramics_width'],
+					   'PANO_FOOTERCOLOR' 		=> $this->my_config['paMOOramics_footercolor'],
+					   'PANO_CAPTIONCOLOR' 		=> $this->my_config['paMOOramics_captioncolor'],));
+
+					$slideshow_paMOOramics_activateSlider	= $this->my_config['paMOOramics_activateSlider'];
+					$slideshow_paMOOramics_enableAutoscroll	= $this->my_config['paMOOramics_enableAutoscroll'];
+					$slideshow_paMOOramics_autoscrollSpeed	= $this->my_config['paMOOramics_autoscrollSpeed'];
+					$slideshow_paMOOramics_autoscrollOnLoad	= $this->my_config['paMOOramics_autoscrollOnLoad'];
+
+
+					 if ( !$page['slideshow'] ){
+						if (isset($picture['current']['high_url'])){
+							$uuid = uniqid(rand());
+							$template->assign('high', array(
+									'U_HIGH' => $picture['current']['high_url'] ,
+									'UUID'   => $uuid,      ));
+						}
+						$display_footer=$this->my_config['paMOOramics_displayfooter'];
+					}
+
+					else {
+						$slideshow_params = decode_slideshow_params($_GET['slideshow']);
+						$slideshow_paMOOramics_activateSlider	= 'true';
+						$slideshow_paMOOramics_enableAutoscroll	= 'true';
+						$slideshow_paMOOramics_autoscrollSpeed	= ($slideshow_params['period']-0.5)*1000;
+						$slideshow_paMOOramics_autoscrollOnLoad	= 'true';
+						$display_footer=$this->my_config['pamooramics_Slideshow_displayfooter'];
+					}
+
+					$template->assign( array(
+						'PANO_ACTIVATESLIDER'		=> $slideshow_paMOOramics_activateSlider,
+						'PANO_ENABLEAUTOSCROLL' 	=> $slideshow_paMOOramics_enableAutoscroll,
+						'PANO_AUTOSCROLLSPEED' 		=> $slideshow_paMOOramics_autoscrollSpeed,
+						'PANO_AUTOSCROLLONLOAD' 	=> $slideshow_paMOOramics_autoscrollOnLoad,
+						'PANO_DISPLAYFOOTER'     	=> $display_footer,));
+
+					load_language('plugin.lang', PAMOORAMICS_PATH);
+
+					return $template->parse( 'pamooramics_content', true);
+
+			}
+			else {
+				return $content;
+			}
+		}
+		else {
+			return $content;
+		}
+
+
+
+	}
+
+
+
+}
+
+$obj = new paMOOramics();
+$obj->load_config();
+
+
+add_event_handler('get_admin_plugin_menu_links', array(&$obj, 'paMOOramics_menu') );
+set_plugin_data($plugin['id'], $obj);
+
+add_event_handler('render_element_content', array(&$obj, 'paMOOramics_load'),41,2);
+
+
+
+
+?>
Index: /extensions/paMOOramics/paMOOramics_admin.css
===================================================================
--- /extensions/paMOOramics/paMOOramics_admin.css	(revision 3700)
+++ /extensions/paMOOramics/paMOOramics_admin.css	(revision 3700)
@@ -0,0 +1,18 @@
+#paMOOfieldset {
+	background: url('moo.jpg') bottom left no-repeat;
+}
+#colorpicker{
+	float:right;
+	margin-left:10px;
+}
+
+.paMOOlabel{
+	text-align:right;
+}
+
+.paMOOfield{
+	width:60px;
+}
+#paMOOtable{
+	margin-right:0;
+}
Index: /extensions/paMOOramics/paMOOramics_admin.php
===================================================================
--- /extensions/paMOOramics/paMOOramics_admin.php	(revision 3700)
+++ /extensions/paMOOramics/paMOOramics_admin.php	(revision 3700)
@@ -0,0 +1,66 @@
+<?php
+load_language('plugin.lang', PAMOORAMICS_PATH);
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+$me = get_plugin_data($plugin_id);
+if ( isset($_POST['submit']) )
+{
+	$me->my_config['paMOOramics_mode']				= $_POST['paMOOramics_mode'];
+	$me->my_config['paMOOramics_use_name'] 			= isset($_POST['paMOOramics_use_name']) ? "true" : "false";
+	$me->my_config['paMOOramics_name'] 				= $_POST['paMOOramics_name'];
+	$me->my_config['paMOOramics_use_ratio'] 		= isset($_POST['paMOOramics_use_ratio']) ? "true" : "false";
+	$me->my_config['paMOOramics_ratio'] 			= $_POST['paMOOramics_ratio'];
+	$me->my_config['paMOOramics_width'] 			= $_POST['paMOOramics_width'];
+	$me->my_config['paMOOramics_border']			= $_POST['paMOOramics_border'];
+	$me->my_config['paMOOramics_bordercolor']		= $_POST['paMOOramics_bordercolor'];
+	$me->my_config['paMOOramics_footercolor']		= $_POST['paMOOramics_footercolor'];
+	$me->my_config['paMOOramics_captioncolor']		= $_POST['paMOOramics_captioncolor'];
+	$me->my_config['paMOOramics_autoscrollSpeed']	= $_POST['paMOOramics_autoscrollSpeed'];
+	$me->my_config['paMOOramics_activateSlider'] 	= isset($_POST['paMOOramics_activateSlider']) ? "true" : "false";
+	$me->my_config['paMOOramics_enableAutoscroll']	= isset($_POST['paMOOramics_enableAutoscroll']) ? "true" : "false";
+	$me->my_config['paMOOramics_autoscrollOnLoad'] 	= isset($_POST['paMOOramics_autoscrollOnLoad']) ? "true" : "false";
+	$me->my_config['paMOOramics_displayfooter']		= isset($_POST['paMOOramics_displayfooter']) ? "display:none;" : "";
+	$me->my_config['pamooramics_Slideshow_displayfooter']= isset($_POST['pamooramics_Slideshow_displayfooter']) ? "display:none;" : "";
+	$me->save_config();
+
+}
+
+global $template;
+$template->set_filenames( array('paMOOramics_admin_content' => dirname(__FILE__).'/paMOOramics_admin.tpl') );
+$template->append('head_elements',
+		   '<script type="text/javascript" src="./plugins/paMOOramics/farbtastic/farbtastic.js"></script>
+<link rel="stylesheet" type="text/css"
+      href="./plugins/paMOOramics/farbtastic/farbtastic.css" />
+<link rel="stylesheet" type="text/css"
+      href="./plugins/paMOOramics/paMOOramics_admin.css" />');
+
+$template->assign('PAMOORAMICS_NAME', 				$me->my_config['paMOOramics_name']);
+$template->assign('PAMOORAMICS_RATIO', 				$me->my_config['paMOOramics_ratio']);
+$template->assign('PAMOORAMICS_WIDTH', 				$me->my_config['paMOOramics_width']);
+$template->assign('PAMOORAMICS_BORDER', 			$me->my_config['paMOOramics_border']);
+$template->assign('PAMOORAMICS_BORDERCOLOR', 		$me->my_config['paMOOramics_bordercolor']);
+$template->assign('PAMOORAMICS_FOOTERCOLOR', 		$me->my_config['paMOOramics_footercolor']);
+$template->assign('PAMOORAMICS_CAPTIONCOLOR', 		$me->my_config['paMOOramics_captioncolor']);
+$template->assign('PAMOORAMICS_AUTOSCROLLSPEED', 	$me->my_config['paMOOramics_autoscrollSpeed']);
+
+if ($me->my_config['paMOOramics_activateSlider']=='true')
+	$template->assign('PAMOORAMICS_ACTIVATESLIDER','checked');
+if ($me->my_config['paMOOramics_enableAutoscroll']=='true')
+	$template->assign('PAMOORAMICS_ENABLEAUTOSCROLL','checked');
+if ($me->my_config['paMOOramics_autoscrollOnLoad']=='true')
+	$template->assign('PAMOORAMICS_AUTOSCROLLONLOAD','checked');
+if ($me->my_config['paMOOramics_displayfooter']=='display:none;')
+	$template->assign('PAMOORAMICS_DISPLAYFOOTER','checked');
+if ($me->my_config['pamooramics_Slideshow_displayfooter']=='display:none;')
+	$template->assign('PAMOORAMICS_SLIDE_DISPLAYFOOTER','checked');
+
+
+
+if ($me->my_config['paMOOramics_mode']=='modename')
+	$template->assign('PAMOORAMICS_USENAME','checked');
+if ($me->my_config['paMOOramics_mode']=='moderatio')
+	$template->assign('PAMOORAMICS_USERATIO','checked');
+
+
+$template->assign_var_from_handle( 'ADMIN_CONTENT', 'paMOOramics_admin_content');
+?>
Index: /extensions/paMOOramics/paMOOramics_admin.tpl
===================================================================
--- /extensions/paMOOramics/paMOOramics_admin.tpl	(revision 3700)
+++ /extensions/paMOOramics/paMOOramics_admin.tpl	(revision 3700)
@@ -0,0 +1,125 @@
+<div class="titrePage">
+  <h2>paMOOramics</h2>
+</div>
+<p>
+
+
+{'pamooramics_description'|@translate} :<br />
+<a href="http://www.silverscripting.com/pamoorama/index.php">PAMOORAMA</a> ({'pamooramics_by'|@translate} SilverTab)
+{'pamooramics_and'|@translate} <a href="http://www.mootools.net/">MOOTOOLS</A><br/>
+
+<br/>
+
+
+</p>
+<form method="post" action="{$TESTPLUGIN_F_ACTION}" class="general">
+ <fieldset id="paMOOfieldset">
+  <legend>{'pamooramics_admin_form_legend'|@translate}</legend>
+  <div id="colorpicker"></div>
+  <table id="paMOOtable">
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_use_name'|@translate}</td>
+    <td><input type="radio" id="paMOOramics_mode" name="paMOOramics_mode" value="modename" {$PAMOORAMICS_USENAME} /></td>
+   </tr>
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_name'|@translate}</td>
+    <td><input type="text" class="paMOOfield" name="paMOOramics_name" value="{$PAMOORAMICS_NAME}" width="200px;"/></td>
+   </tr>
+  <tr>
+    <td class="paMOOlabel">{'pamooramics_use_ratio'|@translate}</td>
+    <td><input type="radio" id="paMOOramics_mode" name="paMOOramics_mode"  value="moderatio" {$PAMOORAMICS_USERATIO} /></td>
+   </tr>
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_ratio'|@translate}</td>
+    <td><input type="text" class="paMOOfield" name="paMOOramics_ratio" value="{$PAMOORAMICS_RATIO}" /></td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_width'|@translate}</td>
+    <td><input type="text" name="paMOOramics_width" class="paMOOfield" value="{$PAMOORAMICS_WIDTH}" /> px</td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_border_size'|@translate}</td>
+    <td><input type="text" name="paMOOramics_border" class="paMOOfield" value="{$PAMOORAMICS_BORDER}" /> px</td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_border_color'|@translate}</td>
+    <td><input type="text" name="paMOOramics_bordercolor" id="paMOOramics_bordercolor" class="paMOOfield colorwell" value="{$PAMOORAMICS_BORDERCOLOR}" /></td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_footer_color'|@translate}</td>
+    <td><input type="text" name="paMOOramics_footercolor" id="paMOOramics_footercolor" class="paMOOfield colorwell" value="{$PAMOORAMICS_FOOTERCOLOR}" /></td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_caption_color'|@translate}</td>
+    <td><input type="text" name="paMOOramics_captioncolor" id="paMOOramics_captioncolor" class="paMOOfield colorwell" value="{$PAMOORAMICS_CAPTIONCOLOR}" /></td>
+   </tr>
+
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_autoscroll_speed'|@translate}</td>
+    <td><input type="text" name="paMOOramics_autoscrollSpeed" class="paMOOfield" value="{$PAMOORAMICS_AUTOSCROLLSPEED}" /> ms</td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_activateslider'|@translate}</td>
+    <td><input type="checkbox" name="paMOOramics_activateSlider" id="paMOOramics_activateSlider" {$PAMOORAMICS_ACTIVATESLIDER} /></td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_enable_autoscroll'|@translate}</td>
+    <td><input type="checkbox" name="paMOOramics_enableAutoscroll" id="paMOOramics_enableAutoscroll" onClick="Pamooscript()" {$PAMOORAMICS_ENABLEAUTOSCROLL} /></td>
+   </tr>
+
+   <tr>
+    <td class="paMOOlabel">{'pamooramics_autoscroll_onload'|@translate}</td>
+    <td><input type="checkbox" id="paMOOramics_autoscrollOnLoad" name="paMOOramics_autoscrollOnLoad" {$PAMOORAMICS_AUTOSCROLLONLOAD} /></td>
+   </tr>
+
+   <tr>
+       <td class="paMOOlabel">{'pamooramics_displayfooter'|@translate}</td>
+       <td><input type="checkbox" id="paMOOramics_displayfooter" name="paMOOramics_displayfooter" onClick="if (this.checked) {ldelim}document.getElementById('paMOOramics_activateSlider').checked=true;}" {$PAMOORAMICS_DISPLAYFOOTER} /></td>
+   </tr>
+   <tr>
+   		<td class="paMOOlabel">{'pamooramics_Slideshow_displayfooter'|@translate}</td>
+     	<td><input type="checkbox" name="pamooramics_Slideshow_displayfooter" id="pamooramics_Slideshow_displayfooter" {$PAMOORAMICS_SLIDE_DISPLAYFOOTER} /></td>
+   </tr>
+  </table>
+ </fieldset>
+
+
+
+
+
+
+
+
+ <p><input type="submit" value="{'pamooramics_save_config'|@translate}" name="submit" /></p>
+</form>
+
+<script type="text/javascript" charset="utf-8">
+ $(document).ready(function() {ldelim}
+     var f = $.farbtastic('#colorpicker');
+     var selected;
+     $('.colorwell')
+       .each(function () {ldelim} f.linkTo(this);  })
+       .focus(function() {ldelim}
+       	f.linkTo(this);
+
+       });
+  });
+function Pamooscript(){ldelim}
+  	if (!document.getElementById("paMOOramics_enableAutoscroll").checked) {ldelim}
+  		document.getElementById("paMOOramics_autoscrollOnLoad").disabled=true;
+  		document.getElementById("paMOOramics_autoscrollOnLoad").checked=false;
+  	}
+  	else {ldelim}
+  		document.getElementById("paMOOramics_autoscrollOnLoad").disabled=false;
+  	}
+}
+
+</script>
Index: /extensions/paMOOramics/picture_content.tpl
===================================================================
--- /extensions/paMOOramics/picture_content.tpl	(revision 3700)
+++ /extensions/paMOOramics/picture_content.tpl	(revision 3700)
@@ -0,0 +1,34 @@
+ <div id="pamoorama" alt="{$SRC_IMG}"></div>
+ <script type="text/javascript" charset="utf-8">
+ 	window.addEvent('domready', init);
+ 	function init(){ldelim}
+ 		myPamoorama = new pamoorama('pamoorama',{ldelim} activateSlider: 	{$PANO_ACTIVATESLIDER},
+ 							  width: 		{$PANO_WIDTH},
+ 							  footercolor: 		'{$PANO_FOOTERCOLOR}',
+ 							  captioncolor: 	'{$PANO_CAPTIONCOLOR}',
+ 							  caption: 		'{$ALT_IMG}',
+ 							  enableAutoscroll: 	{$PANO_ENABLEAUTOSCROLL},
+ 							  autoscrollSpeed:	{$PANO_AUTOSCROLLSPEED},
+ 							  autoscrollOnLoad:	{$PANO_AUTOSCROLLONLOAD},
+ 							  startAutoscroll:	'{'pamooramics_startAutoscroll'|@translate}',
+							  stopAutoscroll:		'{'pamooramics_stopAutoscroll'|@translate}',
+							  loadingMessage: '{'pamooramics_loading'|@translate}',
+							  clickMessage:		'{'pamooramics_clickMessage'|@translate}',
+							  dragMessage:		'{'pamooramics_dragMessage'|@translate}'
+ 							  });
+ 	}
+ </script>
+
+{if isset($high) }
+<a href="javascript:phpWGOpenWindow('{$high.U_HIGH}','{$high.UUID}','scrollbars=yes,toolbar=no,status=no,resizable=yes')">
+  <p>{'pamooramics_picture_high'|@translate}</p></a>
+
+{/if}
+<style>
+#pamoorama {ldelim}
+  margin: 0 auto;
+  border: {$PANO_BORDER}px solid {$PANO_BORDERCOLOR};
+}
+#pamoorama_footer {ldelim}{$PANO_DISPLAYFOOTER}}
+
+</style>
