summaryrefslogtreecommitdiffstats
path: root/emacs.d/nxhtml/nxhtml/doc
diff options
context:
space:
mode:
authorGravatar Tom Willemsen2011-03-07 09:04:49 +0100
committerGravatar Tom Willemsen2011-03-07 09:04:49 +0100
commit94d2fc1815a919734353c942f224db1de4b4fcb8 (patch)
tree4168e816ead132bfa3510e272427837c3895f5e2 /emacs.d/nxhtml/nxhtml/doc
parentd0e7674fdb1de12c8de202d4028a5d7ed3669a6e (diff)
downloaddotfiles-94d2fc1815a919734353c942f224db1de4b4fcb8.tar.gz
dotfiles-94d2fc1815a919734353c942f224db1de4b4fcb8.zip
Django, org
* Added nxhtml, mostly for django support. * Changed some org settings.
Diffstat (limited to 'emacs.d/nxhtml/nxhtml/doc')
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/demo.html71
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/html2xhtml.html39
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/htmlfontify-example.html424
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/Las_Medulas.jpgbin0 -> 40927 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/Toco_toucan.jpgbin0 -> 17430 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/bacchante2.jpgbin0 -> 67205 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/butterflies.jpgbin0 -> 14954 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/butterflies.pngbin0 -> 65893 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/butterflies.xcfbin0 -> 87456 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/continue-play.jpgbin0 -> 44390 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/divine2.jpgbin0 -> 69985 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/edit-part.pngbin0 -> 23263 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.pngbin0 -> 7237 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.xcfbin0 -> 15415 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/emacs-style-completion.pngbin0 -> 23199 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/emacsP.pngbin0 -> 1882 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/emacsP16.pngbin0 -> 694 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/embedded-css.pngbin0 -> 14019 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/embedded-xhtml.pngbin0 -> 17326 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/foldit-closed.pngbin0 -> 7894 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/foldit-temp-opened.pngbin0 -> 17590 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/fun-brain-2.pngbin0 -> 40042 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.pngbin0 -> 1931 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.xcfbin0 -> 5446 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-2.pngbin0 -> 1276 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.pngbin0 -> 1324 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.xcfbin0 -> 5988 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/giraffe.jpgbin0 -> 20966 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/healthy_feet2.jpgbin0 -> 24042 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/itsalltext-pref.pngbin0 -> 14720 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/links-appmenu.pngbin0 -> 7124 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/nxml-where.pngbin0 -> 17217 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml-2.pngbin0 -> 23203 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml.pngbin0 -> 22179 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/php-in-php.pngbin0 -> 21113 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/php-in-xhtml.pngbin0 -> 21510 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/popup-compl.pngbin0 -> 8709 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/raindrops2.jpgbin0 -> 36480 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/region-selected-after.pngbin0 -> 3122 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/region-selected-completion.pngbin0 -> 27193 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/region-selected.pngbin0 -> 3662 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/rembrandt-self-portrait.jpgbin0 -> 52583 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/style-in-nxhtml.pngbin0 -> 19275 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans.pngbin0 -> 1485 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans2.pngbin0 -> 1520 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.pngbin0 -> 1347 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.xcfbin0 -> 3484 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/validation-error.pngbin0 -> 2293 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/volga.jpgbin0 -> 34027 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/img/xml-validation-header.pngbin0 -> 23172 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow1.gifbin0 -> 243 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow2.gifbin0 -> 241 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.gifbin0 -> 1035 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.pngbin0 -> 2626 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.gifbin0 -> 974 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.pngbin0 -> 2889 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/loading-bar-black.gifbin0 -> 10814 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.gifbin0 -> 489 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.pngbin0 -> 1258 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/jd.gallery.css238
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/layout.css91
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/jd.gallery.js449
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.js2
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js4078
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/nxhtml-changes.html3395
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/nxhtml.css171
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/nxhtml.html987
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/wd/grapes/grapes.css107
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/bkgrnd.gifbin0 -> 974 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/grapes.jpgbin0 -> 24419 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/quote.gifbin0 -> 643 bytes
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/wd/grapes/index.html76
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/wd/grapes/nxhtml-grapes.css252
-rw-r--r--emacs.d/nxhtml/nxhtml/doc/working-demo.html60
74 files changed, 10440 insertions, 0 deletions
diff --git a/emacs.d/nxhtml/nxhtml/doc/demo.html b/emacs.d/nxhtml/nxhtml/doc/demo.html
new file mode 100644
index 0000000..8696032
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/demo.html
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>nXhtml Short Tour</title>
+ <script type="text/javascript" src="js/smoothgallery/scripts/mootools.js"></script>
+ <script type="text/javascript" src="js/smoothgallery/scripts/jd.gallery.js"></script>
+ <link rel="stylesheet" href="js/smoothgallery/css/layout.css" type="text/css" media="screen"/>
+ <link rel="stylesheet" href="js/smoothgallery/css/jd.gallery.css" type="text/css" media="screen"/>
+ <style type="text/css" media="screen">
+ /* <![CDATA[ */
+ #myGallery {
+ width: 660px;
+ height: 500px;
+ }
+ /* ]] */
+ </style>
+
+ </head>
+ <body>
+ <script type="text/javascript">
+ function startGallery() {
+ var myGallery = new gallery($('myGallery'), {
+ timed: true,
+ delay: 5000,
+ embedLinks: false,
+ showArrows: true,
+ showCarousel: true,
+ showInfopane: true,
+ showDescription: true,
+ });
+ }
+ window.onDomReady(startGallery);
+ </script>
+ <div id="myGallery"><!-- SmoothGallery -->
+
+ <div class="imageElement">
+ <h3>Popup completion</h3>
+ <p>nXhtml can use popup style completion too (for XHTML)</p>
+ <a href="#" title="open image" class="open"></a>
+ <img src="img/popup-compl.png" class="full" alt="Popup completion" />
+ <img src="img/popup-compl.png" class="thumbnail" alt="Popup completion (thumbnail)" />
+ <div>
+ <p>
+ more about popup
+ </p>
+ <p>
+ more about popup
+ </p>
+ </div>
+ </div>
+
+ <div class="imageElement">
+ <h3>Emacs style completion</h3>
+ <p>Emacs default style for completion uses the minibuffer and an Emacs window</p>
+ <a href="#" title="open image" class="open"></a>
+ <img src="img/emacs-style-completion.png" class="full" alt="Emacs style completion" />
+ <img src="img/emacs-style-completion.png" class="thumbnail" alt="Emacs style completion (thumbnail)" />
+ <div>du</div>
+ </div>
+ </div>
+
+ <div id="DescriptionDiv"
+ style="
+ text-align: center;
+ ">
+ desc div
+ </div>
+ </body>
+</html>
diff --git a/emacs.d/nxhtml/nxhtml/doc/html2xhtml.html b/emacs.d/nxhtml/nxhtml/doc/html2xhtml.html
new file mode 100644
index 0000000..2228c80
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/html2xhtml.html
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>
+ How to Convert to XHTML
+ </title>
+ <link href="nxhtml.css" rel="StyleSheet" type="text/css" />
+ </head>
+ <body>
+ <h1>
+ How to Convert to XHTML
+ </h1>
+ <p>
+ With nxhtml-mode you can edit XHTML documents, but not HTML
+ dito. So what do you do with your old HTML documents? The
+ answer is simple: You convert them to XHTML! There is today
+ not many reasons not to convert them to XHTML. You may say
+ "but what about old browsers?". Most users just do not have
+ old browsers today. Old browsers are too dangerous to use on the
+ Internet.
+ </p>
+ <p>
+ You can convert the documents easily from within nxhtml-mode
+ with <a href= "http://tidy.sourceforge.net/">Tidy</a>. However
+ Tidy does not come with nxhtml, you have to install it yourself.
+ </p>
+ <p>
+ When Tidy is called from Emacs you can do a whole directory tree
+ at once. When a buffer is in nxhtml-mode (and tidy.el is found)
+ there is an entry on the menus called <b>Tidy</b> from which you
+ can access tidy and set the options for it. Note especially the
+ <b>Quick Options Settings</b> where you can set options for
+ converting to XHTML easily.
+ </p>
+
+ </body>
+</html>
diff --git a/emacs.d/nxhtml/nxhtml/doc/htmlfontify-example.html b/emacs.d/nxhtml/nxhtml/doc/htmlfontify-example.html
new file mode 100644
index 0000000..0eafb8d
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/htmlfontify-example.html
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title></title>
+<style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+ --></style>
+<style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.comment-face-1419 { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.comment-face-1419 a { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.comment-delimiter-face-1418 { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.comment-delimiter-face-1418 a { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.help-argument-name-1420 { color: rgb(0, 0, 255); font-style: italic; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-size: 10pt; text-decoration: none; }
+span.help-argument-name-1420 a { color: rgb(0, 0, 255); font-style: italic; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-size: 10pt; text-decoration: underline; }
+span.button-0004 { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+span.button-0004 a { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.completion-tooltip-face-1437 { color: rgb(0, 0, 0); background: rgb(255, 255, 255); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.completion-tooltip-face-1437 a { color: rgb(0, 0, 0); background: rgb(255, 255, 255); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.completion-dynamic-face-1436 { color: rgb(0, 0, 0); background: rgb(255, 165, 0); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.completion-dynamic-face-1436 a { color: rgb(0, 0, 0); background: rgb(255, 165, 0); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.compilation-warning-1435 { color: rgb(255, 165, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.compilation-warning-1435 a { color: rgb(255, 165, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.compilation-line-number-1434 { color: rgb(184, 134, 11); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.compilation-line-number-1434 a { color: rgb(184, 134, 11); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.compilation-info-1433 { color: rgb(0, 205, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.compilation-info-1433 a { color: rgb(0, 205, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.compilation-error-1430 { color: rgb(255, 0, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.compilation-error-1430 a { color: rgb(255, 0, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.compilation-column-number-1429 { color: rgb(34, 139, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.compilation-column-number-1429 a { color: rgb(34, 139, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.comint-highlight-prompt-1428 { color: rgb(0, 0, 139); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.comint-highlight-prompt-1428 a { color: rgb(0, 0, 139); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.button-0004 { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+span.button-0004 a { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.default-0273 { color: rgb(250, 235, 215); font-size: 105%; text-decoration: none; }
+span.default-0273 a { color: rgb(250, 235, 215); font-size: 105%; text-decoration: underline; }
+span.default-0272 { background: rgb(250, 235, 215); font-size: 105%; text-decoration: none; }
+span.default-0272 a { background: rgb(250, 235, 215); font-size: 105%; text-decoration: underline; }
+span.default-0271 { color: rgb(250, 240, 230); font-size: 105%; text-decoration: none; }
+span.default-0271 a { color: rgb(250, 240, 230); font-size: 105%; text-decoration: underline; }
+span.default-0270 { background: rgb(250, 240, 230); font-size: 105%; text-decoration: none; }
+span.default-0270 a { background: rgb(250, 240, 230); font-size: 105%; text-decoration: underline; }
+span.default-0269 { color: rgb(253, 245, 230); font-size: 105%; text-decoration: none; }
+span.default-0269 a { color: rgb(253, 245, 230); font-size: 105%; text-decoration: underline; }
+span.default-0268 { background: rgb(253, 245, 230); font-size: 105%; text-decoration: none; }
+span.default-0268 a { background: rgb(253, 245, 230); font-size: 105%; text-decoration: underline; }
+span.default-0267 { color: rgb(255, 250, 240); font-size: 105%; text-decoration: none; }
+span.default-0267 a { color: rgb(255, 250, 240); font-size: 105%; text-decoration: underline; }
+span.default-0266 { background: rgb(255, 250, 240); font-size: 105%; text-decoration: none; }
+span.default-0266 a { background: rgb(255, 250, 240); font-size: 105%; text-decoration: underline; }
+span.default-0265 { color: rgb(220, 220, 220); font-size: 105%; text-decoration: none; }
+span.default-0265 a { color: rgb(220, 220, 220); font-size: 105%; text-decoration: underline; }
+span.default-0264 { background: rgb(220, 220, 220); font-size: 105%; text-decoration: none; }
+span.default-0264 a { background: rgb(220, 220, 220); font-size: 105%; text-decoration: underline; }
+span.default-0263 { color: rgb(245, 245, 245); font-size: 105%; text-decoration: none; }
+span.default-0263 a { color: rgb(245, 245, 245); font-size: 105%; text-decoration: underline; }
+span.default-0262 { background: rgb(245, 245, 245); font-size: 105%; text-decoration: none; }
+span.default-0262 a { background: rgb(245, 245, 245); font-size: 105%; text-decoration: underline; }
+span.default-0261 { color: rgb(248, 248, 255); font-size: 105%; text-decoration: none; }
+span.default-0261 a { color: rgb(248, 248, 255); font-size: 105%; text-decoration: underline; }
+span.default-0260 { background: rgb(248, 248, 255); font-size: 105%; text-decoration: none; }
+span.default-0260 a { background: rgb(248, 248, 255); font-size: 105%; text-decoration: underline; }
+span.default-0259 { color: rgb(255, 250, 250); font-size: 105%; text-decoration: none; }
+span.default-0259 a { color: rgb(255, 250, 250); font-size: 105%; text-decoration: underline; }
+span.default-0258 { background: rgb(255, 250, 250); font-size: 105%; text-decoration: none; }
+span.default-0258 a { background: rgb(255, 250, 250); font-size: 105%; text-decoration: underline; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.default-1432 { text-decoration: underline; color: rgb(176, 48, 96); font-weight: 700; font-size: 164%; }
+span.default-1432 a { text-decoration: underline; color: rgb(176, 48, 96); font-weight: 700; font-size: 164%; }
+span.default-1431 { color: rgb(176, 48, 96); font-weight: 700; font-size: 164%; text-decoration: none; }
+span.default-1431 a { color: rgb(176, 48, 96); font-weight: 700; font-size: 164%; text-decoration: underline; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.custom-button-0022 { border-width: 1px; border-style: outset; color: rgb(0, 0, 0); background: rgb(211, 211, 211); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.custom-button-0022 a { border-width: 1px; border-style: outset; color: rgb(0, 0, 0); background: rgb(211, 211, 211); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.bold-0248 { background: rgb(173, 255, 47); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.bold-0248 a { background: rgb(173, 255, 47); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.match-1438 { background: rgb(255, 255, 0); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.match-1438 a { background: rgb(255, 255, 0); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.underline-1413 { color: rgb(184, 134, 11); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; text-decoration: underline; font-size: 10pt; }
+span.underline-1413 a { color: rgb(184, 134, 11); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; text-decoration: underline; font-size: 10pt; }
+span.underline-0219 { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+span.underline-0219 a { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+span.underline-1412 { color: rgb(0, 205, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; text-decoration: underline; font-size: 10pt; }
+span.underline-1412 a { color: rgb(0, 205, 0); font-weight: 700; font-family: outline-courier new; font-stretch: normal; font-style: normal; text-decoration: underline; font-size: 10pt; }
+ --></style><style type="text/css"><!--
+body { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.default a { font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.comment-face-1419 { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.comment-face-1419 a { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.comment-delimiter-face-1418 { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.comment-delimiter-face-1418 a { color: rgb(178, 34, 34); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.string-face-1441 { color: rgb(188, 143, 143); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.string-face-1441 a { color: rgb(188, 143, 143); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.match-1438 { background: rgb(255, 255, 0); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: none; }
+span.match-1438 a { background: rgb(255, 255, 0); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; text-decoration: underline; }
+span.keyword-face-1440 { color: rgb(160, 32, 240); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: none; }
+span.keyword-face-1440 a { color: rgb(160, 32, 240); font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; font-size: 10pt; text-decoration: underline; }
+span.underline-1439 { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+span.underline-1439 a { text-decoration: underline; font-family: outline-courier new; font-stretch: normal; font-weight: 500; font-style: normal; color: rgb(0, 0, 0); font-size: 10pt; }
+ --></style>
+ </head>
+ <body style="background: #000000; color: #ff9900; padding:2em; margin:4em; margin-top:2em;">
+
+<h1>Example of htmlfontify.el output</h1>
+
+<p style="font-size: 1.3em; width: 35em;">
+ The following is an example of the output you can get with htmlfontify.el.
+ The version used here is shipped with <a href="nxhtml.html" style="color: #ffbb33; ">nXhtml</a>.
+ (A new version from the original author is on its way.)
+</p>
+
+<table border="0" cellpadding="0" cellspacing="0" style="border: solid rgb(0, 84, 227); width:44.800000000000004em; background:white;">
+<tr>
+<td style="background-color:rgb(0, 84, 227); color:rgb(255, 255, 255);border: none; padding:4px; vertical-align: middle;"><img alt="Emacs Icon (patched)" src="img/emacsP16.png" width="16" height="16" />&nbsp;&nbsp;Emacs - Frame Dump</td>
+</tr>
+<tr>
+<td style="vertical-align:top;"><table border="0" cellpadding="0" cellspacing="0">
+<tr>
+<td style="vertical-align:top;"><table border="0" cellpadding="0" cellspacing="0">
+<tr><td style="vertical-align:top;"><div style="width:22.514999999999997em; height:15.079999999999998em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+<pre><span class="comment-delimiter-face-1418">;; </span><span class="comment-face-1419">This buffer is for notes you don't want to save, and for Lisp evaluation.
+</span><span class="comment-delimiter-face-1418">;; </span><span class="comment-face-1419">If you want to create a file, visit that file with C-x C-f,
+</span><span class="comment-delimiter-face-1418">;; </span><span class="comment-face-1419">then enter the text in that file's own buffer.
+</span>
+</pre>
+
+ </div>
+<div style="width:22.515em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)-- <b>*scratch*</b> (Lisp Interaction Abbrev hs) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+<td style="vertical-align:top;"><div style="width:23.084999999999997em; height:15.079999999999998em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre>cadr is a compiled Lisp function in `<span class="button-0004">subr.el</span>'.
+(cadr <span class="help-argument-name-1420">x</span>)
+
+Return the car of the cdr of <span class="help-argument-name-1420">x</span>.
+
+<span class="button-0004">[back]</span>
+</pre>
+
+ </div>
+<div style="width:23.085em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)%% <b>*Help*</b> (Help View Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td style="vertical-align:top;"><table border="0" cellpadding="0" cellspacing="0">
+<tr><td style="vertical-align:top;"><div style="width:22.514999999999997em; height:12.76em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre><span class="button-0004">comint-highlight-prompt</span> <span class="comint-highlight-prompt-1428">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">compilation-column-number</span> <span class="compilation-column-number-1429">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">compilation-error</span> <span class="compilation-error-1430">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">compilation-info</span> <span class="compilation-info-1433">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">compilation-line-number</span> <span class="compilation-line-number-1434">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">compilation-warning</span> <span class="compilation-warning-1435">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">completion-dynamic-face</span> <span class="completion-dynamic-face-1436">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+<span class="button-0004">completion-tooltip-face</span> <span class="completion-tooltip-face-1437">abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ</span>
+</pre>
+
+
+<div style="margin-top:2em; color: red; text-align: center; "> Truncated to line 11 - 19! </div>
+</div>
+<div style="width:22.515em; color:rgb(0, 0, 0); background:rgb(191, 191, 191); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)%% <b>*Faces*</b> (Help View Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+<td style="vertical-align:top;"><div style="width:23.084999999999997em; height:12.76em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre><span class="default-0258">snow </span><span class="default-0259"> snow </span>#fffafa
+<span class="default-0260">ghost white </span><span class="default-0261"> GhostWhite </span>#f8f8ff
+<span class="default-0262">white smoke </span><span class="default-0263"> WhiteSmoke </span>#f5f5f5
+<span class="default-0264">gainsboro </span><span class="default-0265"> gainsboro </span>#dcdcdc
+<span class="default-0266">floral white </span><span class="default-0267"> FloralWhite </span>#fffaf0
+<span class="default-0268">old lace </span><span class="default-0269"> OldLace </span>#fdf5e6
+<span class="default-0270">linen </span><span class="default-0271"> linen </span>#faf0e6
+<span class="default-0272">antique white </span><span class="default-0273"> AntiqueWhite </span>#faebd7
+</pre>
+
+
+<div style="margin-top:2em; color: red; text-align: center; "> Truncated to line 1 - 9! </div>
+</div>
+<div style="width:23.085em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)%% <b>*Colors*</b> (Help View Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td style="vertical-align:top;"><div style="width:47.025em; height:12.76em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre><span class="default-1431">________________________
+</span><span class="default-1432">Program and Value Search</span>
+
+When you use Emacs on MS Windows you sometimes want to fetch values
+and program locations from MS Windows. Many of these values are
+stored in the MS Windows Registry. Since Emacs is written to be used
+on many platforms (with the emphasis on GPL platforms) the effort to
+let Emacs read the Registry directly has not been made. Below you can
+</pre>
+
+
+<div style="margin-top:2em; color: red; text-align: center; "> Truncated to line 29 - 37! </div>
+</div>
+<div style="width:47.025em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)** <b>*Customize EmacsW32*</b> (Custom Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+</tr>
+<tr>
+<td style="vertical-align:top;"><div style="width:47.025em; height:12.76em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre> Add quick printing to File menu (htmlize-view-print-visible): <span class="bold-0248">t</span>
+ Keep default print entries in File menu (w32-print-menu-show-print): <span class="bold-0248">nil</span>
+ Keep default ps print entries in File menu (w32-print-menu-show-ps-print): <span class="bold-0248">nil</span>
+ Use keyboard Window keys as Emacs META (w32-meta-style): <span class="bold-0248">w32-lr</span>
+ Underlined accelerators in menu bar (menuacc-active): <span class="bold-0248">t</span>
+ Inferior shell + path for unix style programs (w32shell-shell): <span class="bold-0248">cmd</span>
+
+ <span class="custom-button-0022"> Set all to w32 style! </span> <span class="custom-button-0022"> Reset all to default! </span> <span class="custom-button-0022"> Customize EmacsW32 ... </span>
+</pre>
+
+
+<div style="margin-top:2em; color: red; text-align: center; "> Truncated to line 13 - 21! </div>
+</div>
+<div style="width:47.025em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)** <b>*Customize EmacsW32*</b> (Custom Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+</tr>
+<tr>
+<td style="vertical-align:top;"><table border="0" cellpadding="0" cellspacing="0">
+<tr><td style="vertical-align:top;"><div style="width:22.514999999999997em; height:12.76em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre>-*- mode: grep; default-directory: &quot;c:/emacs/p/070604/EmacsW32/nxml/util/&quot; -*-
+Grep started at Fri Dec 28 22:54:06
+
+grep -i -nH -e &quot;hfy-tmpfont-stack&quot; *.el
+<span class="underline-1412">htmlfontify.el</span><span class="underline-0219">:</span><span class="underline-1413">596</span><span class="underline-0219">:</span>(defvar <span class="match-1438">hfy-tmpfont-stack</span> nil
+<span class="underline-1412">htmlfontify.el</span><span class="underline-0219">:</span><span class="underline-1413">999</span><span class="underline-0219">:</span> (entry (assoc key <span class="match-1438">hfy-tmpfont-stack</span>))
+<span class="underline-1412">htmlfontify.el</span><span class="underline-0219">:</span><span class="underline-1413">1003</span><span class="underline-0219">:</span> (setq tag (format &quot;%04d&quot; (length <span class="match-1438">hfy-tmpfont-stack</span>))
+<span class="underline-1412">htmlfontify.el</span><span class="underline-0219">:</span><span class="underline-1413">1005</span><span class="underline-0219">:</span> <span class="match-1438">hfy-tmpfont-stack</span> (cons entry <span class="match-1438">hfy-tmpfont-stack</span>)))
+</pre>
+
+
+<div style="margin-top:2em; color: red; text-align: center; "> Truncated to line 1 - 9! </div>
+</div>
+<div style="width:22.515em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)%% <b>*grep*</b> (Grep Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+<td style="vertical-align:top;"><div style="width:23.084999999999997em; height:12.76em; border: 1px solid rgb(212, 208, 200); overflow:auto; padding:4px;">
+
+
+ <script type="text/javascript">
+ // <![CDATA[
+
+function getObj(name) {
+ if (document.getElementById) {
+ this.obj = document.getElementById(name);
+ this.style = document.getElementById(name).style;
+ }
+}
+function hfy_toggle_display(name) {
+ var x = new getObj("hfy_invis_" + name);
+ var flag = x.style.display == 'inline';
+ x.style.display = (flag) ? 'none' : 'inline'
+}
+
+ // ]]>
+ </script>
+
+<pre><span class="underline-1439">5 matches for &quot;hfy-tmpfont-stack&quot; in buffer: htmlfontify.el
+</span> 596:(<span class="keyword-face-1440">defvar</span> <span class="match-1438">hfy-tmpfont-stack</span> nil
+ 999: (entry (assoc key <span class="match-1438">hfy-tmpfont-stack</span>))
+ 1003: (setq tag (format <span class="string-face-1441">&quot;%04d&quot;</span> (length <span class="match-1438">hfy-tmpfont-stack</span>))
+ 1005: <span class="match-1438">hfy-tmpfont-stack</span> (cons entry <span class="match-1438">hfy-tmpfont-stack</span>)))
+ 1228: <span class="comment-delimiter-face-1418">;;</span><span class="comment-face-1419">(</span><span class="match-1438">hfy-tmpfont-stack</span><span class="comment-face-1419"> nil)</span>
+</pre>
+
+ </div>
+<div style="width:23.085em; color:rgb(51, 51, 51); background:rgb(229, 229, 229); white-space:pre; overflow:hidden; font-family:monospace;">-- (Unix)%% <b>*Occur*</b> (Occur Abbrev) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------</div></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+<tr>
+<td style="padding:1px; color:rgb(0,0,0); ">
+<span style="background:rgb(255, 215, 0); color:rgb(0,0,0); ">&nbsp;M-x </span>&nbsp;hfyview-frame</td>
+</tr>
+</table>
+</body>
+</html>
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/Las_Medulas.jpg b/emacs.d/nxhtml/nxhtml/doc/img/Las_Medulas.jpg
new file mode 100644
index 0000000..694a2c5
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/Las_Medulas.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/Toco_toucan.jpg b/emacs.d/nxhtml/nxhtml/doc/img/Toco_toucan.jpg
new file mode 100644
index 0000000..269886c
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/Toco_toucan.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/bacchante2.jpg b/emacs.d/nxhtml/nxhtml/doc/img/bacchante2.jpg
new file mode 100644
index 0000000..a736099
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/bacchante2.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/butterflies.jpg b/emacs.d/nxhtml/nxhtml/doc/img/butterflies.jpg
new file mode 100644
index 0000000..a7352a6
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/butterflies.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/butterflies.png b/emacs.d/nxhtml/nxhtml/doc/img/butterflies.png
new file mode 100644
index 0000000..8d60637
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/butterflies.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/butterflies.xcf b/emacs.d/nxhtml/nxhtml/doc/img/butterflies.xcf
new file mode 100644
index 0000000..9260725
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/butterflies.xcf
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/continue-play.jpg b/emacs.d/nxhtml/nxhtml/doc/img/continue-play.jpg
new file mode 100644
index 0000000..587113e
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/continue-play.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/divine2.jpg b/emacs.d/nxhtml/nxhtml/doc/img/divine2.jpg
new file mode 100644
index 0000000..6a8ea51
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/divine2.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/edit-part.png b/emacs.d/nxhtml/nxhtml/doc/img/edit-part.png
new file mode 100644
index 0000000..7c6ab2a
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/edit-part.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.png b/emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.png
new file mode 100644
index 0000000..ce30bdf
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.xcf b/emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.xcf
new file mode 100644
index 0000000..6703882
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/editing-web-files.xcf
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/emacs-style-completion.png b/emacs.d/nxhtml/nxhtml/doc/img/emacs-style-completion.png
new file mode 100644
index 0000000..0a404fb
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/emacs-style-completion.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/emacsP.png b/emacs.d/nxhtml/nxhtml/doc/img/emacsP.png
new file mode 100644
index 0000000..e0a5ecb
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/emacsP.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/emacsP16.png b/emacs.d/nxhtml/nxhtml/doc/img/emacsP16.png
new file mode 100644
index 0000000..54b597b
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/emacsP16.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/embedded-css.png b/emacs.d/nxhtml/nxhtml/doc/img/embedded-css.png
new file mode 100644
index 0000000..25c11d4
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/embedded-css.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/embedded-xhtml.png b/emacs.d/nxhtml/nxhtml/doc/img/embedded-xhtml.png
new file mode 100644
index 0000000..85b98f3
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/embedded-xhtml.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/foldit-closed.png b/emacs.d/nxhtml/nxhtml/doc/img/foldit-closed.png
new file mode 100644
index 0000000..fc1b49c
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/foldit-closed.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/foldit-temp-opened.png b/emacs.d/nxhtml/nxhtml/doc/img/foldit-temp-opened.png
new file mode 100644
index 0000000..5e02725
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/foldit-temp-opened.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/fun-brain-2.png b/emacs.d/nxhtml/nxhtml/doc/img/fun-brain-2.png
new file mode 100644
index 0000000..a24f0f4
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/fun-brain-2.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.png b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.png
new file mode 100644
index 0000000..5f3c757
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.xcf b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.xcf
new file mode 100644
index 0000000..8ec9aaa
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-1.xcf
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-2.png b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-2.png
new file mode 100644
index 0000000..c3615f3
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons-2.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.png b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.png
new file mode 100644
index 0000000..b9b0c43
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.xcf b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.xcf
new file mode 100644
index 0000000..ce416ce
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/getitbuttons.xcf
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/giraffe.jpg b/emacs.d/nxhtml/nxhtml/doc/img/giraffe.jpg
new file mode 100644
index 0000000..6bf9b57
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/giraffe.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/healthy_feet2.jpg b/emacs.d/nxhtml/nxhtml/doc/img/healthy_feet2.jpg
new file mode 100644
index 0000000..ed3ab6f
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/healthy_feet2.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/itsalltext-pref.png b/emacs.d/nxhtml/nxhtml/doc/img/itsalltext-pref.png
new file mode 100644
index 0000000..3b3d9f1
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/itsalltext-pref.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/links-appmenu.png b/emacs.d/nxhtml/nxhtml/doc/img/links-appmenu.png
new file mode 100644
index 0000000..a03ba4a
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/links-appmenu.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/nxml-where.png b/emacs.d/nxhtml/nxhtml/doc/img/nxml-where.png
new file mode 100644
index 0000000..102d084
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/nxml-where.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml-2.png b/emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml-2.png
new file mode 100644
index 0000000..c204f4d
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml-2.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml.png b/emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml.png
new file mode 100644
index 0000000..cda754a
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/php-in-nxhtml.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/php-in-php.png b/emacs.d/nxhtml/nxhtml/doc/img/php-in-php.png
new file mode 100644
index 0000000..c7664da
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/php-in-php.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/php-in-xhtml.png b/emacs.d/nxhtml/nxhtml/doc/img/php-in-xhtml.png
new file mode 100644
index 0000000..310d07f
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/php-in-xhtml.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/popup-compl.png b/emacs.d/nxhtml/nxhtml/doc/img/popup-compl.png
new file mode 100644
index 0000000..a40bd49
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/popup-compl.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/raindrops2.jpg b/emacs.d/nxhtml/nxhtml/doc/img/raindrops2.jpg
new file mode 100644
index 0000000..04d0610
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/raindrops2.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/region-selected-after.png b/emacs.d/nxhtml/nxhtml/doc/img/region-selected-after.png
new file mode 100644
index 0000000..c7ea553
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/region-selected-after.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/region-selected-completion.png b/emacs.d/nxhtml/nxhtml/doc/img/region-selected-completion.png
new file mode 100644
index 0000000..b971b9d
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/region-selected-completion.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/region-selected.png b/emacs.d/nxhtml/nxhtml/doc/img/region-selected.png
new file mode 100644
index 0000000..0a2358b
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/region-selected.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/rembrandt-self-portrait.jpg b/emacs.d/nxhtml/nxhtml/doc/img/rembrandt-self-portrait.jpg
new file mode 100644
index 0000000..2689598
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/rembrandt-self-portrait.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/style-in-nxhtml.png b/emacs.d/nxhtml/nxhtml/doc/img/style-in-nxhtml.png
new file mode 100644
index 0000000..151681d
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/style-in-nxhtml.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans.png b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans.png
new file mode 100644
index 0000000..4ae2ff8
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans2.png b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans2.png
new file mode 100644
index 0000000..c348c92
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml-trans2.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.png b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.png
new file mode 100644
index 0000000..408980f
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.xcf b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.xcf
new file mode 100644
index 0000000..d42da0b
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/use-nXhtml.xcf
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/validation-error.png b/emacs.d/nxhtml/nxhtml/doc/img/validation-error.png
new file mode 100644
index 0000000..7682642
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/validation-error.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/volga.jpg b/emacs.d/nxhtml/nxhtml/doc/img/volga.jpg
new file mode 100644
index 0000000..c11e93c
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/volga.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/img/xml-validation-header.png b/emacs.d/nxhtml/nxhtml/doc/img/xml-validation-header.png
new file mode 100644
index 0000000..2093781
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/img/xml-validation-header.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow1.gif b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow1.gif
new file mode 100644
index 0000000..316dea7
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow1.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow2.gif b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow2.gif
new file mode 100644
index 0000000..24a6be1
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/carrow2.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.gif b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.gif
new file mode 100644
index 0000000..218233d
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.png b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.png
new file mode 100644
index 0000000..61e8660
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche1.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.gif b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.gif
new file mode 100644
index 0000000..dc91f06
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.png b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.png
new file mode 100644
index 0000000..bbf66a1
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/fleche2.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/loading-bar-black.gif b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/loading-bar-black.gif
new file mode 100644
index 0000000..99368d6
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/loading-bar-black.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.gif b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.gif
new file mode 100644
index 0000000..d145e66
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.png b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.png
new file mode 100644
index 0000000..aebf498
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/img/open.png
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/jd.gallery.css b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/jd.gallery.css
new file mode 100644
index 0000000..b0d87ec
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/jd.gallery.css
@@ -0,0 +1,238 @@
+#myGallery
+{
+ width: 460px;
+ height: 345px;
+ z-index:5;
+ display: none;
+ border: 1px solid #000;
+}
+
+.jdGallery
+{
+ overflow: hidden;
+ position: relative;
+}
+
+.jdGallery img
+{
+ border: 0;
+ margin: 0;
+}
+
+.jdGallery .slideElement
+{
+ width: 100%;
+ height: 100%;
+ background-color: #000;
+ background-repeat: no-repeat;
+}
+
+.jdGallery .loadingElement
+{
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+ background-color: #000;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-image: url('img/loading-bar-black.gif');
+}
+
+.jdGallery .slideInfoZone
+{
+ position: absolute;
+ z-index: 10;
+ width: 100%;
+ margin: 0px;
+ left: 0;
+ bottom: 0;
+ height: 40px;
+ background: #333;
+ color: #fff;
+ text-indent: 0;
+ overflow: hidden;
+}
+
+* html .jdGallery .slideInfoZone
+{
+ bottom: -1px;
+}
+
+.jdGallery .slideInfoZone h2
+{
+ padding: 0;
+ font-size: 80%;
+ margin: 0;
+ margin: 2px 5px;
+ font-weight: bold;
+ color: inherit;
+}
+
+.jdGallery .slideInfoZone p
+{
+ padding: 0;
+ font-size: 80%;
+ margin: 2px 5px;
+ color: #eee;
+}
+
+.jdGallery div.carouselContainer
+{
+ position: absolute;
+ height: 135px;
+ width: 100%;
+ z-index: 10;
+ margin: 0px;
+ left: 0;
+ top: 0;
+}
+
+.jdGallery a.carouselBtn
+{
+ position: absolute;
+ bottom: 0;
+ right: 30px;
+ height: 20px;
+ /*width: 100px; background: url('img/carousel_btn.gif') no-repeat;*/
+ text-align: center;
+ padding: 0 10px;
+ font-size: 13px;
+ background: #333;
+ color: #fff;
+ cursor: pointer;
+}
+
+.jdGallery .carousel
+{
+ position: absolute;
+ width: 100%;
+ margin: 0px;
+ left: 0;
+ top: 0;
+ height: 115px;
+ background: #333;
+ color: #fff;
+ text-indent: 0;
+ overflow: hidden;
+}
+
+.jdGallery .carousel .carouselWrapper
+{
+ position: absolute;
+ width: 100%;
+ height: 78px;
+ top: 10px;
+ left: 0;
+ overflow: hidden;
+}
+
+.jdGallery .carousel .carouselInner
+{
+ position: relative;
+}
+
+.jdGallery .carousel .carouselInner .thumbnail
+{
+ cursor: pointer;
+ background: #000;
+ background-position: center center;
+ float: left;
+ border: solid 1px #fff;
+}
+
+.jdGallery .carousel .label
+{
+ font-size: 13px;
+ position: absolute;
+ bottom: 5px;
+ left: 10px;
+ padding: 0;
+ margin: 0;
+}
+
+.jdGallery .carousel .label .number
+{
+ color: #b5b5b5;
+}
+
+.jdGallery a
+{
+ font-size: 100%;
+ text-decoration: none;
+ color: inherit;
+}
+
+.jdGallery a.right, .jdGallery a.left
+{
+ position: absolute;
+ height: 99%;
+ width: 25%;
+ cursor: pointer;
+ z-index:10;
+ filter:alpha(opacity=20);
+ -moz-opacity:0.2;
+ -khtml-opacity: 0.2;
+ opacity: 0.2;
+}
+
+* html .jdGallery a.right, * html .jdGallery a.left
+{
+ filter:alpha(opacity=50);
+}
+
+.jdGallery a.right:hover, .jdGallery a.left:hover
+{
+ filter:alpha(opacity=80);
+ -moz-opacity:0.8;
+ -khtml-opacity: 0.8;
+ opacity: 0.8;
+}
+
+.jdGallery a.left
+{
+ left: 0;
+ top: 0;
+ background: url('img/fleche1.png') no-repeat center left;
+}
+
+* html .jdGallery a.left { background: url('img/fleche1.gif') no-repeat center left; }
+
+.jdGallery a.right
+{
+ right: 0;
+ top: 0;
+ background: url('img/fleche2.png') no-repeat center right;
+}
+
+* html .jdGallery a.right { background: url('img/fleche2.gif') no-repeat center right; }
+
+.jdGallery a.open
+{
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.withArrows a.open
+{
+ position: absolute;
+ top: 0;
+ left: 25%;
+ height: 99%;
+ width: 50%;
+ cursor: pointer;
+ z-index: 10;
+ background: none;
+ -moz-opacity:0.8;
+ -khtml-opacity: 0.8;
+ opacity: 0.8;
+}
+
+.withArrows a.open:hover { background: url('img/open.png') no-repeat center center; }
+
+* html .withArrows a.open:hover { background: url('img/open.gif') no-repeat center center;
+ filter:alpha(opacity=80); }
+
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/layout.css b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/layout.css
new file mode 100644
index 0000000..9c807b6
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/css/layout.css
@@ -0,0 +1,91 @@
+body {
+ color: #ccc;
+ font-family: "Trebuchet MS", "Lucida Grande", Arial, Helvetica, sans-serif;
+ margin: 0 auto;
+ padding: 0;
+ font-size: 1.0em;
+ background: #111 url('../images/bg/gradient1.gif') top left repeat-x;
+}
+
+h1
+{
+ color: #fff;
+ font-size: 47px;
+ font-weight: bolder;
+ margin: 0 40px;
+ padding: 0.08em 0;
+}
+
+h1 sup
+{
+ color: #ddd;
+}
+
+h1 a
+{
+ color: #fff;
+ text-decoration: none;
+}
+
+h1 .company, h1 a .company
+{
+ color: #d01a71;
+}
+
+h2
+{
+ color: #ddd;
+ font-size: 2.5em;
+}
+
+h3
+{
+ color: #fff;
+ font-size: 1.5em;
+}
+
+h4
+{
+ font-size: 1.3em;
+}
+
+.content
+{
+ margin: 0 20px;
+}
+
+.content a
+{
+ color: #fff;
+}
+
+
+.content p.linkage
+{
+ margin-top: 2em;
+ text-align: right;
+ font-size: 1.7em;
+ color: #ddd;
+}
+
+.content p.linkage a { color: #fff; }
+
+/*.content p.linkage a
+{
+ color: #fff;
+ background: url('../images/bg/biglink_off.gif') center right no-repeat;
+ padding: 10px 20px;
+ text-decoration: none;
+}
+
+.content p.linkage a:hover
+{
+ background: url('../images/bg/biglink_on.gif') center right no-repeat;
+ font-style: italic;
+}*/
+
+#myGallery
+{
+ text-align: left;
+ margin: 0 auto;
+}
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/jd.gallery.js b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/jd.gallery.js
new file mode 100644
index 0000000..af83b13
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/jd.gallery.js
@@ -0,0 +1,449 @@
+/*
+ This file is part of JonDesign's SmoothGallery v1.0.1.
+
+ JonDesign's SmoothGallery 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.
+
+ JonDesign's SmoothGallery 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 JonDesign's SmoothGallery; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Main Developer: Jonathan Schemoul (JonDesign: http://www.jondesign.net/)
+ Contributed code by:
+ - Christian Ehret (bugfix)
+ - Nitrix (bugfix)
+ - Valerio from Mad4Milk for his great help with the carousel scrolling and many other things.
+ - Archie Cowan for helping me find a bugfix on carousel inner width problem.
+ Many thanks to:
+ - The mootools team for the great mootools lib, and it's help and support throughout the project.
+*/
+
+
+var $removeEvents = function (object, type)
+{
+ if (!object.events) return object;
+ if (type){
+ if (!object.events[type]) return object;
+ for (var fn in object.events[type]) object.removeEvent(type, fn);
+ object.events[type] = null;
+ } else {
+ for (var evType in object.events) object.removeEvents(evType);
+ object.events = null;
+ }
+ return object;
+};
+
+
+// declaring the class
+var gallery = new Class({
+ initialize: function(element, options) {
+ this.setOptions({
+ showArrows: true,
+ showCarousel: true,
+ showInfopane: true,
+ showDescription: false,
+ thumbHeight: 75,
+ thumbWidth: 100,
+ thumbSpacing: 10,
+ embedLinks: true,
+ fadeDuration: 500,
+ timed: false,
+ delay: 9000,
+ preloader: true,
+ manualData: [],
+ populateData: true,
+ elementSelector: "div.imageElement",
+ titleSelector: "h3",
+ subtitleSelector: "p",
+ descriptionSelector: "div",
+ linkSelector: "a.open",
+ imageSelector: "img.full",
+ thumbnailSelector: "img.thumbnail",
+ slideInfoZoneOpacity: 0.7,
+ carouselMinimizedOpacity: 0.4,
+ carouselMinimizedHeight: 20,
+ carouselMaximizedOpacity: 0.7,
+ destroyAfterPopulate: true,
+ baseClass: 'jdGallery',
+ withArrowsClass: 'withArrows',
+ textShowCarousel: 'Pictures',
+ useThumbGenerator: false,
+ thumbGenerator: 'resizer.php'
+ }, options);
+ this.fireEvent('onInit');
+ this.currentIter = 0;
+ this.lastIter = 0;
+ this.maxIter = 0;
+ this.galleryElement = element;
+ this.galleryData = this.options.manualData;
+ this.galleryInit = 1;
+ this.galleryElements = Array();
+ this.thumbnailElements = Array();
+ this.galleryElement.addClass(this.options.baseClass);
+ if (this.options.populateData)
+ this.populateData();
+ element.style.display="block";
+
+ if (this.options.embedLinks)
+ {
+ this.currentLink = new Element('a').addClass('open').setProperties({
+ href: '#',
+ title: ''
+ }).injectInside(element);
+ if ((!this.options.showArrows) && (!this.options.showCarousel))
+ this.galleryElement = element = this.currentLink;
+ else
+ this.currentLink.setStyle('display', 'none');
+ }
+
+ this.constructElements();
+ if ((data.length>1)&&(this.options.showArrows))
+ {
+ var leftArrow = new Element('a').addClass('left').addEvent(
+ 'click',
+ this.prevItem.bind(this)
+ ).injectInside(element);
+ var rightArrow = new Element('a').addClass('right').addEvent(
+ 'click',
+ this.nextItem.bind(this)
+ ).injectInside(element);
+ this.galleryElement.addClass(this.options.withArrowsClass);
+ }
+ this.loadingElement = new Element('div').addClass('loadingElement').injectInside(element);
+ if (this.options.showInfopane) this.initInfoSlideshow();
+ if (this.options.showCarousel) this.initCarousel();
+ this.doSlideShow(1);
+ },
+ populateData: function() {
+ currentArrayPlace = this.galleryData.length;
+ options = this.options;
+ data = this.galleryData;
+ this.galleryElement.getElements(options.elementSelector).each(function(el) {
+ elementDict = {
+ image: el.getElement(options.imageSelector).getProperty('src'),
+ number: currentArrayPlace
+ };
+ if ((options.showInfopane) | (options.showCarousel))
+ Object.extend(elementDict, {
+ title: el.getElement(options.titleSelector).innerHTML,
+ description: el.getElement(options.subtitleSelector).innerHTML
+ });
+ if ((options.showDescription))
+ Object.extend(elementDict, {
+ outsideDescription: el.getElement(options.descriptionSelector).innerHTML
+ });
+ if (options.embedLinks)
+ Object.extend(elementDict, {
+ link: el.getElement(options.linkSelector).href||false,
+ linkTitle: el.getElement(options.linkSelector).title||false
+ });
+ if ((!options.useThumbGenerator) && (options.showCarousel))
+ Object.extend(elementDict, {
+ thumbnail: el.getElement(options.thumbnailSelector).src
+ });
+ else if (options.useThumbGenerator)
+ Object.extend(elementDict, {
+ thumbnail: 'resizer.php?imgfile=' + elementDict.image + '&max_width=' + options.thumbWidth + '&max_height=' + options.thumbHeight
+ });
+
+ data[currentArrayPlace] = elementDict;
+ currentArrayPlace++;
+ if (this.options.destroyAfterPopulate)
+ el.remove();
+ });
+ this.galleryData = data;
+ this.fireEvent('onPopulated');
+ },
+ constructElements: function() {
+ el = this.galleryElement;
+ this.maxIter = this.galleryData.length;
+ var currentImg;
+ for(i=0;i<this.galleryData.length;i++)
+ {
+ var currentImg = new Fx.Style(
+ new Element('div').addClass('slideElement').setStyles({
+ 'position':'absolute',
+ 'left':'0px',
+ 'right':'0px',
+ 'margin':'0px',
+ 'padding':'0px',
+ 'backgroundImage':"url('" + this.galleryData[i].image + "')",
+ 'backgroundPosition':"center center",
+ 'opacity':'0'
+ }).injectInside(el),
+ 'opacity',
+ {duration: this.options.fadeDuration}
+ );
+ this.galleryElements[parseInt(i)] = currentImg;
+ }
+ },
+ destroySlideShow: function(element) {
+ var myClassName = element.className;
+ var newElement = new Element('div').addClass('myClassName');
+ element.parentNode.replaceChild(newElement, element);
+ },
+ startSlideShow: function() {
+ this.fireEvent('onStart');
+ this.loadingElement.style.display = "none";
+ this.lastIter = this.maxIter - 1;
+ this.currentIter = 0;
+ this.galleryInit = 0;
+ this.galleryElements[parseInt(this.currentIter)].set(1);
+ if (this.options.showInfopane)
+ this.showInfoSlideShow.delay(1000, this);
+ this.prepareTimer();
+ if (this.options.embedLinks)
+ this.makeLink(this.currentIter);
+ },
+ nextItem: function() {
+ this.fireEvent('onNextCalled');
+ this.nextIter = this.currentIter+1;
+ if (this.nextIter >= this.maxIter)
+ this.nextIter = 0;
+ this.galleryInit = 0;
+ this.goTo(this.nextIter);
+ },
+ prevItem: function() {
+ this.fireEvent('onPreviousCalled');
+ this.nextIter = this.currentIter-1;
+ if (this.nextIter <= -1)
+ this.nextIter = this.maxIter - 1;
+ this.galleryInit = 0;
+ this.goTo(this.nextIter);
+ },
+ goTo: function(num) {
+ this.clearTimer();
+ if (this.options.embedLinks)
+ this.clearLink();
+ if (this.options.showInfopane)
+ {
+ this.slideInfoZone.clearChain();
+ this.hideInfoSlideShow().chain(this.changeItem.pass(num, this));
+ } else
+ this.changeItem.delay(500, this, num);
+ if (this.options.embedLinks)
+ this.makeLink(num);
+ if (this.options.showDescription)
+ this.showDescription(num);
+ this.prepareTimer();
+ /*if (this.options.showCarousel)
+ this.clearThumbnailsHighlights();*/
+ },
+ changeItem: function(num) {
+ this.fireEvent('onStartChanging');
+ this.galleryInit = 0;
+ if (this.currentIter != num)
+ {
+ for(i=0;i<this.maxIter;i++)
+ {
+ if ((i != this.currentIter)) this.galleryElements[i].set(0);
+ }
+ if (num > this.currentIter) this.galleryElements[num].custom(1);
+ else
+ {
+ this.galleryElements[num].set(1);
+ this.galleryElements[this.currentIter].custom(0);
+ }
+ this.currentIter = num;
+ }
+ this.doSlideShow.bind(this)();
+ this.fireEvent('onChanged');
+ },
+ clearTimer: function() {
+ if (this.options.timed)
+ $clear(this.timer);
+ },
+ prepareTimer: function() {
+ if (this.options.timed)
+ this.timer = this.nextItem.delay(this.options.delay, this);
+ },
+ doSlideShow: function(position) {
+ if (this.galleryInit == 1)
+ {
+ imgPreloader = new Image();
+ imgPreloader.onload=function(){
+ this.startSlideShow.delay(10, this);
+ }.bind(this);
+ imgPreloader.src = this.galleryData[0].image;
+ } else {
+ if (this.options.showInfopane)
+ {
+ if (this.options.showInfopane)
+ {
+ this.showInfoSlideShow.delay((500 + this.options.fadeDuration), this);
+ } else
+ if (this.options.showCarousel)
+ this.centerCarouselOn(position);
+ }
+ }
+ },
+ initCarousel: function () {
+ var carouselContainerElement = new Element('div').addClass('carouselContainer').injectInside(this.galleryElement);
+ this.carouselContainer = new Fx.Styles(carouselContainerElement, {transition: Fx.Transitions.expoOut});
+ this.carouselContainer.normalHeight = carouselContainerElement.offsetHeight;
+ this.carouselContainer.set({'opacity': this.options.carouselMinimizedOpacity, 'top': (this.options.carouselMinimizedHeight - this.carouselContainer.normalHeight)});
+
+ this.carouselBtn = new Element('a').addClass('carouselBtn').setProperties({
+ title: this.options.textShowCarousel
+ }).setHTML(this.options.textShowCarousel).injectInside(carouselContainerElement);
+
+ this.carouselBtn.addEvent(
+ 'click',
+ function () {
+ this.carouselContainer.clearTimer();
+ this.toggleCarousel();
+ }.bind(this)
+ );
+ this.carouselActive = false;
+
+ var carouselElement = new Element('div').addClass('carousel').injectInside(carouselContainerElement);
+ this.carousel = new Fx.Styles(carouselElement);
+
+ this.carouselLabel = new Element('p').addClass('label').injectInside(this.carousel.element);
+ this.carouselWrapper = new Element('div').addClass('carouselWrapper').injectInside(this.carousel.element);
+ this.carouselInner = new Element('div').addClass('carouselInner').injectInside(this.carouselWrapper);
+
+ this.carouselWrapper.scroller = new Scroller(this.carouselWrapper, {
+ area: 100,
+ velocity: 0.2
+ })
+
+ this.carouselWrapper.elementScroller = new Fx.Scroll(this.carouselWrapper, {
+ duration: 400,
+ onStart: this.carouselWrapper.scroller.stop.bind(this.carouselWrapper.scroller),
+ onComplete: this.carouselWrapper.scroller.start.bind(this.carouselWrapper.scroller)
+ });
+
+ this.constructThumbnails();
+
+ this.carouselInner.style.width = ((this.maxIter * (this.options.thumbWidth + this.options.thumbSpacing)) - this.options.thumbSpacing + this.options.thumbWidth) + "px";
+ },
+ toggleCarousel: function() {
+ if (this.carouselActive)
+ this.hideCarousel();
+ else
+ this.showCarousel();
+ },
+ showCarousel: function () {
+ this.fireEvent('onShowCarousel');
+ this.carouselContainer.custom({
+ 'opacity': this.options.carouselMaximizedOpacity,
+ 'top': 0
+ }).addEvent('onComplete', function() { this.carouselActive = true; this.carouselWrapper.scroller.start(); }.bind(this));
+ },
+ hideCarousel: function () {
+ this.fireEvent('onHideCarousel');
+ this.carouselContainer.custom({
+ 'opacity': this.options.carouselMinimizedOpacity,
+ 'top': (this.options.carouselMinimizedHeight - this.carouselContainer.normalHeight)
+ }).addEvent('onComplete', function() { this.carouselActive = false; this.carouselWrapper.scroller.stop(); }.bind(this));
+ },
+ constructThumbnails: function () {
+ element = this.carouselInner;
+ for(i=0;i<this.galleryData.length;i++)
+ {
+ var currentImg = new Fx.Style(new Element ('div').addClass("thumbnail").setStyles({
+ backgroundImage: "url('" + this.galleryData[i].thumbnail + "')",
+ backgroundPosition: "center center",
+ backgroundRepeat: 'no-repeat',
+ marginLeft: this.options.thumbSpacing + "px",
+ width: this.options.thumbWidth + "px",
+ height: this.options.thumbHeight + "px"
+ }).injectInside(element), "opacity", {duration: 200}).set(0.2);
+ currentImg.element.addEvents({
+ 'mouseover': function (myself) {
+ myself.clearTimer();
+ myself.custom(0.99);
+ $(this.carouselLabel).setHTML('<span class="number">' + (myself.relatedImage.number + 1) + "/" + this.maxIter + ":</span> " + myself.relatedImage.title);
+ }.pass(currentImg, this),
+ 'mouseout': function (myself) {
+ myself.clearTimer();
+ myself.custom(0.2);
+ }.pass(currentImg, this),
+ 'click': function (myself) {
+ this.goTo(myself.relatedImage.number);
+ }.pass(currentImg, this)
+ });
+
+ currentImg.relatedImage = this.galleryData[i];
+ this.thumbnailElements[parseInt(i)] = currentImg;
+ }
+ },
+ clearThumbnailsHighlights: function()
+ {
+ for(i=0;i<this.galleryData.length;i++)
+ {
+ this.thumbnailElements[i].clearTimer();
+ this.thumbnailElements[i].custom(0.2);
+ }
+ },
+ centerCarouselOn: function(num) {
+ var carouselElement = this.thumbnailElements[num];
+ var position = carouselElement.element.offsetLeft + (carouselElement.element.offsetWidth / 2);
+ var carouselWidth = this.carouselWrapper.offsetWidth;
+ var carouselInnerWidth = this.carouselInner.offsetWidth;
+ var diffWidth = carouselWidth / 2;
+ var scrollPos = position-diffWidth;
+ this.carouselWrapper.elementScroller.scrollTo(scrollPos,0);
+ },
+ initInfoSlideshow: function() {
+ /*if (this.slideInfoZone.element)
+ this.slideInfoZone.element.remove();*/
+ this.slideInfoZone = new Fx.Styles(new Element('div').addClass('slideInfoZone').injectInside($(this.galleryElement))).set({'opacity':0});
+ var slideInfoZoneTitle = new Element('h2').injectInside(this.slideInfoZone.element);
+ var slideInfoZoneDescription = new Element('p').injectInside(this.slideInfoZone.element);
+ this.slideInfoZone.normalHeight = this.slideInfoZone.element.offsetHeight;
+ this.slideInfoZone.element.setStyle('opacity',0);
+ },
+ changeInfoSlideShow: function()
+ {
+ this.hideInfoSlideShow.delay(10, this);
+ this.showInfoSlideShow.delay(500, this);
+ },
+ showInfoSlideShow: function() {
+ this.fireEvent('onShowInfopane');
+ this.slideInfoZone.clearTimer();
+ element = this.slideInfoZone.element;
+ element.getElement('h2').setHTML(this.galleryData[this.currentIter].title);
+ element.getElement('p').setHTML(this.galleryData[this.currentIter].description);
+ this.slideInfoZone.custom({'opacity': [0, this.options.slideInfoZoneOpacity], 'height': [0, this.slideInfoZone.normalHeight]});
+ if (this.options.showCarousel)
+ this.slideInfoZone.chain(this.centerCarouselOn.pass(this.currentIter, this));
+ return this.slideInfoZone;
+ },
+ hideInfoSlideShow: function() {
+ this.fireEvent('onHideInfopane');
+ this.slideInfoZone.clearTimer();
+ this.slideInfoZone.custom({'opacity': 0, 'height': 0});
+ return this.slideInfoZone;
+ },
+ makeLink: function(num) {
+ this.currentLink.setProperties({
+ href: this.galleryData[num].link,
+ title: this.galleryData[num].linkTitle
+ })
+ if (!((this.options.embedLinks) && (!this.options.showArrows) && (!this.options.showCarousel)))
+ this.currentLink.setStyle('display', 'block');
+ },
+ showDescription: function(num) {
+ var descObj = document.getElementById('DescriptionDiv');
+ if (descObj)
+ descObj.setHTML(this.galleryData[num].outsideDescription);
+ },
+ clearLink: function() {
+ this.currentLink.setProperties({href: '', title: ''});
+ if (!((this.options.embedLinks) && (!this.options.showArrows) && (!this.options.showCarousel)))
+ this.currentLink.setStyle('display', 'none');
+ }
+});
+gallery.implement(new Events);
+gallery.implement(new Options);
+
+/* All code copyright 2006 Jonathan Schemoul */
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.js b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.js
new file mode 100644
index 0000000..eb6402a
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.js
@@ -0,0 +1,2 @@
+//MooTools, My Object Oriented Javascript Tools. Copyright (c) 2006 Valerio Proietti, <http://mad4milk.net>, MIT Style License.
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('k 11=f(1S){k 4s=f(){j(9.1e&&Y[0]!=\'7h\')h 9.1e.2m(9,Y);Q h 9};I(k n W 9)4s[n]=9[n];4s.U=1S;h 4s};11.1G=f(){};11.U={N:f(1S){k 4r=M 9(\'7h\');k 7g=f(2s,2f){j(!2s.2m||!2f.2m)h T;h f(){9.1t=2s;h 2f.2m(9,Y)}};I(k n W 1S){k 2s=4r[n];k 2f=1S[n];j(2s&&2s!=2f)2f=7g(2s,2f)||2f;4r[n]=2f}h M 11(4r)},1T:f(1S){I(k n W 1S)9.U[n]=1S[n]}};1H.N=f(){k R=Y;R=(R[1])?[R[0],R[1]]:[9,R[0]];I(k n W R[1])R[0][n]=R[1][n];h R[0]};1H.5p=f(){I(k i=0;i<Y.14;i++)Y[i].N=11.U.1T};M 1H.5p(59,1r,5e,76,11);j(5r 2I==\'3z\'){k 2I=11.1G;2I.U={}}f $q(u){j(u===1K||u===3z)h T;k q=5r u;j(q==\'5o\'){j(u 4m 2I)h\'r\';j(u 4m 1r)h\'1R\';j(u.9Y){2c(u.6x){1c 1:h\'r\';1c 3:h u.9X.15(\'\\\\S\')?\'9W\':\'4f\'}}}h q};f $2B(u){h!!(u||u===0)};f $9V(u,7f){h($q(u))?u:7f};f $7e(3o,1B){h G.9U(G.7e()*(1B-3o+1)+3o)};f $3Q(1f){9T(1f);9S(1f);h 1K};j(12.9R)12.3w=12[12.9Q?\'9P\':\'53\']=1g;Q j(L.6J&&!L.9O&&!9N.9M)12.3W=1g;Q j(L.9L!=1K)12.5m=1g;1r.U.4q=1r.U.4q||f(O,J){I(k i=0;i<9.14;i++)O.1i(J,9[i],i,9)};1r.U.4X=1r.U.4X||f(O,J){k 5u=[];I(k i=0;i<9.14;i++)5u[i]=O.1i(J,9[i],i,9);h 5u};1r.U.7d=1r.U.7d||f(O,J){I(k i=0;i<9.14;i++){j(!O.1i(J,9[i],i,9))h T}h 1g};1r.U.7c=1r.U.7c||f(O,J){I(k i=0;i<9.14;i++){j(O.1i(J,9[i],i,9))h 1g}h T};1r.U.4g=1r.U.4g||f(3a,F){F=F||0;j(F<0)F=G.1B(0,9.14+F);34(F<9.14){j(9[F]===3a)h F;F++}h-1};1r.N({1o:1r.U.4q,54:f(){k 36=[];I(k i=0;i<9.14;i++)36[i]=9[i];h 36},3Z:f(3a){k i=0;34(i<9.14){j(9[i]==3a)9.47(i,1);Q i++}h 9},15:f(3a,F){h 9.4g(3a,F)!=-1},N:f(36){I(k i=0;i<36.14;i++)9.18(36[i]);h 9},9K:f(1u){k u={},14=G.3o(9.14,1u.14);I(k i=0;i<14;i++)u[1u[i]]=9[i];h u}});f $A(1R){h 1r.U.54.1i(1R)};f $1o(7b,O,J){h 1r.U.4q.1i(7b,O,J)};5e.N({15:f(7a,79){h M 9J(7a,79).15(9)},2C:f(){h 5s(9)},74:f(){h 3t(9)},5n:f(){h 9.35(/-\\D/g,f(28){h 28.5t(1).78()})},6O:f(){h 9.35(/\\w[A-Z]/g,f(28){h(28.5t(0)+\'-\'+28.5t(1).3G())})},9I:f(){h 9.3G().35(/\\b[a-z]/g,f(28){h 28.78()})},77:f(){h 9.35(/^\\s+|\\s+$/g,\'\')},45:f(){h 9.35(/\\s{2,}/g,\' \').77()},3I:f(1R){k 1l=9.28(/\\d{1,3}/g);h(1l)?1l.3I(1R):T},3s:f(1R){k 2J=9.28(\'^#?(\\\\w{1,2})(\\\\w{1,2})(\\\\w{1,2})$\');h(2J)?2J.3s(1R):T}});1r.N({3I:f(1R){j(9.14<3)h T;j(9[3]&&9[3]==0)h\'9H\';k 2J=[];I(k i=0;i<3;i++){k 4p=(9[i]-0).9G(16);2J.18(4p.14==1?\'0\'+4p:4p)}h 1R?2J:\'#\'+2J.3r(\'\')},3s:f(1R){j(9.14!=4)h T;k 1l=[];I(k i=1;i<4;i++){j(9[i].14==1)9[i]+=9[i];1l.18(5s(9[i],16))}h 1R?1l:\'1l(\'+1l.3r(\',\')+\')\'}});76.N({2C:f(){h 5s(9)},74:f(){h 3t(9)}});59.N({2e:f(m){k O=9;m=1H.N({\'J\':O,\'o\':T,\'Y\':1K,\'2d\':T,\'2k\':T,\'4o\':T},m||{});j(m.Y!=1K&&5r m.Y!=\'3z\'&&!(m.Y 4m 1r))m.Y=[m.Y];h f(o){k R=m.Y||Y;j(m.o){o=(m.o===1g)?o||12.o:M m.o(o);R=[o].9F(R)}k 2t=f(){h O.2m(m.J,R)};j(m.2d)h 9E(2t,m.2d);j(m.2k)h 9D(2t,m.2k);j(m.4o){6g{k 5q=2t()}6f(73){5q=73}9C{h 5q}}Q h 2t()}},9B:f(R,J){h 9.2e({\'Y\':R,\'J\':J})},4o:f(R,J){h 9.2e({\'Y\':R,\'J\':J,\'4o\':1g})()},J:f(J,R){h 9.2e({\'J\':J,\'Y\':R})},9A:f(J,R){h 9.2e({\'J\':J,\'o\':1g,\'Y\':R})},2d:f(4n,J,R){h 9.2e({\'2d\':4n,\'J\':J,\'Y\':R})()},2k:f(4n,J,R){h 9.2e({\'2k\':4n,\'J\':J,\'Y\':R})()}});k 1b=M 11({1e:f(l){j($q(l)==\'4j\')l=L.6H(l);h $(l)}});f $(l){j(!l)h T;j(l.72||[12,L].15(l))h l;j($q(l)==\'4j\')l=L.44(l);j($q(l)!=\'r\')h T;j([\'5o\',\'9z\'].15(l.41.3G())||l.N)h l;l.72=1g;31.6z(l);l.N=1H.N;j(!(l 4m 2I))l.N(1b.U);h l};k 1N=M 11({});M 1H.5p(1N);L.2G=L.56;f $$(){j(!Y)h T;j(Y.14==1){j(!Y[0])h T;j(Y[0].71)h Y[0]}k 1w=[];$1o(Y,f(1v){2c($q(1v)){1c\'r\':1w.18($(1v));1P;1c\'4j\':1v=L.2G(1v);6F:j(1v.14){$1o(1v,f(l){j($(l))1w.18(l)})}}});1w.71=1g;h 1H.N(1w,M 1N)};1N.3T=f(n){h f(){k R=Y;k 3J=[];k 1w=1g;$1o(9,f(l){k 2t=l[n].2m(l,R);j($q(2t)!=\'r\')1w=T;3J.18(2t)});j(1w)3J=$$(3J);h 3J}};1b.N=f(1S){I(k n W 1S){2I.U[n]=1S[n];1b.U[n]=1S[n];1N.U[n]=1N.3T(n)}};1b.N({4l:f(l,70){l=$(l)||M 1b(l);2c(70){1c"6Y":$(l.26).6Z(9,l);1P;1c"6X":j(!l.5k())$(l.26).4k(9);Q $(l.26).6Z(9,l.5k());1P;1c"6W":l.4k(9)}h 9},9y:f(l){h 9.4l(l,\'6Y\')},5K:f(l){h 9.4l(l,\'6X\')},9x:f(l){h 9.4l(l,\'6W\')},5J:f(l){9.4k($(l)||M 1b(l));h 9},3Z:f(){9.26.9w(9);h 9},9v:f(6V){k l=9.9u(6V!==T);h $(l)},6G:f(l){l=$(l)||M 1b(l);9.26.9t(l,9);h l},9s:f(33){j(12.3w){2c(9.3C()){1c\'1h\':9.9r.6S=33;h 9;1c\'52\':9.4d(\'33\',33);h 9}}9.4k(L.9q(33));h 9},3A:f(1d){h 9.1d.15(\'(?:^|\\\\s+)\'+1d+\'(?:\\\\s+|$)\')},6T:f(1d){j(!9.3A(1d))9.1d=(9.1d+\' \'+1d).45();h 9},6U:f(1d){j(9.3A(1d))9.1d=9.1d.35(1d,\'\').45();h 9},9p:f(1d){h 9.3A(1d)?9.6U(1d):9.6T(1d)},1F:f(n,K){j(n==\'1Y\')9.6R(3t(K));Q 9.1h[n.5n()]=(K.18)?K.3I():K;h 9},6I:f(1L){2c($q(1L)){1c\'5o\':I(k n W 1L)9.1F(n,1L[n]);1P;1c\'4j\':j(12.3w)9.6S=1L;Q 9.6E(\'1h\',1L)}h 9},6R:f(1Y){j(1Y==0){j(9.1h.4i!="3S")9.1h.4i="3S"}Q{j(9.1h.4i!="6Q")9.1h.4i="6Q"}j(!9.4h||!9.4h.9o)9.1h.9n=1;j(12.3w)9.1h.3D="3x(1Y="+1Y*3g+")";9.1h.1Y=9.1Y=1Y;h 9},1W:f(n){n=n.5n();k 1h=9.1h[n]||T;j(!$2B(1h)){j(n==\'1Y\')h $2B(9.1Y)?9.1Y:1;j([\'2n\',\'9m\'].15(n)){h[9.1W(n+\'-2w\')||0,9.1W(n+\'-5a\')||0,9.1W(n+\'-6B\')||0,9.1W(n+\'-2i\')||0].3r(\' \')}j(L.6P)1h=L.6P.9l(9,1K).9k(n.6O());Q j(9.4h)1h=9.4h[n]}h(1h&&n.15(\'1A\',\'i\')&&1h.15(\'1l\'))?1h.3I():1h},1a:f(q,O){9.V=9.V||{};9.V[q]=9.V[q]||{\'1u\':[],\'1z\':[]};j(!9.V[q].1u.15(O)){9.V[q].1u.18(O);j(9.6N){9.6N((q==\'2M\'&&12.5m)?\'5f\':q,O,T)}Q{O=O.J(9);9.9j(\'58\'+q,O);9.V[q].1z.18(O)}}h 9},9i:f(1L){j(1L){I(k q W 1L)9.1a(q,1L[q])}h 9},1E:f(q,O){j(9.V&&9.V[q]){k 1D=9.V[q].1u.4g(O);j(1D==-1)h 9;k 1O=9.V[q].1u.47(1D,1)[0];j(9.6M){9.6M((q==\'2M\'&&12.5m)?\'5f\':q,1O,T)}Q{9.9h(\'58\'+q,9.V[q].1z.47(1D,1)[0])}}h 9},5h:f(q){j(9.V){j(q){j(9.V[q]){9.V[q].1u.1o(f(O){9.1E(q,O)},9);9.V[q]=1K}}Q{I(k 6L W 9.V)9.5h(6L);9.V=1K}}h 9},1x:f(q,R){j(9.V&&9.V[q]){R=R||[];j($q(R)!=\'1R\')R=[R];9.V[q].1u.1o(f(O){O.2m(9,R)},9)}},5j:f(5l){k l=9[5l+\'6K\'];34($q(l)==\'4f\')l=l[5l+\'6K\'];h $(l)},9g:f(){h 9.5j(\'2s\')},5k:f(){h 9.5j(\'9f\')},9e:f(){k l=9.9d;34($q(l)==\'4f\')l=l.9c;h $(l)},9b:f(){k l=9.9a;34($q(l)==\'4f\')l=l.99;h $(l)},98:f(){h $(9.26)},97:f(){h $$(9.6J)},4d:f(n,K){2c(n){1c\'6C\':9.1d=K;1P;1c\'1h\':9.6I(K);1P;1c\'24\':j(12.53){k l=$(L.6H(\'<\'+9.3C()+\' 24="\'+K+\'" />\'));$1o(9.96,f(4e){j(4e.24!=\'24\')l.4d(4e.24,4e.K)});j(9.26)9.6G(l);h l}6F:9.6E(n,K)}h 9},95:f(1L){I(k n W 1L)9.4d(n,1L[n]);h 9},94:f(6D){9.93=6D;h 9},92:f(n){h(n==\'6C\')?9.1d:9.6k(n)},3C:f(){h 9.41.3G()},2O:f(){k l=9,4c=0,4b=0;91{4c+=l.4c||0;4b+=l.4b||0;l=l.90}34(l);h{\'x\':4c,\'y\':4b}},2a:f(x,y){9.3U=x;9.3V=y},3P:f(){h{\'1V\':{\'x\':9.3U,\'y\':9.3V},\'2A\':{\'x\':9.2x,\'y\':9.2v},\'3O\':{\'x\':9.68,\'y\':9.69}}},4D:f(){h 9.2O().y},4F:f(){h 9.2O().x},8Z:f(){k 5i=9.2O();k u={\'3j\':9.2x,\'3i\':9.2v,\'2i\':5i.x,\'2w\':5i.y};u.5a=u.2i+u.3j;u.6B=u.2w+u.3i;h u},2F:f(){2c(9.3C()){1c\'2U\':j(9.6A!=-1)h 9.m[9.6A].K;1P;1c\'8Y\':j(!(9.8X&&[\'8W\',\'8V\'].15(9.q))&&![\'3S\',\'33\',\'8U\'].15(9.q))1P;1c\'8T\':h 9.K}h T}});k 8S=12;12.1a=L.1a=1b.U.1a;12.1E=L.1E=1b.U.1E;k 31={1w:[],6z:f(r){31.1w.18(r)},5g:f(){12.1E(\'6y\',31.5g);31.1w.1o(f(l){l.5h();I(k p W 1b.U)2I[p]=12[p]=L[p]=l[p]=1K;l.N=1K})}};12.1a(\'6y\',31.5g);k 3F=M 11({1e:f(o){9.o=o||12.o;9.q=9.o.q;9.3H=9.o.3H||9.o.8R;j(9.3H.6x==3)9.3H=9.3H.26;9.8Q=9.o.8P;9.8O=9.o.8N;9.8M=9.o.8L;9.8K=9.o.8J;j([\'5f\',\'2M\'].15(9.q)){9.3f=9.o.6w?(9.o.6w/ (12.51 ? -6v : 6v)) : -(9.o.8I || 0) /3}Q j(9.q.15(\'1O\')){9.5d=9.o.6r||9.o.8H;I(k 24 W 3F.1u){j(3F.1u[24]==9.5d)k 6u=24}9.1O=6u||5e.8G(9.5d).3G()}Q j(9.q.15(\'2l\')||9.q==\'8F\'){9.1y={\'x\':9.o.5c||9.o.6t+L.2r.3U,\'y\':9.o.5b||9.o.6s+L.2r.3V};9.5y={\'x\':9.o.5c?9.o.5c-12.66:9.o.6t,\'y\':9.o.5b?9.o.5b-12.67:9.o.6s};9.8E=(9.o.6r==3)||(9.o.8D==2);2c(9.q){1c\'8C\':9.4a=9.o.4a||9.o.8B;1P;1c\'8A\':9.4a=9.o.4a||9.o.5L}}},1s:f(){9.49();9.48();h 9},49:f(){j(9.o.49)9.o.49();Q 9.o.8z=1g;h 9},48:f(){j(9.o.48)9.o.48();Q 9.o.8y=T;h 9}});3F.1u={\'8x\':13,\'8w\':38,\'8v\':40,\'2i\':37,\'5a\':39,\'8u\':27,\'8t\':32,\'8s\':8,\'8r\':46};59.N({2y:f(J,R){h 9.2e({\'J\':J,\'Y\':R,\'o\':3F})}});k 5S=M 11({8q:f(O){9.2H=9.2H||[];9.2H.18(O);h 9},5Z:f(){j(9.2H&&9.2H.14)9.2H.47(0,1)[0].2d(10,9)},8p:f(){9.2H=[]}});k 3c=M 11({1a:f(q,O){j(O!=11.1G){9.V=9.V||{};9.V[q]=9.V[q]||[];j(!9.V[q].15(O))9.V[q].18(O)}h 9},1x:f(q,R,2d){j(9.V&&9.V[q]){9.V[q].1o(f(O){O.2e({\'J\':9,\'2d\':2d,\'Y\':R})()},9)}h 9},1E:f(q,O){j(9.V&&9.V[q])9.V[q].3Z(O);h 9}});k 3b=M 11({2N:f(6q,m){9.m=1H.N(6q,m);j(9.1a){I(k 3E W 9.m){j(($q(9.m[3E])==\'f\')&&3E.15(\'^58[A-Z]\'))9.1a(3E,9.m[3E])}}h 9}});f $E(1v,3D){h($(3D)||L).42(1v)};f $8o(1v,3D){h($(3D)||L).2G(1v)};1b.N({3B:f(1v){k 1Q=[];1v.45().4Y(\' \').1o(f(43,i){k 1q=43.28(\'^(\\\\w*|\\\\*)(?:#([\\\\6p-]+)|\\\\.([\\\\6p-]+))?(?:\\\\[["\\\']?(\\\\w+)["\\\']?(?:([\\\\*\\\\^\\\\$]?=)["\\\']?(\\\\w*)["\\\']?)?\\\\])?$\');j(!1q)h;1q[1]=1q[1]||\'*\';j(i==0){j(1q[2]){k l=9.44(1q[2]);j(!l||((1q[1]!=\'*\')&&(1b.U.3C.1i(l)!=1q[1])))h;1Q=[l]}Q{1Q=$A(9.56(1q[1]))}}Q{1Q=1N.U.6m.1i(1Q,1q[1]);j(1q[2])1Q=1N.U.6o.1i(1Q,1q[2])}j(1q[3])1Q=1N.U.6n.1i(1Q,1q[3]);j(1q[4])1Q=1N.U.6l.1i(1Q,1q[4],1q[6],1q[5])},9);h $$(1Q)},44:f(2Z){k l=L.44(2Z);j(!l)h T;I(k 1t=l.26;1t!=9;1t=1t.26){j(!1t)h T}h l},42:f(1v){h 9.2G(1v)[0]},2G:f(1v){k 57=[];1v.4Y(\',\').1o(f(43){57.N(9.3B(43))},9);h $$(57)}});L.N=1H.N;L.N({8n:f(1d){h L.3B(\'.\'+1d)},42:1b.U.42,3B:1b.U.3B,2G:1b.U.2G});1N.N({6o:f(2Z,8m){k 1p=[];9.1o(f(l){j(l.2Z==2Z)1p.18(l)});h 1p},6n:f(1d){k 1p=[];9.1o(f(l){j(1b.U.3A.1i(l,1d))1p.18(l)});h 1p},6m:f(41){k 1p=[];9.1o(f(l){1p.N(l.56(41))});h 1p},6l:f(24,K,55){k 1p=[];9.1o(f(l){k 30=l.6k(24);j(!30)h 1p;j(!55)h 1p.18(l);2c(55){1c\'*=\':j(30.15(K))1p.18(l);1P;1c\'=\':j(30==K)1p.18(l);1P;1c\'^=\':j(30.15(\'^\'+K))1p.18(l);1P;1c\'$=\':j(30.15(K+\'$\'))1p.18(l)}h 1p});h 1p}});k 6j=M 11({14:0,1e:f(u){9.u={};I(k n W u){9.u[n]=u[n];9.14++}},8l:f(1O){h 9.u[1O]},1U:f(1O,K){j(K==1K)h T;j(9.u[1O]==3z)9.14++;9.u[1O]=K;h 9},3Z:f(1O){j(9.u[1O]==3z)h T;k u={};9.14--;I(k n W 9.u){j(n!=1O)u[n]=9.u[n]}9.u=u;h 9},1o:f(O,J){I(k n W 9.u)O.1i(J||9,n,9.u[n])},N:f(u){9.1e(1H.N(9.u,u));h 9},1G:f(){h(9.14==0)},1u:f(){k 1u=[];I(k n W 9.u)1u.18(n);h 1u},1z:f(){k 1z=[];I(k n W 9.u)1z.18(9.u[n]);h 1z}});f $H(u){h M 6j(u)};k 2q=M 11({1e:f(1A){j(1A.6i&&1A.6h)h 1A;k 1l=(1A.18)?1A:1A.3s(1g);h 1H.N(1l,2q.U)},6i:f(){k 3y=$A(Y);k 3x=50;j($q(3y[3y.14-1])==\'5N\')3x=3y.8k();k 1l=9.54();3y.1o(f(1A){1A=M 2q(1A);I(k i=0;i<3;i++)1l[i]=G.3e((1l[i]/ 3g * (3g - 3x)) + (1A[i] /3g*3x))});h M 2q(1l)},6h:f(){k 1l=[];I(k i=0;i<3;i++)1l.18(8j-9[i]);h M 2q(1l)}});f $C(1A){h M 2q(1A)};12.N=1H.N;12.N({8i:f(){j(9.53)6g{L.8h("8g",T,1g)}6f(e){}},1a:f(q,O){j(q==\'3u\'){j(9.3Y)O();Q j(!9.V||!9.V.3u){k 3v=f(){j(9.3Y)h;9.3Y=1g;j(9.1f)9.1f=$3Q(9.1f);1b.U.1x.1i(9,\'3u\');9.V.3u=1K}.J(9);j(L.3X&&9.3W){9.1f=f(){j([\'3Y\',\'6d\'].15(L.3X))3v()}.2k(50)}Q j(L.3X&&9.3w){L.8f("<52 2Z=6e 8e 8d=8c:8b(0)><\\/52>");$(\'6e\').8a=f(){j(9.3X==\'6d\')3v()}}Q{9.1a("89",3v);L.1a("88",3v)}}}1b.U.1a.1i(9,q,O);h 9},87:f(6c){h 9.1a(\'3u\',6c)}});12.N({63:f(){j(9.3W||9.51)h 9.86;Q h L.2r.6b||L.4N.6b},62:f(){j(9.3W||9.51)h 9.85;h L.2r.6a||L.4N.6a},60:f(){h L.2r.69},61:f(){h L.2r.68},64:f(){h 9.67||L.2r.3V},65:f(){h 9.66||L.2r.3U},3P:f(){h{\'1V\':{\'x\':9.65(),\'y\':9.64()},\'2A\':{\'x\':9.63(),\'y\':9.62()},\'3O\':{\'x\':9.61(),\'y\':9.60()}}},2O:f(){h{\'x\':0,\'y\':0}}});k X={};X.1C=M 11({2j:f(){h{2K:11.1G,2g:11.1G,5T:11.1G,5Y:X.2Q.4U,4Z:84,1J:\'4I\',2T:1g,5U:50}},1e:f(m){9.r=9.r||1K;9.2N(9.2j(),m);j(9.m.1e)9.m.1e.1i(9)},19:f(){k 2Y=M 5W().5V();j(2Y<9.2Y+9.m.4Z){9.5X=2Y-9.2Y;9.2E();9.2o()}Q{9.1s(1g);9.P=9.B;9.2o();9.1x(\'2g\',9.r,10);9.5Z()}},1U:f(B){9.P=B;9.2o();h 9},2E:f(){9.P=9.2D(9.F,9.B)},2D:f(F,B){h 9.m.5Y(9.5X,F,(B-F),9.m.4Z)},1m:f(F,B){j(!9.m.2T)9.1s();Q j(9.1f)h 9;9.F=F;9.B=B;9.2Y=M 5W().5V();9.1f=9.19.2k(G.3e(83/9.m.5U),9);9.1x(\'2K\',9.r);h 9},1s:f(2h){j(!9.1f)h 9;9.1f=$3Q(9.1f);j(!2h)9.1x(\'5T\',9.r);h 9},82:f(F,B){h 9.1m(F,B)},81:f(2h){h 9.1s(2h)}});X.1C.1T(M 5S);X.1C.1T(M 3c);X.1C.1T(M 3b);X.2Q={5F:f(t,b,c,d){h c*t/d+b},4U:f(t,b,c,d){h-c/2*(G.4T(G.1X*t/d)-1)+b}};X.23={2U:f(n,B){j(n.15(\'1A\',\'i\'))h 9.2q;j(B.15&&B.15(\' \'))h 9.3T;h 9.5R},1M:f(l,n,2X){j(!2X.18)2X=[2X];k F=2X[0],B=2X[1];j(!B&&B!=0){B=F;F=l.1W(n)}k 17=9.2U(n,B);h{F:17.1M(F),B:17.1M(B),17:17}}};X.23.5R={1M:f(K){h 3t(K)},2V:f(F,B,2W){h 2W.2D(F,B)},2F:f(K,1J){h K+1J}};X.23.3T={1M:f(K){h K.18?K:K.4Y(\' \').4X(f(v){h 3t(v)})},2V:f(F,B,2W){k P=[];I(k i=0;i<F.14;i++)P[i]=2W.2D(F[i],B[i]);h P},2F:f(K,1J){h K.3r(1J+\' \')+1J}};X.23.2q={1M:f(K){h K.18?K:K.3s(1g)},2V:f(F,B,2W){k P=[];I(k i=0;i<F.14;i++)P[i]=G.3e(2W.2D(F[i],B[i]));h P},2F:f(K){h\'1l(\'+K.3r(\',\')+\')\'}};X.5Q=X.1C.N({1e:f(l,n,m){9.r=$(l);9.n=n;9.1t(m)},5I:f(){h 9.1U(0)},2E:f(){9.P=9.17.2V(9.F,9.B,9)},1U:f(B){9.17=X.23.2U(9.n,B);h 9.1t(9.17.1M(B))},1m:f(F,B){j(9.1f&&9.m.2T)h 9;k 1n=X.23.1M(9.r,9.n,[F,B]);9.17=1n.17;h 9.1t(1n.F,1n.B)},2o:f(){9.r.1F(9.n,9.17.2F(9.P,9.m.1J))}});1b.N({80:f(n,m){h M X.5Q(9,n,m)}});X.5P=X.1C.N({1e:f(l,m){9.r=$(l);9.1t(m)},2E:f(){I(k p W 9.F)9.P[p]=9.17[p].2V(9.F[p],9.B[p],9)},1U:f(B){k 1n={};9.17={};I(k p W B){9.17[p]=X.23.2U(p,B[p]);1n[p]=9.17[p].1M(B[p])}h 9.1t(1n)},1m:f(u){j(9.1f&&9.m.2T)h 9;9.P={};9.17={};k F={},B={};I(k p W u){k 1n=X.23.1M(9.r,p,u[p]);F[p]=1n.F;B[p]=1n.B;9.17[p]=1n.17}h 9.1t(F,B)},2o:f(){I(k p W 9.P)9.r.1F(p,9.17[p].2F(9.P[p],9.m.1J))}});1b.N({7Z:f(m){h M X.5P(9,m)}});X.1N=X.1C.N({1e:f(1w,m){9.1w=$$(1w);9.1t(m)},2E:f(){I(k i W 9.F){k 3q=9.F[i],2p=9.B[i],2b=9.17[i],3p=9.P[i]={};I(k p W 3q)3p[p]=2b[p].2V(3q[p],2p[p],9)}},1U:f(B){k 1n={};9.17={};I(k i W B){k 2p=B[i],2b=9.17[i]={},5O=1n[i]={};I(k p W 2p){2b[p]=X.23.2U(p,2p[p]);5O[p]=2b[p].1M(2p[p])}}h 9.1t(1n)},1m:f(u){j(9.1f&&9.m.2T)h 9;9.P={};9.17={};k F={},B={};I(k i W u){k 4W=u[i],3q=F[i]={},2p=B[i]={},2b=9.17[i]={};I(k p W 4W){k 1n=X.23.1M(9.1w[i],p,4W[p]);3q[p]=1n.F;2p[p]=1n.B;2b[p]=1n.17}}h 9.1t(F,B)},2o:f(){I(k i W 9.P){k 3p=9.P[i],2b=9.17[i];I(k p W 3p)9.1w[i].1F(p,2b[p].2F(3p[p],9.m.1J))}}});X.7Y=X.1C.N({1e:f(r,m){9.P=[];9.r=$(r);9.1a(\'2K\',f(){9.r.1a(\'2M\',9.1s.J(9,T))}.J(9));9.1E(\'2g\',f(){9.r.1E(\'2M\',9.1s.J(9,T))}.J(9));9.1t(m)},2E:f(){I(k i=0;i<2;i++)9.P[i]=9.2D(9.F[i],9.B[i])},2a:f(x,y){j(9.1f&&9.m.2T)h 9;k l=9.r.3P();k 1z={\'x\':x,\'y\':y};I(k z W l.2A){k 1B=l.3O[z]-l.2A[z];j($2B(1z[z]))1z[z]=($q(1z[z])==\'5N\')?G.1B(G.3o(1z[z],1B),0):1B;Q 1z[z]=l.1V[z]}h 9.1m([l.1V.x,l.1V.y],[1z.x,1z.y])},7X:f(){h 9.2a(T,0)},7W:f(){h 9.2a(T,\'5M\')},7V:f(){h 9.2a(0,T)},7U:f(){h 9.2a(\'5M\',T)},5L:f(l){h 9.2a($(l).4F(),$(l).4D())},2o:f(){9.r.2a(9.P[0],9.P[1])}});X.7T=X.1C.N({1e:f(l,m){9.r=$(l).1F(\'2n\',0);9.2R=M 1b(\'7S\').5K(9.r).1F(\'7R\',\'3S\').5J(9.r);9.2N({\'1k\':\'4E\'},m);9.P=[];9.1t(9.m)},2E:f(){I(k i=0;i<2;i++)9.P[i]=9.2D(9.F[i],9.B[i])},4E:f(){9.2n=\'2w\';9.4V=\'3i\';9.2S=9.r.2v;h[9.r.1W(\'2n-2w\').2C(),9.2R.1W(\'3i\').2C()]},4G:f(){9.2n=\'2i\';9.4V=\'3j\';9.2S=9.r.2x;h[9.r.1W(\'2n-2i\').2C(),9.2R.1W(\'3j\').2C()]},5H:f(1k){h 9.1m(9[1k||9.m.1k](),[0,9.2S])},5G:f(1k){h 9.1m(9[1k||9.m.1k](),[-9.2S,0])},5I:f(1k){9[1k||9.m.1k]();h 9.1U([-9.2S,0])},7Q:f(1k){9[1k||9.m.1k]();h 9.1U([0,9.2S])},7P:f(1k){j(9.2R.2v==0||9.2R.2x==0)h 9.5H(1k);Q h 9.5G(1k)},2o:f(){9.r.1F(\'2n-\'+9.2n,9.P[0]+9.m.1J);9.2R.1F(9.4V,9.P[1]+9.m.1J)}});X.2Q={5F:f(t,b,c,d){h c*t/d+b},7O:f(t,b,c,d){h c*(t/=d)*t+b},7N:f(t,b,c,d){h-c*(t/=d)*(t-2)+b},7M:f(t,b,c,d){j((t/=d/2)<1)h c/2*t*t+b;h-c/2*((--t)*(t-2)-1)+b},7L:f(t,b,c,d){h c*(t/=d)*t*t+b},7K:f(t,b,c,d){h c*((t=t/d-1)*t*t+1)+b},7J:f(t,b,c,d){j((t/=d/2)<1)h c/2*t*t*t+b;h c/2*((t-=2)*t*t+2)+b},7I:f(t,b,c,d){h c*(t/=d)*t*t*t+b},7H:f(t,b,c,d){h-c*((t=t/d-1)*t*t*t-1)+b},7G:f(t,b,c,d){j((t/=d/2)<1)h c/2*t*t*t*t+b;h-c/2*((t-=2)*t*t*t-2)+b},7F:f(t,b,c,d){h c*(t/=d)*t*t*t*t+b},7E:f(t,b,c,d){h c*((t=t/d-1)*t*t*t*t+1)+b},7D:f(t,b,c,d){j((t/=d/2)<1)h c/2*t*t*t*t*t+b;h c/2*((t-=2)*t*t*t*t+2)+b},7C:f(t,b,c,d){h-c*G.4T(t/d*(G.1X/2))+c+b},7B:f(t,b,c,d){h c*G.3n(t/d*(G.1X/2))+b},4U:f(t,b,c,d){h-c/2*(G.4T(G.1X*t/d)-1)+b},7A:f(t,b,c,d){h(t==0)?b:c*G.22(2,10*(t/d-1))+b},7z:f(t,b,c,d){h(t==d)?b+c:c*(-G.22(2,-10*t/d)+1)+b},7y:f(t,b,c,d){j(t==0)h b;j(t==d)h b+c;j((t/=d/2)<1)h c/2*G.22(2,10*(t-1))+b;h c/2*(-G.22(2,-10*--t)+2)+b},7x:f(t,b,c,d){h-c*(G.3m(1-(t/=d)*t)-1)+b},7w:f(t,b,c,d){h c*G.3m(1-(t=t/d-1)*t)+b},7v:f(t,b,c,d){j((t/=d/2)<1)h-c/2*(G.3m(1-t*t)-1)+b;h c/2*(G.3m(1-(t-=2)*t)+1)+b},7u:f(t,b,c,d,a,p){j(t==0)h b;j((t/=d)==1)h b+c;j(!p)p=d*.3;j(!a)a=1;j(a<G.4S(c)){a=c;k s=p/4}Q k s=p/(2*G.1X)*G.4R(c/a);h-(a*G.22(2,10*(t-=1))*G.3n((t*d-s)*(2*G.1X)/p))+b},7t:f(t,b,c,d,a,p){j(t==0)h b;j((t/=d)==1)h b+c;j(!p)p=d*.3;j(!a)a=1;j(a<G.4S(c)){a=c;k s=p/4}Q k s=p/(2*G.1X)*G.4R(c/a);h a*G.22(2,-10*t)*G.3n((t*d-s)*(2*G.1X)/p)+c+b},7s:f(t,b,c,d,a,p){j(t==0)h b;j((t/=d/2)==2)h b+c;j(!p)p=d*(.3*1.5);j(!a)a=1;j(a<G.4S(c)){a=c;k s=p/4}Q k s=p/(2*G.1X)*G.4R(c/a);j(t<1)h-.5*(a*G.22(2,10*(t-=1))*G.3n((t*d-s)*(2*G.1X)/p))+b;h a*G.22(2,-10*(t-=1))*G.3n((t*d-s)*(2*G.1X)/p)*.5+c+b},7r:f(t,b,c,d,s){j(!s)s=1.4Q;h c*(t/=d)*t*((s+1)*t-s)+b},7q:f(t,b,c,d,s){j(!s)s=1.4Q;h c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},7p:f(t,b,c,d,s){j(!s)s=1.4Q;j((t/=d/2)<1)h c/2*(t*t*(((s*=(1.5E))+1)*t-s))+b;h c/2*((t-=2)*t*(((s*=(1.5E))+1)*t+s)+2)+b},5D:f(t,b,c,d){h c-X.2Q.4P(d-t,0,c,d)+b},4P:f(t,b,c,d){j((t/=d)<(1/2.75)){h c*(7.3R*t*t)+b}Q j(t<(2/2.75)){h c*(7.3R*(t-=(1.5/2.75))*t+.75)+b}Q j(t<(2.5/2.75)){h c*(7.3R*(t-=(2.25/2.75))*t+.7o)+b}Q{h c*(7.3R*(t-=(2.7n/2.75))*t+.7m)+b}},7l:f(t,b,c,d){j(t<d/2)h X.2Q.5D(t*2,0,c,d)*.5+b;h X.2Q.4P(t*2-d,0,c,d)*.5+c*.5+b}};k 2L={};2L.1C=M 11({2j:f(){h{3k:T,1J:\'4I\',2K:11.1G,2g:11.1G,5B:11.1G,4A:11.1G,1j:T,2u:{x:\'2i\',y:\'2w\'},3N:6}},1e:f(l,m){9.2N(9.2j(),m);9.r=$(l);9.3k=$(9.m.3k)||9.r;9.2l={\'P\':{},\'1D\':{}};9.K={\'1m\':{},\'P\':{}};9.1I={\'1m\':9.1m.2y(9)};9.3k.1a(\'4H\',9.1I.1m);j(9.m.1e)9.m.1e.1i(9)},1m:f(o){9.2l.1m=o.1y;k 1j=9.m.1j;9.1j={\'x\':[],\'y\':[]};I(k z W 9.m.2u){9.K.P[z]=9.r.1W(9.m.2u[z]).2C();9.2l.1D[z]=o.1y[z]-9.K.P[z];j(1j&&1j[z]){I(k i=0;i<2;i++){j($2B(1j[z][i]))9.1j[z][i]=1j[z][i].2m?1j[z][i].1i(9):1j[z][i]}}}9.1I.29=9.29.2y(9);9.1I.3l=9.3l.2y(9);9.1I.1s=9.1s.J(9);L.1a(\'2P\',9.m.3N?9.1I.3l:9.1I.29);L.1a(\'5A\',9.1I.1s);9.1x(\'2K\',9.r);o.1s()},3l:f(o){k 5C=G.3e(G.3m(G.22(o.1y.x-9.2l.1m.x,2)+G.22(o.1y.y-9.2l.1m.y,2)));j(5C>9.m.3N){L.1E(\'2P\',9.1I.3l);L.1a(\'2P\',9.1I.29);9.29(o);9.1x(\'5B\',9.r)}o.1s()},29:f(o){9.4O=T;9.2l.P=o.1y;I(k z W 9.m.2u){9.K.P[z]=o.1y[z]-9.2l.1D[z];j(9.1j[z]){j($2B(9.1j[z][1])&&(9.K.P[z]>9.1j[z][1])){9.K.P[z]=9.1j[z][1];9.4O=1g}Q j($2B(9.1j[z][0])&&(9.K.P[z]<9.1j[z][0])){9.K.P[z]=9.1j[z][0];9.4O=1g}}9.r.1F(9.m.2u[z],9.K.P[z]+9.m.1J)}9.1x(\'4A\',9.r);o.1s()},7k:f(){9.3k.1E(\'4H\',9.1I.1m)},1s:f(){L.1E(\'2P\',9.1I.29);L.1E(\'5A\',9.1I.1s);9.1x(\'2g\',9.r)}});2L.1C.1T(M 3c);2L.1C.1T(M 3b);1b.N({7j:f(m){h M 2L.1C(9,1H.N(m||{},{2u:{x:\'3j\',y:\'3i\'}}))}});k 4J=M 11({2j:f(){h{3h:20,4K:1,3K:f(x,y){9.r.2a(x,y)}}},1e:f(r,m){9.2N(9.2j(),m);9.r=$(r);9.4M=([12,L].15(r))?$(L.4N):9.r},1m:f(){9.4L=9.5z.2y(9);9.4M.1a(\'2P\',9.4L)},1s:f(){9.4M.1E(\'2P\',9.4L);9.1f=$3Q(9.1f)},5z:f(o){9.1y=(9.r==12)?o.5y:o.1y;j(!9.1f)9.1f=9.1V.2k(50,9)},1V:f(){k l=9.r.3P();k 1D=9.r.2O();k 2z={\'x\':0,\'y\':0};I(k z W 9.1y){j(9.1y[z]<(9.m.3h+1D[z])&&l.1V[z]!=0)2z[z]=(9.1y[z]-9.m.3h-1D[z])*9.m.4K;Q j(9.1y[z]+9.m.3h>(l.2A[z]+1D[z])&&l.1V[z]+l.2A[z]!=l.3O[z])2z[z]=(9.1y[z]-l.2A[z]+9.m.3h-1D[z])*9.m.4K}j(2z.y||2z.x)9.1x(\'3K\',[l.1V.x+2z.x,l.1V.y+2z.y])}});4J.1T(M 3c);4J.1T(M 3b);k 4t=M 11({2j:f(){h{3K:11.1G,2g:11.1G,4x:f(1D){9.21.1F(9.p,1D+\'4I\')},3d:3g,1k:\'4G\',3f:T}},1e:f(l,21,m){9.r=$(l);9.21=$(21);9.2N(9.2j(),m);9.4w=-1;9.4v=-1;9.19=-1;9.r.1a(\'4H\',9.5w.2y(9));j(9.m.3f)9.r.1a(\'2M\',9.5x.2y(9));j(9.m.1k==\'4G\'){9.z=\'x\';9.p=\'2i\';9.1B=9.r.2x-9.21.2x;9.4y=9.21.2x/2;9.4z=9.r.4F.J(9.r)}Q j(9.m.1k==\'4E\'){9.z=\'y\';9.p=\'2w\';9.1B=9.r.2v-9.21.2v;9.4y=9.21.2v/2;9.4z=9.r.4D.J(9.r)}9.21.1F(\'1Z\',\'7i\').1F(9.p,0);k 4B={},4C={};4C[9.z]=[0,9.1B];4B[9.z]=9.p;9.29=M 2L.1C(9.21,{1j:4C,3N:0,2u:4B,2K:f(){9.3M()}.J(9),4A:f(){9.3M()}.J(9),2g:f(){9.3M();9.2h()}.J(9)});j(9.m.1e)9.m.1e.1i(9)},1U:f(19){j(19>9.m.3d)19=9.m.3d;Q j(19<0)19=0;9.19=19;9.3L();9.2h();9.1x(\'4x\',9.5v(9.19)+\'\');h 9},5x:f(o){j(o.3f<0)9.1U(9.19+1);Q j(o.3f>0)9.1U(9.19-1);o.1s()},5w:f(o){k 1Z=o.1y[9.z]-9.4z()-9.4y;j(1Z>9.1B)1Z=9.1B;Q j(1Z<0)1Z=0;9.19=9.4u(1Z);9.3L();9.2h();9.1x(\'4x\',1Z+\'\')},3M:f(){9.19=9.4u(9.29.K.P[9.z]);9.3L()},3L:f(){j(9.4w!=9.19){9.4w=9.19;9.1x(\'3K\',9.19)}},2h:f(){j(9.4v!==9.19){9.4v=9.19;9.1x(\'2g\',9.19+\'\')}},4u:f(1Z){h G.3e(1Z/9.1B*9.m.3d)},5v:f(19){h(9.1B)*19/9.m.3d}});4t.1T(M 3c);4t.1T(M 3b);',62,619,'|||||||||this||||||function||return||if|var|el|options|property|event||type|element|||obj|||||||to||||from|Math||for|bind|value|document|new|extend|fn|now|else|args||false|prototype|events|in|Fx|arguments|||Class|window||length|test||css|push|step|addEvent|Element|case|className|initialize|timer|true|style|call|limit|mode|rgb|start|parsed|each|found|param|Array|stop|parent|keys|selector|elements|fireEvent|page|values|color|max|Base|pos|removeEvent|setStyle|empty|Object|bound|unit|null|source|parse|Elements|key|break|filters|array|properties|implement|set|scroll|getStyle|PI|opacity|position||knob|pow|CSS|name||parentNode||match|drag|scrollTo|iCss|switch|delay|create|current|onComplete|end|left|getOptions|periodical|mouse|apply|margin|increase|iTo|Color|documentElement|previous|returns|modifiers|offsetHeight|top|offsetWidth|bindWithEvent|change|size|chk|toInt|compute|setNow|getValue|getElementsBySelector|chains|HTMLElement|hex|onStart|Drag|mousewheel|setOptions|getOffsets|mousemove|Transitions|wrapper|offset|wait|select|getNow|fx|fromTo|time|id|att|Garbage||text|while|replace|newArray||||item|Options|Events|steps|round|wheel|100|area|height|width|handle|checkAndDrag|sqrt|sin|min|iNow|iFrom|join|hexToRgb|parseFloat|domready|domReady|ie|alpha|colors|undefined|hasClass|getElements|getTag|filter|option|Event|toLowerCase|target|rgbToHex|items|onChange|checkStep|draggedKnob|snap|scrollSize|getSize|clear|5625|hidden|Multi|scrollLeft|scrollTop|khtml|readyState|loaded|remove||tagName|getElement|sel|getElementById|clean||splice|preventDefault|stopPropagation|relatedTarget|offsetTop|offsetLeft|setProperty|attribute|whitespace|indexOf|currentStyle|visibility|string|appendChild|inject|instanceof|ms|attempt|bit|forEach|pr0t0typ3|klass|Slider|toStep|previousEnd|previousChange|onTick|half|getPos|onDrag|modSlide|limSlide|getTop|vertical|getLeft|horizontal|mousedown|px|Scroller|velocity|coord|mousemover|body|out|bounceOut|70158|asin|abs|cos|sineInOut|layout|iProps|map|split|duration||opera|script|ie6|copy|operator|getElementsByTagName|els|on|Function|right|pageY|pageX|code|String|DOMMouseScroll|trash|removeEvents|offs|getBrother|getNext|what|gecko|camelCase|object|Native|result|typeof|parseInt|charAt|results|toPosition|clickedElement|scrolledElement|client|getCoords|mouseup|onSnap|distance|bounceIn|525|linear|slideOut|slideIn|hide|adopt|injectAfter|toElement|full|number|iParsed|Styles|Style|Single|Chain|onCancel|fps|getTime|Date|cTime|transition|callChain|getScrollHeight|getScrollWidth|getHeight|getWidth|getScrollTop|getScrollLeft|pageXOffset|pageYOffset|scrollWidth|scrollHeight|clientHeight|clientWidth|init|complete|ie_ready|catch|try|invert|mix|Hash|getAttribute|filterByAttribute|filterByTagName|filterByClassName|filterById|w_|defaults|which|clientY|clientX|special|120|wheelDelta|nodeType|unload|collect|selectedIndex|bottom|class|html|setAttribute|default|replaceWith|createElement|setStyles|childNodes|Sibling|evType|removeEventListener|addEventListener|hyphenate|defaultView|visible|setOpacity|cssText|addClass|removeClass|contents|inside|after|before|insertBefore|where|_elements_extended_|_element_extended_|err|toFloat||Number|trim|toUpperCase|params|regex|iterable|some|every|random|picked|parentize|noinit|relative|makeResizable|detach|bounceInOut|984375|625|9375|backInOut|backOut|backIn|elasticInOut|elasticOut|elasticIn|circInOut|circOut|circIn|expoInOut|expoOut|expoIn|sineOut|sineIn|quintInOut|quintOut|quintIn|quartInOut|quartOut|quartIn|cubicInOut|cubicOut|cubicIn|quadInOut|quadOut|quadIn|toggle|show|overflow|div|Slide|toRight|toLeft|toBottom|toTop|Scroll|effects|effect|clearTimer|custom|1000|500|innerHeight|innerWidth|onDomReady|DOMContentLoaded|load|onreadystatechange|void|javascript|src|defer|write|BackgroundImageCache|execCommand|disableImageCache|255|pop|get|tag|getElementsByClassName|ES|clearChain|chain|delete|backspace|space|esc|down|up|enter|returnValue|cancelBubble|mouseout|fromElement|mouseover|button|rightClick|click|fromCharCode|keyCode|detail|metaKey|meta|altKey|alt|ctrlKey|control|shiftKey|shift|srcElement|Window|textarea|password|radio|checkbox|checked|input|getPosition|offsetParent|do|getProperty|innerHTML|setHTML|setProperties|attributes|getChildren|getParent|previousSibling|lastChild|getLast|nextSibling|firstChild|getFirst|next|getPrevious|detachEvent|addEvents|attachEvent|getPropertyValue|getComputedStyle|padding|zoom|hasLayout|toggleClass|createTextNode|styleSheet|appendText|replaceChild|cloneNode|clone|removeChild|injectInside|injectBefore|embed|bindAsEventListener|pass|finally|setInterval|setTimeout|concat|toString|transparent|capitalize|RegExp|associate|getBoxObjectFor|taintEnabled|navigator|all|ie7|XMLHttpRequest|ActiveXObject|clearInterval|clearTimeout|floor|pick|textnode|nodeValue|nodeName'.split('|'),0,{}))
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js
new file mode 100644
index 0000000..d0ef7e8
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js
@@ -0,0 +1,4078 @@
+/*
+Script: Moo.js
+ My Object Oriented javascript.
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+
+Credits:
+ - Class is slightly based on Base.js <http://dean.edwards.name/weblog/2006/03/base/> (c) 2006 Dean Edwards, License <http://creativecommons.org/licenses/LGPL/2.1/>
+ - Some functions are based on those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
+ - Documentation by Aaron Newton (aaron.newton [at] cnet [dot] com) and Valerio Proietti.
+*/
+
+/*
+Class: Class
+ The base class object of the <http://mootools.net> framework.
+
+Arguments:
+ properties - the collection of properties that apply to the class. Creates a new class, its initialize method will fire upon class instantiation.
+
+Example:
+ (start code)
+ var Cat = new Class({
+ initialize: function(name){
+ this.name = name;
+ }
+ });
+ var myCat = new Cat('Micia');
+ alert myCat.name; //alerts 'Micia'
+ (end)
+*/
+
+var Class = function(properties){
+ var klass = function(){
+ if (this.initialize && arguments[0] != 'noinit') return this.initialize.apply(this, arguments);
+ else return this;
+ };
+ for (var property in this) klass[property] = this[property];
+ klass.prototype = properties;
+ return klass;
+};
+
+/*
+Property: empty
+ Returns an empty function
+*/
+
+Class.empty = function(){};
+
+Class.prototype = {
+
+ /*
+ Property: extend
+ Returns the copy of the Class extended with the passed in properties.
+
+ Arguments:
+ properties - the properties to add to the base class in this new Class.
+
+ Example:
+ (start code)
+ var Animal = new Class({
+ initialize: function(age){
+ this.age = age;
+ }
+ });
+ var Cat = Animal.extend({
+ initialize: function(name, age){
+ this.parent(age); //will call the previous initialize;
+ this.name = name;
+ }
+ });
+ var myCat = new Cat('Micia', 20);
+ alert myCat.name; //alerts 'Micia'
+ alert myCat.age; //alerts 20
+ (end)
+ */
+
+ extend: function(properties){
+ var pr0t0typ3 = new this('noinit');
+
+ var parentize = function(previous, current){
+ if (!previous.apply || !current.apply) return false;
+ return function(){
+ this.parent = previous;
+ return current.apply(this, arguments);
+ };
+ };
+
+ for (var property in properties){
+ var previous = pr0t0typ3[property];
+ var current = properties[property];
+ if (previous && previous != current) current = parentize(previous, current) || current;
+ pr0t0typ3[property] = current;
+ }
+ return new Class(pr0t0typ3);
+ },
+
+ /*
+ Property: implement
+ Implements the passed in properties to the base Class prototypes, altering the base class, unlike <Class.extend>.
+
+ Arguments:
+ properties - the properties to add to the base class.
+
+ Example:
+ (start code)
+ var Animal = new Class({
+ initialize: function(age){
+ this.age = age;
+ }
+ });
+ Animal.implement({
+ setName: function(name){
+ this.name = name
+ }
+ });
+ var myAnimal = new Animal(20);
+ myAnimal.setName('Micia');
+ alert(myAnimal.name); //alerts 'Micia'
+ (end)
+ */
+
+ implement: function(properties){
+ for (var property in properties) this.prototype[property] = properties[property];
+ }
+
+};
+
+/* Section: Object related Functions */
+
+/*
+Function: Object.extend
+ Copies all the properties from the second passed object to the first passed Object.
+ If you do myWhatever.extend = Object.extend the first parameter will become myWhatever, and your extend function will only need one parameter.
+
+Example:
+ (start code)
+ var firstOb = {
+ 'name': 'John',
+ 'lastName': 'Doe'
+ };
+ var secondOb = {
+ 'age': '20',
+ 'sex': 'male',
+ 'lastName': 'Dorian'
+ };
+ Object.extend(firstOb, secondOb);
+ //firstOb will become:
+ {
+ 'name': 'John',
+ 'lastName': 'Dorian',
+ 'age': '20',
+ 'sex': 'male'
+ };
+ (end)
+
+Returns:
+ The first object, extended.
+*/
+
+Object.extend = function(){
+ var args = arguments;
+ args = (args[1]) ? [args[0], args[1]] : [this, args[0]];
+ for (var property in args[1]) args[0][property] = args[1][property];
+ return args[0];
+};
+
+/*
+Function: Object.Native
+ Will add a .extend method to the objects passed as a parameter, equivalent to <Class.implement>
+
+Arguments:
+ a number of classes/native javascript objects
+
+*/
+
+Object.Native = function(){
+ for (var i = 0; i < arguments.length; i++) arguments[i].extend = Class.prototype.implement;
+};
+
+new Object.Native(Function, Array, String, Number, Class);
+
+/*
+Script: Utility.js
+ Contains Utility functions
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+//htmlelement mapping
+
+if (typeof HTMLElement == 'undefined'){
+ var HTMLElement = Class.empty;
+ HTMLElement.prototype = {};
+}
+
+/*
+Function: $type
+ Returns the type of object that matches the element passed in.
+
+Arguments:
+ obj - the object to inspect.
+
+Example:
+ >var myString = 'hello';
+ >$type(myString); //returns "string"
+
+Returns:
+ 'element' - if obj is a DOM element node
+ 'textnode' - if obj is a DOM text node
+ 'whitespace' - if obj is a DOM whitespace node
+ 'array' - if obj is an array
+ 'object' - if obj is an object
+ 'string' - if obj is a string
+ 'number' - if obj is a number
+ 'boolean' - if obj is a boolean
+ 'function' - if obj is a function
+ false - (boolean) if the object is not defined or none of the above.
+*/
+
+function $type(obj){
+ if (obj === null || obj === undefined) return false;
+ var type = typeof obj;
+ if (type == 'object'){
+ if (obj instanceof HTMLElement) return 'element';
+ if (obj instanceof Array) return 'array';
+ if (obj.nodeName){
+ switch (obj.nodeType){
+ case 1: return 'element';
+ case 3: return obj.nodeValue.test('\\S') ? 'textnode' : 'whitespace';
+ }
+ }
+ }
+ return type;
+};
+
+/*
+Function: $chk
+ Returns true if the passed in value/object exists or is 0, otherwise returns false.
+ Useful to accept zeroes.
+*/
+
+function $chk(obj){
+ return !!(obj || obj === 0);
+};
+
+/*
+Function: $pick
+ Returns the first object if defined, otherwise returns the second.
+*/
+
+function $pick(obj, picked){
+ return ($type(obj)) ? obj : picked;
+};
+
+/*
+Function: $random
+ Returns a random integer number between the two passed in values.
+
+Arguments:
+ min - integer, the minimum value (inclusive).
+ max - integer, the maximum value (inclusive).
+
+Returns:
+ a random integer between min and max.
+*/
+
+function $random(min, max){
+ return Math.floor(Math.random() * (max - min + 1) + min);
+};
+
+/*
+Function: $clear
+ clears a timeout or an Interval.
+
+Returns:
+ null
+
+Arguments:
+ timer - the setInterval or setTimeout to clear.
+
+Example:
+ >var myTimer = myFunction.delay(5000); //wait 5 seconds and execute my function.
+ >myTimer = $clear(myTimer); //nevermind
+
+See also:
+ <Function.delay>, <Function.periodical>
+*/
+
+function $clear(timer){
+ clearTimeout(timer);
+ clearInterval(timer);
+ return null;
+};
+
+/* Section: Browser Detection */
+
+/*
+Properties:
+ window.ie - will be set to true if the current browser is internet explorer (any).
+ window.ie6 - will be set to true if the current browser is internet explorer 6.
+ window.ie7 - will be set to true if the current browser is internet explorer 7.
+ window.khtml - will be set to true if the current browser is Safari/Konqueror.
+ window.gecko - will be set to true if the current browser is Mozilla/Gecko.
+*/
+
+if (window.ActiveXObject) window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;
+else if (document.childNodes && !document.all && !navigator.taintEnabled) window.khtml = true;
+else if (document.getBoxObjectFor != null) window.gecko = true;
+
+/*
+Script: Array.js
+ Contains Array prototypes and the function <$A>;
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Array
+ A collection of The Array Object prototype methods.
+*/
+
+//emulated methods
+
+/*
+Property: forEach
+ Iterates through an array; This method is only available for browsers without native *forEach* support.
+ For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach>
+*/
+
+Array.prototype.forEach = Array.prototype.forEach || function(fn, bind){
+ for (var i = 0; i < this.length; i++) fn.call(bind, this[i], i, this);
+};
+
+/*
+Property: map
+ This method is provided only for browsers without native *map* support.
+ For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map>
+*/
+
+Array.prototype.map = Array.prototype.map || function(fn, bind){
+ var results = [];
+ for (var i = 0; i < this.length; i++) results[i] = fn.call(bind, this[i], i, this);
+ return results;
+};
+
+/*
+Property: every
+ This method is provided only for browsers without native *every* support.
+ For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
+*/
+
+Array.prototype.every = Array.prototype.every || function(fn, bind){
+ for (var i = 0; i < this.length; i++){
+ if (!fn.call(bind, this[i], i, this)) return false;
+ }
+ return true;
+};
+
+/*
+Property: some
+ This method is provided only for browsers without native *some* support.
+ For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some>
+*/
+
+Array.prototype.some = Array.prototype.some || function(fn, bind){
+ for (var i = 0; i < this.length; i++){
+ if (fn.call(bind, this[i], i, this)) return true;
+ }
+ return false;
+};
+
+/*
+Property: indexOf
+ This method is provided only for browsers without native *indexOf* support.
+ For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
+*/
+
+Array.prototype.indexOf = Array.prototype.indexOf || function(item, from){
+ from = from || 0;
+ if (from < 0) from = Math.max(0, this.length + from);
+ while (from < this.length){
+ if(this[from] === item) return from;
+ from++;
+ }
+ return -1;
+};
+
+//custom methods
+
+Array.extend({
+
+ /*
+ Property: each
+ Same as <Array.forEach>.
+
+ Arguments:
+ fn - the function to execute with each item in the array
+ bind - optional, the object that the "this" of the function will refer to.
+
+ Example:
+ >var Animals = ['Cat', 'Dog', 'Coala'];
+ >Animals.forEach(function(animal){
+ > document.write(animal)
+ >});
+ */
+
+ each: Array.prototype.forEach,
+
+ /*
+ Property: copy
+ Copy the array and returns it.
+
+ Returns:
+ an Array
+
+ Example:
+ >var letters = ["a","b","c"];
+ >var copy = ["a","b","c"].copy();
+ */
+
+ copy: function(){
+ var newArray = [];
+ for (var i = 0; i < this.length; i++) newArray[i] = this[i];
+ return newArray;
+ },
+
+ /*
+ Property: remove
+ Removes all occurrences of an item from the array.
+
+ Arguments:
+ item - the item to remove
+
+ Returns:
+ the Array with all occurrences of the item removed.
+
+ Example:
+ >["1","2","3","2"].remove("2") // ["1","3"];
+ */
+
+ remove: function(item){
+ var i = 0;
+ while (i < this.length){
+ if (this[i] == item) this.splice(i, 1);
+ else i++;
+ }
+ return this;
+ },
+
+ /*
+ Property: test
+ Tests an array for the presence of an item.
+
+ Arguments:
+ item - the item to search for in the array.
+ from - optional, the index at which to begin the search, default is 0. If negative, it is taken as the offset from the end of the array.
+
+ Returns:
+ true - the item was found
+ false - it wasn't
+
+ Example:
+ >["a","b","c"].test("a"); // true
+ >["a","b","c"].test("d"); // false
+ */
+
+ test: function(item, from){
+ return this.indexOf(item, from) != -1;
+ },
+
+ /*
+ Property: extend
+ Extends an array with another
+
+ Arguments:
+ newArray - the array to extend ours with
+
+ Example:
+ >var Animals = ['Cat', 'Dog', 'Coala'];
+ >Animals.extend(['Lizard']);
+ >//Animals is now: ['Cat', 'Dog', 'Coala', 'Lizard'];
+ */
+
+ extend: function(newArray){
+ for (var i = 0; i < newArray.length; i++) this.push(newArray[i]);
+ return this;
+ },
+
+ /*
+ Property: associate
+ Creates an object with key-value pairs based on the array of keywords passed in
+ and the current content of the array.
+
+ Arguments:
+ keys - the array of keywords.
+
+ Example:
+ (start code)
+ var Animals = ['Cat', 'Dog', 'Coala', 'Lizard'];
+ var Speech = ['Miao', 'Bau', 'Fruuu', 'Mute'];
+ var Speeches = Animals.associate(speech);
+ //Speeches['Miao'] is now Cat.
+ //Speeches['Bau'] is now Dog.
+ //...
+ (end)
+ */
+
+ associate: function(keys){
+ var obj = {}, length = Math.min(this.length, keys.length);
+ for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
+ return obj;
+ }
+
+});
+
+/* Section: Utility Functions */
+
+/*
+Function: $A()
+ Same as <Array.copy>, but as function.
+ Useful to apply Array prototypes to iterable objects, as a collection of DOM elements or the arguments object.
+
+Example:
+ (start code)
+ function myFunction(){
+ $A(arguments).each(argument, function(){
+ alert(argument);
+ });
+ };
+ //the above will alert all the arguments passed to the function myFunction.
+ (end)
+*/
+
+function $A(array){
+ return Array.prototype.copy.call(array);
+};
+
+/*
+Function: $each
+ use to iterate through iterables that are not regular arrays, such as builtin getElementsByTagName calls, or arguments of a function.
+
+Arguments:
+ iterable - an iterable element.
+ function - function to apply to the iterable.
+ bind - optional, the 'this' of the function will refer to this object.
+*/
+
+function $each(iterable, fn, bind){
+ return Array.prototype.forEach.call(iterable, fn, bind);
+};
+
+/*
+Script: String.js
+ Contains String prototypes and Number prototypes.
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: String
+ A collection of The String Object prototype methods.
+*/
+
+String.extend({
+
+ /*
+ Property: test
+ Tests a string with a regular expression.
+
+ Arguments:
+ regex - the regular expression you want to match the string with
+ params - optional, any parameters you want to pass to the regex ('g' has no effect)
+
+ Returns:
+ true if a match for the regular expression is found in the string, false if not.
+ See <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:RegExp:test>
+
+ Example:
+ >"I like cookies".test("cookie"); // returns true
+ >"I like cookies".test("COOKIE", "i") // ignore case, returns true
+ >"I like cookies".test("cake"); // returns false
+ */
+
+ test: function(regex, params){
+ return new RegExp(regex, params).test(this);
+ },
+
+ /*
+ Property: toInt
+ parses a string to an integer.
+
+ Returns:
+ either an int or "NaN" if the string is not a number.
+
+ Example:
+ >var value = "10px".toInt(); // value is 10
+ */
+
+ toInt: function(){
+ return parseInt(this);
+ },
+
+ toFloat: function(){
+ return parseFloat(this);
+ },
+
+ /*
+ Property: camelCase
+ Converts a hiphenated string to a camelcase string.
+
+ Example:
+ >"I-like-cookies".camelCase(); //"ILikeCookies"
+
+ Returns:
+ the camel cased string
+ */
+
+ camelCase: function(){
+ return this.replace(/-\D/g, function(match){
+ return match.charAt(1).toUpperCase();
+ });
+ },
+
+ /*
+ Property: hyphenate
+ Converts a camelCased string to a hyphen-ated string.
+
+ Example:
+ >"ILikeCookies".hyphenate(); //"I-like-cookies"
+ */
+
+ hyphenate: function(){
+ return this.replace(/\w[A-Z]/g, function(match){
+ return (match.charAt(0)+'-'+match.charAt(1).toLowerCase());
+ });
+ },
+
+ /*
+ Property: capitalize
+ Converts the first letter in each word of a string to Uppercase.
+
+ Example:
+ >"i like cookies".capitalize(); //"I Like Cookies"
+
+ Returns:
+ the capitalized string
+ */
+
+ capitalize: function(){
+ return this.toLowerCase().replace(/\b[a-z]/g, function(match){
+ return match.toUpperCase();
+ });
+ },
+
+ /*
+ Property: trim
+ Trims the leading and trailing spaces off a string.
+
+ Example:
+ >" i like cookies ".trim() //"i like cookies"
+
+ Returns:
+ the trimmed string
+ */
+
+ trim: function(){
+ return this.replace(/^\s+|\s+$/g, '');
+ },
+
+ /*
+ Property: clean
+ trims (<String.trim>) a string AND removes all the double spaces in a string.
+
+ Returns:
+ the cleaned string
+
+ Example:
+ >" i like cookies \n\n".clean() //"i like cookies"
+ */
+
+ clean: function(){
+ return this.replace(/\s{2,}/g, ' ').trim();
+ },
+
+ /*
+ Property: rgbToHex
+ Converts an RGB value to hexidecimal. The string must be in the format of "rgb(255, 255, 255)" or "rgba(255, 255, 255, 1)";
+
+ Arguments:
+ array - boolean value, defaults to false. Use true if you want the array ['FF', '33', '00'] as output instead of #FF3300
+
+ Returns:
+ hex string or array. returns transparent if the fourth value of rgba in input string is 0,
+
+ Example:
+ >"rgb(17,34,51)".rgbToHex(); //"#112233"
+ >"rgba(17,34,51,0)".rgbToHex(); //"transparent"
+ >"rgb(17,34,51)".rgbToHex(true); //[11,22,33]
+ */
+
+ rgbToHex: function(array){
+ var rgb = this.match(/\d{1,3}/g);
+ return (rgb) ? rgb.rgbToHex(array) : false;
+ },
+
+ /*
+ Property: hexToRgb
+ Converts a hexidecimal color value to RGB. Input string must be the hex color value (with or without the hash). Also accepts triplets ('333');
+
+ Arguments:
+ array - boolean value, defaults to false. Use true if you want the array ['255', '255', '255'] as output instead of "rgb(255,255,255)";
+
+ Returns:
+ rgb string or array.
+
+ Example:
+ >"#112233".hexToRgb(); //"rgb(17,34,51)"
+ >"#112233".hexToRgb(true); //[17,34,51]
+ */
+
+ hexToRgb: function(array){
+ var hex = this.match('^#?(\\w{1,2})(\\w{1,2})(\\w{1,2})$');
+ return (hex) ? hex.hexToRgb(array) : false;
+ }
+
+});
+
+Array.extend({
+
+ rgbToHex: function(array){
+ if (this.length < 3) return false;
+ if (this[3] && this[3] == 0) return 'transparent';
+ var hex = [];
+ for (var i = 0; i < 3; i++){
+ var bit = (this[i]-0).toString(16);
+ hex.push(bit.length == 1 ? '0'+bit : bit);
+ }
+ return array ? hex : '#'+hex.join('');
+ },
+
+ hexToRgb: function(array){
+ if (this.length != 4) return false;
+ var rgb = [];
+ for (var i = 1; i < 4; i++){
+ if (this[i].length == 1) this[i] += this[i];
+ rgb.push(parseInt(this[i], 16));
+ }
+ return array ? rgb : 'rgb('+rgb.join(',')+')';
+ }
+
+});
+
+/*
+Class: Number
+ contains the internal method toInt.
+*/
+
+Number.extend({
+
+ /*
+ Property: toInt
+ Returns this number; useful because toInt must work on both Strings and Numbers.
+ */
+
+ toInt: function(){
+ return parseInt(this);
+ },
+
+ toFloat: function(){
+ return parseFloat(this);
+ }
+
+});
+
+/*
+Script: Function.js
+ Contains Function prototypes and utility functions .
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+
+Credits:
+ - Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
+*/
+
+/*
+Class: Function
+ A collection of The Function Object prototype methods.
+*/
+
+Function.extend({
+
+ create: function(options){
+ var fn = this;
+ options = Object.extend({
+ 'bind': fn,
+ 'event': false,
+ 'arguments': null,
+ 'delay': false,
+ 'periodical': false,
+ 'attempt': false
+ }, options || {});
+ if (options.arguments != null && typeof options.arguments != 'undefined' && !(options.arguments instanceof Array))
+ options.arguments = [options.arguments];
+ return function(event){
+ var args = options.arguments || arguments;
+ if (options.event){
+ event = (options.event === true) ? event || window.event : new options.event(event);
+ args = [event].concat(args);
+ }
+ var returns = function(){
+ return fn.apply(options.bind, args);
+ };
+ if (options.delay) return setTimeout(returns, options.delay);
+ if (options.periodical) return setInterval(returns, options.periodical);
+ if (options.attempt){
+ try {
+ var result = returns();
+ } catch(err){
+ result = err;
+ } finally {
+ return result;
+ }
+ } else return returns();
+ };
+ },
+
+ /*
+ Property: pass
+ Shortcut to create closures with arguments and bind.
+
+ Returns:
+ a function.
+
+ Arguments:
+ args - the arguments passed. must be an array if arguments > 1
+ bind - optional, the object that the "this" of the function will refer to.
+
+ Example:
+ >myFunction.pass([arg1, arg2], myElement);
+ */
+
+ pass: function(args, bind){
+ return this.create({'arguments': args, 'bind': bind});
+ },
+
+ /*
+ Property: attempt
+ Tries to execute the function, returns either the function results or the error.
+
+ Arguments:
+ args - the arguments passed. must be an array if arguments > 1
+ bind - optional, the object that the "this" of the function will refer to.
+
+ Example:
+ >myFunction.attempt([arg1, arg2], myElement);
+ */
+
+ attempt: function(args, bind){
+ return this.create({'arguments': args, 'bind': bind, 'attempt': true})();
+ },
+
+ /*
+ Property: bind
+ method to easily create closures with "this" altered.
+
+ Arguments:
+ bind - optional, the object that the "this" of the function will refer to.
+ args - optional, the arguments passed. must be an array if arguments > 1
+
+ Returns:
+ a function.
+
+ Example:
+ >function myFunction(){
+ > this.setStyle('color', 'red');
+ > // note that 'this' here refers to myFunction, not an element
+ > // we'll need to bind this function to the element we want to alter
+ >};
+ >var myBoundFunction = myFunction.bind(myElement);
+ >myBoundFunction(); // this will make the element myElement red.
+ */
+
+ bind: function(bind, args){
+ return this.create({'bind': bind, 'arguments': args});
+ },
+
+ /*
+ Property: bindAsEventListener
+ cross browser method to pass event firer
+
+ Arguments:
+ bind - optional, the object that the "this" of the function will refer to.
+ args - optional, the arguments passed. must be an array if arguments > 1
+
+ Returns:
+ a function with the parameter bind as its "this" and as a pre-passed argument event or window.event, depending on the browser.
+
+ Example:
+ >function myFunction(event){
+ > alert(event.clientx) //returns the coordinates of the mouse..
+ >};
+ >myElement.onclick = myFunction.bindAsEventListener(myElement);
+ */
+
+ bindAsEventListener: function(bind, args){
+ return this.create({'bind': bind, 'event': true, 'arguments': args});
+ },
+
+ /*
+ Property: delay
+ Delays the execution of a function by a specified duration.
+
+ Arguments:
+ ms - the duration to wait in milliseconds
+ bind - optional, the object that the "this" of the function will refer to.
+ args - optional, the arguments passed. must be an array if arguments > 1
+
+ Example:
+ >myFunction.delay(50, myElement) //wait 50 milliseconds, then call myFunction and bind myElement to it
+ >(function(){alert('one second later...')}).delay(1000); //wait a second and alert
+ */
+
+ delay: function(ms, bind, args){
+ return this.create({'delay': ms, 'bind': bind, 'arguments': args})();
+ },
+
+ /*
+ Property: periodical
+ Executes a function in the specified intervals of time
+
+ Arguments:
+ ms - the duration of the intervals between executions.
+ bind - optional, the object that the "this" of the function will refer to.
+ args - optional, the arguments passed. must be an array if arguments > 1
+ */
+
+ periodical: function(ms, bind, args){
+ return this.create({'periodical': ms, 'bind': bind, 'arguments': args})();
+ }
+
+});
+
+/*
+Script: Element.js
+ Contains useful Element prototypes, to be used with the dollar function <$>.
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+
+Credits:
+ - Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
+*/
+
+/*
+Class: Element
+ Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+var Element = new Class({
+
+ /*
+ Property: initialize
+ Creates a new element of the type passed in.
+
+ Arguments:
+ el - the tag name for the element you wish to create.
+
+ Example:
+ >var div = new Element('div');
+ */
+
+ initialize: function(el){
+ if ($type(el) == 'string') el = document.createElement(el);
+ return $(el);
+ }
+
+});
+
+/*
+Function: $()
+ returns the element passed in with all the Element prototypes applied.
+
+Arguments:
+ el - a reference to an actual element or a string representing the id of an element
+
+Example:
+ >$('myElement') // gets a DOM element by id with all the Element prototypes applied.
+ >var div = document.getElementById('myElement');
+ >$(div) //returns an Element also with all the mootools extentions applied.
+
+ You'll use this when you aren't sure if a variable is an actual element or an id, as
+ well as just shorthand for document.getElementById().
+
+Returns:
+ a DOM element or false (if no id was found).
+
+Note:
+ you need to call $ on an element only once to get all the prototypes.
+ But its no harm to call it multiple times, as it will detect if it has been already extended.
+*/
+
+function $(el){
+ if (!el) return false;
+ if (el._element_extended_ || [window, document].test(el)) return el;
+ if ($type(el) == 'string') el = document.getElementById(el);
+ if ($type(el) != 'element') return false;
+ if (['object', 'embed'].test(el.tagName.toLowerCase()) || el.extend) return el;
+ el._element_extended_ = true;
+ Garbage.collect(el);
+ el.extend = Object.extend;
+ if (!(el instanceof HTMLElement)) el.extend(Element.prototype);
+ return el;
+};
+
+//elements class
+
+var Elements = new Class({});
+
+new Object.Native(Elements);
+
+document.getElementsBySelector = document.getElementsByTagName;
+
+/*
+Function: $$()
+ Selects, and extends DOM elements.
+
+Arguments:
+ HTMLCollection(document.getElementsByTagName, element.childNodes), an array of elements, a string.
+
+Note:
+ if you loaded <Dom.js>, $$ will also accept CSS Selectors.
+
+Example:
+ >$$('a') //an array of all anchor tags on the page
+ >$$('a', 'b') //an array of all anchor and bold tags on the page
+ >$$('#myElement') //array containing only the element with id = myElement. (only with <Dom.js>)
+ >$$('#myElement a.myClass') //an array of all anchor tags with the class "myClass" within the DOM element with id "myElement" (only with <Dom.js>)
+
+Returns:
+ array - array of all the dom elements matched
+*/
+
+function $$(){
+ if (!arguments) return false;
+ if (arguments.length == 1){
+ if (!arguments[0]) return false;
+ if (arguments[0]._elements_extended_) return arguments[0];
+ }
+ var elements = [];
+ $each(arguments, function(selector){
+ switch ($type(selector)){
+ case 'element': elements.push($(selector)); break;
+ case 'string': selector = document.getElementsBySelector(selector);
+ default:
+ if (selector.length){
+ $each(selector, function(el){
+ if ($(el)) elements.push(el);
+ });
+ }
+ }
+ });
+ elements._elements_extended_ = true;
+ return Object.extend(elements, new Elements);
+};
+
+Elements.Multi = function(property){
+ return function(){
+ var args = arguments;
+ var items = [];
+ var elements = true;
+ $each(this, function(el){
+ var returns = el[property].apply(el, args);
+ if ($type(returns) != 'element') elements = false;
+ items.push(returns);
+ });
+ if (elements) items = $$(items);
+ return items;
+ };
+};
+
+Element.extend = function(properties){
+ for (var property in properties){
+ HTMLElement.prototype[property] = properties[property];
+ Element.prototype[property] = properties[property];
+ Elements.prototype[property] = Elements.Multi(property);
+ }
+};
+
+Element.extend({
+
+ inject: function(el, where){
+ el = $(el) || new Element(el);
+ switch (where){
+ case "before": $(el.parentNode).insertBefore(this, el); break;
+ case "after":
+ if (!el.getNext()) $(el.parentNode).appendChild(this);
+ else $(el.parentNode).insertBefore(this, el.getNext());
+ break;
+ case "inside": el.appendChild(this);
+ }
+ return this;
+ },
+
+ /*
+ Property: injectBefore
+ Inserts the Element before the passed element.
+
+ Parameteres:
+ el - a string representing the element to be injected in (myElementId, or div), or an element reference.
+ If you pass div or another tag, the element will be created.
+
+ Example:
+ >html:
+ ><div id="myElement"></div>
+ ><div id="mySecondElement"></div>
+ >js:
+ >$('mySecondElement').injectBefore('myElement');
+ >resulting html:
+ ><div id="mySecondElement"></div>
+ ><div id="myElement"></div>
+
+ */
+
+ injectBefore: function(el){
+ return this.inject(el, 'before');
+ },
+
+ /*
+ Property: injectAfter
+ Same as <Element.injectBefore>, but inserts the element after.
+ */
+
+ injectAfter: function(el){
+ return this.inject(el, 'after');
+ },
+
+ /*
+ Property: injectInside
+ Same as <Element.injectBefore>, but inserts the element inside.
+ */
+
+ injectInside: function(el){
+ return this.inject(el, 'inside');
+ },
+
+ /*
+ Property: adopt
+ Inserts the passed element inside the Element. Works as <Element.injectInside> but in reverse.
+
+ Parameteres:
+ el - a string representing the element to be injected in (myElementId, or div), or an element reference.
+ If you pass div or another tag, the element will be created.
+ */
+
+ adopt: function(el){
+ this.appendChild($(el) || new Element(el));
+ return this;
+ },
+
+ /*
+ Property: remove
+ Removes the Element from the DOM.
+
+ Example:
+ >$('myElement').remove() //bye bye
+ */
+
+ remove: function(){
+ this.parentNode.removeChild(this);
+ return this;
+ },
+
+ /*
+ Property: clone
+ Clones the Element and returns the cloned one.
+
+ Returns:
+ the cloned element
+
+ Example:
+ >var clone = $('myElement').clone().injectAfter('myElement');
+ >//clones the Element and append the clone after the Element.
+ */
+
+ clone: function(contents){
+ var el = this.cloneNode(contents !== false);
+ return $(el);
+ },
+
+ /*
+ Property: replaceWith
+ Replaces the Element with an element passed.
+
+ Parameteres:
+ el - a string representing the element to be injected in (myElementId, or div), or an element reference.
+ If you pass div or another tag, the element will be created.
+
+ Returns:
+ the passed in element
+
+ Example:
+ >$('myOldElement').replaceWith($('myNewElement')); //$('myOldElement') is gone, and $('myNewElement') is in its place.
+ */
+
+ replaceWith: function(el){
+ el = $(el) || new Element(el);
+ this.parentNode.replaceChild(el, this);
+ return el;
+ },
+
+ /*
+ Property: appendText
+ Appends text node to a DOM element.
+
+ Arguments:
+ text - the text to append.
+
+ Example:
+ ><div id="myElement">hey</div>
+ >$('myElement').appendText(' howdy'); //myElement innerHTML is now "hey howdy"
+ */
+
+ appendText: function(text){
+ if (window.ie){
+ switch(this.getTag()){
+ case 'style': this.styleSheet.cssText = text; return this;
+ case 'script': this.setProperty('text', text); return this;
+ }
+ }
+ this.appendChild(document.createTextNode(text));
+ return this;
+ },
+
+ /*
+ Property: hasClass
+ Tests the Element to see if it has the passed in className.
+
+ Returns:
+ true - the Element has the class
+ false - it doesn't
+
+ Arguments:
+ className - the class name to test.
+
+ Example:
+ ><div id="myElement" class="testClass"></div>
+ >$('myElement').hasClass('testClass'); //returns true
+ */
+
+ hasClass: function(className){
+ return this.className.test('(?:^|\\s+)' + className + '(?:\\s+|$)');
+ },
+
+ /*
+ Property: addClass
+ Adds the passed in class to the Element, if the element doesnt already have it.
+
+ Arguments:
+ className - the class name to add
+
+ Example:
+ ><div id="myElement" class="testClass"></div>
+ >$('myElement').addClass('newClass'); //<div id="myElement" class="testClass newClass"></div>
+ */
+
+ addClass: function(className){
+ if (!this.hasClass(className)) this.className = (this.className+' '+className).clean();
+ return this;
+ },
+
+ /*
+ Property: removeClass
+ works like <Element.addClass>, but removes the class from the element.
+ */
+
+ removeClass: function(className){
+ if (this.hasClass(className)) this.className = this.className.replace(className, '').clean();
+ return this;
+ },
+
+ /*
+ Property: toggleClass
+ Adds or removes the passed in class name to the element, depending on if it's present or not.
+
+ Arguments:
+ className - the class to add or remove
+
+ Example:
+ ><div id="myElement" class="myClass"></div>
+ >$('myElement').toggleClass('myClass');
+ ><div id="myElement" class=""></div>
+ >$('myElement').toggleClass('myClass');
+ ><div id="myElement" class="myClass"></div>
+ */
+
+ toggleClass: function(className){
+ return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
+ },
+
+ /*
+ Property: setStyle
+ Sets a css property to the Element.
+
+ Arguments:
+ property - the property to set
+ value - the value to which to set it
+
+ Example:
+ >$('myElement').setStyle('width', '300px'); //the width is now 300px
+ */
+
+ setStyle: function(property, value){
+ if (property == 'opacity') this.setOpacity(parseFloat(value));
+ else this.style[property.camelCase()] = (value.push) ? value.rgbToHex() : value;
+ return this;
+ },
+
+ /*
+ Property: setStyles
+ Applies a collection of styles to the Element.
+
+ Arguments:
+ source - an object or string containing all the styles to apply
+
+ Examples:
+ >$('myElement').setStyles({
+ > border: '1px solid #000',
+ > width: '300px',
+ > height: '400px'
+ >});
+
+ OR
+
+ >$('myElement').setStyle('border: 1px solid #000; width: 300px; height: 400px;');
+ */
+
+ setStyles: function(source){
+ switch ($type(source)){
+ case 'object':
+ for (var property in source) this.setStyle(property, source[property]);
+ break;
+ case 'string':
+ if (window.ie) this.cssText = source;
+ else this.setAttribute('style', source);
+ }
+ return this;
+ },
+
+ /*
+ Property: setOpacity
+ Sets the opacity of the Element, and sets also visibility == "hidden" if opacity == 0, and visibility = "visible" if opacity == 1.
+
+ Arguments:
+ opacity - Accepts numbers from 0 to 1.
+
+ Example:
+ >$('myElement').setOpacity(0.5) //make it 50% transparent
+ */
+
+ setOpacity: function(opacity){
+ if (opacity == 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 = "alpha(opacity=" + opacity*100 + ")";
+ this.style.opacity = this.opacity = opacity;
+ return this;
+ },
+
+ /*
+ Property: getStyle
+ Returns the style of the Element given the property passed in.
+
+ Arguments:
+ property - the css style property you want to retrieve
+
+ Example:
+ >$('myElement').getStyle('width'); //returns "400px"
+ >//but you can also use
+ >$('myElement').getStyle('width').toInt(); //returns "400"
+
+ Returns:
+ the style as a string
+ */
+
+ getStyle: function(property){
+ property = property.camelCase();
+ var style = this.style[property] || false;
+ if (!$chk(style)){
+ if (property == 'opacity') return $chk(this.opacity) ? this.opacity : 1;
+ if (['margin', 'padding'].test(property)){
+ return [this.getStyle(property+'-top') || 0, this.getStyle(property+'-right') || 0,
+ this.getStyle(property+'-bottom') || 0, this.getStyle(property+'-left') || 0].join(' ');
+ }
+ if (document.defaultView) style = document.defaultView.getComputedStyle(this, null).getPropertyValue(property.hyphenate());
+ else if (this.currentStyle) style = this.currentStyle[property];
+ }
+ return (style && property.test('color', 'i') && style.test('rgb')) ? style.rgbToHex() : style;
+ },
+
+ /*
+ Property: addEvent
+ Attaches an event listener to a DOM element.
+
+ Arguments:
+ type - the event to monitor ('click', 'load', etc) without the prefix 'on'.
+ fn - the function to execute
+
+ Example:
+ >$('myElement').addEvent('click', function(){alert('clicked!')});
+ */
+
+ addEvent: function(type, fn){
+ this.events = this.events || {};
+ this.events[type] = this.events[type] || {'keys': [], 'values': []};
+ if (!this.events[type].keys.test(fn)){
+ this.events[type].keys.push(fn);
+ if (this.addEventListener){
+ this.addEventListener((type == 'mousewheel' && window.gecko) ? 'DOMMouseScroll' : type, fn, false);
+ } else {
+ fn = fn.bind(this);
+ this.attachEvent('on'+type, fn);
+ this.events[type].values.push(fn);
+ }
+ }
+ return this;
+ },
+
+ addEvents: function(source){
+ if (source){
+ for (var type in source) this.addEvent(type, source[type]);
+ }
+ return this;
+ },
+
+ /*
+ Property: removeEvent
+ Works as Element.addEvent, but instead removes the previously added event listener.
+ */
+
+ removeEvent: function(type, fn){
+ if (this.events && this.events[type]){
+ var pos = this.events[type].keys.indexOf(fn);
+ if (pos == -1) return this;
+ var key = this.events[type].keys.splice(pos,1)[0];
+ if (this.removeEventListener){
+ this.removeEventListener((type == 'mousewheel' && window.gecko) ? 'DOMMouseScroll' : type, key, false);
+ } else {
+ this.detachEvent('on'+type, this.events[type].values.splice(pos,1)[0]);
+ }
+ }
+ return this;
+ },
+
+ /*
+ Property: removeEvents
+ removes all events of a certain type from an element. if no argument is passed in, removes all events.
+ */
+
+ removeEvents: function(type){
+ if (this.events){
+ if (type){
+ if (this.events[type]){
+ this.events[type].keys.each(function(fn){
+ this.removeEvent(type, fn);
+ }, this);
+ this.events[type] = null;
+ }
+ } else {
+ for (var evType in this.events) this.removeEvents(evType);
+ this.events = null;
+ }
+ }
+ return this;
+ },
+
+ /*
+ Property: fireEvent
+ executes all events of the specified type present in the element.
+ */
+
+ fireEvent: function(type, args){
+ if (this.events && this.events[type]){
+ args = args || [];
+ if ($type(args) != 'array') args = [args];
+ this.events[type].keys.each(function(fn){
+ fn.apply(this, args);
+ }, this);
+ }
+ },
+
+ getBrother: function(what){
+ var el = this[what+'Sibling'];
+ while ($type(el) == 'whitespace') el = el[what+'Sibling'];
+ return $(el);
+ },
+
+ /*
+ Property: getPrevious
+ Returns the previousSibling of the Element, excluding text nodes.
+
+ Example:
+ >$('myElement').getPrevious(); //get the previous DOM element from myElement
+
+ Returns:
+ the sibling element or undefined if none found.
+ */
+
+ getPrevious: function(){
+ return this.getBrother('previous');
+ },
+
+ /*
+ Property: getNext
+ Works as Element.getPrevious, but tries to find the nextSibling.
+ */
+
+ getNext: function(){
+ return this.getBrother('next');
+ },
+
+ /*
+ Property: getFirst
+ Works as <Element.getPrevious>, but tries to find the firstChild.
+ */
+
+ getFirst: function(){
+ var el = this.firstChild;
+ while ($type(el) == 'whitespace') el = el.nextSibling;
+ return $(el);
+ },
+
+ /*
+ Property: getLast
+ Works as <Element.getPrevious>, but tries to find the lastChild.
+ */
+
+ getLast: function(){
+ var el = this.lastChild;
+ while ($type(el) == 'whitespace') el = el.previousSibling;
+ return $(el);
+ },
+
+ /*
+ Property: getParent
+ returns the $(element.parentNode)
+ */
+
+ getParent: function(){
+ return $(this.parentNode);
+ },
+
+ /*
+ Property: getChildren
+ returns all the $(element.childNodes), excluding text nodes. Returns as <Elements>.
+ */
+
+ getChildren: function(){
+ return $$(this.childNodes);
+ },
+
+ /*
+ Property: setProperty
+ Sets an attribute for the Element.
+
+ Arguments:
+ property - the property to assign the value passed in
+ value - the value to assign to the property passed in
+
+ Example:
+ >$('myImage').setProperty('src', 'whatever.gif'); //myImage now points to whatever.gif for its source
+ */
+
+ setProperty: function(property, value){
+ switch (property){
+ case 'class': this.className = value; break;
+ case 'style': this.setStyles(value); break;
+ case 'name': if (window.ie6){
+ var el = $(document.createElement('<'+this.getTag()+' name="'+value+'" />'));
+ $each(this.attributes, function(attribute){
+ if (attribute.name != 'name') el.setProperty(attribute.name, attribute.value);
+ });
+ if (this.parentNode) this.replaceWith(el);
+ return el;
+ }
+ default: this.setAttribute(property, value);
+ }
+ return this;
+ },
+
+ /*
+ Property: setProperties
+ Sets numerous attributes for the Element.
+
+ Arguments:
+ source - an object with key/value pairs.
+
+ Example:
+ >$('myElement').setProperties({
+ > src: 'whatever.gif',
+ > alt: 'whatever dude'
+ >});
+ ><img src="whatever.gif" alt="whatever dude">
+ */
+
+ setProperties: function(source){
+ for (var property in source) this.setProperty(property, source[property]);
+ return this;
+ },
+
+ /*
+ Property: setHTML
+ Sets the innerHTML of the Element.
+
+ Arguments:
+ html - the new innerHTML for the element.
+
+ Example:
+ >$('myElement').setHTML(newHTML) //the innerHTML of myElement is now = newHTML
+ */
+
+ setHTML: function(html){
+ this.innerHTML = html;
+ return this;
+ },
+
+ /*
+ Property: getProperty
+ Gets the an attribute of the Element.
+
+ Arguments:
+ property - the attribute to retrieve
+
+ Example:
+ >$('myImage').getProperty('src') // returns whatever.gif
+
+ Returns:
+ the value, or an empty string
+ */
+
+ getProperty: function(property){
+ return (property == 'class') ? this.className : this.getAttribute(property);
+ },
+
+ /*
+ Property: getTag
+ Returns the tagName of the element in lower case.
+
+ Example:
+ >$('myImage').getTag() // returns 'img'
+
+ Returns:
+ The tag name in lower case
+ */
+
+ getTag: function(){
+ return this.tagName.toLowerCase();
+ },
+
+ getOffsets: function(){
+ var el = this, offsetLeft = 0, offsetTop = 0;
+ do {
+ offsetLeft += el.offsetLeft || 0;
+ offsetTop += el.offsetTop || 0;
+ el = el.offsetParent;
+ } while (el);
+ return {'x': offsetLeft, 'y': offsetTop};
+ },
+
+ /*
+ Property: scrollTo
+ scrolls the element to the specified coordinated (if the element has an overflow)
+
+ Arguments:
+ x - the x coordinate
+ y - the y coordinate
+
+ Example:
+ >$('myElement').scrollTo(0, 100)
+ */
+
+ scrollTo: function(x, y){
+ this.scrollLeft = x;
+ this.scrollTop = y;
+ },
+
+ /*
+ Property: getSize
+ return an Object representing the size/scroll values of the element.
+
+ Example:
+ (start code)
+ $('myElement').getSize();
+ (end)
+
+ Returns:
+ (start code)
+ {
+ 'scroll': {'x': 100, 'y': 100},
+ 'size': {'x': 200, 'y': 400},
+ 'scrollSize': {'x': 300, 'y': 500}
+ }
+ (end)
+ */
+
+ getSize: function(){
+ return {
+ 'scroll': {'x': this.scrollLeft, 'y': this.scrollTop},
+ 'size': {'x': this.offsetWidth, 'y': this.offsetHeight},
+ 'scrollSize': {'x': this.scrollWidth, 'y': this.scrollHeight}
+ };
+ },
+
+ /*
+ Property: getTop
+ Returns the distance from the top of the window to the Element.
+ */
+
+ getTop: function(){
+ return this.getOffsets().y;
+ },
+
+ /*
+ Property: getLeft
+ Returns the distance from the left of the window to the Element.
+ */
+
+ getLeft: function(){
+ return this.getOffsets().x;
+ },
+
+ /*
+ Property: getPosition
+ Returns an object with width, height, left, right, top, and bottom, representing the values of the Element
+
+ Example:
+ (start code)
+ var myValues = $('myElement').getPosition();
+ (end)
+
+ Returns:
+ (start code)
+ {
+ width: 200,
+ height: 300,
+ left: 100,
+ top: 50,
+ right: 300,
+ bottom: 350
+ }
+ (end)
+ */
+
+ getPosition: function(){
+ var offs = this.getOffsets();
+ var obj = {
+ 'width': this.offsetWidth,
+ 'height': this.offsetHeight,
+ 'left': offs.x,
+ 'top': offs.y
+ };
+ obj.right = obj.left + obj.width;
+ obj.bottom = obj.top + obj.height;
+ return obj;
+ },
+
+ /*
+ Property: getValue
+ Returns the value of the Element, if its tag is textarea, select or input. no multiple select support.
+ */
+
+ getValue: function(){
+ switch (this.getTag()){
+ case 'select': if (this.selectedIndex != -1) return this.options[this.selectedIndex].value; break;
+ case 'input': if (!(this.checked && ['checkbox', 'radio'].test(this.type)) && !['hidden', 'text', 'password'].test(this.type)) break;
+ case 'textarea': return this.value;
+ }
+ return false;
+ }
+
+});
+
+var Window = window;
+
+window.addEvent = document.addEvent = Element.prototype.addEvent;
+window.removeEvent = document.removeEvent = Element.prototype.removeEvent;
+
+var Garbage = {
+
+ elements: [],
+
+ collect: function(element){
+ Garbage.elements.push(element);
+ },
+
+ trash: function(){
+ window.removeEvent('unload', Garbage.trash);
+ Garbage.elements.each(function(el){
+ el.removeEvents();
+ for (var p in Element.prototype) HTMLElement[p] = window[p] = document[p] = el[p] = null;
+ el.extend = null;
+ });
+ }
+
+};
+
+window.addEvent('unload', Garbage.trash);
+
+/*
+Script: Event.js
+ Event class
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>, Michael Jackson, <http://ajaxon.com/michael>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Event
+ Cross browser methods to manage events.
+
+Arguments:
+ event - the event
+
+Properties:
+ shift - true if the user pressed the shift
+ control - true if the user pressed the control
+ alt - true if the user pressed the alt
+ meta - true if the user pressed the meta key
+ code - the keycode of the key pressed
+ page.x - the x position of the mouse, relative to the full window
+ page.y - the y position of the mouse, relative to the full window
+ client.x - the x position of the mouse, relative to the viewport
+ client.y - the y position of the mouse, relative to the viewport
+ key - the key pressed as a lowercase string. key also returns 'enter', 'up', 'down', 'left', 'right', 'space', 'backspace', 'delete', 'esc'. Handy for these special keys.
+ target - the event target
+ relatedTarget - the event related target
+
+Example:
+ (start code)
+ $('myLink').onkeydown = function(event){
+ var event = new Event(event);
+ //event is now the Event class.
+ alert(event.key); //returns the lowercase letter pressed
+ alert(event.shift); //returns true if the key pressed is shift
+ if (event.key == 's' && event.control) alert('document saved');
+ };
+ (end)
+*/
+
+var Event = new Class({
+
+ initialize: function(event){
+ this.event = event || window.event;
+ this.type = this.event.type;
+ this.target = this.event.target || this.event.srcElement;
+ if (this.target.nodeType == 3) this.target = this.target.parentNode; // Safari
+ this.shift = this.event.shiftKey;
+ this.control = this.event.ctrlKey;
+ this.alt = this.event.altKey;
+ this.meta = this.event.metaKey;
+ if (['DOMMouseScroll', 'mousewheel'].test(this.type)){
+ this.wheel = this.event.wheelDelta ? (this.event.wheelDelta / (window.opera ? -120 : 120)) : -(this.event.detail || 0) / 3;
+ } else if (this.type.test('key')){
+ this.code = this.event.which || this.event.keyCode;
+ for (var name in Event.keys){
+ if (Event.keys[name] == this.code) var special = name;
+ }
+ this.key = special || String.fromCharCode(this.code).toLowerCase();
+
+ } else if (this.type.test('mouse') || this.type == 'click'){
+ this.page = {
+ 'x': this.event.pageX || this.event.clientX + document.documentElement.scrollLeft,
+ 'y': this.event.pageY || this.event.clientY + document.documentElement.scrollTop
+ };
+ this.client = {
+ 'x': this.event.pageX ? this.event.pageX - window.pageXOffset : this.event.clientX,
+ 'y': this.event.pageY ? this.event.pageY - window.pageYOffset : this.event.clientY
+ };
+ this.rightClick = (this.event.which == 3) || (this.event.button == 2);
+ switch (this.type){
+ case 'mouseover': this.relatedTarget = this.event.relatedTarget || this.event.fromElement; break;
+ case 'mouseout': this.relatedTarget = this.event.relatedTarget || this.event.toElement;
+ }
+ }
+ },
+
+ /*
+ Property: stop
+ cross browser method to stop an event
+ */
+
+ stop: function() {
+ this.stopPropagation();
+ this.preventDefault();
+ return this;
+ },
+
+ /*
+ Property: stopPropagation
+ cross browser method to stop the propagation of an event
+ */
+
+ stopPropagation: function(){
+ if (this.event.stopPropagation) this.event.stopPropagation();
+ else this.event.cancelBubble = true;
+ return this;
+ },
+
+ /*
+ Property: preventDefault
+ cross browser method to prevent the default action of the event
+ */
+
+ preventDefault: function(){
+ if (this.event.preventDefault) this.event.preventDefault();
+ else this.event.returnValue = false;
+ return this;
+ }
+
+});
+
+Event.keys = {
+ 'enter': 13,
+ 'up': 38,
+ 'down': 40,
+ 'left': 37,
+ 'right': 39,
+ 'esc': 27,
+ 'space': 32,
+ 'backspace': 8,
+ 'delete': 46
+};
+
+Function.extend({
+
+ /*
+ Property: bindWithEvent
+ automatically passes mootools Event Class.
+
+ Arguments:
+ bind - optional, the object that the "this" of the function will refer to.
+
+ Returns:
+ a function with the parameter bind as its "this" and as a pre-passed argument event or window.event, depending on the browser.
+
+ Example:
+ >function myFunction(event){
+ > alert(event.clientx) //returns the coordinates of the mouse..
+ >};
+ >myElement.onclick = myFunction.bindWithEvent(myElement);
+ */
+
+ bindWithEvent: function(bind, args){
+ return this.create({'bind': bind, 'arguments': args, 'event': Event});
+ }
+
+});
+
+
+/*
+Script: Common.js
+ Contains common implementations for custom classes. In Mootools is implemented in <Ajax> and <Fx>.
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Chain
+ An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>.
+ Currently implemented in <Fx> and <Ajax>. In <Fx> for example, is used to execute a list of function, one after another, once the effect is completed.
+ The functions will not be fired all togheter, but one every completion, to create custom complex animations.
+
+Example:
+ (start code)
+ var myFx = new Fx.Style('element', 'opacity');
+
+ myFx.start(1,0).chain(function(){
+ myFx.start(0,1);
+ }).chain(function(){
+ myFx.start(1,0);
+ }).chain(function(){
+ myFx.start(0,1);
+ });
+ //the element will appear and disappear three times
+ (end)
+*/
+
+var Chain = new Class({
+
+ /*
+ Property: chain
+ adds a function to the Chain instance stack.
+
+ Arguments:
+ fn - the function to append.
+ */
+
+ chain: function(fn){
+ this.chains = this.chains || [];
+ this.chains.push(fn);
+ return this;
+ },
+
+ /*
+ Property: callChain
+ Executes the first function of the Chain instance stack, then removes it. The first function will then become the second.
+ */
+
+ callChain: function(){
+ if (this.chains && this.chains.length) this.chains.splice(0, 1)[0].delay(10, this);
+ },
+
+ /*
+ Property: clearChain
+ Clears the stack of a Chain instance.
+ */
+
+ clearChain: function(){
+ this.chains = [];
+ }
+
+});
+
+/*
+Class: Events
+ An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>.
+ In <Fx> Class, for example, is used to give the possibility add any number of functions to the Effects events, like onComplete, onStart, onCancel
+
+Example:
+ (start code)
+ var myFx = new Fx.Style('element', 'opacity').addEvent('onComplete', function(){
+ alert('the effect is completed');
+ }).addEvent('onComplete', function(){
+ alert('I told you the effect is completed');
+ });
+
+ myFx.start(0,1);
+ //upon completion it will display the 2 alerts, in order.
+ (end)
+*/
+
+var Events = new Class({
+
+ /*
+ Property: addEvent
+ adds an event to the stack of events of the Class instance.
+ */
+
+ addEvent: function(type, fn){
+ if (fn != Class.empty){
+ this.events = this.events || {};
+ this.events[type] = this.events[type] || [];
+ if (!this.events[type].test(fn)) this.events[type].push(fn);
+ }
+ return this;
+ },
+
+ /*
+ Property: fireEvent
+ fires all events of the specified type in the Class instance.
+ */
+
+ fireEvent: function(type, args, delay){
+ if (this.events && this.events[type]){
+ this.events[type].each(function(fn){
+ fn.create({'bind': this, 'delay': delay, 'arguments': args})();
+ }, this);
+ }
+ return this;
+ },
+
+ /*
+ Property: removeEvent
+ removes an event from the stack of events of the Class instance.
+ */
+
+ removeEvent: function(type, fn){
+ if (this.events && this.events[type]) this.events[type].remove(fn);
+ return this;
+ }
+
+});
+
+/*
+Class: Options
+ An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>.
+ Used to automate the options settings, also adding Class <Events> when the option begins with on.
+*/
+
+var Options = new Class({
+
+ /*
+ Property: setOptions
+ sets this.options
+
+ Arguments:
+ defaults - the default set of options
+ options - the user entered options. can be empty too.
+
+ Note:
+ if your Class has <Events> implemented, every option beginning with on, followed by a capital letter (onComplete) becomes an Class instance event.
+ */
+
+ setOptions: function(defaults, options){
+ this.options = Object.extend(defaults, options);
+ if (this.addEvent){
+ for (var option in this.options){
+ if (($type(this.options[option]) == 'function') && option.test('^on[A-Z]')) this.addEvent(option, this.options[option]);
+ }
+ }
+ return this;
+ }
+
+});
+
+/*
+Script: Dom.js
+ Css Query related function and <Element> extensions
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/* Section: Utility Functions */
+
+/*
+Function: $E
+ Selects a single (i.e. the first found) Element based on the selector passed in and an optional filter element.
+
+Arguments:
+ selector - the css selector to match
+ filter - optional; a DOM element to limit the scope of the selector match; defaults to document.
+
+Example:
+ >$E('a', 'myElement') //find the first anchor tag inside the DOM element with id 'myElement'
+
+Returns:
+ a DOM element - the first element that matches the selector
+*/
+
+function $E(selector, filter){
+ return ($(filter) || document).getElement(selector);
+};
+
+/*
+Function: $ES
+ Returns a collection of Elements that match the selector passed in limited to the scope of the optional filter.
+ See Also: <Element.getElements> for an alternate syntax.
+
+Returns:
+ an array of dom elements that match the selector within the filter
+
+Arguments:
+ selector - css selector to match
+ filter - optional; a DOM element to limit the scope of the selector match; defaults to document.
+
+Examples:
+ >$ES("a") //gets all the anchor tags; synonymous with $$("a")
+ >$ES('a','myElement') //get all the anchor tags within $('myElement')
+*/
+
+function $ES(selector, filter){
+ return ($(filter) || document).getElementsBySelector(selector);
+};
+
+/*
+Class: Element
+ Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+Element.extend({
+
+ /*
+ Property: getElements
+ Gets all the elements within an element that match the given (single) selector.
+
+ Arguments:
+ selector - the css selector to match
+
+ Example:
+ >$('myElement').getElements('a'); // get all anchors within myElement
+
+ Credits:
+ Say thanks to Christophe Beyls <http://digitalia.be> for the new regular expression that rules getElements, a big step forward in terms of speed.
+ */
+
+ getElements: function(selector){
+ var filters = [];
+ selector.clean().split(' ').each(function(sel, i){
+ var param = sel.match('^(\\w*|\\*)(?:#([\\w_-]+)|\\.([\\w_-]+))?(?:\\[["\']?(\\w+)["\']?(?:([\\*\\^\\$]?=)["\']?(\\w*)["\']?)?\\])?$');
+ //PARAM ARRAY: 0 = full string: 1 = tag; 2 = id; 3 = class; 4 = attribute; 5 = operator; 6 = value;
+ if (!param) return;
+ param[1] = param[1] || '*';
+ if (i == 0){
+ if (param[2]){
+ var el = this.getElementById(param[2]);
+ if (!el || ((param[1] != '*') && (Element.prototype.getTag.call(el) != param[1]))) return;
+ filters = [el];
+ } else {
+ filters = $A(this.getElementsByTagName(param[1]));
+ }
+ } else {
+ filters = Elements.prototype.filterByTagName.call(filters, param[1]);
+ if (param[2]) filters = Elements.prototype.filterById.call(filters, param[2]);
+ }
+ if (param[3]) filters = Elements.prototype.filterByClassName.call(filters, param[3]);
+ if (param[4]) filters = Elements.prototype.filterByAttribute.call(filters, param[4], param[6], param[5]);
+ }, this);
+ return $$(filters);
+ },
+
+ /*
+ Property: getElementById
+ Targets an element with the specified id found inside the Element. Does not overwrite document.getElementById.
+
+ Arguments:
+ id - the id of the element to find.
+ */
+
+ getElementById: function(id){
+ var el = document.getElementById(id);
+ if (!el) return false;
+ for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
+ if (!parent) return false;
+ }
+ return el;
+ },
+
+ /*
+ Property: getElement
+ Same as <Element.getElements>, but returns only the first. Alternate syntax for <$E>, where filter is the Element.
+ */
+
+ getElement: function(selector){
+ return this.getElementsBySelector(selector)[0];
+ },
+
+ /*
+ Property: getElementsBySelector
+ Same as <Element.getElements>, but allows for comma separated selectors, as in css. Alternate syntax for <$$>, where filter is the Element.
+
+ */
+
+ getElementsBySelector: function(selector){
+ var els = [];
+ selector.split(',').each(function(sel){
+ els.extend(this.getElements(sel));
+ }, this);
+ return $$(els);
+ }
+
+});
+
+document.extend = Object.extend;
+
+/* Section: document related functions */
+
+document.extend({
+ /*
+ Function: document.getElementsByClassName
+ Returns all the elements that match a specific class name.
+ Here for compatibility purposes. can also be written: document.getElements('.className'), or $$('.className')
+ */
+
+ getElementsByClassName: function(className){
+ return document.getElements('.'+className);
+ },
+ getElement: Element.prototype.getElement,
+ getElements: Element.prototype.getElements,
+ getElementsBySelector: Element.prototype.getElementsBySelector
+
+});
+
+/*
+Class: Elements
+ Methods for dom queries arrays, as <$$>.
+*/
+
+Elements.extend({
+
+ //internal methods
+
+ filterById: function(id, tag){
+ var found = [];
+ this.each(function(el){
+ if (el.id == id) found.push(el);
+ });
+ return found;
+ },
+
+ filterByClassName: function(className){
+ var found = [];
+ this.each(function(el){
+ if (Element.prototype.hasClass.call(el, className)) found.push(el);
+ });
+ return found;
+ },
+
+ filterByTagName: function(tagName){
+ var found = [];
+ this.each(function(el){
+ found.extend(el.getElementsByTagName(tagName));
+ });
+ return found;
+ },
+
+ filterByAttribute: function(name, value, operator){
+ var found = [];
+ this.each(function(el){
+ var att = el.getAttribute(name);
+ if (!att) return found;
+ if (!operator) return found.push(el);
+
+ switch (operator){
+ case '*=': if (att.test(value)) found.push(el); break;
+ case '=': if (att == value) found.push(el); break;
+ case '^=': if (att.test('^'+value)) found.push(el); break;
+ case '$=': if (att.test(value+'$')) found.push(el);
+ }
+ return found;
+ });
+ return found;
+ }
+
+});
+
+/*
+Script: Hash.js
+ Contains the class Hash.
+
+Author:
+ Christophe Beyls <http://digitalia.be>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Hash
+ It wraps an object that it uses internally as a map. The user must use put(), get(), and remove() to add/change, retrieve and remove values, it must not access the internal object directly. With this implementation, null values are not allowed.
+
+Example:
+ (start code)
+ var hash = new Hash({a: 'hi', b: 'world', c: 'howdy'});
+ hash.remove('b'); // b is removed.
+ hash.set('c', 'hello');
+ hash.get('c'); // returns 'hello'
+ hash.length // returns 2 (a and b)
+ (end)
+*/
+
+var Hash = new Class({
+
+ length: 0,
+
+ initialize: function(obj) {
+ this.obj = {};
+ for (var property in obj) {
+ this.obj[property] = obj[property];
+ this.length++;
+ }
+ },
+
+ get: function(key) {
+ return this.obj[key];
+ },
+
+ set: function(key, value) {
+ if (value == null) return false;
+ if (this.obj[key] == undefined) this.length++;
+ this.obj[key] = value;
+ return this;
+ },
+
+ remove: function(key) {
+ if (this.obj[key] == undefined) return false;
+ var obj = {};
+ this.length--;
+ for (var property in this.obj){
+ if (property != key) obj[property] = this.obj[property];
+ }
+ this.obj = obj;
+ return this;
+ },
+
+ each: function(fn, bind) {
+ for (var property in this.obj) fn.call(bind || this, property, this.obj[property]);
+ },
+
+ extend: function(obj){
+ this.initialize(Object.extend(this.obj, obj));
+ return this;
+ },
+
+ empty: function() {
+ return (this.length == 0);
+ },
+
+ keys: function() {
+ var keys = [];
+ for (var property in this.obj) keys.push(property);
+ return keys;
+ },
+
+ values: function() {
+ var values = [];
+ for (var property in this.obj) values.push(this.obj[property]);
+ return values;
+ }
+
+});
+
+/*
+Function: $H
+ Shortcut to create an Hash from an Object.
+*/
+
+function $H(obj) {
+ return new Hash(obj);
+};
+
+/*
+Script: Color.js
+ Contains the Color class.
+
+Author:
+ Michael Jackson <http://ajaxon.com/michael>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Color
+ Creates a new Color Object, which is an array with some color specific methods.
+
+Example:
+ (start code)
+ var black = new Color('#000');
+ var purple = new Color([255,0,255]);
+ // mix black with white and purple, each time at 10% of the new color
+ var darkpurple = black.mix('#fff', purple, 10);
+ $('myDiv').setStyle('background-color', darkpurple);
+ (end)
+*/
+
+var Color = new Class({
+
+ initialize: function(color){
+ if (color.mix && color.invert) return color;
+ var rgb = (color.push) ? color : color.hexToRgb(true);
+ return Object.extend(rgb, Color.prototype);
+ },
+
+ mix: function(){
+ var colors = $A(arguments);
+ var alpha = 50;
+ if ($type(colors[colors.length-1]) == 'number') alpha = colors.pop();
+ var rgb = this.copy();
+ colors.each(function(color){
+ color = new Color(color);
+ for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));
+ });
+ return new Color(rgb);
+ },
+
+ invert: function(){
+ var rgb = [];
+ for (var i = 0; i < 3; i++) rgb.push(255 - this[i]);
+ return new Color(rgb);
+ }
+
+});
+
+function $C(color){
+ return new Color(color);
+};
+
+/*
+Script: Window.Base.js
+ Contains Window.onDomReady and Window.disableImageCache
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Window
+ Cross browser methods to get the window size, onDomReady method.
+*/
+
+window.extend = Object.extend;
+
+window.extend({
+
+ /*
+ Function: window.disableImageCache
+ Disables background image chache for internex explorer, to prevent flickering.
+ To be called if you have effects with background images, and they flicker.
+
+ Example:
+ Window.disableImageCache();
+ */
+
+ disableImageCache: function(){
+ if (this.ie6) try {document.execCommand("BackgroundImageCache", false, true);} catch (e){};
+ },
+
+ addEvent: function(type, fn){
+ if (type == 'domready'){
+ if (this.loaded) fn();
+ else if (!this.events || !this.events.domready){
+ var domReady = function(){
+ if (this.loaded) return;
+ this.loaded = true;
+ if (this.timer) this.timer = $clear(this.timer);
+ Element.prototype.fireEvent.call(this, 'domready');
+ this.events.domready = null;
+ }.bind(this);
+ if (document.readyState && this.khtml){ //safari and konqueror
+ this.timer = function(){
+ if (['loaded','complete'].test(document.readyState)) domReady();
+ }.periodical(50);
+ }
+ else if (document.readyState && this.ie){ //ie
+ document.write("<script id=ie_ready defer src=javascript:void(0)><\/script>");
+ $('ie_ready').onreadystatechange = function(){
+ if (this.readyState == 'complete') domReady();
+ };
+ } else { //others
+ this.addEvent("load", domReady);
+ document.addEvent("DOMContentLoaded", domReady);
+ }
+ }
+ }
+ Element.prototype.addEvent.call(this, type, fn);
+ return this;
+ },
+
+ /*
+ Function: window.onDomReady
+ Executes the passed in function when the DOM is ready (when the document tree has loaded, not waiting for images).
+ Same as window.addEvent('domready', init);
+
+ Credits:
+ (c) Dean Edwards/Matthias Miller/John Resig, remastered for mootools. Later touched up by Christophe Beyls <http://digitalia.be>.
+
+ Arguments:
+ init - the function to execute when the DOM is ready
+
+ Example:
+ > window.addEvent('domready', function(){alert('the dom is ready')});
+ */
+
+ onDomReady: function(init){
+ return this.addEvent('domready', init);
+ }
+
+});
+
+/*
+Script: Window.Size.js
+ Window cross-browser dimensions methods.
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: window
+ Cross browser methods to get the window size, onDomReady method.
+*/
+
+window.extend({
+
+ /*
+ Property: getWidth
+ Returns an integer representing the width of the browser.
+ */
+
+ getWidth: function(){
+ if (this.khtml || this.opera) return this.innerWidth;
+ else return document.documentElement.clientWidth || document.body.clientWidth;
+ },
+
+ /*
+ Property: getHeight
+ Returns an integer representing the height of the browser.
+ */
+
+ getHeight: function(){
+ if (this.khtml || this.opera) return this.innerHeight;
+ return document.documentElement.clientHeight || document.body.clientHeight;
+ },
+
+ /*
+ Property: getScrollHeight
+ Returns an integer representing the scrollHeight of the window.
+
+ See Also:
+ <http://developer.mozilla.org/en/docs/DOM:element.scrollHeight>
+ */
+
+ getScrollHeight: function(){
+ return document.documentElement.scrollHeight;
+ },
+
+ /*
+ Property: getScrollWidth
+ Returns an integer representing the scrollWidth of the window.
+
+ See Also:
+ <http://developer.mozilla.org/en/docs/DOM:element.scrollWidth>
+ */
+
+ getScrollWidth: function(){
+ return document.documentElement.scrollWidth;
+ },
+
+ /*
+ Property: getScrollTop
+ Returns an integer representing the scrollTop of the window (the number of pixels the window has scrolled from the top).
+
+ See Also:
+ <http://developer.mozilla.org/en/docs/DOM:element.scrollTop>
+ */
+
+ getScrollTop: function(){
+ return this.pageYOffset || document.documentElement.scrollTop;
+ },
+
+ /*
+ Property: getScrollLeft
+ Returns an integer representing the scrollLeft of the window (the number of pixels the window has scrolled from the left).
+
+ See Also:
+ <http://developer.mozilla.org/en/docs/DOM:element.scrollLeft>
+ */
+
+ getScrollLeft: function(){
+ return this.pageXOffset || document.documentElement.scrollLeft;
+ },
+
+ /*
+ Property: getSize
+ Same as <Element.getSize>
+ */
+
+ getSize: function(){
+ return {
+ 'scroll': {'x': this.getScrollLeft(), 'y': this.getScrollTop()},
+ 'size': {'x': this.getWidth(), 'y': this.getHeight()},
+ 'scrollSize': {'x': this.getScrollWidth(), 'y': this.getScrollHeight()}
+ };
+ },
+
+ //ignore
+ getOffsets: function(){return {'x': 0, 'y': 0}}
+
+});
+
+/*
+Script: Fx.Base.js
+ Contains <Fx.Base> and two Transitions.
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+var Fx = {};
+
+/*
+Class: Fx.Base
+ Base class for the Mootools Effects (Moo.Fx) library.
+
+Options:
+ onStart - the function to execute as the effect begins; nothing (<Class.empty>) by default.
+ onComplete - the function to execute after the effect has processed; nothing (<Class.empty>) by default.
+ transition - the equation to use for the effect see <Fx.Transitions>; default is <Fx.Transitions.sineInOut>
+ duration - the duration of the effect in ms; 500 is the default.
+ unit - the unit is 'px' by default (other values include things like 'em' for fonts or '%').
+ wait - boolean: to wait or not to wait for a current transition to end before running another of the same instance. defaults to true.
+ fps - the frames per second for the transition; default is 30
+*/
+
+Fx.Base = new Class({
+
+ getOptions: function(){
+ return {
+ onStart: Class.empty,
+ onComplete: Class.empty,
+ onCancel: Class.empty,
+ transition: Fx.Transitions.sineInOut,
+ duration: 500,
+ unit: 'px',
+ wait: true,
+ fps: 50
+ };
+ },
+
+ initialize: function(options){
+ this.element = this.element || null;
+ this.setOptions(this.getOptions(), options);
+ if (this.options.initialize) this.options.initialize.call(this);
+ },
+
+ step: function(){
+ var time = new Date().getTime();
+ if (time < this.time + this.options.duration){
+ this.cTime = time - this.time;
+ this.setNow();
+ this.increase();
+ } else {
+ this.stop(true);
+ this.now = this.to;
+ this.increase();
+ this.fireEvent('onComplete', this.element, 10);
+ this.callChain();
+ }
+ },
+
+ /*
+ Property: set
+ Immediately sets the value with no transition.
+
+ Arguments:
+ to - the point to jump to
+
+ Example:
+ >var myFx = new Fx.Style('myElement', 'opacity').set(0); //will make it immediately transparent
+ */
+
+ set: function(to){
+ this.now = to;
+ this.increase();
+ return this;
+ },
+
+ setNow: function(){
+ this.now = this.compute(this.from, this.to);
+ },
+
+ compute: function(from, to){
+ return this.options.transition(this.cTime, from, (to - from), this.options.duration);
+ },
+
+ /*
+ Property: start
+ Executes an effect from one position to the other.
+
+ Arguments:
+ from - integer: staring value
+ to - integer: the ending value
+
+ Examples:
+ >var myFx = new Fx.Style('myElement', 'opacity').start(0,1); //display a transition from transparent to opaque.
+ */
+
+ start: function(from, to){
+ if (!this.options.wait) this.stop();
+ else if (this.timer) return this;
+ this.from = from;
+ this.to = to;
+ this.time = new Date().getTime();
+ this.timer = this.step.periodical(Math.round(1000/this.options.fps), this);
+ this.fireEvent('onStart', this.element);
+ return this;
+ },
+
+ /*
+ Property: stop
+ Stops the transition.
+ */
+
+ stop: function(end){
+ if (!this.timer) return this;
+ this.timer = $clear(this.timer);
+ if (!end) this.fireEvent('onCancel', this.element);
+ return this;
+ },
+
+ //compat
+ custom: function(from, to){return this.start(from, to)},
+ clearTimer: function(end){return this.stop(end)}
+
+});
+
+Fx.Base.implement(new Chain);
+Fx.Base.implement(new Events);
+Fx.Base.implement(new Options);
+
+/*
+Class: Fx.Transitions
+ A collection of transition equations for use with the <Fx> Class.
+
+See Also:
+ <Fxtransitions.js> for a whole bunch of transitions.
+
+Credits:
+ Easing Equations, (c) 2003 Robert Penner (http://www.robertpenner.com/easing/), Open Source BSD License.
+*/
+
+Fx.Transitions = {
+
+ /* Property: linear */
+ linear: function(t, b, c, d){
+ return c*t/d + b;
+ },
+
+ /* Property: sineInOut */
+ sineInOut: function(t, b, c, d){
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ }
+
+};
+
+/*
+Script: Fx.CSS.js
+ Css parsing class for effects. Required by <Fx.Style>, <Fx.Styles>, <Fx.Elements>. No documentation needed, as its used internally.
+
+Author:
+ Christophe Beyls, <http://www.digitalia.be>,
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+Fx.CSS = {
+
+ select: function(property, to){
+ if (property.test('color', 'i')) return this.Color;
+ if (to.test && to.test(' ')) return this.Multi;
+ return this.Single;
+ },
+
+ parse: function(el, property, fromTo){
+ if (!fromTo.push) fromTo = [fromTo];
+ var from = fromTo[0], to = fromTo[1];
+ if (!to && to != 0){
+ to = from;
+ from = el.getStyle(property);
+ }
+ var css = this.select(property, to);
+ return {from: css.parse(from), to: css.parse(to), css: css};
+ }
+
+};
+
+Fx.CSS.Single = {
+
+ parse: function(value){
+ return parseFloat(value);
+ },
+
+ getNow: function(from, to, fx){
+ return fx.compute(from, to);
+ },
+
+ getValue: function(value, unit){
+ return value+unit;
+ }
+
+};
+
+Fx.CSS.Multi = {
+
+ parse: function(value){
+ return value.push ? value : value.split(' ').map(function(v){
+ return parseFloat(v);
+ });
+ },
+
+ getNow: function(from, to, fx){
+ var now = [];
+ for (var i = 0; i < from.length; i++) now[i] = fx.compute(from[i], to[i]);
+ return now;
+ },
+
+ getValue: function(value, unit){
+ return value.join(unit+' ')+unit;
+ }
+
+};
+
+Fx.CSS.Color = {
+
+ parse: function(value){
+ return value.push ? value : value.hexToRgb(true);
+ },
+
+ getNow: function(from, to, fx){
+ var now = [];
+ for (var i = 0; i < from.length; i++) now[i] = Math.round(fx.compute(from[i], to[i]));
+ return now;
+ },
+
+ getValue: function(value){
+ return 'rgb('+value.join(',')+')';
+ }
+
+};
+
+/*
+Script: Fx.Style.js
+ Contains <Fx.Style>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Fx.Style
+ The Style effect; Extends <Fx.Base>, inherits all its properties. Used to transition any css property from one value to another. Includes colors.
+ Colors must be in hex format.
+
+Arguments:
+ el - the $(element) to apply the style transition to
+ property - the property to transition
+ options - the Fx.Base options (see: <Fx.Base>)
+
+Example:
+ >var marginChange = new Fx.Style('myElement', 'margin-top', {duration:500});
+ >marginChange.start(10, 100);
+*/
+
+Fx.Style = Fx.Base.extend({
+
+ initialize: function(el, property, options){
+ this.element = $(el);
+ this.property = property;
+ this.parent(options);
+ },
+
+ /*
+ Property: hide
+ Same as <Fx.Base.set>(0)
+ */
+
+ hide: function(){
+ return this.set(0);
+ },
+
+ setNow: function(){
+ this.now = this.css.getNow(this.from, this.to, this);
+ },
+
+ set: function(to){
+ this.css = Fx.CSS.select(this.property, to);
+ return this.parent(this.css.parse(to));
+ },
+
+ /*
+ Property: start
+ displays the transition to the value/values passed in
+
+ Example:
+ (start code)
+ var var marginChange = new Fx.Style('myElement', 'margin-top', {duration:500});
+ marginChange.start(10); //tries to read current margin top value and goes from current to 10
+ (end)
+ */
+
+ start: function(from, to){
+ if (this.timer && this.options.wait) return this;
+ var parsed = Fx.CSS.parse(this.element, this.property, [from, to]);
+ this.css = parsed.css;
+ return this.parent(parsed.from, parsed.to);
+ },
+
+ increase: function(){
+ this.element.setStyle(this.property, this.css.getValue(this.now, this.options.unit));
+ }
+
+});
+
+/*
+Class: Element
+ Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+Element.extend({
+
+ /*
+ Property: effect
+ Applies an <Fx.Style> to the Element; This a shortcut for <Fx.Style>.
+
+ Example:
+ >var myEffect = $('myElement').effect('height', {duration: 1000, transition: Fx.Transitions.linear});
+ >myEffect.start(10, 100);
+ */
+
+ effect: function(property, options){
+ return new Fx.Style(this, property, options);
+ }
+
+});
+
+/*
+Script: Fx.Styles.js
+ Contains <Fx.Styles>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Fx.Styles
+ Allows you to animate multiple css properties at once; Extends <Fx.Base>, inherits all its properties. Includes colors.
+ Colors must be in hex format.
+
+Arguments:
+ el - the $(element) to apply the styles transition to
+ options - the fx options (see: <Fx.Base>)
+
+Example:
+ (start code)
+ var myEffects = new Fx.Styles('myElement', {duration: 1000, transition: Fx.Transitions.linear});
+
+ //height from 10 to 100 and width from 900 to 300
+ myEffects.start({
+ 'height': [10, 100],
+ 'width': [900, 300]
+ });
+
+ //or height from current height to 100 and width from current width to 300
+ myEffects.start({
+ 'height': 100,
+ 'width': 300
+ });
+ (end)
+*/
+
+Fx.Styles = Fx.Base.extend({
+
+ initialize: function(el, options){
+ this.element = $(el);
+ this.parent(options);
+ },
+
+ setNow: function(){
+ for (var p in this.from) this.now[p] = this.css[p].getNow(this.from[p], this.to[p], this);
+ },
+
+ set: function(to){
+ var parsed = {};
+ this.css = {};
+ for (var p in to){
+ this.css[p] = Fx.CSS.select(p, to[p]);
+ parsed[p] = this.css[p].parse(to[p]);
+ }
+ return this.parent(parsed);
+ },
+
+ /*
+ Property: start
+ The function you'll actually use to execute a transition.
+
+ Arguments:
+ an object
+
+ Example:
+ see <Fx.Styles>
+ */
+
+ start: function(obj){
+ if (this.timer && this.options.wait) return this;
+ this.now = {};
+ this.css = {};
+ var from = {}, to = {};
+ for (var p in obj){
+ var parsed = Fx.CSS.parse(this.element, p, obj[p]);
+ from[p] = parsed.from;
+ to[p] = parsed.to;
+ this.css[p] = parsed.css;
+ }
+ return this.parent(from, to);
+ },
+
+ increase: function(){
+ for (var p in this.now) this.element.setStyle(p, this.css[p].getValue(this.now[p], this.options.unit));
+ }
+
+});
+
+/*
+Class: Element
+ Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+Element.extend({
+
+ /*
+ Property: effects
+ Applies an <Fx.Styles> to the Element; This a shortcut for <Fx.Styles>.
+
+ Example:
+ >var myEffects = $(myElement).effects({duration: 1000, transition: Fx.Transitions.sineInOut});
+ >myEffects.start({'height': [10, 100], 'width': [900, 300]});
+ */
+
+ effects: function(options){
+ return new Fx.Styles(this, options);
+ }
+
+});
+
+/*
+Script: Fx.Elements.js
+ Contains <Fx.Elements>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Fx.Elements
+ Fx.Elements allows you to apply any number of styles transitions to a selection of elements. Includes colors (must be in hex format).
+
+Arguments:
+ elements - a collection of elements the effects will be applied to.
+ options - same as <Fx.Base> options.
+*/
+
+Fx.Elements = Fx.Base.extend({
+
+ initialize: function(elements, options){
+ this.elements = $$(elements);
+ this.parent(options);
+ },
+
+ setNow: function(){
+ for (var i in this.from){
+ var iFrom = this.from[i], iTo = this.to[i], iCss = this.css[i], iNow = this.now[i] = {};
+ for (var p in iFrom) iNow[p] = iCss[p].getNow(iFrom[p], iTo[p], this);
+ }
+ },
+
+ set: function(to){
+ var parsed = {};
+ this.css = {};
+ for (var i in to){
+ var iTo = to[i], iCss = this.css[i] = {}, iParsed = parsed[i] = {};
+ for (var p in iTo){
+ iCss[p] = Fx.CSS.select(p, iTo[p]);
+ iParsed[p] = iCss[p].parse(iTo[p]);
+ }
+ }
+ return this.parent(parsed);
+ },
+
+ /*
+ Property: start
+ Applies the passed in style transitions to each object named (see example). Each item in the collection is refered to as a numerical string ("1" for instance). The first item is "0", the second "1", etc.
+
+ Example:
+ (start code)
+ var myElementsEffects = new Fx.Elements($$('a'));
+ myElementsEffects.start({
+ '0': { //let's change the first element's opacity and width
+ 'opacity': [0,1],
+ 'width': [100,200]
+ },
+ '1': { //and the second one's opacity
+ 'opacity': [0.2, 0.5]
+ }
+ });
+ (end)
+ */
+
+ start: function(obj){
+ if (this.timer && this.options.wait) return this;
+ this.now = {};
+ this.css = {};
+ var from = {}, to = {};
+ for (var i in obj){
+ var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {}, iCss = this.css[i] = {};
+ for (var p in iProps){
+ var parsed = Fx.CSS.parse(this.elements[i], p, iProps[p]);
+ iFrom[p] = parsed.from;
+ iTo[p] = parsed.to;
+ iCss[p] = parsed.css;
+ }
+ }
+ return this.parent(from, to);
+ },
+
+ increase: function(){
+ for (var i in this.now){
+ var iNow = this.now[i], iCss = this.css[i];
+ for (var p in iNow) this.elements[i].setStyle(p, iCss[p].getValue(iNow[p], this.options.unit));
+ }
+ }
+
+});
+
+/*
+Script: Fx.Scroll.js
+ Contains <Fx.Scroll>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Fx.Scroll
+ Scroll any element with an overflow, including the window element.
+
+Arguments:
+ element - the element to scroll
+ options - same as <Fx.Base> options.
+*/
+
+Fx.Scroll = Fx.Base.extend({
+
+ initialize: function(element, options){
+ this.now = [];
+ this.element = $(element);
+ this.addEvent('onStart', function(){
+ this.element.addEvent('mousewheel', this.stop.bind(this, false));
+ }.bind(this));
+ this.removeEvent('onComplete', function(){
+ this.element.removeEvent('mousewheel', this.stop.bind(this, false));
+ }.bind(this));
+ this.parent(options);
+ },
+
+ setNow: function(){
+ for (var i = 0; i < 2; i++) this.now[i] = this.compute(this.from[i], this.to[i]);
+ },
+
+ /*
+ Property: scrollTo
+ Scrolls the chosen element to the x/y coordinates.
+
+ Arguments:
+ x - the x coordinate to scroll the element to
+ y - the y coordinate to scroll the element to
+ */
+
+ scrollTo: function(x, y){
+ if (this.timer && this.options.wait) return this;
+ var el = this.element.getSize();
+ var values = {'x': x, 'y': y};
+ for (var z in el.size){
+ var max = el.scrollSize[z] - el.size[z];
+ if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? Math.max(Math.min(values[z], max), 0) : max;
+ else values[z] = el.scroll[z];
+ }
+ return this.start([el.scroll.x, el.scroll.y], [values.x, values.y]);
+ },
+
+ /*
+ Property: toTop
+ Scrolls the chosen element to its maximum top.
+ */
+
+ toTop: function(){
+ return this.scrollTo(false, 0);
+ },
+
+ /*
+ Property: toBottom
+ Scrolls the chosen element to its maximum bottom.
+ */
+
+ toBottom: function(){
+ return this.scrollTo(false, 'full');
+ },
+
+ /*
+ Property: toLeft
+ Scrolls the chosen element to its maximum left.
+ */
+
+ toLeft: function(){
+ return this.scrollTo(0, false);
+ },
+
+ /*
+ Property: toRight
+ Scrolls the chosen element to its maximum right.
+ */
+
+ toRight: function(){
+ return this.scrollTo('full', false);
+ },
+
+ /*
+ Property: toElement
+ Scrolls the specified element to the position the passed in element is found. Only usable if the chosen element is == window.
+
+ Arguments:
+ el - the $(element) to scroll the window to
+ */
+
+ toElement: function(el){
+ return this.scrollTo($(el).getLeft(), $(el).getTop());
+ },
+
+ increase: function(){
+ this.element.scrollTo(this.now[0], this.now[1]);
+ }
+
+});
+
+/*
+Script: Fx.Slide.js
+ Contains <Fx.Slide>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Fx.Slide
+ The slide effect; slides an element in horizontally or vertically, the contents will fold inside. Extends <Fx.Base>, inherits all its properties.
+
+Note:
+ This effect works on any block element, but the element *cannot be positioned*; no margins or absolute positions. To position the element, put it inside another element (a wrapper div, for instance) and position that instead.
+
+Options:
+ mode - set it to vertical or horizontal. Defaults to vertical.
+ and all the <Fx.Base> options
+
+Example:
+ (start code)
+ var mySlider = new Fx.Slide('myElement', {duration: 500});
+ mySlider.toggle() //toggle the slider up and down.
+ (end)
+*/
+
+Fx.Slide = Fx.Base.extend({
+
+ initialize: function(el, options){
+ this.element = $(el).setStyle('margin', 0);
+ this.wrapper = new Element('div').injectAfter(this.element).setStyle('overflow', 'hidden').adopt(this.element);
+ this.setOptions({'mode': 'vertical'}, options);
+ this.now = [];
+ this.parent(this.options);
+ },
+
+ setNow: function(){
+ for (var i = 0; i < 2; i++) this.now[i] = this.compute(this.from[i], this.to[i]);
+ },
+
+ vertical: function(){
+ this.margin = 'top';
+ this.layout = 'height';
+ this.offset = this.element.offsetHeight;
+ return [this.element.getStyle('margin-top').toInt(), this.wrapper.getStyle('height').toInt()];
+ },
+
+ horizontal: function(){
+ this.margin = 'left';
+ this.layout = 'width';
+ this.offset = this.element.offsetWidth;
+ return [this.element.getStyle('margin-left').toInt(), this.wrapper.getStyle('width').toInt()];
+ },
+
+ /*
+ Property: slideIn
+ slides the elements in view horizontally or vertically, depending on the mode parameter or options.mode.
+ */
+
+ slideIn: function(mode){
+ return this.start(this[mode || this.options.mode](), [0, this.offset]);
+ },
+
+ /*
+ Property: slideOut
+ slides the elements out of the view horizontally or vertically, depending on the mode parameter or options.mode.
+ */
+
+ slideOut: function(mode){
+ return this.start(this[mode || this.options.mode](), [-this.offset, 0]);
+ },
+
+ /*
+ Property: hide
+ Hides the element without a transition.
+ */
+
+ hide: function(mode){
+ this[mode || this.options.mode]();
+ return this.set([-this.offset, 0]);
+ },
+
+ /*
+ Property: show
+ Shows the element without a transition.
+ */
+
+ show: function(mode){
+ this[mode || this.options.mode]();
+ return this.set([0, this.offset]);
+ },
+
+ /*
+ Property: toggle
+ Slides in or Out the element, depending on its state
+ */
+
+ toggle: function(mode){
+ if (this.wrapper.offsetHeight == 0 || this.wrapper.offsetWidth == 0) return this.slideIn(mode);
+ else return this.slideOut(mode);
+ },
+
+ increase: function(){
+ this.element.setStyle('margin-'+this.margin, this.now[0]+this.options.unit);
+ this.wrapper.setStyle(this.layout, this.now[1]+this.options.unit);
+ }
+
+});
+
+/*
+Script: Fx.Transitions.js
+ Cool transitions, to be used with all the effects.
+
+Author:
+ Robert Penner, <http://www.robertpenner.com/easing/>, modified to be used with mootools.
+
+License:
+ Easing Equations v1.5, (c) 2003 Robert Penner, all rights reserved. Open Source BSD License.
+*/
+
+/*
+Class: Fx.Transitions
+ A collection of tweaning transitions for use with the <Fx.Base> classes.
+*/
+
+Fx.Transitions = {
+
+ /* Property: linear */
+ linear: function(t, b, c, d){
+ return c*t/d + b;
+ },
+
+ /* Property: quadIn */
+ quadIn: function(t, b, c, d){
+ return c*(t/=d)*t + b;
+ },
+
+ /* Property: quatOut */
+ quadOut: function(t, b, c, d){
+ return -c *(t/=d)*(t-2) + b;
+ },
+
+ /* Property: quadInOut */
+ quadInOut: function(t, b, c, d){
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+
+ /* Property: cubicIn */
+ cubicIn: function(t, b, c, d){
+ return c*(t/=d)*t*t + b;
+ },
+
+ /* Property: cubicOut */
+ cubicOut: function(t, b, c, d){
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+
+ /* Property: cubicInOut */
+ cubicInOut: function(t, b, c, d){
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+
+ /* Property: quartIn */
+ quartIn: function(t, b, c, d){
+ return c*(t/=d)*t*t*t + b;
+ },
+
+ /* Property: quartOut */
+ quartOut: function(t, b, c, d){
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+
+ /* Property: quartInOut */
+ quartInOut: function(t, b, c, d){
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+
+ /* Property: quintIn */
+ quintIn: function(t, b, c, d){
+ return c*(t/=d)*t*t*t*t + b;
+ },
+
+ /* Property: quintOut */
+ quintOut: function(t, b, c, d){
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+
+ /* Property: quintInOut */
+ quintInOut: function(t, b, c, d){
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+
+ /* Property: sineIn */
+ sineIn: function(t, b, c, d){
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+
+ /* Property: sineOut */
+ sineOut: function(t, b, c, d){
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+
+ /* Property: sineInOut */
+ sineInOut: function(t, b, c, d){
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+
+ /* Property: expoIn */
+ expoIn: function(t, b, c, d){
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+
+ /* Property: expoOut */
+ expoOut: function(t, b, c, d){
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+
+ /* Property: expoInOut */
+ expoInOut: function(t, b, c, d){
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+
+ /* Property: circIn */
+ circIn: function(t, b, c, d){
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+
+ /* Property: circOut */
+ circOut: function(t, b, c, d){
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+
+ /* Property: circInOut */
+ circInOut: function(t, b, c, d){
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+
+ /* Property: elasticIn */
+ elasticIn: function(t, b, c, d, a, p){
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (!a) a = 1;
+ if (a < Math.abs(c)){ a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin(c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+
+ /* Property: elasticOut */
+ elasticOut: function(t, b, c, d, a, p){
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (!a) a = 1;
+ if (a < Math.abs(c)){ a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin(c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+
+ /* Property: elasticInOut */
+ elasticInOut: function(t, b, c, d, a, p){
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); if (!a) a = 1;
+ if (a < Math.abs(c)){ a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin(c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+
+ /* Property: backIn */
+ backIn: function(t, b, c, d, s){
+ if (!s) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+
+ /* Property: backOut */
+ backOut: function(t, b, c, d, s){
+ if (!s) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+
+ /* Property: backInOut */
+ backInOut: function(t, b, c, d, s){
+ if (!s) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+
+ /* Property: bounceIn */
+ bounceIn: function(t, b, c, d){
+ return c - Fx.Transitions.bounceOut (d-t, 0, c, d) + b;
+ },
+
+ /* Property: bounceOut */
+ bounceOut: function(t, b, c, d){
+ if ((t/=d) < (1/2.75)){
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)){
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)){
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+
+ /* Property: bounceInOut */
+ bounceInOut: function(t, b, c, d){
+ if (t < d/2) return Fx.Transitions.bounceIn(t*2, 0, c, d) * .5 + b;
+ return Fx.Transitions.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+
+};
+
+/*
+Script: Drag.Base.js
+ Contains <Drag.Base>, <Element.makeResizable>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+var Drag = {};
+
+/*
+Class: Drag.Base
+ Modify two css properties of an element based on the position of the mouse.
+
+Arguments:
+ el - the $(element) to apply the transformations to.
+ options - optional. The options object.
+
+Options:
+ handle - the $(element) to act as the handle for the draggable element. defaults to the $(element) itself.
+ modifiers - an object. see Modifiers Below.
+ onStart - optional, function to execute when the user starts to drag (on mousedown);
+ onComplete - optional, function to execute when the user completes the drag.
+ onDrag - optional, function to execute at every step of the drag
+ limit - an object, see Limit below.
+ snap - optional, the distance you have to drag before the element starts to respond to the drag. defaults to false
+
+ modifiers:
+ x - string, the style you want to modify when the mouse moves in an horizontal direction. defaults to 'left'
+ y - string, the style you want to modify when the mouse moves in a vertical direction. defaults to 'top'
+
+ limit:
+ x - array with start and end limit relative to modifiers.x
+ y - array with start and end limit relative to modifiers.y
+*/
+
+Drag.Base = new Class({
+
+ getOptions: function(){
+ return {
+ handle: false,
+ unit: 'px',
+ onStart: Class.empty,
+ onComplete: Class.empty,
+ onSnap: Class.empty,
+ onDrag: Class.empty,
+ limit: false,
+ modifiers: {x: 'left', y: 'top'},
+ snap: 6
+ };
+ },
+
+ initialize: function(el, options){
+ this.setOptions(this.getOptions(), options);
+ this.element = $(el);
+ this.handle = $(this.options.handle) || this.element;
+ this.mouse = {'now': {}, 'pos': {}};
+ this.value = {'start': {}, 'now': {}};
+ this.bound = {'start': this.start.bindWithEvent(this)};
+ this.handle.addEvent('mousedown', this.bound.start);
+ if (this.options.initialize) this.options.initialize.call(this);
+ },
+
+ start: function(event){
+ this.mouse.start = event.page;
+ var limit = this.options.limit;
+ this.limit = {'x': [], 'y': []};
+ for (var z in this.options.modifiers){
+ this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt();
+ this.mouse.pos[z] = event.page[z] - this.value.now[z];
+ if (limit && limit[z]){
+ for (var i = 0; i < 2; i++){
+ if ($chk(limit[z][i])) this.limit[z][i] = limit[z][i].apply ? limit[z][i].call(this) : limit[z][i];
+ }
+ }
+ }
+ this.bound.drag = this.drag.bindWithEvent(this);
+ this.bound.checkAndDrag = this.checkAndDrag.bindWithEvent(this);
+ this.bound.stop = this.stop.bind(this);
+ document.addEvent('mousemove', this.options.snap ? this.bound.checkAndDrag : this.bound.drag);
+ document.addEvent('mouseup', this.bound.stop);
+ this.fireEvent('onStart', this.element);
+ event.stop();
+ },
+
+ checkAndDrag: function(event){
+ var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
+ if (distance > this.options.snap){
+ document.removeEvent('mousemove', this.bound.checkAndDrag);
+ document.addEvent('mousemove', this.bound.drag);
+ this.drag(event);
+ this.fireEvent('onSnap', this.element);
+ }
+ event.stop();
+ },
+
+ drag: function(event){
+ this.out = false;
+ this.mouse.now = event.page;
+ for (var z in this.options.modifiers){
+ this.value.now[z] = event.page[z] - this.mouse.pos[z];
+ if (this.limit[z]){
+ if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){
+ this.value.now[z] = this.limit[z][1];
+ this.out = true;
+ } else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){
+ this.value.now[z] = this.limit[z][0];
+ this.out = true;
+ }
+ }
+ this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit);
+ }
+ this.fireEvent('onDrag', this.element);
+ event.stop();
+ },
+
+ detach: function(){
+ this.handle.removeEvent('mousedown', this.bound.start);
+ },
+
+ stop: function(){
+ document.removeEvent('mousemove', this.bound.drag);
+ document.removeEvent('mouseup', this.bound.stop);
+ this.fireEvent('onComplete', this.element);
+ }
+
+});
+
+Drag.Base.implement(new Events);
+Drag.Base.implement(new Options);
+
+/*
+Class: Element
+ Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+Element.extend({
+
+ /*
+ Property: makeResizable
+ Makes an element resizable (by dragging) with the supplied options.
+
+ Arguments:
+ options - see <Drag.Base> for acceptable options.
+ */
+
+ makeResizable: function(options){
+ return new Drag.Base(this, Object.extend(options || {}, {modifiers: {x: 'width', y: 'height'}}));
+ }
+
+});
+
+/*
+Script: Scroller.js
+ Contains the <Scroller>.
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Scroller
+ The Scroller is a class to scroll any element with an overflow (including the window) when the mouse cursor reaches certain buondaries of that element.
+ You must call its start method to start listening to mouse movements.
+
+Arguments:
+ element - required, the element to scroll.
+ options - optional, see options below, and <Fx.Base> options.
+
+Options:
+ area - integer, the necessary boundaries to make the element scroll.
+ velocity - integer, velocity ratio, the modifier for the window scrolling speed.
+ onChange - optionally, when the mouse reaches some boundaries, you can choose to alter some other values, instead of the scrolling offsets.
+ Automatically passes as parameters x and y values.
+*/
+
+var Scroller = new Class({
+
+ getOptions: function(){
+ return {
+ area: 20,
+ velocity: 1,
+ onChange: function(x, y){
+ this.element.scrollTo(x, y);
+ }
+ };
+ },
+
+ initialize: function(element, options){
+ this.setOptions(this.getOptions(), options);
+ this.element = $(element);
+ this.mousemover = ([window, document].test(element)) ? $(document.body) : this.element;
+ },
+
+ /*
+ Property: start
+ The scroller starts listening to mouse movements.
+ */
+
+ start: function(){
+ this.coord = this.getCoords.bindWithEvent(this);
+ this.mousemover.addEvent('mousemove', this.coord);
+ },
+
+ /*
+ Property: stop
+ The scroller stops listening to mouse movements.
+ */
+
+ stop: function(){
+ this.mousemover.removeEvent('mousemove', this.coord);
+ this.timer = $clear(this.timer);
+ },
+
+ getCoords: function(event){
+ this.page = (this.element == window) ? event.client : event.page;
+ if (!this.timer) this.timer = this.scroll.periodical(50, this);
+ },
+
+ scroll: function(){
+ var el = this.element.getSize();
+ var pos = this.element.getOffsets();
+
+ var change = {'x': 0, 'y': 0};
+ for (var z in this.page){
+ if (this.page[z] < (this.options.area + pos[z]) && el.scroll[z] != 0)
+ change[z] = (this.page[z] - this.options.area - pos[z]) * this.options.velocity;
+ else if (this.page[z] + this.options.area > (el.size[z] + pos[z]) && el.scroll[z] + el.size[z] != el.scrollSize[z])
+ change[z] = (this.page[z] - el.size[z] + this.options.area - pos[z]) * this.options.velocity;
+ }
+ if (change.y || change.x) this.fireEvent('onChange', [el.scroll.x + change.x, el.scroll.y + change.y]);
+ }
+
+});
+
+Scroller.implement(new Events);
+Scroller.implement(new Options);
+
+/*
+Script: Slider.js
+ Contains <Slider>
+
+Author:
+ Valerio Proietti, <http://mad4milk.net>
+
+License:
+ MIT-style license.
+*/
+
+/*
+Class: Slider
+ Creates a slider with two elements: a knob and a container. Returns the values.
+
+Arguments:
+ element - the knob container
+ knob - the handle
+ options - see Options below
+
+Options:
+ onChange - a function to fire when the value changes.
+ onComplete - a function to fire when you're done dragging.
+ onTick - optionally, you can alter the onTick behavior, for example displaying an effect of the knob moving to the desired position.
+ Passes as parameter the new position.
+ steps - the number of steps for your slider.
+ mode - either 'horizontal' or 'vertical'. defaults to horizontal.
+ wheel - experimental! Also use the mouse wheel to control the slider. defaults to false.
+*/
+
+var Slider = new Class({
+
+ getOptions: function(){
+ return {
+ onChange: Class.empty,
+ onComplete: Class.empty,
+ onTick: function(pos){
+ this.knob.setStyle(this.p, pos+'px');
+ },
+ steps: 100,
+ mode: 'horizontal',
+ wheel: false
+ };
+ },
+
+ initialize: function(el, knob, options){
+ this.element = $(el);
+ this.knob = $(knob);
+ this.setOptions(this.getOptions(), options);
+
+ this.previousChange = -1;
+ this.previousEnd = -1;
+ this.step = -1;
+
+ this.element.addEvent('mousedown', this.clickedElement.bindWithEvent(this));
+
+ if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement.bindWithEvent(this));
+
+ if (this.options.mode == 'horizontal'){
+ this.z = 'x'; this.p = 'left';
+ this.max = this.element.offsetWidth-this.knob.offsetWidth;
+ this.half = this.knob.offsetWidth/2;
+ this.getPos = this.element.getLeft.bind(this.element);
+ } else if (this.options.mode == 'vertical'){
+ this.z = 'y'; this.p = 'top';
+ this.max = this.element.offsetHeight-this.knob.offsetHeight;
+ this.half = this.knob.offsetHeight/2;
+ this.getPos = this.element.getTop.bind(this.element);
+ }
+
+ this.knob.setStyle('position', 'relative').setStyle(this.p, 0);
+
+ var modSlide = {}, limSlide = {};
+
+ limSlide[this.z] = [0, this.max];
+ modSlide[this.z] = this.p;
+
+ this.drag = new Drag.Base(this.knob, {
+ limit: limSlide,
+ snap: 0,
+ modifiers: modSlide,
+ onStart: function(){
+ this.draggedKnob();
+ }.bind(this),
+ onDrag: function(){
+ this.draggedKnob();
+ }.bind(this),
+ onComplete: function(){
+ this.draggedKnob();
+ this.end();
+ }.bind(this)
+ });
+ if (this.options.initialize) this.options.initialize.call(this);
+ },
+
+ /*
+ Property: set
+ The slider will get the step you pass.
+
+ Arguments:
+ step - one integer
+ */
+
+ set: function(step){
+ if (step > this.options.steps) step = this.options.steps;
+ else if (step < 0) step = 0;
+ this.step = step;
+ this.checkStep();
+ this.end();
+ this.fireEvent('onTick', this.toPosition(this.step)+'');
+ return this;
+ },
+
+ scrolledElement: function(event){
+ if (event.wheel < 0) this.set(this.step + 1);
+ else if (event.wheel > 0) this.set(this.step - 1);
+ event.stop();
+ },
+
+ clickedElement: function(event){
+ var position = event.page[this.z] - this.getPos() - this.half;
+ if (position > this.max) position = this.max;
+ else if (position < 0) position = 0;
+ this.step = this.toStep(position);
+ this.checkStep();
+ this.end();
+ this.fireEvent('onTick', position+'');
+ },
+
+ draggedKnob: function(){
+ this.step = this.toStep(this.drag.value.now[this.z]);
+ this.checkStep();
+ },
+
+ checkStep: function(){
+ if (this.previousChange != this.step){
+ this.previousChange = this.step;
+ this.fireEvent('onChange', this.step);
+ }
+ },
+
+ end: function(){
+ if (this.previousEnd !== this.step){
+ this.previousEnd = this.step;
+ this.fireEvent('onComplete', this.step+'');
+ }
+ },
+
+ toStep: function(position){
+ return Math.round(position/this.max*this.options.steps);
+ },
+
+ toPosition: function(step){
+ return (this.max)*step/this.options.steps;
+ }
+
+});
+
+Slider.implement(new Events);
+Slider.implement(new Options); \ No newline at end of file
diff --git a/emacs.d/nxhtml/nxhtml/doc/nxhtml-changes.html b/emacs.d/nxhtml/nxhtml/doc/nxhtml-changes.html
new file mode 100644
index 0000000..81339df
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/nxhtml-changes.html
@@ -0,0 +1,3395 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>News and Notes about nXhtml</title>
+ <link href="wd/grapes/nxhtml-grapes.css" rel="StyleSheet" type="text/css" />
+ <style type="text/css">
+#nxhtml-home a {
+ /* Image */
+ display: block;
+ background: transparent url("img/getitbuttons.png") 0 0 no-repeat;
+ overflow: hidden;
+ width: 200px;
+ xheight: 35px;
+ /* Text placement and size, etc */
+ text-align: center;
+ padding-top: 11px;
+ font-size: 12px;
+ padding-bottom: 9px;
+ text-decoration: none;
+ white-space: nowrap;
+ margin: 0;
+ border: none;
+}
+#nxhtml-home a:hover {
+ background-position: 0 -35px;
+ color: yellow;
+}
+.bugfix {
+ background-color: #ffd700;
+}
+
+</style>
+ </head>
+ <body>
+ <div id="container">
+
+ <div id="rgtcol">
+ <p id="nxhtml-home"><a href='nxhtml.html'>To nXhtml main page</a></p>
+
+ <h1>News and Notes about nXhtml</h1>
+
+ <dl>
+
+ <dt id="state-of-the-art" style="margin-top:1em;
+ background-color: #66cd5c;
+ background-color: #96cd5c;
+ padding: 0.5em;
+ ">The State of the Art</dt>
+ <dd style="background-color: #f9e529; padding: 0.5em">
+ <p>
+ I believe now that MuMaMo (the multi major mode support)
+ is fairly stable. It is now possible to have chunks in
+ chunks and it is reasonably fast.
+ </p>
+ <p>
+ The major mode than once gave the name to this package
+ for web devoloping, nxhtml-mode, has long been stable.
+ There are a lot of other minor things in this package.
+ Of course everything is not perfect. Bug report and
+ taking part in the development is very welcome. Go to
+ the project page on Launchpad if you want to join!
+ </p>
+ <p>
+ If you want to know how it works, install and test. It
+ will not harm, everything is autoloaded so it will not
+ slow down your Emacs - eh, a tiny little bit perhaps if
+ you really use it, but then you will also get the
+ benefits of it.
+ </p>
+ <p>
+ If you want to know current bug status go to Launchpad!
+ </p>
+ </dd>
+
+ <dt id="hadron-bugs" style="margin-top:1em;">Thanks for testing!</dt>
+ <dd>
+ <p>
+ I want to thanks the testers and bug reporters (who have
+ been many now), especially to my first testers Hadron
+ Quark and Eric Lilja, for helping me by testing and
+ pointing out bugs and weaknesses, most of them related
+ to editing of PHP.
+ </p>
+ <p>
+ Without testers all kind of problems I just can't
+ imagine myself would still be there in nXhtml. For
+ example Hadron told me once that he got the error
+ <i>(wrong-type-argument stringp nil)</i>. Eh, I replied, are
+ you sure. Yes he was. I tried the same file as him. No
+ error.
+ </p>
+ <p>
+ The error happened during fontification so the error
+ message above was all we had. A real black box for
+ me. Or perhaps black magic? After much confusion and
+ some hard work we finally found out what it was and I
+ implemented a better way to catch such errors. If Hadron
+ would have given up the problem would still have been
+ there. Some problems are just impossible to solve
+ without good cooperation. So, again, thanks Hadron.
+ </p>
+ <p>
+ BTW, I will perhaps add some even better way to Emacs to
+ catch these errors so other can benefit from our
+ insights too, but that requires some time and effort
+ which I can't afford right now.
+ </p>
+ <p>
+ If is now a bit more easy to take care of errors since
+ there is a good bug database for nXhtml at Launchpad.
+ </p>
+ </dd>
+
+ <dt id="underline-bug" style="margin-top:1em;">Long Red Underlines</dt>
+ <dd>
+ <p>
+ Because of a bug in Emacs 22.1 you can sometimes (at the
+ end of a line) get long red lines instead of just a
+ single underlined character. Many users (me included)
+ find this quite a bit disturbing. I have therefore added
+ a command to quickly hide/show the underlines. This is
+ on <em>C-c C-w</em> (nxhtml-toggle-visible-warnings, key
+ binding changed to <em>C-c _</em> in later versions of
+ nXhtml).
+ </p>
+ <p>
+ This is particular useful for example in the case where
+ you edit a PHP file and are bound to get a lot of XHTML
+ validation errors.
+ </p>
+ </dd>
+
+ <dt id="php-attribute-values" style="margin-top:1em;">Attribute values computed by PHP</dt>
+ <dd>
+ <p>
+ If you want to have attribute values computed by PHP
+ here is a way how to structure that to avoid breaking
+ completion and validation in the XHTML part unnessecary:
+ </p>
+ <p style="margin-left:2em">
+ &lt;img src=&quot;images/linux.png&quot; title=&quot;&lt;?php foo(&quot;bar&quot;);?&gt;&quot;/&gt;
+ </p>
+ <p>
+ Unfortunately that still breaks XHTML validation since
+ &lt; is not allowed in strings. In the long run I
+ believe the XML validator has to be broken up so that it
+ avoids parsing the string here (in PHP files).
+ </p>
+ <p>
+ For now I have implemented a workaround.
+ If you are using constructs like those above then turn on <em>mumamo-alt-php-tags-mode</em>.
+ This will temporarily replace the above with
+ </p>
+ <p style="margin-left:2em">
+ &lt;img src=&quot;images/linux.png&quot; title=&quot;(?php foo(&quot;bar&quot;);?)&quot;/&gt;
+ </p>
+ <p>
+ However on the screen you will still see the original
+ string and when writing to file the correct characters
+ will be used.
+ </p>
+ </dd>
+
+ <dt id="pi-note" style="margin-top:1em;">A note for PHP and its cousins</dt>
+ <dd>
+ <p>
+ The rules for a process instruction in XML, like &lt;?php
+ ... ?&gt; says that the text can contain any text except
+ <em>?&gt;</em>. So if you want to output that string
+ from PHP then break it up so it does not look as ?&gt; in
+ the source file.
+ </p>
+ <p>
+ It might be good to break up the beginning part of the
+ process instructions too. And please note that to use
+ XHTML validation or completion you should avoid using
+ &lt; in strings, since it is not allowed there.
+ </p>
+ </dd>
+
+ <dt id="mmm-compat" style="margin-top:1em;">Why the chunks are not compatible with mmm</dt>
+ <dd>
+ <p>
+ Some people have asked why the way to specify chunks in
+ mumamo-mode is not compatible with the old mmm-mode. The
+ answer is that I was not sure that the way used in
+ mmm-mode for specifying the chunks was flexible enough.
+ </p>
+ <p>
+ Some people have also wondered why MuMaMo does not find
+ chunks just as simple as multi-mode does. The answer is
+ it did from the beginning. However that way (looking
+ around current point) is not stable enough. Multi major
+ modes are a bit different in this respect than normal
+ major modes. More things can go wrong when you are
+ guessing.
+ </p>
+ </dd>
+
+ </dl>
+
+ <h1 id="change-history">nXhtml Changes</h1>
+
+ <div>
+ <a href="#v0.89">v0.89</a>
+ <a href="#v0.90">v0.90</a>
+ <a href="#v0.91">v0.91</a>
+ <a href="#v0.92">v0.92</a>
+ <a href="#v0.93">v0.93</a>
+ <a href="#v0.94">v0.94</a>
+ <a href="#v0.95">v0.95</a>
+ <a href="#v0.96">v0.96</a>
+ <a href="#v0.97">v0.97</a>
+ <a href="#v0.98">v0.98</a>
+ <a href="#v0.99">v0.99</a>
+ <a href="#v1.00">v1.00</a>
+ <a href="#v1.01">v1.01</a>
+ <a href="#v1.02">v1.02</a>
+ <a href="#v1.03">v1.03</a>
+ <a href="#v1.04">v1.04</a>
+ <a href="#v1.10">v1.10</a>
+ <a href="#v1.11">v1.11</a>
+ <a href="#v1.12">v1.12</a>
+ <a href="#v1.13">v1.13</a>
+ <a href="#v1.14">v1.14</a>
+ <a href="#v1.15">v1.15</a>
+ <a href="#v1.16">v1.16</a>
+ <a href="#v1.17">v1.17</a>
+ <a href="#v1.18">v1.18</a>
+ <a href="#v1.19">v1.19</a>
+ <a href="#v1.20">v1.20</a>
+ <a href="#v1.21">v1.21</a>
+ <a href="#v1.22">v1.22</a>
+ <a href="#v1.23">v1.23</a>
+ <a href="#v1.24">v1.24</a>
+ <a href="#v1.25">v1.25</a>
+ <a href="#v1.26">v1.26</a>
+ <a href="#v1.27">v1.27</a>
+ <a href="#v1.28">v1.28</a>
+ <a href="#v1.29">v1.29</a>
+ <a href="#v1.30">v1.30</a>
+ <a href="#v1.31">v1.31</a>
+ <a href="#v1.32">v1.32</a>
+ <a href="#v1.33">v1.33</a>
+ <a href="#v1.34">v1.34</a>
+ <a href="#v1.35">v1.35</a>
+ <a href="#v1.36">v1.36</a>
+ <a href="#v1.37">v1.37</a>
+ <a href="#v1.38">v1.38</a>
+ <a href="#v1.39">v1.39</a>
+ <a href="#v1.40">v1.40</a>
+ <a href="#v1.41">v1.41</a>
+ <a href="#v1.42">v1.42</a>
+ <a href="#v1.43">v1.43</a>
+ <a href="#v1.44">v1.44</a>
+ <a href="#v1.45">v1.45</a>
+ <a href="#v1.46">v1.46</a>
+ <a href="#v1.47">v1.47</a>
+ <a href="#v1.48">v1.48</a>
+ <a href="#v1.49">v1.49</a>
+ <a href="#v1.50">v1.50</a>
+ <a href="#v1.51">v1.51</a>
+ <a href="#v1.52">v1.52</a>
+ <a href="#v1.53">v1.53</a>
+ <a href="#v1.54">v1.54</a>
+ <a href="#v1.55">v1.56</a>
+ <a href="#v1.56">v1.56</a>
+ <a href="#v1.57">v1.57</a>
+ <a href="#v1.58">v1.58</a>
+ <a href="#v1.59">v1.59</a>
+ <a href="#v1.60">v1.60</a>
+ <a href="#v1.61">v1.61</a>
+ <a href="#v1.62">v1.62</a>
+ <a href="#v1.63">v1.63</a>
+ <a href="#v1.64">v1.64</a>
+ <a href="#v1.65">v1.65</a>
+ <a href="#v1.66">v1.66</a>
+ <a href="#v1.67">v1.67</a>
+ <a href="#v1.68">v1.68</a>
+ <a href="#v1.69">v1.69</a>
+ <a href="#v1.70">v1.70</a>
+ <a href="#v1.71">v1.71</a>
+ <a href="#v1.72">v1.72</a>
+ <a href="#v1.73">v1.73</a>
+ <a href="#v1.74">v1.74</a>
+ <a href="#v1.75">v1.75</a>
+ <a href="#v1.76">v1.76</a>
+ <a href="#v1.77">v1.77</a>
+ <a href="#v1.78">v1.78</a>
+ <a href="#v1.79">v1.79</a>
+ <a href="#v1.80">v1.80</a>
+ <a href="#v1.81">v1.81</a>
+ <a href="#v1.82">v1.82</a>
+ <a href="#v1.83">v1.83</a>
+ <a href="#v1.84">v1.84</a>
+ <a href="#v1.85">v1.85</a>
+ <a href="#v1.86">v1.86</a>
+ <a href="#v1.87">v1.87</a>
+ <a href="#v1.88">v1.88</a>
+ <a href="#v1.89">v1.89</a>
+ <a href="#v1.90">v1.90</a>
+ <a href="#v1.91">v1.91</a>
+ <a href="#v1.92">v1.92</a>
+ <a href="#v1.93">v1.93</a>
+ <a href="#v1.94">v1.94</a>
+ <a href="#v1.95">v1.95</a>
+ <a href="#v1.96">v1.96</a>
+ <a href="#v1.97">v1.97</a>
+ <a href="#v1.98">v1.98</a>
+ <a href="#v1.99">v1.99</a>
+ <a href="#v2.00">v2.00</a>
+ <a href="#v2.01">v2.01</a>
+ <a href="#v2.02">v2.02</a>
+ <a href="#v2.03">v2.03</a>
+ <a href="#v2.04">v2.04</a>
+ <a href="#v2.05">v2.05</a>
+ <a href="#v2.06">v2.06</a>
+ <a href="#v2.07">v2.07</a>
+ <a href="#v2.08">v2.08</a>
+ </div>
+
+ <dl>
+ <dt id="v0.89">0.89</dt>
+ <dd>
+ <ul>
+ <li>
+ Corrected autostart for nXhtml when not used together with EmacsW32.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.90">0.90</dt>
+ <dd>
+ <ul>
+ <li>
+ Improved display of XML path.
+ </li>
+ <li>
+ Discontinued xmple-mode.
+ </li>
+ <li>
+ New major modes nxhtml-part-mode/nxml-part-mode replaces
+ minor mode xmlpe-mode. (While moving the code to
+ nxhtml-part.el I also fixed a bug in Xmple minor mode that
+ made Emacs take 99% of the CPU.)
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.91">0.91</dt>
+ <dd>
+ <ul>
+ <li>
+ Fixed some calls to perl which prevented uploading of
+ a site of you did not have perl in the same location
+ as me.
+ </li>
+ <li>
+ Glued together things so that editing PHP files works
+ as I intended. (This means that Emacs switches between
+ php-mode and nxhtml-part-mode automatically when
+ moving point. And that you can use completion.)
+ </li>
+ <li>
+ Starting working on the documentation for nXhtml.
+ New layout to the documentation files.
+ Examples with images.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.92">0.92</dt>
+ <dd>
+ <ul>
+ <li>
+ Fixes to make the switching between php and xhtml
+ style editing work better.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.93">0.93</dt>
+ <dd>
+ <ul>
+ <li>
+ Better error handling when switching to editing
+ embedded JavaScript and CSS.
+ </li>
+ <li>
+ Removed PHP spec from embedded switching since they
+ interfered with the automatic switching between php
+ and xhtml.
+ </li>
+ <li>
+ Gives an error message if web host is not defined in
+ site when trying to use View Uploaded File and
+ cousins.
+ </li>
+ <li>
+ Gives a ready message when finished uploading a single
+ file.
+ </li>
+ <li>
+ When using Mode Switching at &lt;? ... ?&gt; mode
+ switching could occur in wrong buffer. Fixed together
+ with some other buffer problems.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.94">0.94</dt>
+ <dd>
+ <ul>
+ <li>
+ Add http://www.w3.org/ to the help sites for CSS.
+ </li>
+ <li>
+ Included a CSS mode.
+ </li>
+ <li>
+ Added a menu entry for bug reporting.
+ </li>
+ <li>
+ Renamed menu bar entry from XHTML to nXhtml for clarity.
+ (But nXml menu bar entry is still called XML.)
+ </li>
+ <li>
+ Added work around for globalized minor modes in the
+ cases of MLinks, XML Path and mode switching at &lt;? ... ?&gt;.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.95">0.95</dt>
+ <dd>
+ <ul>
+ <li>
+ Added workaround for the problem with the first
+ keyboard key after automatically switching of mode at
+ &lt;? ... ?&gt;.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.96">0.96</dt>
+ <dd>
+ <ul>
+ <li>
+ Added support for multiple major modes with mumamo.el.
+ </li>
+ <li>
+ More conventient handling of links. They can now be
+ opened in the same window, 'other window' or in a new
+ frame.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.97">0.97</dt>
+ <dd>
+ <ul>
+ <li>
+ Schema was not setup after starting new page so
+ completion did not work. Fixed.
+ </li>
+ <li>
+ Added http://xhtml.com/ to help sites for XHTML.
+ </li>
+ <li>
+ Added the concept of <em>fictive XML validation
+ headers</em>. These are just text parsed by the nXml
+ validation parser to get a start state before starting
+ parsing a buffer. This allows the use of the nXml
+ completion in buffers where there are no XML header.
+ Such a header is often lacking for example in PHP code
+ since the XHTML header is often generated dynamically.
+ </li>
+ <li>
+ Because of the change above <em>nxhtml-part-mode</em>
+ is no longer needed and is therefore declared
+ obsolete.
+ </li>
+ <li>
+ Corrected a bug in mlinks.el that prevented opening an
+ HTML link in a other window or a new frame.
+ </li>
+ <li>
+ Added support for JSP, eRuby and some support for perl
+ in mumamo.el.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.98">0.98</dt>
+ <dd>
+ <ul>
+ <li>
+ Mumamo was not found when nXhtml was installed with
+ just the zip file. Corrected. (nXhtml is also
+ installed when you install EmacsW32.)
+ </li>
+ <li>
+ Enhancement to mumamo error handling when a bad mode
+ specifier for an embedded mode is found.
+ </li>
+ <li>
+ Introduced a bug for empty XHTML documents in
+ 0.97. Corrected.
+ </li>
+ <li>
+ Corrected a bug for chunks 1 character long.
+ </li>
+ <li>
+ There is what I consider is a bug in Emacs 22.1 in the
+ handling of global minor mode that are not distributed
+ with Emacs. If they are turned on by customization,
+ but loaded after Emacs have loaded the customizations
+ (usually in .emacs) then they are not turned on
+ correctly. Added work-around for this.
+ </li>
+ <li>
+ <em>Fictive XHTML Validation Header</em>:
+ <ul>
+ <li>
+ <em>Fictive XHTML Validation Header</em> state was not saved when moving between chunks. Fixed.
+ </li>
+ <li>
+ Tried to make the concept of <em>Fictive XHTML Validation Header</em>
+ more clear. Added this visually to the buffer.
+ </li>
+ <li>
+ <em>Fictive XHTML Validation Headers</em> can now be turned on
+ automatically based on file name.
+ </li>
+ </ul>
+ </li>
+ <li>
+ <em>nXhtml menu:</em>
+ <ul>
+ <li>
+ Reorganized the nXhtml menu.
+ </li>
+ <li>
+ Added <em>customization</em> groups for help libraries to nXhtml.
+ </li>
+ <li>
+ Added an entry for customization of nXhtml to the menus.
+ </li>
+ <li>
+ Added <em>Tidy</em> to the menus again.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Corrected bug in <em>XML Path</em> (nxml-where) for single tags.
+ Other small fixes to nxhtml-where.
+ </li>
+ <li>
+ Documentation enhancements.
+ Added <em>The Quick Guide</em>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v0.99">0.99</dt>
+ <dd>
+ <ul>
+ <li>
+ Fixed a serious bug in the cooperation between nxhtml-mode and mumamo-mode.
+ </li>
+ <li>
+ Turn on mumamo-mode by file name (mumamo-global-mode).
+ </li>
+ <li>
+ Fictive XHTML Validation Header:
+ <ul>
+ <li>
+ The Fictive XHTML Validation Header state were not saved when changing major mode in MuMaMo. Corrected.
+ </li>
+ <li>
+ Added more alternatives to the Fictive XHTML Validation Header list.
+ This should make it easier to use completion with for example PHP.
+ </li>
+ <li>
+ Added default value for the Fictive XHTML Validation Header.
+ </li>
+ <li>
+ Tried to make the use of Fictive XHTML Validation Header more automatic and therefore useful.
+ Also tried to make it play better with setting schema file.
+ (There is no need normally to set schema file by hand.)
+ </li>
+ <li>
+ To turn this on by default customize nxhtml-global-validation-header-mode.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Possible to hide validation warnings without turning
+ on validation (which would make completion in the
+ XHTML part impossible).
+ </li>
+ <li>
+ Some fixes to php-mode:
+ <ul>
+ <li>Using the character # for comments now works for most cases.</li>
+ <li>Now uses the fontification faces in a more standard way which calms down the look.</li>
+ <li>Initialization bug fixes.</li>
+ <li>Renamed php-mode-user-hook to php-mode-hook to follow standard.</li>
+ </ul>
+ </li>
+ <li>
+ Indentation fixes:
+ <ul>
+ <li>
+ Various corrections to indentation in mumamo.
+ </li>
+ <li>
+ Added the possibility to use TAB to indent regions
+ (indent-region-mode).
+ </li>
+ <li>
+ Warn about bad indentation in mixed PHP/HTML code
+ when using php-mode only.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Fontification now fontifies all text first in main
+ major mode and thereafter applies submodes. (This
+ avoids some problems with around a submode chunk.)
+ </li>
+ <li>
+ Reorganized the nXhtml menu:
+ <ul>
+ <li>
+ There is now a minor mode for the nXhtml
+ menu. This makes it possible to easier use common
+ features when in buffers not in nxhtml-mode.
+ </li>
+ <li>
+ The nXhtml menu does not disappear when moving
+ into a chunk where the major mode is not
+ nxhtml-mode. The changes also makes it easy to
+ access uploading functions functions etc from
+ other modes than nxhtml-mode since the
+ <em>nXhtml</em> may also be shown in them.
+ </li>
+ <li>
+ The nXhtml menu can be turned on globally by default.
+ Customize nxhtml-menu-mode for that.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.00">1.00</dt>
+ <dd>
+ <ul>
+ <li>
+ Reached version number 1.00 - which you maybe believe
+ means the bugs should be gone? Sorry, it is just that
+ I ran out of version numbers. However it looks like
+ much fewer bugs at least.
+ </li>
+ <li>
+ Fixed problems mostly related to global turn on of different features in nXhtml.
+ </li>
+ <li>
+ Small fixes to indentation.
+ <ul>
+ <li>
+ nxhtml-mode could get confused by php tags.
+ </li>
+ <li>
+ nxhtml-mode did not indent &lt;!DOCTYPE in a sensible way.
+ </li>
+ <li>
+ Electric keys now works in embedded php when using mumamo-mode.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Tidy was very misbehaving since the output buffer was
+ not erased between different files. But I have got no
+ bug reports on this.
+ </li>
+ <li>
+ Fixed a bug in validation that should up when using muamo-mode.
+ </li>
+ <li>
+ Fixed bug in &lt;script ...&gt; and &lt;style ...&gt; chunk dividing.
+ </li>
+ <li>
+ Added support for OpenLaszlo.
+ </li>
+ <li>
+ Corrections to mlinks-mode (visible mostly as links in
+ XHTML buffers):
+ <ul>
+ <li>
+ Links disappeared when a new file was
+ opened. Corrected.
+ </li>
+ <li>
+ Links were not correctly updated at changes in the
+ buffer when mumamo-mode was used. Fixed.
+ </li>
+ </ul>
+ </li>
+ <li>
+ The welcome message for nXhtml could be shown too
+ early sometimes when loading, before nXhtml actually
+ knew if it should be shown or not. Tried to fix it.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.01">1.01</dt>
+ <dd>
+ <ul>
+ <li>
+ Reported wrong version number for nXhtml in the menus. Fixed.
+ </li>
+ <li>
+ <em>If you use the zip file to install nXhtml please
+ notice that it has now a top level nxml.</em> Sorry for not
+ having zipped it like that before!
+ </li>
+ <li>
+ The url links in <em>Welcome to nXhtml</em> was a bit
+ incorrect and did not work on all OS:es. Fixed.
+ </li>
+ <li>
+ Added customization of popup completion to the 'nxhtml
+ customization group so they are easier to find.
+ </li>
+ <li>
+ MuMaMo
+ <ul>
+ <li>
+ Struggled a bit with the load sequences of the elisp
+ libraries used by nXhtml when using MuMaMo.
+ </li>
+ <li>
+ Tried to get the global turn on of mumam-mode to work
+ in all cases.
+ </li>
+ <li>
+ The screen was blinking when changing overlays after
+ changes in the buffer. Tried to fix this.
+ </li>
+ <li>
+ Minor fixes do syntax highlighting, like taking care of single ':s.
+ </li>
+ <li>
+ Fixes to the support for JSP and eRuby.
+ </li>
+ <li>
+ Made the support for perl here documents a bit better.
+ Large perl documents are however still quite slow when
+ using mumamo-mode. I do not know the reason yet.
+ </li>
+ <li>
+ Refontification could miss some parts when buffer
+ changes caused chunk division changes. Complex,
+ tried to fix it, but I am a bit unsure that it
+ always works.
+ </li>
+ <li>
+ Cleaned up mumamo.el a bit.
+ </li>
+ <li>
+ Rewrote mumamo-test.el and functions called from it in
+ mumamo.el a bit to make tracebacks from errors more
+ useful. Changed keybindings in mumamo-test.el from
+ global to a minor mode <em>mumamo-test-mode</em>.
+ Renamed mumamo-notest.el to mumamo-test.el. Added it
+ to the zipped distribution of nXhtml.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Fixed a bug related to links and buffer changes.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.02">1.02</dt>
+ <dd>
+ <ul>
+ <li>
+ Fixed a refontification bug that occured after changes.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.03">1.03</dt>
+ <dd>
+ <ul>
+ <li>
+ Added the possibility to call GIMP.
+ </li>
+ <li>
+ Reworked the messages for fontification errors to try
+ to catch an error that shows up sometimes. Tried to
+ avoid disturbing normal use in spite of that error.
+ </li>
+ <li>
+ Reverted to using a short delay before switching major
+ mode when moving between buffers.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.04">1.04</dt>
+ <dd id="v1.04-dd">
+ <ul>
+ <li>
+ Enhanced the documentation for nXhtml. Starting from
+ <i>C-h f nxhtml-mode</i> it should now be easier to
+ get an overview.
+ </li>
+ <li>
+ Bug fixes etc:
+ <ul id="v1.04-bugs">
+ <li>
+ Completion on an empty page gave a faulty frameset page. Fixed.
+ </li>
+ <li>
+ Insert end tag did not work with a fictive
+ validation header. Fixed.
+ </li>
+ <li>
+ Insert end tag when all preceding tags where
+ closed gave a strange error message. Fixed.
+ </li>
+ <li>
+ Changed some key bindings to comply with
+ <i>(info "(elisp) Key Binding Conventions")</i>
+ </li>
+ <li>
+ Completion in empty buffers with a completion
+ header did not work. Fixed.
+ </li>
+ <li id="mumamo-bugs">
+ Multiple major modes:
+ <ul>
+ <li>
+ Fixed a bug that prevented mumamo-global-mode from
+ beeing turned on in a file opened in
+ fundamental-mode.
+ </li>
+ <li>
+ Better error tracing for some functions,
+ including the call of major mode functions.
+ </li>
+ <li>
+ Position was garbled when a ;-char was inserted in php-mode chunk. Fixed.
+ </li>
+ <li>
+ A bad check for if mlinks-mode where available was fixed.
+ </li>
+ <li>
+ Some bugs concerning turning off mumamo-mode was fixed.
+ </li>
+ <li>
+ Fixed a bug in <i>perl here doc</i> chunks. Suddenly the
+ problem with slowness when using mumamo-mode in
+ perl buffers seems gone. (Note quite sure, but I
+ can't see any problems now.)
+ </li>
+ <li>
+ Fixed a bug in mumamo-mode when current buffer was
+ switched before the major mode had been set from
+ the current chunk.
+ </li>
+ <li>
+ Fixed a long standing bug in php fontification of
+ strings and comments.
+ </li>
+ <li>
+ Fixed a bug where <i>sgml-xml-mode</i> was not defined.
+ </li>
+ <li>
+ Fixed a bug related to get-text-property which
+ gives an error when buffer is narrowed.
+ </li>
+ <li>
+ Tried to refontify things outside of a narrowed part. Fixed.
+ </li>
+ <li>
+ Too little where refontified after changes. I hope I have fixed this.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Fictive XHTML Validation Header:
+ <ul id="v1.04-fic-bugs">
+ <li>
+ View File did not work correctly when a fictive
+ XHTML validation header was used. Corrected.
+ </li>
+ <li>
+ Fictive XHTML validation headers are no longer
+ turned on by default in any buffers.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Indentation:
+ <ul>
+ <li>
+ Tried to fix a problem when using
+ newline-and-indent. When this was in a mode
+ derived from C the indentation sometimes became 0.
+ </li>
+ <li>
+ Speeded up the indentation of regions a bit when
+ using <i>mumamo-mode</i>.
+ </li>
+ <li>
+ Indentation: TAB now only indents a region if it
+ is visibly marked (see transient-mark-mode and
+ cua-mode).
+ </li>
+ <li>
+ Simplified the indentation code.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Fixed a problem where string fontification got out
+ of phase so that wrong parts of buffer could be
+ fontified as a string.
+ </li>
+ <li>
+ Added a workaround for <a
+ href="#php-attribute-values">Attribute values
+ computed by PHP</a>
+ </li>
+ <li>
+ Added .nosearch to subdirectories with no elisp files.
+ </li>
+ <li>
+ Fixed incorrect checks for mlinks-mode in menu building.
+ </li>
+ <li>
+ File extensions where used in a case sensitive way
+ in some places. Fixed.
+ </li>
+ <li>
+ appmenu: Worked only in html files. Fixed.
+ </li>
+ <li>
+ html-site: Fixed the error <em>Error
+ (html-site-current): Can't find site:
+ your-site-name</em>.
+ </li>
+ <li>
+ Fixed a problem with longlines-mode in the support
+ for Firefox add-on It's All Text. (Note however
+ that there are some bugs in longlines-mode
+ itself.) Rewrote the support to be more
+ general. It is now in the file as-external.el, see
+ this file.
+ </li>
+ <li>
+ Fixed an encoding problem in
+ <i>tidy-buffer</i>. Output from tidy was not read
+ using the same coding system as tidy was using.
+ </li>
+ <li>
+ Fixed some problems with face definitions, possibly bugs (not sure).
+ </li>
+ <li>
+ Made the fontification faster when using mumamo-mode.
+ (It is still slower than single mode fontification of course.)
+ </li>
+ <li>
+ nxml-where.el: Made it aware of mumamo.el.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Menu changes:
+ <ul>
+ <li>
+ Completion menu: Renamed to <i>Completion and
+ Validation</i> menu and reorganized a little bit to
+ make it more clear.
+ </li>
+ <li>
+ Renamed <i>view</i> to <i>browse</i> since this is
+ the normal emacs name for showing files in a web
+ browser. Also made corresponding changes to
+ function names. Put back the possibility to view
+ only the region in a web browser.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Uploading:
+ <ul>
+ <li>
+ Added remote dired to the menus.
+ </li>
+ <li>
+ Fixed problems with file names starting with ~.
+ </li>
+ <li>
+ Fixed more problems with file names with spaces.
+ </li>
+ </ul>
+ </li>
+ <li>
+ nxml-where:
+ <ul>
+ <li>
+ nxml-where now uses a timeout for more smooth performance.
+ </li>
+ <li>
+ nxml-where can now recognizes both id and name attribute.
+ </li>
+ <li>
+ Hyphens are now accepted in tag names.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Ruby
+ <ul>
+ <li>
+ Multiple major mode turned on by default for .rhtml files when this mode is global.
+ </li>
+ <li>
+ Multiple major mode is no longer turned on when rub-mode is turned on.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added support for switching major mode dependent on if
+ Emacs was called as an external editor. This makes it
+ possible for example to switch to relevant major and
+ minor modes when Firefox add-on It's All Text.
+ </li>
+ <li>
+ Added the possibility to easily view the output of scripts on the server (if they require no parameters).
+ You can now do that from the nXhtml menu.
+ Previously only html files on the server could be viewed that way.
+ Image files can also be viewed this way.
+ </li>
+ <li>
+ Filling:
+ <ul>
+ <li>
+ Added functions for unfilling.
+ </li>
+ <li>
+ Added keybindings and menu entries for longlines-mode, fill-paragraph and unfill-paragraph.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Quoting:
+ Added HTML quoting of &amp; and &lt; in text areas. Bound to C-c C-q.
+ </li>
+ <li>
+ Images:
+ <ul>
+ <li>
+ Added image-mode to those that are encompassed by nxhtml-global-minor-mode so that images can be uploaded more easily.
+ </li>
+ <li>
+ Added <em>edit with GIMP</em> and <em>upload</em> to the popup menu for links.
+ This avoids the need to load the linked files in Emacs first.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added <em>nxml-untag-element</em>.
+ </li>
+ <li>
+ Added a modified version of wikipedia-mode.el. Seems likely to be useful if you are doing web editing.
+ </li>
+ <li>
+ Added html-imenu.el
+ </li>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Removed the lighter <i>"MuMaMo"</i> for
+ mumamo-mode. Instead the active major mode now has
+ <b>"/m"</b> appended to mode-name (that is what you see
+ in the mode line).
+ </li>
+ <li>
+ The normal way to turn on <i>mumamo-mode</i> has
+ changed. There are now functions that you can use
+ in <i>auto-mode-alist</i> to directly set up the
+ buffer for mumamo-mode. The available functions
+ are in the
+ variable <i>mumamo-defined-turn-on-functions</i>.
+ <p>
+ You are not supposed to call mumamo-mode
+ yourself any more and mumamo-global-mode is
+ gone. So is also mumamo-chunk-family-by-mode and
+ mumamo-filenames-list. The functionality those
+ gave are all replaced by the new functions for
+ turning on mumamo mode.
+ </p>
+ </li>
+ <li>
+ Added support for buffer local values in
+ hooks. This is necessary for example to support
+ minor modes that are meant to be buffer local but
+ not major mode specific. Instructions for authors
+ of this kind of minor modes are in the file
+ mumamo.el.
+ </li>
+ <li>
+ Added support for Django.
+ </li>
+ <li>
+ Added support for Embperl.
+ </li>
+ <li>
+ Added support for PHP Smarty. The <i>{literal}
+ ... {/literal}</i> construct is not supported.
+ This mean that you can not use &lt;style ..&gt; or &lt;script ..&gt;.
+ </li>
+ <li>
+ Added support for imenu for the main major mode.
+ Turned on this by default in nxhtml-mode.
+ </li>
+ <li>
+ Made the temporary replacement of the
+ attr="&lt;?php ... ?&gt;" a bit better. They are
+ now more visible and also still mumamo chunks
+ during the temporary replacement.
+ </li>
+ <li>
+ Added support for <i>flymake-mode</i>.
+ Maybe add support for checking chunks?
+ </li>
+ <li>
+ Printing: Added htmlfontify.el and
+ hfyview.el. These makes if possible to print a
+ buffer fontified with <i>mumamo-mode</i> on in
+ colors (through your web browser). There is an
+ example of the capabilities of htmlfontify <a
+ href="htmlfontify-example.html">here</a> (made
+ with a little function in hfyview.el).
+ </li>
+ </ul>
+ </li>
+ <li>
+ PHP:
+ <ul>
+ <li>
+ Did a first merge with Aaron Hawleys fixes for php-mode.el.
+ </li>
+ </ul>
+ </li>
+ <li>
+ CSS: Upgraded to Stefan's latest css-mode.el.
+ </li>
+ <li>
+ Fictive XHTML Validation Headers: Changed the way they
+ are turned on. They may now be turned on when
+ mumamo-mode is turned on.
+ </li>
+ <li>
+ Some users want to use their own patched version of nXml. Next version of Emacs will come with nXml. Therefore, the loading routine for nXhtml now checks if nXml is is already loaded. Thanks to Eric Lilja for testing this. Eric also made me aware of that if nXhtml was placed in the site-lisp directory tree then things did not work as I expected. I think I have corrected that by placing a <i>.nosearch</i> file at the top of the nxml tree in nXhtml.
+ </li>
+ <li>
+ Restructured the directories. Moved some files out of
+ the <i>nxhtml</i> subdir. Some of them went into the
+ <i>util</i> subdir (those are written by me) and some
+ to the new subdir <i>related</i> (those that are
+ inherited from others, maybe changed by me - most
+ often to work with mumamo-mode).
+ </li>
+ <li>
+ Changed all licenses to be GNU GPL.
+ </li>
+ <li>
+ Additions to tidy support: It is now possible to use
+ the tidy support to tidy the XHTML part of php etc.
+ (Thanks to Hadron for this suggestion.)
+ </li>
+ <li>
+ Added <i>winsize.el</i> which allows interactive resizing of
+ windows. Also added <i>winsav.el</i> which adds the
+ capability to rotate window configurations and also to
+ save window configuration to file.
+ </li>
+ <li>
+ Made nXhtml work with CVS Emacs 23.0.50.1.
+ </li>
+ <li>
+ Added freemind.el to the parcel. After all FreeMind
+ supports web publishing too so why not have the Emacs
+ support here ...
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.10">1.10</dt>
+ <dd id="v1.10-dd">
+ Just jumped the version number for the new release of
+ nXhtml. There are really significant changes in this
+ release, not only minor bug fixes.
+ </dd>
+ <dt id="v1.11">1.11</dt>
+ <dd id="v1.11-dd">
+ Minor bug fixes to completion. Added fictive validation
+ header to completion alternatives when buffer is empty and
+ mumamo is used.
+ </dd>
+ <dt id="v1.12">1.12</dt>
+ <dd id="v1.12-dd">
+ <ul>
+ <li>
+ Fixed a bug in image link insertion in nxhtml-mode, thanks Niels Giesen!
+ </li>
+ <li>
+ Restructured, reordered and documented mumamo.el. It is now two
+ separate files, mumamo.el and mumamo-fun.el.
+ </li>
+ <li>
+ Added move by chunk to the nXhtml menu.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.13">1.13</dt>
+ <dd id="v1.13-dd">
+ <ul>
+ <li>
+ Better handling of the case when no validation header
+ is needed and the user tries to turn it on.
+ </li>
+ <li>
+ Added .phtml as php file.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.14">1.14</dt>
+ <dd id="v1.14-dd">
+ <ul>
+ <li>
+ Completion of links in XHTML was broken. Fixed, thanks
+ to Niels Giesen.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.15">1.15</dt>
+ <dd id="v1.15-dd">
+ <ul>
+ <li>
+ Added `mumamo-map' keymap.
+ </li>
+ <li>
+ Added a keymap to all multi major modes.
+ </li>
+ <li>
+ Some more refinement to fictive validation headers.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.16">1.16</dt>
+ <dd id="v1.16-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Changes to indentation:
+ <ul>
+ <li>
+ Removed indent-region-mode since that
+ functionality is now in indent-for-tab-command in
+ Emacs 22.
+ </li>
+ <li>
+ Removed some code that checked if indentation was 0.
+ </li>
+ <li>
+ Added indent-for-tab-command to mumamo-map.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Reordering and renaming:
+ <ul>
+ <li>
+ Reordered and move some functions in mumamo.el et al.
+ Added new file nxhtml-mumamo.el.
+ </li>
+ <li>
+ Renamed <i>define-mumamo-turn-on</i> to
+ <i>define-mumamo-multi-major-mode</i>.
+ </li>
+ <li>
+ Removed the ending <i>-turn-on</i> from the
+ functions defined by the macro above.
+ </li>
+ <li>
+ Introduced <i>multi major mode</i> as a name for
+ the functions defined by the macro above. Those
+ works in many respects like major mode functions,
+ but they support multiple major modes in a buffer.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added support for noweb as multiple major mode.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.17">1.17</dt>
+ <dd id="v1.17-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Added support for flyspell.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Bug fixes to the version of find-recursive.el that
+ ships with nXhtml. Thanks to Cezar Halmagean.
+ </li>
+ <li>
+ Added tabkey2.el which tries to make it easy to use
+ the Tab key for completion. (You must load it and turn
+ on tabkey2-mode to use it.)
+ </li>
+ <li>
+ Folding:
+ <ul>
+ <li>
+ Added <i>nxhtml-heading-element-name-regexp</i> as
+ default for nxml style folding.
+ </li>
+ <li>
+ Some changes to fold-dwim.el.
+ </li>
+ </ul>
+ </li>
+ <li>
+ AppMenu:
+ <ul>
+ <li>
+ Simplified: Removed the possibility to
+ automatically show minor and major mode menus.
+ There is now only one list, <i>appmenu-alist</i>.
+ </li>
+ <li>
+ Added menu item <i>At Current Point</i> for
+ bindings found in character and overlay keymaps at
+ point. Those you always forget.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Physical line:
+ <ul>
+ <li>
+ Added physical-line.el to nXhtml.
+ </li>
+ <li>
+ Added new functions to move to beginning and end
+ of line to ourcomments-util.el that supports
+ physical-line.el.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.18">1.18</dt>
+ <dd id="v1.18-dd">
+ <ul>
+ <li>
+ Better Tab completion in tabkey2.el.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.19">1.19</dt>
+ <dd id="v1.19-dd">
+ <ul>
+ <li>
+ Even better Tab completion in tabkey2.el.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.20">1.20</dt>
+ <dd id="v1.20-dd">
+ <ul>
+ <li>
+ Once again even better Tab completion in tabkey2.el.
+ </li>
+ <li>
+ Fixed bug in hiding of validation errors (they could
+ disappear totally).
+ </li>
+ <li>
+ Cleaned up menus in nXhtml.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.21">1.21</dt>
+ <dd id="v1.21-dd">
+ <ul>
+ <li>
+ Added a bit support for dired (upload, browse, browse
+ remote).
+ </li>
+ <li>
+ Fixed some strange menu problems (i hope).
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.22">1.22</dt>
+ <dd id="v1.22-dd">
+ <ul>
+ <li>
+ Bug fix.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.23">1.23</dt>
+ <dd id="v1.23-dd">
+ <ul>
+ <li>
+ Bug fix.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.24">1.24</dt>
+ <dd id="v1.24-dd">
+ <ul>
+ <li>
+ Tried again to make hexcolor-mode more readable.
+ </li>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Added support for <i>hi-lock-mode</i>. At present
+ it might however be very puzzling. The hilight
+ added by hi-lock-mode may be hidden by the
+ overlays used by mumamo. Tip: you can always use
+ the face <span
+ style="font-size:1.5em;">hi-black-hb</span>.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.25">1.25</dt>
+ <dd id="v1.25-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Handle hi-lock-mode in a more general way
+ using <i>font-lock-mode-hook</i>.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.26">1.26</dt>
+ <dd id="v1.26-dd">
+ <ul>
+ <li>
+ nxhtml-mode:
+ <ul>
+ <li>
+ Removed the indent line patch for nxml-mode.
+ </li>
+ <li>
+ Better test for empty page during completion.
+ </li>
+ </ul>
+ </li>
+ <li>
+ tabkey2-mode:
+ <ul>
+ <li>
+ A lot of improvements.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.27">1.27</dt>
+ <dd id="v1.27-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Worked with bugs in mumamo.el that was due to bad
+ handling of syntax-ppss et el. Looks like most of
+ them are fixed.
+ </li>
+ <li>
+ Fixed documentation and reordered code in mumamo.el and mumamo-fun.el.
+ </li>
+ <li>
+ Changed javascript.el indentation to make it work with
+ mumamo.el.
+ </li>
+ <li>
+ Introduced the function <i>mumamo-make-variable-buffer-permanent</i> as an aid for minor mode authors.
+ </li>
+ <li>
+ Fixed quite a few indentation bugs.
+ There was one bug that could make Emacs loop after indentation.
+ </li>
+ </ul>
+ </li>
+ <li>
+ nxml-where, mlinks
+ <ul>
+ <li>
+ Fixed bugs with left over idle timers when buffer
+ had been killed (nxml-where.el, mlinks.el).
+ </li>
+ </ul>
+ </li>
+ <li>
+ html-site
+ <ul>
+ <li>
+ Fixed a bug in html-site when comparing file
+ names. File names where not made unique before
+ comparision.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Tabkey2
+ <ul>
+ <li>
+ Fixed tabkey2 bugs.
+ </li>
+ </ul>
+ </li>
+ <li>
+ freemind.el
+ <ul>
+ <li>
+ Fixed a problem in freemind-to-org-mode that
+ caused the error "wrong-type-argument string: nil"
+ in string-match("\\(?:^--org-mode: WHOLE FILE$\\)"
+ nil).
+ </li>
+ </ul>
+ </li>
+ <li>
+ Made nXhtml menu available in sub-chunks.
+ </li>
+ <li>
+ Included a slightly changed version of Steve Yegge's js2.el + js2-fl-mode.el from 2008-04-24 with support for jit-lock-mode. This support has some flaws and maybe js2 is not ready for use, I am not sure. However if you want to use this instead of Karl Landströms javascript-mode then please customize <i>mumamo-major-modes</i>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.28">1.28</dt>
+ <dd id="v1.28-dd">
+ <ul>
+ <li>
+ New version with mostly minor bug fixes from 1.27.
+ Unfortunately I put out 1.27 a bit too early.
+ Please upgrade.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.29">1.29</dt>
+ <dd id="v1.29-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Fixed a bug causing emacs to loop when &lt;?&gt;
+ was encountered in an html style buffer.
+ </li>
+ <li>
+ Fixed some problems with &lt;? and ?&gt; in
+ strings in html style buffers.
+ </li>
+ <li>
+ Tried to avoid chunk dividers in strings and comments. (There are still some bugs there.)
+ </li>
+ <li>
+ Fixed an error that prevented byte compiling nxhtml-mumamo.el.
+ (Thanks Christoph Conrad.)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.30">1.30</dt>
+ <dd id="v1.30-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Added support to handle specific rng
+ schemacs. With the help of this Genshi and MJT
+ templating languages are now handled.
+ </li>
+ <li>
+ Let the rng schema file name survive mumamo major
+ mode changes.
+ </li>
+ <li>
+ Added support for to let nxml-mode skip chunks it
+ can not parse. (This requires a patch to
+ rng-valid.el too which is not included, but which
+ I hope can go into Emacs soon.)
+ </li>
+ <li>
+ Chunk dividers can now be a part on their own. (Ie
+ there will be no parsing or syntax highlighting of
+ them by the chunk major mode. This is optional and
+ specified for each chunk types.)
+ </li>
+ <li>
+ Added support for Genshi and MJT. These multi
+ major modes support completion and error checking
+ in the XML/XHTML part according to their DTD
+ (which has some additions to the XHTML DTD).
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.31">1.31</dt>
+ <dd id="v1.31-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Fixed a bug that caused multi major modes to loop sometimes.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.32">1.32</dt>
+ <dd id="v1.32-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Fixed a bug in syntax-ppss advice.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.33">1.33</dt>
+ <dd id="v1.33-dd">
+ <ul>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Fixed another bug in syntax-ppss advice.
+ </li>
+ <li>
+ Added support for <i>fill-forward-paragraph-function</i>.
+ </li>
+ <li>
+ Made <i>longlines-mode</i> survive major mode changes in mumamo buffers.
+ </li>
+ <li>
+ Fixed a bug that made Emacs loop when it found
+ &lt;??&gt; in for example nxhtml-mumamo.
+ </li>
+ <li>
+ Made it usable with Emacs 22 again.
+ </li>
+ <li>
+ Moved some changes from rng-valid.el to
+ mumamo.el. This makes it possible to let nxml-mode
+ (and derivates) jump over parts when parsing the
+ buffer even if not using the patched version of
+ Emacs+EmacsW32.
+ </li>
+ </ul>
+ </li>
+ <li>
+ nxhtml:
+ <ul>
+ <li>
+ Added command to add CSS rollover images.
+ </li>
+ </ul>
+ </li>
+ <li>
+ mlinks:
+ <ul>
+ <li>
+ Tried to fix the error <i>invalid-read-syntax &quot;]
+ in a list&quot;</i> when loading <i>mlinks.el</i>
+ reported by some Asian users.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.34">1.34</dt>
+ <dd id="v1.34-dd">
+ <ul>
+ <li>
+ <span style="font-size: 1.2em; color: red ()"
+ >Changed top directory name from nxml to nxhtml</span>
+ <p>
+ This will of course case some problems if you do not
+ notice it when you upgrade nXhtml. If you are using
+ EmacsW32 and upgrade nXhtml you should change the
+ file <i>emacsw32.el</i>.
+ </p>
+ <p>
+ The reason for this change is that nXml will soon
+ normally not be part of nXhtml so keeping the old
+ top directory name would be confusing.
+ </p>
+ </li>
+ <li>
+ Added a test suite. See the file <i>nxml/tests/test-Q.el</i>.
+ </li>
+ <li>
+ Mumamo:
+ <ul>
+ <li>
+ Fixed indentation when the whole line is a sub chunk.
+ </li>
+ <li>
+ Tried a bit more to stop nxml from parsing non-xml
+ mode chunks. Because of this php support was
+ changed a bit (for the better I hope).
+ </li>
+ </ul>
+ </li>
+ <li>
+ GIMP:
+ <ul>
+ <li>
+ Registry value location for GIMP had changed.
+ </li>
+ </ul>
+ </li>
+ <li>
+ nXhtml:
+ <ul>
+ <li>
+ Added support for <a href="http://hyperstruct.net/projects/mozlab">MozLab</a>. If you install MozLab in Firefox then you can directly use it from javascript mode without any additional setup.
+ </li>
+ <li>
+ Added <a href="http://www.oak.homeunix.org/~marcel/blog/articles/2008/07/18/nested-imenu-for-php">php-imenu.el</a>.
+ </li>
+ <li>
+ Fixed a bug where I inadvertently
+ added <i>../../lisp</i> to load-path.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.35">1.35</dt>
+ <dd id="v1.35-dd">
+ <ul>
+ <li>
+ Fixed a small bug in sex-mode.el.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.36">1.36</dt>
+ <dd id="v1.36-dd">
+ <ul>
+ <li>
+ Added the function <i>emacs-Q-nxhtml</i> for easier
+ testing. It does the equivalent of <i>emacs -Q --load
+ PATH-TO/nxhtml/autostart.el</i>.
+ </li>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Forgot to return php-mode in php short tags. Fixed.
+ </li>
+ <li>
+ Borders where not correctly calculated with php short tags. Fixed.
+ </li>
+ <li>
+ Subchunks not parseable by nxml-mode where marked as parseable. Fixed.
+ </li>
+ <li>
+ Debug messages from mumamo where not silenced.
+ </li>
+ <li>
+ Forgot font-lock-syntactic-keywords. This showed up in
+ bad fontification for strings sometimes. Fixed.
+ </li>
+ <li>
+ To fontify keywords font-lock-syntactically-fontified
+ must be set in each chunk. Fixed.
+ </li>
+ <li>
+ Find a way to at least temporarily work around the
+ problem with the last &quote; char in
+ syntax=&quote;...&quote; that could be seen in
+ large XHTML files, for example this file. The
+ drawback with the work around is that it bypasses
+ the cache for syntax-ppss, but this happens only
+ in multi major mode buffers and I notice no
+ performance problems here.
+ </li>
+ <li>
+ Fixed a number of problems with the defadvice for the syntax functions.
+ (I am afraid there are more left.)
+ </li>
+ <li>
+ Took a new grab on the indentation problems.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.37">1.37</dt>
+ <dd id="v1.37-dd">
+ <ul>
+ <li>
+ The command <i>emacs-Q-nxhtml</i> and cousins did not
+ work on all platform. Tried to fix it.
+ </li>
+ <li>
+ Got a report that editing Django was to slow. Tried to fix this.
+ </li>
+ <li>
+ Added a test to the unit test suite that test
+ scrolling and jumping.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.38">1.38</dt>
+ <dd id="v1.38-dd">
+ <ul>
+ <li>
+ Added a workaround that removes validation error marking in non-xhtml chunks.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.39">1.39</dt>
+ <dd id="v1.39-dd">
+ <ul>
+ <li>
+ Multi major modes where not allowed in defcustoms
+ nxhtml-magic-mode-alist and
+ nxhtml-auto-mode-alist. Fixed.
+ </li>
+ <li>
+ Added tests for the use of the lists above.
+ </li>
+ <li>
+ Fixed some bugs that could make a buffer became
+ modified due to mumamo fontification actions.
+ </li>
+ <li>
+ The rnc files for mjt and genshi had include path that
+ did not work if you where using the nxml-mode that
+ comes with nXhtml. Fixed. (Thanks for pointing this
+ out, Bryan.)
+ </li>
+ <li>
+ Now trying to keep the launchpad bazaar repository in
+ sync.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.40">1.40</dt>
+ <dd id="v1.40-dd">
+ <ul>
+ <li>
+ tabkey2-mode
+ <ul>
+ <li>
+ Some small changes: support for eshell
+ and better information about completion commands
+ alternative key bindings.
+ </li>
+ </ul>
+ </li>
+ <li>
+ php-mode
+ <ul>
+ <li>
+ It turned out that my patched php-mode asked in
+ every buffer to turn on mumamo. Changed it to
+ once for every Emacs invocation instead.
+ </li>
+ <li>
+ In addition to this it did not turn on mumamo
+ multi major support if the user wanted it ;-)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.41">1.41</dt>
+ <dd id="v1.41-dd">
+ <ul>
+ <li>
+ There was an error that prevented loading of nXhtml
+ with Emacs 22. (This was before opening any file.)
+ </li>
+ <li>
+ Fixed a problem in startup order for ido-mode and nXhtml.
+ (This could lead to that ido-mode was reset from 'both to 'buffer.)
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.42">1.42</dt>
+ <dd id="v1.42-dd">
+ <ul>
+ <li>
+ Fixed a bug concerning style=&quote;...&quote; and similar constructs.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.43">1.43</dt>
+ <dd id="v1.43-dd">
+ <ul>
+ <li>
+ Added file ffip.el for finding files in projects.
+ </li>
+ <li>
+ Added command <i>html-site-find-file</i>.
+ </li>
+ <li>
+ Added aliases for all multi major modes.
+ The alias looks like <i>mumamo-alias-MULTI_MAJOR_MODE</i>.
+ Their purpose is to make it easier to find a multi major mode.
+ </li>
+ <li>
+ Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/258169">https://bugs.launchpad.net/nxhtml/+bug/258169</a>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.44">1.44</dt>
+ <dd id="v1.44-dd">
+ <ul>
+ <li>
+ Fixed an error in chunk dividing.
+ </li>
+ <li>
+ Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/258097">https://bugs.launchpad.net/nxhtml/+bug/258097</a>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.45">1.45</dt>
+ <dd id="v1.45-dd">
+ <ul>
+ <li>
+ Fixed bug reporting instructions to point to Launchpad.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.46">1.46</dt>
+ <dd id="v1.46-dd">
+ <ul>
+ <li>
+ Cleaned up and fixed bugs in the help routines.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.47">1.47</dt>
+ <dd id="v1.47-dd">
+ <ul>
+ <li>
+ Made tabkey2-mode aware of this-command.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.48">1.48</dt>
+ <dd id="v1.48-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Added jde-mode as first choice if major mode file spec is java-mode.
+ </li>
+ <li>
+ Fixed a bug concerning buffer local variables saving.
+ </li>
+ <li>
+ Fixed a bug that occured when autoloading major mode failed.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.49">1.49</dt>
+ <dd id="v1.49-dd">
+ <ul>
+ <li>
+ Added a CEDET loader which can fetch CVS version of CEDET.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.50">1.50</dt>
+ <dd id="v1.50-dd">
+ <ul>
+ <li>
+ Added a Rinari loader which can fetch SVN version of Rinari and ruby-mode.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.51">1.51</dt>
+ <dd id="v1.51-dd">
+ <ul>
+ <li>
+ Fixed a regression bug in MuMaMo. If a major mode was
+ not defined Emacs could hang badly.
+ </li>
+ <li>
+ Added an ECB loader which can fetch CVS version of ECB.
+ </li>
+ <li>
+ Enhancements to the routines for fetching and setting
+ up CEDET, ECT and Rinari.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.52">1.52</dt>
+ <dd id="v1.52-dd">
+ <ul>
+ <li>
+ Added a tool to give major modes priority when
+ choosing a major mode for a buffer.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.53">1.53</dt>
+ <dd id="v1.53-dd">
+ <ul>
+ <li>
+ Quick fix for left-over which made it impossible to
+ edit php files in version 1.52. If you are using
+ version 1.52 you may for the moment just add (require
+ 'fmode) to your .emacs after loading nXhtml.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.54">1.54</dt>
+ <dd id="v1.54-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Added better error handling for problems such as
+ those that occured in version 1.52 with php-mode.
+ </li>
+ <li>
+ There was a bug when changing from a mumamo multi
+ major mode.
+ </li>
+ <li>
+ Tried to fix <a href="https://answers.launchpad.net/nxhtml/+question/43320">question 43320</a>.
+ </li>
+ </ul>
+ </li>
+ <li>
+ php-mode:
+ <ul>
+ <li>
+ Made the indentation check up to date with current
+ MuMaMo.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.55">1.55</dt>
+ <dd id="v1.55-dd">
+ <ul>
+ <li>
+ Tried to fix https://answers.launchpad.net/nxhtml/+question/43320 again.
+ </li>
+ <li>
+ Better test of when to end tabkey2-mode completion function state.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.56">1.56</dt>
+ <dd id="v1.56-dd">
+ <ul>
+ <li>
+ Allowed both single and double quotes in mlinks for html files.
+ </li>
+ <li>
+ Added initial support for Mako template language.
+ (There is no support for the tags yet, like in
+ Genshi. Additions are welcome!)
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.57">1.57</dt>
+ <dd id="v1.57-dd">
+ <ul>
+ <li>
+ Fixed another part of question 43320 (see above) regarding php indentation.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.58">1.58</dt>
+ <dd id="v1.58-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ The change of major mode when moving between
+ chunks could occur in the wrong buffer because I
+ had misunderstood how with-selected-window
+ works. Fixed.
+ </li>
+ <li>
+ Added ${...} python chunks to Mako (ie mako-html-mumamo).
+ </li>
+ <li>
+ Added mako-nxhtml-mumamo.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Appmenu:
+ <ul>
+ <li>
+ Fixed problem with point keymap.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Php:
+ <ul>
+ <li>
+ Fixed <a href="https://answers.launchpad.net/nxhtml/+question/44504">https://answers.launchpad.net/nxhtml/+question/44504</a>.
+ </li>
+ <li>
+ Fixed a typo regarding indentation check.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Tabkey2:
+ <ul>
+ <li>
+ Better support for YASnippet.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.59">1.59</dt>
+ <dd id="v1.59-dd">
+ <ul>
+ <li>
+ Fixed a bug that was revealed by the better support for YASnippet.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.60">1.60</dt>
+ <dd id="v1.60-dd">
+ <ul>
+ <li>
+ Bug fixes:
+ <ul>
+ <li>
+ Fix some bugs in Tidy XHTML support.
+ </li>
+ <li>
+ Also Some small improvements to Tidy GUI.
+ </li>
+ <li>
+ Added a test case for bug
+ https://bugs.launchpad.net/nxhtml/+bug/271497 (which I
+ can't reproduce).
+ </li>
+ <li>
+ Bug fixes to ffip.el
+ </li>
+ <li>
+ Added fix for <a href="http://emacsbugs.donarmstrong.com/cgi-bin/bugreport.cgi?bug=1013"
+ >Emacs bug 1013</a>.
+ </li>
+ <li>
+ Fixed some minor bugs in as-external.el.
+ </li>
+ <li>
+ New handling of minor modes (buffer local variables).
+ I hope this should fix the problem reported in
+ <a href="https://bugs.launchpad.net/bugs/272526">nXhtml bug 272526: Imenu on menubar doesn't work after switching modes</a>.
+ </li>
+ <li>
+ Fixed a bug that could make buffer marked as modified
+ during fontification.
+ </li>
+ <li>
+ Changed <i>php-mode</i> binding for TAB to follow Emacs normal standard.
+ </li>
+ <li>
+ Fixed a bug that sometimes caused rng-validate-mode to be
+ turned on in wrong buffer when setting xhtml fictive
+ validation header.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Finished a replacement for the usual help command on
+ [f1 ?c]. This will in addition to the command show the
+ keymap. To use it add
+ <i>(global-set-key [f1 ?c] 'find-keymap-binding-key)</i> to your .emacs.
+ </li>
+ <li>
+ Let tabkey2-mode first look for [tab] and then [?\t].
+ </li>
+ <li>
+ Added an <a href="http://ourcomments.org/Emacs/nXhtml/tut/tutorials.html"
+ >nXhtml tutorial page</a> with video tutorials.
+ </li>
+ <li>
+ After question
+ <a href="https://answers.launchpad.net/nxhtml/+question/45721"
+ >nXhtml question 45721</a>
+ there was a short discussion on Emacs Devel where I
+ was convinced to change the name convention for multi
+ major modes. They are now supposed to end
+ in <i>-mumamo-mode</i> (instead of the old <i>-mumamo</i>).
+ </li>
+ <li>
+ Added <i>ourcomments-ediff-files</i> to start ediff
+ from a shell with Emacs Client.
+ </li>
+ <li>
+ Took a look at autoloading. nXhtml now uses
+ autoloading in many more cases and loads much faster.
+ </li>
+ <li>
+ Added new general functions for search and replace:
+ <i>grep-query-replace</i>, <i>ldir-query-replace</i> and
+ <i>rdir-query-replace</i>. Also added similar
+ functions to search and replace in a site (they are in
+ the nXhtml menu).
+ </li>
+ <li>
+ Added <i>better-fringes-mode</i> for my personal preferences
+ for fringe symbols ...
+ </li>
+ <li>
+ Enhancement for (X)HTML editing:
+ <ul>
+ <li>
+ Added a minimal one-line display version of fictive
+ validation headers and made it the default.
+ </li>
+ <li>
+ Some enhancements to <i>nxml-where-mode</i>.
+ </li>
+ <li>
+ Display of images inline. Can be used in different major modes/files.
+ </li>
+ <li>
+ Added the minor mode <i>wrap-to-fill-column-mode</i> and
+ replaced longlines-mode in the Tools menu with this.
+ </li>
+ <li>
+ Added the minor mode <i>html-write-mode</i> that can hide
+ some simple tags and just show the inner html with a
+ user defined face. This is meant to make it easier to
+ write html files.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.61">1.61</dt>
+ <dd id="v1.61-dd">
+ <ul>
+ <li>
+ Bug fixes in html-write-mode and as-external.el.
+ </li>
+ <li>
+ Removed left over autoloads (maybe there was a problem with ruby-mode, not sure).
+ </li>
+ <li>
+ Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/290364">290364</a>,
+ see below about MuMaMo important changes.
+ </li>
+ <li>Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/272526">272526</a>.</li>
+ <li>Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/292393">292393</a>.</li>
+ <li>Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/300946">300946</a>.</li>
+ <li>Fixed bug <a href="https://bugs.launchpad.net/nxhtml/+bug/304569">304569</a>.</li>
+ <li>
+ Added some support for editing gmail messages in
+ as-external.el (to be used with It's All Text for
+ Firefox).
+ </li>
+ <li>
+ Some changes to face handling in Emacs had made htmlfontify.el fail.
+ Some changes in CSS handling in Firefox and IE made hfyview.el fail even more.
+ Tried to fix this.
+ </li>
+ <li>
+ Updated vline.el
+ </li>
+ <li>
+ Aaron Hawley merged in some changes he made to php-mode.el. Thanks Aaron!
+ Now nXhtml uses a slightly modified version of php-mode 1.5.0 is used
+ </li>
+ <li>
+ <b>MuMaMo important changes</b>
+ <p>
+ Unfortunately the chunk dividing routines in
+ mumamo.el can loop, see bug 290364 above. The
+ reason is that I tried to find chunks at current
+ point in a buffer without looking through the buffer
+ from the beginning. Fontification works this way in
+ Emacs. It is a heuristic that sometimes fails
+ however, but the consequences are merely just local
+ errors in fontification.
+ </p>
+ <p>
+ Chunk dividing must be more stable since it has a
+ global impact on the files fontification. It
+ therefore have to be done from the beginning of the
+ buffer - just like a parser reading the file will
+ do.
+ </p>
+ <p>
+ I have done first part of this rewrite and I hope
+ chunk dividing can not loop any more. Chunk dividing
+ is now always done from the beginning. However the
+ routines actually finding the chunks still looks
+ both upwards and downwards. I will try to remove
+ this unnecessary complexity later.
+ </p>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.62">1.62</dt>
+ <dd id="v1.62-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Fixed bugs in chunk creation that caused args out
+ of range at buffer end.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Autoloading caused wrong libraries to load (for
+ example javascript from mozdev). Fixed.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.63">1.63</dt>
+ <dd id="v1.63-dd">
+ <ul>
+ <li>
+ Removed find-recursive.el since there is no use for it
+ any more and it interferes with emacs-rails. (It was
+ initally a bug fixs for emacs-rails.)
+ </li>
+ <li>
+ Fixed bugs in <i>html-write-mode</i>.
+ </li>
+ <li>
+ Used the new routines for finding chunks also during
+ xml validation and syntax-ppss.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.64">1.64</dt>
+ <dd id="v1.64-dd">
+ <ul>
+ <li>
+ MuMaMo: nxml was not turned off properly when
+ switching from a multi major mode that used nxml-mode
+ or nxhtml-mode. Fixed. This was especially troublesome
+ for Emacs 22 users where multi major modes based on
+ nxhtml-mode does not always work.
+ </li>
+ <li>
+ Majmodpri.el: Added a defcustom to give multi major
+ modes based on nxhtm-mode or nxml-mode lower
+ priority. This is on by default in Emacs 22.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.65">1.65</dt>
+ <dd id="v1.65-dd">
+ <ul>
+ <li>Fixed a bug in nxml-where.el.</li>
+ <li>
+ Fixed a minor bug in majmodpri.el. It did not work if
+ magic-mode-alist contained anonymous functions.
+ (Thanks from Niels Giesen.)
+ </li>
+ <li>
+ Fixed a bug in pause.el and added some mindfulness to it.
+ </li>
+ <li>
+ Adjusted <i>ourcomments-move-beginning-of-line</i> (and dito
+ for end) to the new <i>line-move-visual</i> in Emacs 23.
+ Moved physical-line.el to <i>old</i> subdir since it is now
+ obsolete.
+ </li>
+ <li>
+ Made it possible to byte compile nXhtml.
+ <p>
+ To do that use
+ <i>M-x nxhtmlmaint-start-byte-compilation</i>.
+ </p>
+ <p>
+ A lot of code changes to make byte compilation
+ possible without a lot of warnings. Most changes
+ where just moving code around, but some where bug
+ fixes.
+ </p>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.66">1.66</dt>
+ <dd id="v1.66-dd">
+ <ul>
+ <li>
+ Further work on byte compiling.
+ </li>
+ <li>
+ Tried to fix some problem with defadvice in
+ ourcomments-util.el.
+ </li>
+ <li>
+ Tried to finish the command <i>M-x search-form</i>.
+ </li>
+ <li>
+ When no chunk is found (border case) then set the
+ major mode to the main major mode for the current
+ multi major mode.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.67">1.67</dt>
+ <dd id="v1.67-dd">
+ <ul>
+ <li>
+ Removed css.el since it is in Emacs 22.2 and later.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.68">1.68</dt>
+ <dd id="v1.68-dd">
+ <ul>
+ <li>
+ Fixed bugs related to byte compilation. This should
+ now work for both Emacs 22 and 23. Also added a menu
+ entry for byte compilation.
+ </li>
+ <li>
+ Removed nXml from the distribution to make it
+ smaller. nXml comes with Emacs 23 (not yet released of
+ course). For Emacs 22 users see EmacsWiki about where
+ to get nXml.
+ <p>
+ Adding nXml to Emacs 22 startup should be done by
+ using the file <i>nxhtml/autostart22.el</i>.
+ </p>
+ <p>
+ NOTE 1: if you want to use <i>nxhtml-mode</i> in
+ multi major modes in Emacs 22 (not recommended) you
+ must also customize <i>majmodpri-no-nxml</i>.
+ </p>
+ <p>
+ NOTE 2: The major mode <i>nxhtml-mode</i> as a
+ major-mode works however very well also in Emacs 22.
+ </p>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.69">1.69</dt>
+ <dd id="v1.69-dd">
+ <ul>
+ <li>
+ Chunks were unnecessary deleted and recreated after a
+ change even if all changes where within one
+ chunk. This could make editing very slow. Fixed.
+ </li>
+ <li>
+ Search for rng-auto.el in path. (Emacs 22 only.)
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.70">1.70</dt>
+ <dd id="v1.70-dd">
+ <ul>
+ <li>
+ Validation could not be turned on in multi major
+ modes. Fixed.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.71">1.71</dt>
+ <dd id="v1.71-dd">
+ <ul>
+ <li>
+ Fixed the problem that showed up in the file
+ nxhtml/tests/in/kubica-freezing-i.html which could
+ make Emacs freeze.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.72">1.72</dt>
+ <dd id="v1.72-dd">
+ <ul>
+ <li>
+ Somehow I dropped this: Search for rng-auto.el in
+ path. (Emacs 22 only.) Don't ask me how. Fixed again.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.73">1.73</dt>
+ <dd id="v1.73-dd">
+ <ul>
+ <li>
+ Worked a bit more on byte compilation and elisp
+ libraries loading. If you byte compile nXhtml it will
+ now load very few modules by default. It loads more
+ modules if you don't.
+ </li>
+ <li>
+ Added chart.el, a small elisp library to create charts.
+ This works by calling google charts library.
+ Chart.el is a bit beta, eh alpha, but still useful I believe.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.74">1.74</dt>
+ <dd id="v1.74-dd">
+ <ul>
+ <li>
+ Found and fixed a bug in <em>fictive XML validation
+ headers</em>. This bug depended on the load order of
+ libraries.
+ </li>
+ <li>
+ Fixed a small bug in <i>nxml-where-mode</i>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.75">1.75</dt>
+ <dd id="v1.75-dd">
+ <ul>
+ <li>
+ Included css-color.el, css-palette.el and gpl.el from Niels Giesen.
+ (This replaces hexcolor.el which is no longer in nXhtml.)
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.76">1.76 -- Released 2009-02-26</dt>
+ <dd id="v1.76-dd">
+ <ul>
+ <li>
+ <span class="bugfix">Fixed a long standing bug in XML validation.</span> (I had
+ forgot to set the defadvice return value in defadvice
+ rng-set-initial-state in rngalt.el - I wonder why I
+ did not get any bug reports about this...)
+ </li>
+ <li>
+ <span class="bugfix">css-color.el: bug fix for mIxEd case color names.</span>
+ </li>
+ <li>
+ <span class="bugfix">freemind.el: bug fixes.</span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.77">1.77 -- Never released!</dt>
+ <dd id="v1.77-dd">
+ <ul>
+ <li>
+ <span class="bugfix">Fixed numerous bugs</span>, please
+ see <a href="https://bugs.launchpad.net/nxhtml/">nXhtml bug tracker</a>
+ and dito <a href="https://answers.launchpad.net/nxhtml">question and answers</a>.
+ </li>
+ <li>
+ Added some missing autoloads.
+ </li>
+ <li>
+ <span class="bugfix">Tried to fix some smaller troubles with Viper when
+ changing chunk.</span>
+ </li>
+ <li>
+ <span class="bugfix">Menus for Tidy were broken. Fixed.</span>
+ </li>
+ <li>
+ Added a test that the <i>nxml-mode libraries included
+ in Emacs</i> are used and not the old ones. (If I
+ understand it correctly this might have been a problem
+ for Debian/Ubuntu Emacs 23 snap-shots users where the
+ old nxml-mode has been a left over from earlier
+ snap-shots where it was needed.)
+ </li>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Chunks are now always created from top to bottom.
+ This should make chunk creation more stable.
+ It also opens up for chunks in chunks in the future.
+ (The code still needs work...)
+ </li>
+ </ul>
+ </li>
+ <li>
+ majmodpri.el:
+ <ul>
+ <li>
+ To restore multi major modes in files loaded by
+ desktop-save-mode the new
+ function <i>majmodpri-apply</i> can be added
+ to <i>desktop-after-read-hook</i>.
+ </li>
+ <li>
+ New default for <i>majmodpri-sort-after-load</i>:
+ Sort after loading certain features/libraries that
+ are known to change <i>auto-mode-alist</i> and
+ apply to current buffer. This new default should
+ hopefully make major mode selection less
+ confusing.
+ </li>
+ </ul>
+ </li>
+ <li>
+ winsav.el:
+ <ul>
+ <li>
+ Added save and restore between Emacs sessions for frame configuration.
+ I am not sure how this works with special frames yet, but I have tested this with oneonone.el and it seems to work.
+ Dedicated windows should also work.
+ </li>
+ <li>
+ Added saving and restoring of named frame configurations.
+ </li>
+ </ul>
+ </li>
+ <li>
+ javascript.el:
+ <ul>
+ <li>
+ Updated to Karl's newest version (and added my additions).
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added library usb-setup.el that might help a bit with
+ using Emacs from an USB stick.
+ </li>
+ <li>
+ Updated smarty-mode.el to the latest version.
+ </li>
+ <li>
+ <img alt="Happy brain" src="img/fun-brain-2.png" width="131" height="119" />
+ Added an n-back game for your brain (and mine).
+ Just do <b>M-x n-back-game</b> to start it.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.78">1.78 -- Released 2009-05-28</dt>
+ <dd id="v1.78-dd">
+ <ul>
+ <li>
+ <span class="bugfix">nXhtml version 1.78 is the
+ release of the previous beta</span> (which had number
+ 1.77 and existed in many versions).
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.79">1.79</dt>
+ <dd id="v1.79-dd">
+ <ul>
+ <li>
+ Added a function to simplify adding for example font
+ lock keywords for major modes used in multi major
+ mode: <i>mumamo-refresh-multi-font-lock</i>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.80">1.80 -- Released 2009-06-02</dt>
+ <dd id="v1.80-dd">
+ <ul>
+ <li>
+ <span class="bugfix">Fixed a (rather serious) bug and cleaned up.</span>
+ </li>
+ <li>
+ Added mumamo regions. Mumamo regions are temporary
+ mumamo chunks that you set up by selecting a region
+ and telling you want that in a new major mode. To use
+ this feature look in the nXhtml menu under <i>Chunks -
+ Region Chunks</i>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.81">1.81 -- Released 2009-06-19</dt>
+ <dd id="v1.81-dd">
+ <ul>
+ <li>
+ Added the minor mode <i>mumamo-alt-php-tags-mode</i>
+ that lets you work more easily with &lt;?php tags in
+ strings while you are still able to use XHTML
+ completion. (I added something looking rather similare
+ earlier, but removed it again because of difficulties
+ with undo. They are now fixed in Emacs and this should
+ be safe.)
+ </li>
+ <li>
+ Added support for hi-lock, but please be aware that
+ chunk overlays hides background marking that hi-lock
+ does... - so you must use marking that changes
+ foreground part of face.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.82">1.82 -- Released 2009-06-23</dt>
+ <dd id="v1.82-dd">
+ <ul>
+ <li>
+ <span class="bugfix">Find and fixed some bugs when
+ I tried to fix bug 388729.</span> Not sure I fixed that
+ bug though.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.83">1.83 -- Released 2009-06-24</dt>
+ <dd id="v1.83-dd">
+ <ul>
+ <li>
+ <span class="bugfix">Fontification disappeared for example in *grep* buffer. Fixed.</span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.84">1.84 -- Released 2009-06-30</dt>
+ <dd id="v1.84-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">Worked around bug in Emacs
+ 22.3 where c-after-change was left in
+ after-change-functions.</span> (This makes no
+ difference in Emacs 23.)
+ </li>
+ <li>
+ <span class="bugfix">Fixed a bug that occured
+ after deletion of whole chunks.</span>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.85">1.85 -- Released 2009-07-04</dt>
+ <dd id="v1.85-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">Corrected various mostly
+ minor bugs</span>, like indent-line-function which
+ where globally set to
+ mumamo-indent-line. Corrected.
+ </li>
+ <li>
+ <span class="bugfix">Forgot to finish the implementation of support for
+ font-lock-add-keywords. Done.</span>
+ </li>
+ <li>
+ Added some faces hi-mumamo-* to use with hi-lock,
+ but unfortunately they are not very
+ visible. Suggestions are welcome.
+ </li>
+ </ul>
+ </li>
+ <li>
+ CEDET and ECB:
+ <ul>
+ <li>
+ <span class="bugfix">Made the routines for fetching and installing CEDET and ECB
+ from the development sources work again.</span>
+ </li>
+ <li>
+ Added support for ECB in <i>winsav-save-mode</i>. Though I suspect it need some rework...
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added pointback.el, found on EmacsWiki. This is just
+ so missing in Emacs...
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.86">1.86 -- Released 2009-07-05</dt>
+ <dd id="v1.86-dd">
+ <ul>
+ <li>
+ Made the fetching and installing of CEDET and ECB a
+ bit better.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.87">1.87 -- Released 2009-07-08</dt>
+ <dd id="v1.87-dd">
+ <ul>
+ <li>
+ Some enhancements to winsav.el and menuacc.el.
+ </li>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Added heredoc for some modes. They are currently
+ kind of hidden since they are only available in
+ multiple major modes that offer just heredocs.
+ The implemented heredoc multi major modes are
+
+ sh-mumamo-heredoc-mode,
+ php-mumamo-heredoc-mode,
+ perl-mumamo-heredoc-mode,
+ cperl-mumamo-heredoc-mode,
+ python-mumamo-heredoc-mode and
+ ruby-mumamo-heredoc-mode.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.88">1.88 -- Never released, only betas</dt>
+ <dd id="v1.88-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">
+ Background colors could not be removed by
+ setting <i>mumamo-background-coloring</i>.
+ Fixed, but please notice that this variable now
+ is a number.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">Support for chunks in chunks.</span>
+ </li>
+ <li>
+ <span class="bugfix">Removed string-match-p which does not exist in Emacs 22.</span>
+ </li>
+ <li>
+ <span class="bugfix">
+ mumamo-alt-php-tags-mode hardly survived major mode
+ changes. Rescued.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Added possibility to display chunk info in
+ window margins as an alternative/addon to
+ colored chunks.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Fixed a bug in n-back.el that prevented the game to be used on Emacs 22.
+ </span>
+ </li>
+ </ul>
+ </li>
+ <li>
+ Bug fixes and changes to udev for CEDET and ECB. (Udev
+ is a little utility to fetch and install dev sources.)
+ <ul>
+ <li>
+ <span class="bugfix">
+ Changed default directory for installing CEDET and
+ ECB to be under <i>~/.emacs.d/udev/</i>.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Several bug fixes for udev.
+ It should now work again (it did not if you compiled nXhtml).
+ </span>
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added support for <a href="http://www.emacswiki.org/emacs/CompanyMode">Company Mode</a> style completion. Temporary included a copy of Company Mode with bug fixes and changes needed for nXhtml and Viper. It also include a lot of other small features (which I hope can be included in Company Mode). On of these is integration with <a href="http://www.emacswiki.org/emacs/PredictiveMode">Predictive Mode</a>. (You have to get Predictive Mode yourself. If you want to install it on MS Windows I recommend using the latest version of Cygwin. A smaller change to the Makefile is required, there is one absolute path you probably want to remove.)
+ <p class="bugfix">
+ Note: I thought that I should make Company Mode the default completion style. However there are still some problem so I kept the old default completion style.
+ </p>
+ </li>
+ <li>
+ TabKey2:
+ <ul>
+ <li>
+ Added support for Company Mode.
+ </li>
+ <li>
+ Made completion only occur at word ends.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added support for <a href="http://www.emacswiki.org/emacs/Anything">anything style completion</a> in XHTML completion.
+ </li>
+ <li>
+ Added support in inlimg-mode to show images in org-mode. (Also made inlimg-mode use font lock which makes it more reliable.)
+ </li>
+ <li>
+ Included espresso-mode (with some possible bug fixes). Not yet the default for Javascript.
+ </li>
+ <li>
+ <p class="bugfix">
+ Added simple functions for mirroring html files in
+ Firefox as typing. This works - at least for small
+ files. There is also support for automatic update
+ of Firefox when saving CSS files.
+ </p>
+ <p>
+ This is a simple framework for communicating with
+ MozRepl which enqueues requests, waiting for
+ response prompt before sending next requests.
+ <span class="bugfix">Maybe this can be used to make
+ some more efficient routines than those I have
+ written here. Any takers?</span>
+ </p>
+ <p>
+ For larger files (like this one) this version is
+ rather slow since it always changes the whole DOM.
+ </p>
+ </li>
+ <li>
+ <span class="bugfix">
+ Rewrote <i>nxml-where-mode</i> to be more efficient and
+ fixed some minor bugs. It can now also be used with
+ MozRepl to track position in file.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Made <i>winsav-save-mode</i> remember maximized state and forget about empty non-file buffers.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Added workaround for <a href="http://emacsbugs.donarmstrong.com/cgi-bin/bugreport.cgi?bug=4015">Emacs bug 4015 on w32</a>.
+ </span>
+ </li>
+ <li>
+ Added <i>ourcomments-M-x-menu-mode</i> which <a
+ href="http://lists.gnu.org/archive/html/emacs-devel/2009-07/msg01025.html">adds menu commands to M-x history</a>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.89">1.89 -- Released 2009-08-04</dt>
+ <dd id="v1.89-dd">
+ <ul>
+ <li>
+ The release version of all the fixes in beta 1.88.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.90">1.90 -- Released 2009-08-04</dt>
+ <dd id="v1.90-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Made wrap-to-fill-column-mode cooperate a bit with
+ mumamo-margin-info-mode.
+ </span>
+ </li>
+ <li>
+ Made an inventory of utilities in nXhtml and made some
+ of them more visible in the menus.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.91">1.91 -- Released 2009-08-04</dt>
+ <dd id="v1.91-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Mumamo bug fix for bug reported on Emacs wiki today. Inline scripts end tag could not be in column one if previous line had a // style js comment.
+ </span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.92">1.92 -- Released 2009-08-04</dt>
+ <dd id="v1.92-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ An Emacs bug that sometimes prevent changing local keymap in a timer hit us. Made a workaround.
+ </span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.93">1.93 -- Released 2009-08-04</dt>
+ <dd id="v1.93-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Minor bug in menus gave major problem. Fixed - I hope.
+ </span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.94">1.94 -- Never released, only betas</dt>
+ <dd id="v1.94-dd">
+ <ul>
+ <li>
+ MuMaMo
+ <ul>
+ <li>
+ <span class="bugfix">
+ Hopefully MuMaMo is now fully transfered to the new way of finding the major mode chunks. Chunks in chunks should now work (except for lurking bugs of course...). Tried to fix indentation.
+ </span>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span class="bugfix">
+ <i>wrap-to-fill-column-mode</i> calculated window width wrongly so that the displayed wrapping was not consistent with what fill-paragraph would give. Corrected together with some other bugs in it.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Fixed an indentation bug in php-mode I introduced when I fixed another indentation bug for heredoc endings.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ A bug in <i>ourcomments-M-x-menu-mode</i> made Emacs client fail. Fixed.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ The version of company-mode include in nXhtml has some changes. It turns out that these probably gives some problems with company-mode support for etags. The version of company-mode in nXhtml is therefore not autoloaded any more.
+ </span>
+ </li>
+ <li>
+ Improved external editing of web mail.
+ </li>
+ <li>
+ Removed <i>js2-mode</i> (and my attempts to make it work with mumamo) since it is now part of Emacs devel sources. Since js2-mode does not use font-lock its integration with mumamo have to wait until it does that.
+ </li>
+ <li>
+ Reworked <b>folding</b> a bit so it is more useful.
+ There is a new minor mode, <i>foldit-mode</i>, that shows better markers for folding. There is a new entry in the <i>nXhtml / Tools</i> menu for folding. <i>fold-dwim-toggle</i> now alwo toggles images and <i>html-write-mode</i> things. In html it first checks for headers then does tag block style visibility toggling.
+ </li>
+ <li>
+ Updated <i>vline.el</i>.
+ </li>
+ <li>
+ Removed fmode.el since it is not needed any more when majmodpri.el does the job.
+ </li>
+ <li>
+ Removed routines to fetch/load CEDET since CEDET is now part of devel sources of Emacs.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.95">1.95</dt>
+ <dd id="v1.95-dd">
+ <ul>
+ <li>
+ First release after all 1.94 betas.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.96">1.96</dt>
+ <dd id="v1.96-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Problem creating autoload file in latest dev version of Emacs. Fixed.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Fixed typo in wrap-to-fill.el.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Autoloaded <i>buffer-narrowed-p</i>.
+ </span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.97">1.97</dt>
+ <dd id="v1.97-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Problem with customize-option because widgets where not loaded. Rearranged code to bit to fix this.
+ </span>
+ </li>
+ <li>
+ Added support for Groovy from
+ <a href="http://tiagocury.blogspot.com/2009/10/gsp-groovy-server-pages-support-for.html">Tiago Cury</a>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.98">1.98</dt>
+ <dd id="v1.98-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Added support for PHP nowdocs.
+ </span>
+ </li>
+ <li>
+ Freemind.el: Added support for <i>org-odd-levels-only</i>.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v1.99">1.99</dt>
+ <dd id="v1.99-dd">
+ <ul>
+ <li>
+ Converted line endings from CRLF to LF.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.00">2.00</dt>
+ <dd id="v2.00-dd">
+ <p>
+ 2.00 does not stand for something very exciting, it is just a consecutive number. But - I do believe this is a rather mature version of nXhtml.
+ </p>
+ <ul>
+ <li>
+ MuMaMo
+ <ul>
+ <li>
+ <span class="bugfix">
+ Fixed some indentation bugs.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Added multi major mode local sub chunk dividing inheriting.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Made MuMaMo avoid closing org-mode nodes
+ </span>
+ when moving between sub chunks in org files.
+ </li>
+ <li>
+ <span class="bugfix">
+ Introduced per main major local variables.
+ </span>
+ First use is for buffer-invisibility-spec. This can only be set in the main major mode now. (Or rather, it will be reset to what was last set in main major mode when you move between chunks.) This is the most reasonable way I believe, since it may otherwise change when moving between chunks and the new chunk's major mode is called.
+ </li>
+ <li>
+ Added support for Mason.
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span class="bugfix">Renamed gimp.el to gimpedit.el</span> and made it open GIMP on other platforms than w32 too. (Symbols in the files are renamed too.) Skipped compatibility with old GIMP versions.
+ </li>
+ <li>
+ <span class="bugfix">Renamed freemind.el to org-freemind.el</span> so that it can be included among the org files.
+ Also added support for #+BEGIN_HTML when exporting to freemind.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.01">2.01</dt>
+ <dd id="v2.01-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">
+ Major mode was not always switched when moving fast between chunks. Fixed.
+ </span>
+ </li>
+ <li>
+ Made desktop recognize multi major modes.
+ </li>
+ </ul>
+ </li>
+ <li>
+ <span class="bugfix">
+ org-freemind.el was broken. Sorry.
+ </span>
+ </li>
+ <li>
+ Fixed a bug in wrap-to-fill-column-mode.
+ </li>
+ <li>
+ Enhanced support for smarty template language.
+ </li>
+ <li>
+ Mlinks mode used one timer per buffer. Converted to one global timer => much faster. (This actually slowed down Emacs screen update before.)
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.02">2.02</dt>
+ <dd id="v2.02-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">
+ Support for #+BEGIN_SRC ... #+END_SRC etc in org-mode.
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Bug fix for the case &lt;script ...&gt;//&lt;!-- --&gt;
+ </span>
+ </li>
+ <li>
+ <span class="bugfix">
+ Fixed support for ASP again.
+ </span>
+ </li>
+ <li>
+ Added support for XSL with embedded CSS and Javascript, see <i>xsl-nxml-mumamo-mode</i>.
+ </li>
+ <li>
+ Added support for SSJS (Server Side Javascript)
+ </li>
+ <li>
+ Changed to using nxhtml-mode for indentation when chunk major is htm-mode. Added <i>mumamo-indent-major-to-use</i> to control this.
+ </li>
+ <li>
+ Turned off nxml-mode validation during indentation of regions.
+ </li>
+ <li>
+ Updated htmlfontify.el.
+ </li>
+ <li>
+ Included <a href="http://www.emacswiki.org/emacs/ZenCoding">zencoding-mode.el</a>.
+ </li>
+ <li>
+ Finally got around to implement a <b>C-a</b> that just selects a widget field in a Custom buffer, not the whole buffer. See <i>rebind-keys-mode</i>.
+ </li>
+ </ul>
+ </li>
+ <li>
+ Added wrap-to-fill-column-global-mode.
+ </li>
+ <li>
+ Removed org-freemind.el (formerly freemind.el) since it is now part of Emacs CVS repository and you can get it there.
+ </li>
+ <li>
+ <span class="bugfix">
+ Added flymake support for CSS and javascript with detailed instructions of how to install needed support.
+ </span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.03">2.03</dt>
+ <dd id="v2.03-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">
+ Made the new JavaScript mode that is included in Emacs work within chunks.
+ </span>
+ </li>
+ </ul>
+ </li>
+ <li>
+ Removed the JavaScript modes that were distributed with nXhtml. If you are not using CVS Emacs please get js.el from there.
+ </li>
+ <li>
+ <span class="bugfix">
+ Made <i>majmodpri-no-nxml</i> work a bit better.
+ </span>
+ </li>
+ <li>
+ Put <i>rebind-keys-mode</i> on the menu so it can be found.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.04">2.04</dt>
+ <dd id="v2.04-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Added web install and update of nXhtml.
+ </span>
+ You can find this in the nXhtml menu.
+ If you do not have this in your nXhtml yet, or have not installed nXhtml please see the instructions on EmacsWiki.
+ </li>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ <span class="bugfix">
+ Fixed some problems with temporary chunks.
+ </span>
+ </li>
+ <li>
+ Added support for html chunks in markdown files with new multi major mode <i>markdown-html-mumamo-mode</i>.
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.05">2.05</dt>
+ <dd id="v2.05-dd">
+ <ul>
+ <li>
+ <span class="bugfix">
+ Fixed a problem in flymake-css.el with loading newst-backend.el (which provides the wrong feature).
+ </span>
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.06">2.06 - never released</dt>
+ <dd id="v2.06-dd">
+ <ul>
+ <li>
+ MuMaMo:
+ <ul>
+ <li>
+ Skipped fontification during indentation. (This was troublesome since major mode may have to be changed during indentation.)
+ </li>
+ <li>
+ Included iss-mode and iss-mumamo-mode for editing of Inno Setup scripts.
+ </li>
+ <li>
+ <span class="bugfix">
+ Comments in eRuby &lt;%# .. %&gt; did not work. Fixed.
+ </span>
+ </li>
+ </ul>
+ </li>
+ <li>
+ Included better support for Java in flymake. It will can now recognize makefiles, ant and single java files and try to DTRT.
+ </li>
+ </ul>
+ </dd>
+ <dt id="v2.07">2.07 - never released</dt>
+ <dd id="v2.07-dd">
+ <p>
+ This version was never released, but was available as beta for testing (and use). During this beta I tried to finish the rewriting of the rewriting of the chunk dividing routines. (Those needed simplification. Initially I believed that chunks with different major could be created starting from anywhere in the file. This was complex and indeed a bad idea since the chunk dividing markers depends on the content of the file from the top.)
+ </p>
+ <p>
+ A lot of bugs where fixed during this and new things were added. Some things were removed. But there is no good logg of this anywhere because I did not have time to update that. Sorry. But if you are interested you can have a look at the bug database at Launchpad.
+ </p>
+ </dd>
+ <dt id="v2.08">2.08 - released 2010-04-25</dt>
+ <dd id="v2.08-dd">
+ <p>
+ This is the first released version since version 2.05 (which was released in Dec 2009).
+ </p>
+ <p>
+ One noticeable thing is that the menus were restructered to make it easier to find things. You can find some of the new things there. Most of the rest are internal changes and bug fixes.
+ </p>
+ </dd>
+ </dl>
+ </div>
+
+ <hr class="footer"/>
+ <p class="footer">
+ <span id="latest">Copyright &copy; <!-- this year -->2009<!-- end this year --> OurComments.org</span>
+ </p>
+ </div>
+ </body>
+</html>
diff --git a/emacs.d/nxhtml/nxhtml/doc/nxhtml.css b/emacs.d/nxhtml/nxhtml/doc/nxhtml.css
new file mode 100644
index 0000000..eea8750
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/nxhtml.css
@@ -0,0 +1,171 @@
+@import url(td_oc.css);
+
+hr {
+ margin-top: 4em;
+}
+body {
+ margin-top: 0.5em;
+ background-color: #ffe4b5;
+ background-color: #ffffdf;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+body, td {
+ font-size: 0.9em;
+ font-family: Arial, sans-serif;
+}
+h1, h2, h3 {
+ color: #556b2f;
+}
+em {
+ color: maroon;
+ font-style: normal;
+}
+
+a {
+ color: maroon;
+}
+a.nonexistent {
+ font-weight: bold;
+ background-color: #F8F8F8;
+ color: #FF2222;
+}
+
+a.nonexistent:visited {
+ background-color: #F8F8F8;
+ color: #FF2222;
+}
+
+a.dl {
+ font-weight: 400;
+ background-color: #e0ff6e
+}
+
+strong { font-weight: bold; }
+
+ul { list-style-type: disc }
+
+dl.contents { margin-top: 0; }
+dt.contents { margin-bottom: 0; }
+
+
+p.verse {
+ white-space: pre;
+ margin-left: 5%;
+}
+
+pre {
+ white-space: pre;
+ /* monospace does not work in Firefox 0.9.2 font-family: monospace; */
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl.bolddt dt { font-weight: bold; }
+
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-bottom: 0.7em;
+}
+hr {
+ width: 100%;
+}
+hr.divider {
+ height: 0.7em;
+ background-color: maroon;
+ width: 67%;
+}
+#FEAT li {
+ margin-bottom: 0.7em;
+}
+
+#PAGETOC {
+ float: left;
+ background-color: #df7;
+ background-color: #edef87;
+ margin-right: 2em;
+ margin-bottom: 2em;
+ margin-top: 0em;
+ -moz-border-radius: 1em;
+}
+#PAGETOC td {
+ padding: 0.8em;
+ padding-right: 1.1em;
+ //font-size: 0.8em; /* For IE only */
+}
+#PAGETOC strong {
+ color: #6b8e23;
+ display: block;
+ margin-bottom: 0.5em;
+}
+#PAGETOC ul li a {
+ color: maroon;
+}
+#PAGETOC a:hover { background-color: yellow; }
+#PAGETOC ul {
+ list-style-type: none;
+ margin:0;
+ padding-left: 1.5em;
+}
+#PAGETOC ul li {
+ font-weight: bold;
+}
+#PAGETOC ul li ul { }
+#PAGETOC ul li ul li { font-weight: normal;}
+#PAGETOC .liul {
+ //display:inline; /* For IE only */
+}
+#emacswikibar {
+ background-color:#ef4;
+ background-color: #edef87;
+ text-align:center;
+ margin-top:0em;
+ padding:0.4em;
+}
+#imgwikiguide {
+ background-color:#cef;
+ padding:2em;
+ -moz-border-radius: 2em;
+}
+
+#download a {
+ border: groove;
+ font-size: 1.5em;
+ padding: 0.6em;
+ background-color: #556b2f;
+ color: #ce6;
+ -moz-border-radius: 1em;
+}
+#download a:hover {
+ color: #BF0;
+ background-color: black;
+ text-decoration: underline;
+}
+#emacsw32dl {
+ width:20em;
+ border-style:solid;
+ border-color:#556b2f;
+ padding:0.7em;
+ -moz-border-radius: 1em;
+}
+
+#my-elisp {
+ background-color: #fff;
+ padding: 2em;
+ border-style: solid;
+ -moz-border-radius: 1em;
+}
+#my-elisp dl {
+ margin-left: 2em;
+}
+
+#keybnotationdiv {
+ border-width:1px;
+ border-style:solid;
+ border-color:#556b2f;
+ padding:0.7em;
+ padding-left:1.5em;
+ -moz-border-radius: 1em;
+}
diff --git a/emacs.d/nxhtml/nxhtml/doc/nxhtml.html b/emacs.d/nxhtml/nxhtml/doc/nxhtml.html
new file mode 100644
index 0000000..01d761d
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/nxhtml.html
@@ -0,0 +1,987 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>nXhtml - an Emacs mode for Web Development</title>
+ <link href="wd/grapes/nxhtml-grapes.css" rel="StyleSheet" type="text/css" />
+ <style type="text/css">
+ #special {
+ background-color: red;
+ }
+ </style>
+<style type="text/css">
+
+
+#getit {
+ max-width: 800px;
+}
+
+#getit span { display: none; }
+/* This seems to be impossible with CSS2 since the containing block
+ can not be floated. Why did they design it that way?
+#getit, #getit dl { display: block; }
+#getit a:hover span {
+ display: block;
+ position: absolute;
+ left: 200;
+ top: 0;
+}
+*/
+
+#getit a {
+ /* Image */
+ display: block;
+ background: transparent url("img/getitbuttons.png") 0 0 no-repeat;
+ overflow: hidden;
+ width: 200px;
+ /* Text placement and size, etc */
+ text-align: center;
+ padding-top: 11px;
+ font-size: 12px;
+ font-weight: 600;
+ padding-bottom: 9px;
+ text-decoration: none;
+ white-space: nowrap;
+ border: none;
+}
+#getit dt {
+ display: block;
+ padding: 0;
+ margin: 0;
+ float: left;
+ letter-spacing: 0;
+}
+#getit a:hover {
+ background-position: 0 -35px;
+ color: yellow;
+}
+
+#useit {
+ position: absolute;
+ top: 150px;
+ left: 100px;
+ width: 85px;
+ z-index: 100;
+ border: none;
+ font-size: 9px;
+}
+/* I can't get rid of the underline. Firefox bug or my bug? */
+#useit a { text-decoration: none; }
+#useit img {
+ text-decoration: none;
+ overflow: hidden;
+ border: solid 2px #990033;
+}
+div#useit { text-decoration: none; }
+#useit img:hover {
+ background: url("img/use-nXhtml-trans2.png") 0 0 no-repeat;
+}
+
+#quicklnk a {
+ color: #cd3700;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+#quicklnk a:hover {
+ background-color: yellow;
+}
+
+</style>
+ </head>
+ <body>
+ <div id="useit">
+ <!-- title is for Firefox -->
+ <a href="http://ourcomments.org/Emacs/nXhtml/doc/nxhtml.html"
+ title="Get nXhtml for Emacs"
+ ><img alt="Get nXhtml for Emacs" src="img/use-nXhtml-trans2.png" width="78" height="29" /></a>
+ Above is a little banner you can put on your site if you want to.
+ </div>
+
+ <div id="container">
+ <div id="hdr">
+ <br />
+ <span style="color:#FF0;font-size:14px; font-weight: 600;"> <i>&nbsp;Enjoying editing web files!</i> </span>
+ <br />
+ </div>
+
+ <div id="lftcol">
+ <!-- Table of contents BEGIN -->
+ <!-- Table of contents min=2 max=3 -->
+ <table id="PAGETOC"><tr><td>
+ <span class="tochead">On THIS Page:</span>
+ <ul>
+ <li><a href="#summary">Introduction to nXhtml</a></li>
+ <li class="liul"><ul>
+ <li><a href="#featsum">Features</a></li>
+ <li><a href="#qg">The Quick Guide</a></li>
+ <li><a href="#toolset">What you may use more</a></li>
+ </ul></li>
+ <li><a href="#completion">Completion</a></li>
+ <li class="liul"><ul>
+ <li><a href="#complex-compl">More Helpful Completion</a></li>
+ <li><a href="#ask-compl">But How Do I Ask nXhtml for Alternatives?</a></li>
+ <li><a href="#region-compl">The Region and Completion</a></li>
+ <li><a href="#errors">And if I Do Not Follow the Advices?</a></li>
+ </ul></li>
+ <li><a href="#xmlpath">Where am I? - XML Path</a></li>
+ <li><a href="#sites">Why it is Useful that nXhtml has Sites</a></li>
+ <li><a href="#mlinks">Why the Links Look Like Links</a></li>
+ <li><a href="#tocs">Did You Notice the Table of Contents at the Top?</a></li>
+ <li><a href="#tidy">But I Can't Use this Cause my Files are HTML</a></li>
+ <li><a href="#php">And what about Multiple Modes like PHP?</a></li>
+ <li class="liul"><ul>
+ <li><a href="#dtd-needed">But I Have no DTD Links in my PHP Files?</a></li>
+ <li><a href="#multi-colors">Why Are Colors Different in Multiple Modes?</a></li>
+ <li><a href="#part2">More Multiple Modes</a></li>
+ <li><a href="#tips-multi">Tips When Using Multiple Modes</a></li>
+ </ul></li>
+ <li><a href="#file-assoc">File Associations within Emacs</a></li>
+ <li><a href="#bloggin">Not for Me, I Am Only Blogging</a></li>
+ <li><a href="#bloggin">And Other Goodies...</a></li>
+ </ul>
+ </td></tr></table>
+ <!-- END of Table of contents -->
+ </div>
+
+ <div id="getit">
+ <dl>
+ <dt>
+ <a href="http://ourcomments.org/Emacs/nXhtml/tut/tutorials.html" title="Tutorials">Tutorials</a>
+ </dt>
+ <dt>
+ <a href="https://answers.launchpad.net/nxhtml/+faqs" title="nXhtml FAQ">nXhtml FAQ</a>
+ </dt>
+ <dt>
+ <a href="nxhtml-changes.html">News about nXhtml
+ <span>Details</span></a>
+ </dt>
+ <dt>
+ <a href="http://www.emacswiki.org/cgi-bin/wiki/NxhtmlMode"
+ >nXhtml page at EmacsWiki</a>
+ </dt>
+ <dt>
+ <a id="download" href="http://ourcomments.org/cgi-bin/emacsw32-dl-latest.pl">Download nXhtml</a>
+ </dt>
+ <dt>
+ <a href="https://launchpad.net/nxhtml" title="Bazaar repository">nXhtml at Launchpad</a>
+ </dt>
+ </dl>
+ </div>
+
+ <div id="rgtcol">
+ <h1 id="mainheader">nXhtml - Emacs Utilities for Web Development</h1>
+
+ <h2 id="summary">Introduction to nXhtml</h2>
+ <p>
+ nXhtml is an addon to Emacs for editing XHTML, PHP and similar things. It is not
+ very well-known, but it looks like at least <a
+ href="http://drewyates.net/nxml-nxhmtl-emacs-mode-for-ruby-on-rails-rhtml">Drew
+ Yates</a> has found it useful:
+ </p>
+ <blockquote>
+ <p style="font-style:italic">
+ nXML mode and the subsequent nXHTML mode for emacs are godsends ...
+ </p>
+ </blockquote>
+ <p>
+ And that was before I fixed all the bugs ...
+ </p>
+
+ <h3 id="featsum">Features</h3>
+ <p>
+ One of the main parts of nXhtml is nxhtml-mode, a GNU <a
+ href="http://en.wikipedia.org/wiki/Emacs">Emacs</a> major
+ mode that builds on <a
+ href="http://www.thaiopensource.com/nxml-mode/">nxml-mode</a>.
+ It knows about XHTML syntax and can check this as
+ you type. It can also tell you what tags and attributes you
+ can use at a certain point and help you insert them.
+ </p>
+ <p>
+ That feature, which we call <a
+ href="#completion">completion</a>, is one of the main
+ features of this mode. Another important feature is the
+ ability to mix several languages in one buffer and get the
+ correct syntax highlighting and indentation for each of
+ them.
+ </p>
+ <p>
+ In nXhtml this is combined with other features to make it
+ more easy to edit web sites (mostly XHTML based but there is
+ support for things like PHP too). Here is a list of important features:
+ </p>
+ <ul id="sum-ul">
+ <li>
+ Completion and syntax checking for XHTML.
+ <ul>
+ <li> Some helpful extensions when completing certain tags (like the &lt;a ...> tag for example).</li>
+ <li> When region is visible tag completion will surround the region with the start tag and end tag.</li>
+ </ul>
+ </li>
+ <li>
+ Multiple major modes, which means it can handle for example PHP, JSP, eRuby and Django while allowing XHTML completion.
+ (Notice however that not all major modes you may need for this comes with nXhtml.)
+ </li>
+ <li>
+ Link handling:
+ <ul>
+ <li> Easier insertion of tags with links.</li>
+ <li> Following links to edit or view.</li>
+ <li> Moving between links.</li>
+ <li> Moving files and automatically update affected links.</li>
+ <li> Copy link to id location and paste it back as a relative link.</li>
+ <li> Link checking in current site (local links only)</li>
+ </ul>
+ </li>
+ <li>
+ The concept of a site. This is used in many places. A
+ site is here a directory tree with additional properties, like
+ remote ftp and http addresses. A directory could belong to
+ many sites.
+ </li>
+ <li>
+ Make a remote copy of site:
+ <ul>
+ <li> Uploading of single files</li>
+ <li> Uploading of whole or part of site</li>
+ <li> Editing of remote files.</li>
+ <li> Ediff of local vs remote file.</li>
+ <li> Easy viewing of local and remote files in web browser.</li>
+ </ul>
+ </li>
+ <li>
+ Table of contents
+ <ul>
+ <li>Creating table of contents for a page.</li>
+ <li>Creating table of contents for a site.</li>
+ <li>
+ Merging of pages and table of contents for a site (see
+ example, notice that the table of content easily can be
+ navigated using the keyboard).
+ </li>
+ </ul>
+ </li>
+ <li> Support for folding.</li>
+ <li> Using <a href="http://www.w3.org/People/Raggett/tidy/">Tidy</a> to convert HTML to XHTML.</li>
+ <li> Help for XHTML tags and CSS attributes.</li>
+ <li> Edit a fragment of an XHTML file (for blogging for example).</li>
+ <li> ... and more of course ...</li>
+ <!-- <li> Adding a popup menu to [apps] to access these features.</li> -->
+ </ul>
+
+ <h3 id="qg">The Quick Guide</h3>
+ <p>
+ Below are some short notes to get you started using nXhtml.
+ (Maybe you should start by taking a look at the
+ <a href="http://ourcomments.org/Emacs/nXhtml/tut/tutorials.html" title="Tutorials">Tutorials</a>?)
+ </p>
+ <dl>
+ <dt>GNU Emacs 22 or later</dt>
+ <dd>
+ <p>
+ You need GNU Emacs 22 (which was released 2007-06-02) or later.
+ </p>
+ </dd>
+ <dt>Installation</dt>
+ <dd>
+ <ul>
+ <li>
+ Download nXhtml as a zip file <a href="http://ourcomments.org/cgi-bin/emacsw32-dl-latest.pl">here</a>
+ or download
+ <a href="http://ourcomments.org/Emacs/EmacsW32.html">EmacsW32</a>.
+ </li>
+ <li>
+ If you got nXhtml with <a
+ href="http://ourcomments.org/Emacs/EmacsW32.html">EmacsW32</a>
+ you should use the menus <em>Options - Customize
+ EmacsW32</em> and there just set <em>nxhtml-load</em>.
+ </li>
+ <li>
+ If you downloaded the zip file with nXhtml then unzip it anywhere and
+ then follow the instructions in
+ <em>nxhtml/README.txt</em>.
+ </li>
+ </ul>
+ <p>
+ After this files with extensions for example .html will open in nxhtml-mode.
+ </p>
+ <p>
+ To make nXhtml run faster you can also byte compile the files.
+ You do that with <i>M-x nxhtmlmaint-start-byte-compilation</i>.
+ </p>
+ </dd>
+
+ <dt id="nxhtml-menu">The nXhtml Menu</dt>
+ <dd>
+ <p>
+ To reach many of the features in nXhtml you can use the
+ <b>nXhtml menu</b>. If you do not see that when in a buffer
+ then you can always do <em>M-x nxhtml-minor-mode</em> which
+ will turn it on (or off) for that buffer.
+ </p>
+ <p>
+ But please notice also the <b>XML menu</b> which
+ contains the nXml menu! (Remember that nXhtml is based
+ on nXml.) When you are using nxhtml-mode this menu is
+ visible when you are in the XHTML parts of a buffer.
+ </p>
+ </dd>
+
+ <!-- <dt id="turn-on-some">Turn on Some Things</dt> -->
+ <!-- <dd> -->
+ <!-- <p> -->
+ <!-- There is a good chance that you want to turn on some -->
+ <!-- things that makes nXhtml work more automatic. They are -->
+ <!-- in the <a href="#nxhtml-menu">nXhtml menu</a> for -->
+ <!-- turning them on temporarily. Later, when you have -->
+ <!-- tested, you may want to turn them on permanently, which -->
+ <!-- you can do from the menus by choosing <em>nXhtml - -->
+ <!-- nXhtml Help and Setup - Quick Customize nXhtml</em>. -->
+ <!-- </p> -->
+ <!-- </dd> -->
+
+ <dt>XHTML Completion and Validation</dt>
+ <dd>
+ <p>
+ nXhtml knows a good deal about XHTML tags and attributes when you are using <em>nxhtml-mode</em>.
+ It can assist you in different ways:
+ </p>
+ <ul>
+ <li>
+ Completion
+ </li>
+ <li>
+ Validation
+ </li>
+ </ul>
+ <p>
+ <b>Completion</b> means that you ask Emacs to give you choices to complete what you are currently writing.
+ For example you may have written &lt;b and want to know what tags beginning this way can actually be used at that place in the document.
+ You ask Emacs in nxhtml-mode this by calling the function nxml-complete.
+ This is normally bound to M-Tab.
+ </p>
+ <p>
+ On some systems, for example MS Windows with an
+ unpatched Emacs this is inconvenient and clashes with
+ Alt-Tab that the window manager uses. There is however a
+ little utility that comes with nXhtml that let you use
+ just Tab for completion, <i>tabkey2-mode</i>. Turn this on with
+ </p>
+ <p style="padding-left:2em;">
+ M-x tabkey2-mode
+ </p>
+ <p>
+ After this the first Tab press will still do
+ indentation, but the second can do completion.
+ </p>
+ <p>
+ <b>Validation</b> means checking that what you have
+ written in nxhtml-mode follows the XHTML specifications.
+ If it does not there will be a red underline at the
+ places where something is wrong. To see what is wrong
+ move to this (for example with C-c C-n). A message in
+ the minibuffer will tell you the error.
+ </p>
+ <p>
+ Notice that the modeline also tells if the document is
+ valid. Most of the times it will however say
+ <em>Invalid</em> maybe just because you are editing and have
+ not yet finished.
+ </p>
+ <p>
+ For files mixing XHTML with codes, like PHP, you can use
+ something I call <a href="#dtd-needed">Fictive XHTML
+ Validation Headers</a>. That allows you to use XHTML
+ completion even if those files does not have the XHTML
+ headers needed.
+ </p>
+ </dd>
+ <dt>Multiple Major Modes</dt>
+ <dd>
+ <p>
+ nXhtml can automatically divide the buffer into chunks
+ with relevant different major modes (i e languages, like
+ PHP, XHTML etc). This is useful for editing PHP,
+ JSP, eRuby, Django and similar. See <a href="#php">And
+ what about Multiple Modes like PHP?</a> for more information.
+ </p>
+ </dd>
+ <dt>Links</dt>
+ <dd>
+ <p>
+ The links you put in your XHTML documents actually works
+ like links with nxhtml-mode too. To follow a link you
+ can use <em>C-c RET RET</em>. (There are other
+ possibilities too, they all begin with <em>C-c RET</em>.)
+ </p>
+ </dd>
+ <dt>Sites and Uploading</dt>
+ <dd>
+ <p>
+ If you want to upload your XHTML files, image files etc
+ you can do that from within Emacs. There are entries
+ for this in the <a href="#nxhtml-menu">nXhtml menu</a>.
+ </p>
+ </dd>
+ <dt>Keyboard shortcuts (aka keybindings in Emacs)</dt>
+ <dd>
+ <p>
+ When you start to use a new program you often wonder
+ about which keybindings there are to use. If you have
+ not used Emacs before you may feel quite lost because
+ you have looked in all documentation and you have not
+ seen any list of keybindings.
+ </p>
+ <p>
+ Well, that is how it often is in Emacs. Get use to it ...
+ </p>
+ <p>
+ But do not panic. Because there is help, probably even
+ better than you are used to - in Emacs dynamic help
+ system. A help system that change if you for example add
+ a keybinding yourself. Try the command <i>C-h b</i> (or <i>F1
+ b</i>). This list all the keybindings (in their priority
+ order) that are active where you are in Emacs.
+ </p>
+ <p>
+ You can also try <i>C-h m</i> which gives information about
+ minor modes and the current major mode. There is
+ sometimes information about the keybindings there too.
+ </p>
+ </dd>
+ <dt>Some More You Can Do ...</dt>
+ <dd>
+ <p>
+ See <a href="#summary">Introduction</a> above.
+ Look into the <a href="#nxhtml-menu">nXhtml menu</a>.
+ And then of course learn some of all the things you can do using the power of Emacs.
+ </p>
+ </dd>
+ </dl>
+ <p>
+ </p>
+ <h3 id="toolset">What you may use more</h3>
+ <p>
+ If find it very conventient to combine nXhtml with Firefox
+ add-on Firebug. I think Firebug is very handy for finding CSS
+ problem.
+ </p>
+ <p>
+ <a href="http://www.spreadfirefox.com/node&id=0&t=306"><img border="0"
+ alt="Firefox 3" title="Firefox 3"
+ src="http://sfx-images.mozilla.org/affiliates/Buttons/firefox3/110x32_get_ffx.png"/></a>
+
+ <a href="http://www.getfirebug.com/?link=2" title="Firebug
+ is a free web development tool for
+ Firefox"><img src="http://www.getfirebug.com/images/firebug2.png"
+ border="0" alt="Firebug - Web Development Evolved"/></a>
+ </p>
+ <p>
+ And of course, another good resource is Russ Weakley's <a
+ href="http://css.maxdesign.com.au/">CSS-based tutorials</a>.
+ Russ co-chairs the <a
+ href="http://webstandardsgroup.org/">Web Standards Group</a>
+ and seems to know this well.
+ </p>
+ <p>
+ I am sure you know about it, but just in case, here is WDG's
+ <a href="http://htmlhelp.com/design/accessibility/">Guide to Accessibility</a>
+ and their
+ <a href="http://htmlhelp.com/design/accessibility/tips.html">Accessibility Tips</a>.
+ </p>
+
+ <h2 id="completion">Completion</h2>
+ <div align="right">
+ <img align="right"
+ src="img/popup-compl.png"
+ alt="Popup menu style completion"
+ title="Popup menu style completion"
+ style="border: thin dotted #00ff00;
+ margin-left: 2em;
+ margin-top: 0em;
+ margin-bottom: 1em;"
+ width="371" height="483" />
+ </div>
+ <p>
+ Completion in nXhtml Mode lets you ask Emacs <i>"What can I
+ type here?"</i>. The most important part, the content, can
+ Emacs not help you with yet. However when it comes to XHTML and
+ such things that you really want to get past as easy as
+ possible, then nXhtml mode can assist you.
+ </p>
+ <p>
+ Perhaps you wonder with <i>"With what?"</i> Well, completion
+ works like this: You position point in your XHML file where you
+ want to write. Now you ask nXhtml what XHTML code you can
+ write there. nXhtml may answer that it can't help you, that
+ happens in some cases.
+ </p>
+ <p>
+ But most often nXhtml can help you. It knows about tags and
+ where they fit, and it knows about tag attributes. When nXhtml
+ can helpt you it will give you choices you can select from. It
+ may display the choices in a popup menu like in the pictures to
+ the left, or it may use something like the picture below shows.
+ It is actually exactly the same question that is asked in these
+ two cases. You decide by <i>customizing</i> nXhtml mode in Emacs which
+ way it should display the choices. The way below is the
+ standard Emacs way to do display choices. It is fast once you know it, but
+ the popup menus are of course more familiar to computer users
+ today.
+ </p>
+ <img alt="Emacs style completion" src="img/emacs-style-completion.png" width="456" height="406"
+ />
+ <p>
+ That far nXhtml can take you because it knows the DTD for XHTML.
+ (You may wonder about different versions of XHTML, more about that later.)
+ </p>
+
+ <h3 id="complex-compl">More Helpful Completion</h3>
+ <p>
+ For certain attributes nXhtml knows their values because the DTD just allows certain values.
+ For some other attribute values for which nXhtml can know little
+ from the DTD alone, like links (src and href attributes) nXhtml
+ can also be helpful. If you want a link to a file, for example,
+ nXhtml lets you browse for the file and then inserts a relative
+ link to it. It can also look for anchors (ie <b>id</b> attributes).
+ </p>
+ <p>
+ In some cases nXhtml knows more about a tag.
+ From the DTD it knows that an <b>&lt;img></b> tag should have a <b>src</b> attribute with a value that points to an image.
+ Therefor it prompts you for the value of the src attribute.
+ It is the same with the <b>alt</b> attribute that is required.
+ It even gets the height and width of an image on file if it can and inserts the attributes in the &lt;img> tag.
+ </p>
+ <p>
+ Well, it is better that you test (and perhaps give some feedback?).
+ </p>
+ <p>
+ Normally nXhtml does not care that much. It just tells you that
+ you when you have broken the DTD rules. If however you want
+ nXhtml to do less or more of this kind then you can change the
+ variable <b>nxhtml-complete-tag-do-also</b> - but that requires
+ that you knows Emacs lisp. If you do write something useful for
+ this, please tell me.
+ </p>
+
+ <h3 id="ask-compl">But How Do I Ask nXhtml for Alternatives?</h3>
+ <p>
+ Oh, I nearly forgot. Do you wonder how to ask nXhtml in Emacs for completion alternatives?
+ That is a nice question to answer.
+ You give a certain command to Emacs to ask for this.
+ That can be done by either:
+ </p>
+ <ul>
+ <li>Type <i>M-Tab</i></li>
+ <li>Do it from the <a href="#nxhtml-menu">nXhtml menu</a>: <i>nXhtml - Completion - Complete tag, attributes etc</i></li>
+ <li>Or more explicit with a command: <i>M-x nxml-complete</i></li>
+ </ul>
+ <p>
+ You can change <i>M-Tab</i> to whatever you want. What it
+ means? Ah, yes, it means <i>"hold down the Meta key and press
+ Tab"</i>. That is Emacs jargon and you have to know which key
+ is the Meta key of course. I actually use the left Windows key
+ on my keyboard for Meta. See <a
+ href="http://ourcomments.org/Emacs/EmacsW32.html">EmacsW32 home
+ page</a> for some information about this if you are on MS
+ Windows.
+ </p>
+
+ <h3 id="region-compl">The Region and Completion</h3>
+ <p>
+ This is a small but useful thing (and I added it because some people liked it, it
+ was not my own idea): If some text is selected (in Emacs jargon
+ "if region is active and hilighted") and you use completion to
+ insert a tag then the <em>region will be surrounded by that tag</em>.
+ If region is active like here:
+ </p>
+ <img alt="Region is selected" src="img/region-selected.png" width="584" height="50"
+ style="border: thin dotted #00ff00;
+ vertical-align: top;
+ margin-bottom: 1em;" />
+ <p>
+ And you then ask for completion:
+ </p>
+ <img alt="Ask for tag" src="img/region-selected-completion.png" width="584" height="393"
+ style="border: thin dotted #00ff00;
+ vertical-align: top;
+ margin-bottom: 1em;" />
+ <p>
+ The result will be that your choice (<em>em</em> here) will surround the region you had selected:
+ </p>
+ <img alt="After completion" src="img/region-selected-after.png" width="584" height="61"
+ style="border: thin dotted #00ff00;
+ vertical-align: top;
+ margin-bottom: 1em;" />
+ <p>
+ Eh? Ah, yes, you are right. I happened to choose the wrong picture for the result. Sorry.
+ </p>
+
+ <h3 id="errors">And if I Do Not Follow the Advices?</h3>
+ <p>
+ nXhtml gives you advices about how to handle the XHTML tags, but
+ it does not force you to follow them. You can write whatever
+ you want, but nXhtml anyway observes what you are doing and
+ checks the XHTML code. If you do not follow the DTD rules
+ nXhtml will silently warn you with a red underline, like here
+ (where I have written <i>image</i> instead of <i>img</i>):
+ </p>
+ <img alt="Validation error marking" src="img/validation-error.png" width="375" height="50"
+ style="border: thin dotted #00ff00;"
+ />
+ <p>
+ (Oh, geeh. Firefox took that before, but not now ...)
+ </p>
+
+ <h2 id="xmlpath" style="clear:both">Where am I? - XML Path</h2>
+
+ <p>
+ If you have for example &lt;div> tags to separate things or long
+ list you may wonder in which of those you are. Nxml Mode can
+ show this. Look in the menus <i>XHTML - XML Path</i> to turn it
+ on. Here is what it looks like. There is header with the label <i>Path:</i> which here shows that we are in a list with id="sum-ul".
+ Note also the yellow color of the tag we are in. The whole path up to the top is colored this way.
+ </p>
+ <img alt="Showing XML Path" src="img/nxml-where.png" width="456" height="262" />
+ <p>
+ A little tip: I found this very useful when I looked at different CSS designs.
+ </p>
+
+ <h2 id="sites">Why it is Useful that nXhtml has Sites</h2>
+ <p>
+ I am writing this in nXhtml mode in Emacs. Just after I had
+ written a piece or added an image on my pc I update the web
+ pages on http://OurComments.org/. I do that very easily because
+ of the concept of a site.
+ </p>
+ <p>
+ A <b>site in nXhtml</b> is in its simplest form just a local directory tree.
+ And that is given a name.
+ In my case I have given it the name <i>nxhtml-doc</i> just to remember what it is about.
+ </p>
+ <p>
+ To that site I have also added information about uploading and
+ and the http address of the uploaded files. Now if I add an
+ image to the site on my pc all I have to do to upload it to the
+ web site is to open the image in Emacs (yes that is possible,
+ Emacs knows about the most common image formats) and then just from the menus choose
+ <i>Web Site - File Transfer - Upload Single File</i>.
+ That is all.
+ </p>
+ <p>
+ And then I can (from the XHTML file I am editing) use the
+ command <i>XHTML - File Transfer - View Uploaded File</i> to
+ check that the web page is ok.
+ </p>
+
+ <h2 id="mlinks">Why the Links Look Like Links</h2>
+ <p>
+ As soon as you open an XHTML file in nXhtml mode you will notice that the links you enter looks like links.
+ They are underlined and blue like in a web browser.
+ You may think that that is kind of nice, but why do they look like that?
+ </p>
+ <p>
+ It is just because they are links. You access them a little bit
+ different in a web browser, just so that it does not interfere
+ with editing. And because you may want to do different things
+ with them. Take a look at the picture below. I have positioned
+ point to a link and then pressed tha App key on my keyboard.
+ That pops up a menu where I can see what I can do with the link:
+ </p>
+ <img alt="Link with popup menu" src="img/links-appmenu.png" width="529" height="189"
+ style="border: thin dotted #00ff00;"
+ />
+ <p>
+ As you can see I can copy the link (maybe not that useful
+ often). I can open it - and that means edit the linked file in
+ Emacs. That is useful. And then I can view the linked file in a
+ web browser. Can be useful too.
+ </p>
+ <p>
+ And then I can move between the links.
+ </p>
+ <p>
+ All this is useful, at least for me. But there are some more
+ things, in the menus <i>XHTML - Links</i>. Check them out, you
+ may like them. They may save you time.
+ </p>
+
+ <h2 id="tocs">Did You Notice the Table of Contents at the Top?</h2>
+ <p>
+ Well, you should notice not because it exactly is the worlds
+ most pretty table of content. But because it is there. And I
+ did not write it. nXhtml mode wrote it for me.
+ </p>
+ <p>
+ How it works? Just put <b>id</b> attributes on your header tags
+ (h1-h6). Then position point where you want the table of
+ contents. Tell nXhtml mode to write it by using the menus
+ <i>XHTML - Table of Contents</i>.
+ </p>
+ <p>
+ When you want to change it just ask nXhtml mode to rewrite it.
+ </p>
+ <p>
+ And you can make it more pretty if you are good at CSS.
+ </p>
+
+ <h2 id="tidy">But I Can't Use this Cause my Files are HTML</h2>
+ <p>
+ That is a problem of course. You need to convert them to XHTML
+ because that is what the browsers and all other tools are best
+ at today.
+ </p>
+ <p>
+ But don't worry. Didn't I tell you that nXhtml knows about <a
+ href="http://tidy.sourceforge.net/">Tidy For XHTML</a>? (It
+ even comes together with nXhtml if you get it with EmacsW32.)
+ </p>
+ <p>
+ Tidy can convert your HTML files to XHTML.
+ Just open a file in nXhtml mode then use the <i>Tidy</i>
+ menu and choose what you want to do there.
+ </p>
+ <p>
+ If you do it file-by-file you can compare the "tidied" XHTML
+ version of the file and your old version side by side (using
+ Emacs Ediff command actually - an interactive way to compare).
+ You can also tidy a whole directory tree at once.
+ </p>
+
+ <h2 id="php">And what about Multiple Modes like PHP?</h2>
+ <p>
+ nXhtml mode can handle multiple modes in a buffer. The
+ benefits of nXml style completion can still be used. This
+ can even be done when there is no header in the file that
+ tells what DTD to use for the completion.
+ </p>
+ <p>
+ Mumamo, which is part of nXhtml, implements what it
+ calls <i>multi major modes</i> for handling multiple major
+ modes in a buffer. Instead of turning on a major mode for a
+ buffer you turn on a multi major mode and Mumamo will handle
+ the rest. Multi major modes has names like nxhtml-mumamo,
+ html-mumamo, django-nxhtml-mumamo etc.
+ </p>
+ <p>
+ When point is in a PHP part then the major mode is switched
+ to php-mode, with all that means. Here you can see how that
+ looks:
+ </p>
+ <img alt="In PHP part" src="img/php-in-nxhtml.png" width="448" height="294" />
+ <p>
+ If you move the point outside of those &lt;?php ... ?&gt; areas
+ then the mode is automatically switched to nxhtml-mode
+ instead. Now you can use the power of nxhtml-mode and
+ do for example completion, like here:
+ </p>
+ <img alt="In XHTML part" src="img/php-in-nxhtml-2.png" width="450" height="294" />
+ <p>
+ The switching is done with a short delay so that it does not
+ interfere with your normal editing. That's it. (But maybe
+ there should be a better php-mode? Does someone has any
+ better than the one that comes with nXhtml now?)
+ </p>
+
+ <h3 id="dtd-needed">But I Have no DTD Links in my PHP Files?</h3>
+ <p>
+ Ah, yes. Good question. You are right. nXhtml mode needs a
+ DTD to be able to help you with XHTML and completion. I
+ thought it was impossible for a normal human to get that
+ working.
+ </p>
+ <p>
+ But it turned out to be surpricingly simple and it works
+ quite nicely now. The first time you do completion of XHTML
+ code in a buffer where you do not have the needed XHTML
+ headers nXhtml mode will ask you for what it calls a
+ <em>fictive XHTML validation header</em>. After that completion
+ should work as usual. A fictive XHTML validation header in nXhtml
+ mode is something that is used in the background for
+ validation. It is not inserted in the buffer, but may be shown on the screen like this:
+ </p>
+ <img alt="fictive XHTML validation header" src="img/xml-validation-header.png" width="448" height="374" />
+ <p>
+ nXhtml does its best to guess what fictive XHTML Validation Header
+ the buffer needs, but if the default fictive XHTML validation header
+ does not fit you can customize the choices.
+ </p>
+ <p>
+ Note: Do not try to set the XML schema directly when the XHTML
+ headers are missing in the buffer. Use a fictive XHTML
+ validation header instead.
+ </p>
+
+ <h3 id="multi-colors">Why Are Colors Different in Multiple Modes?</h3>
+ <p>
+ It has been necessary to replace the nxml-mode style
+ fontification with the sgml-mode style. All other features
+ of nXml/nXhtml modes should still work however.
+ In all other cases the normal fontification colors are used.
+ </p>
+ <p>
+ Or perhaps you mean the background colors? These are just a
+ visual aid about the dividing into chunks with different
+ major modes and they can be turned off. Do <em>M-x
+ customize-group RET mumamo RET</em>.
+ </p>
+
+ <h3 id="part2">More Multiple Modes</h3>
+ <p>
+ nXhtml mode handles for example embedded style sheets the
+ same way as it handles PHP chunks:
+ </p>
+ <!--
+ <img alt="CSS embedded in XHTML" src="img/embedded-xhtml.png" width="448" height="294" />
+ -->
+ <img alt="CSS embedded in XHTML" src="img/style-in-nxhtml.png" width="448" height="278" />
+ <p>
+ Currently it can handle PHP, CSS, JavaScript, eRuby, JSP and
+ some other minor cases. If you can program in elisp it is
+ not a very big deal adding support for other embedded
+ languages. (I do not use all the languages above myself so
+ please give me feedback if there is something you think
+ could be done better.)
+ </p>
+ <p>
+ Please notice also that each major mode handles completion
+ in its own ways. The popup style completion is currently
+ only used by nXhtml mode, not the other major modes even if
+ they are on the same page.
+ </p>
+ <p>
+ The use of multi major modes is not constrained to nXhtml.
+ You can use that when editing other files too. To see what
+ multi major modes are currently defined in your Emacs
+ session see the
+ variable <i>mumamo-defined-turn-on-functions</i>.
+ </p>
+
+ <h3 id="tips-multi">Tips When Using Multiple Modes</h3>
+ <p>
+ The routines dividing into chunks with different major modes is not that very supersmart.
+ They do not know much about the languages of the major modes.
+ So if you write something like this:
+ </p>
+ <pre>
+ &lt;?php
+ echo '&lt;'?xml version="1.0" encoding="utf-8"?'>';
+ ?&gt;
+ </pre>
+ <p>
+ it will get very, very confused. If you are not fond of that
+ you better write it like this instead:
+ </p>
+ <pre>
+ &lt;?php
+ echo '&lt;'; echo '?xml version="1.0" encoding="utf-8"?'; echo '>';
+ ?&gt;
+ </pre>
+ <p>
+ For a similar problem <a href="nxhtml-changes.html#php-attribute-values">attribute values computed by PHP</a>.
+ </p>
+ <p>
+ When editing PHP sometimes the validation of the XHTML part
+ gets quite upset. You may even think that it is unuseful
+ (since trying to complete gives you nothing), but it is not.
+ Here is what you can do:
+ </p>
+ <ul>
+ <li>
+ Turn on <em>Fictive XHTML Validation Header</em> from
+ menus. (In <em>nXhtml - Completion</em>.) That will try
+ to guess a how to start validation. It shows a fictive
+ header at the top of the buffer to show you what is goind
+ on (nothing is inserted in the buffer).
+ </li>
+ <li>
+ If you do not think the red underlines you get are very
+ pretty then you can hide them. Use the menus again,
+ <em>Hide Validation Errors</em>.
+ </li>
+ </ul>
+ <p>
+ And maybe you do not think the background colors when using
+ Multiple Major Modes is very smart? Then just go ahead and
+ remove them. Customize.
+ <em>M-x customize-group RET mumamo RET</em>.
+ </p>
+
+ <h2 id="file-assoc">File Associations within Emacs</h2>
+ <p>
+ Some file associations are changed within Emacs to get
+ multiple modes to work without requiring the user to do
+ anything. Good for a new user I guess, but I understand
+ that old Emacs users may want more control over this. If
+ you are one of them then please look in
+ <em>nxhtml-autoload.el</em> which is where the associations
+ are made.
+ </p>
+
+ <h2 id="bloggin">Not for Me, I Am Only Blogging</h2>
+ <p>
+ Not for you?
+ Ah, wait a minute.
+ Blogging, that is exactly one of the things that I myself use this for.
+ </p>
+ <p>
+ When you blog you only write part of an XHTML page, so you
+ may think that all the nicities of nXhtml mode like
+ validation and completion does not work. They do. (If you
+ wonder how, then please read <a href="#dtd-needed">But I
+ Have No DTD Links In My PHP Files</a>. Though you do not
+ have to read this to start using nXhtml for writing blog
+ texts and comments.)
+ </p>
+ <p>
+ The setup for blogging is simple
+ </p>
+ <ol>
+ <li>
+ <a href="http://www.mozilla.com/en-US/firefox/">Firefox</a> - which you of course already use ...
+ </li>
+ <li>
+ The <a href="https://addons.mozilla.org/en-US/firefox/addon/4125">It's All Text</a> add-on to Firefox.
+ It should use Emacs client:
+ <p>
+ <img alt="It's All Text preferences" src="img/itsalltext-pref.png" width="371" height="352" />
+ </p>
+ </li>
+ <li>
+ And finally: Customize the little elisp library that comes with nXhtml:
+ <p style="padding-left:2em; font-size: 1em; font-weight: 600;">
+ M-x customize-group RET as-external RET
+ </p>
+ You just need to turn <i>as-external</i> on there.
+ </li>
+ </ol>
+ <p>
+ With this setup you just press F2 in any text area in
+ Firefox and then you got the text to edit in Emacs - using
+ nXhtml for completion etc. Finish and save with <b>C-x
+ #</b>.
+ </p>
+
+<!-- <img alt="Edit part of an XHTML file" src="img/edit-part.png" width="448" height="390" /> -->
+
+ <h2 id="bloggin">And Other Goodies...</h2>
+ <p>
+ There are a lot of other things in the package too, please
+ see the nXhtml menu in Emacs. You can for example find a
+ n-back-game (if you do not know what it is now, do not
+ worry, just try it and you will learn - and understand why I
+ put it there).
+ </p>
+ </div>
+
+ <hr align="left" class="footer" />
+ <p class="footer">
+ Copyright &copy; 2008 OurComments.org
+ <br style="margin:0; padding:0; line-height: 0;" />
+ Design thanks to <a href="http://www.oswd.org/">OSWD</a>
+ <br />
+ </p>
+ </div>
+ </body>
+</html>
diff --git a/emacs.d/nxhtml/nxhtml/doc/wd/grapes/grapes.css b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/grapes.css
new file mode 100644
index 0000000..c325dfd
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/grapes.css
@@ -0,0 +1,107 @@
+/* Grapes, web template for business or for fun */
+/* By Dave Reeder, www.davereederdesign.com */
+
+body {margin: 0; padding: 0; background: #213205}
+
+* {margin: 0; padding: 0; border: 0; font-family: Arial, Helvetica, sans-serif}
+
+
+/*----------------------------------------------Basic styles------------------------------------------------*/
+
+h1, h2, h3, h4 {font-family: Georgia, Georgia, serif; margin: 15px 0 0 5px; color: #fff; font-weight: normal; text-decoration: none}
+h1 em, h2 em, h3 em, h4 em {font-family: Georgia, Georgia, serif; font-weight: normal} /* italic words in titles */
+
+h1 {position: absolute; right: 0px; top: 30px; font-size: 2.25em; letter-spacing: 0.1em; line-height: 1.00em; padding-right: 10px; border-right: 15px solid #fff}
+h1:first-letter {font-family: Georgia, Georgia, serif; font-size: 2.25em} /* styles the first letter of the main title to make it large */
+
+p#tagline {position: absolute; right: 0px; top: 125px; font-style: italic; color: #648D20; font-size: 0.90em} /* sits under main title */
+
+h2 {font-size: 1.30em; letter-spacing: 0.05em}
+
+p, ul, ol {margin: 10px 10px 0 7px; font-size: 0.70em; line-height: 1.60em; color: #000; letter-spacing: 0.05em}
+
+code {font-family: monospace; font-size: 1.20em; color: #E20000}
+
+p span {font-size: 1.50em; font-weight: bold} /* shouting words */
+
+a:link, a:visited {color: #792533; font-weight: bold; text-decoration: none; border-bottom: 1px solid #792533}
+a:hover, a:active {color: #fff; border-color: #fff}
+
+ul {list-style: inside square} /* general lists */
+
+acronym {font-weight: bold; border-bottom: 1px dashed #000; cursor: help}
+
+
+/*-----------------------------------------------Layout DIVS------------------------------------------------*/
+
+#container { /* keeps everything together */
+position: relative;
+margin: 0 auto;
+width: 620px;
+background: url(images/bkgrnd.gif) 0 0 repeat-y #CCCC33; /* Important image, do not remove */
+overflow: hidden
+}
+
+#hdr { /* div containing h1, nav and grapes image */
+float: left;
+width: 620px;
+height: 200px;
+background: url(images/grapes.jpg) 0 0 no-repeat #CCCC33 /* Image of Grapes */
+}
+
+#lftcol { /* left column */
+position: absolute;
+left: 0px;
+top: 200px;
+margin-left: 50px; /* leave this so that background image lines up with edge of this div */
+width: 200px;
+background: transparent;
+overflow: hidden
+}
+
+#rgtcol {float: right; width: 370px; padding-bottom: 30px; background: transparent; overflow: hidden} /* right column */
+
+#bttmbar {float: right; text-align: center; font-size: 0.70em; height: 4em; line-height: 4em; width: 570px; background: #CCCC33; border-top: 1px solid #D9D93C}
+
+#quote { /* Quote box in left column */
+ float: left;
+ margin: 10px 0 20px 10px;
+ padding: 10px 0;
+ width: 170px;
+ text-align: center;
+ background: url(images/quote.gif) no-repeat 0 0
+}
+
+#quote p {color: #444; font-size: 0.80em; font-weight: bold; line-height: 2.00em} /* Quote box text */
+
+
+/*---------------------------------------------Main Navigation-----------------------------------------------*/
+
+ul#nav { /* navigation list */
+ margin: 53px 0 20px 0; /* the 53px is where the nav begins (margin top) */
+ padding: 0;
+ list-style: none inside
+}
+
+ul#nav li {float: left; display: block}
+
+ul#nav li a {
+ width: 170px;
+ margin: 3px 0 0 0; /* a little top margin */
+ border: 0;
+ border-left: 10px solid #CCCC33;
+ padding: 10px 5px;
+ font-family: Georgia, Georgia, serif;
+ font-weight: normal;
+ text-decoration: none;
+ display: block;
+ color: #450F1F;
+ background: #D9D93C
+}
+
+ul#nav li a#current {border-color: #fff} /* current page, move id in the xhtml when creating a new page */
+
+ul#nav li a:hover {background: #9EA219; color: #fff}
+
+
+ \ No newline at end of file
diff --git a/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/bkgrnd.gif b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/bkgrnd.gif
new file mode 100644
index 0000000..cdec922
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/bkgrnd.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/grapes.jpg b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/grapes.jpg
new file mode 100644
index 0000000..21d98f5
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/grapes.jpg
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/quote.gif b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/quote.gif
new file mode 100644
index 0000000..ed81a24
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/images/quote.gif
Binary files differ
diff --git a/emacs.d/nxhtml/nxhtml/doc/wd/grapes/index.html b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/index.html
new file mode 100644
index 0000000..3fd0fe3
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/index.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html>
+<head>
+<title>Grapes</title>
+<link rel="stylesheet" type="text/css" href="grapes.css" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<meta name="author" content="Your name here" />
+<meta name="Copyright" content="Copyright (c) Your copyright here 2005" />
+</head>
+<body>
+<div id="container">
+<div id="hdr">
+<h1>grapes</h1>
+<p id="tagline">fruit, wine &amp; web design</p>
+</div>
+
+<div id="lftcol">
+ <ul id="nav">
+ <li><a href="" id="current">Introduction</a></li>
+ <li><a href="">Our Wines</a></li>
+ <li><a href="">Important Grapes</a></li>
+ <li><a href="">Contact Us</a></li>
+ <li><a href="">Links</a></li>
+ </ul>
+
+<div id="quote">
+<p><em>A great source for information...</em></p>
+</div>
+
+<h3>More stuff</h3>
+ <ul>
+ <li><a href="http://validator.w3.org/check?uri=referer">Validate XHTML</a></li>
+ <li><a href="http://jigsaw.w3.org/css-validator/check/referer">Validate CSS</a></li>
+ <li><a href="http://www.davereederdesign.com/">Authors Website</a></li>
+ <li><a href="http://www.oswd.org/">OSWD</a></li>
+ </ul>
+
+</div>
+
+
+
+<div id="rgtcol">
+<h2>Introduction</h2>
+<p>Hello and welcome to my latest template called &quot;Grapes&quot;.
+<br />
+&quot;Grapes&quot; is an Open Source web template which means it can be used without the need to ask permission and you have full rights to use and adapt its images. For more of my work, please see my website which can be found <a href="http://www.davereederdesign.com/">here.</a>
+</p>
+<p>
+I wanted to create a fairly simple yet attractive template which can be used for food or wine related websites, although it can easily be adapted for other uses too.
+</p>
+
+
+<h2>But is it <em>easy</em> to Use?</h2>
+<p>&quot;Grapes&quot; should be quite easy to use as I have added plenty of comments and tried to make the <acronym title="Cascading Style Sheet">CSS</acronym> as neat and organised as possible.
+</p>
+<p>There are also plenty of styles for other tags, including:</p>
+
+<p><code>Text using the code tag, this is ideal for showing code on a page.</code></p>
+
+<p><acronym title="acronym text">acronym text</acronym></p>
+
+<p><strong>strong or bold text</strong></p>
+
+<p><em>em or italic text</em></p>
+
+<p>This is a paragraph of normal text that contains <span>span</span> tags with a class set to <span>special</span>. This means all the <span>big words</span> in this paragraph are words that are placed between opening and closing <span>span</span> tags. These span tags can be used to add meaning to a block of text or to <span>shout out</span> when needed.</p>
+</div>
+
+<div id="bttmbar">Copyright &copy; Your Copyright Info</div>
+
+
+</div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/emacs.d/nxhtml/nxhtml/doc/wd/grapes/nxhtml-grapes.css b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/nxhtml-grapes.css
new file mode 100644
index 0000000..a241c1e
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/wd/grapes/nxhtml-grapes.css
@@ -0,0 +1,252 @@
+/* Grapes, web template for business or for fun */
+/* By Dave Reeder, www.davereederdesign.com */
+
+body {margin: 0; padding: 0; background: #213205}
+
+/* * {margin: 0; padding: 0; border: 0; font-family: Arial, Helvetica, sans-serif} */
+* {font-family: Arial, Helvetica, sans-serif}
+
+/*----------------------------------------------Basic styles------------------------------------------------*/
+
+h1, h2, h3, h4 {font-family: Georgia, Georgia, serif; margin: 15px 0 0 5px; color: #fff; font-weight: normal; text-decoration: none}
+h1 em, h2 em, h3 em, h4 em {font-family: Georgia, Georgia, serif; font-weight: normal} /* italic words in titles */
+
+h1 {xposition: absolute; right: 0px; top: 30px; font-size: 2.25em; letter-spacing: 0.1em; line-height: 1.00em; padding-right: 10px; border-right: 15px solid #fff}
+h1:first-letter {font-family: Georgia, Georgia, serif; font-size: 2.25em} /* styles the first letter of the main title to make it large */
+
+p#tagline {position: absolute; right: 0px; top: 125px; font-style: italic; color: #648D20; font-size: 0.90em} /* sits under main title */
+
+h2 {font-size: 1.40em; letter-spacing: 0.05em}
+h3 {font-size: 1.00em; letter-spacing: 0.05em}
+
+p {
+/* margin: 10px 10px 0 7px; */
+}
+p, ul, ol {
+ font-size: 0.75em; xline-height: 1.60em; color: #000; letter-spacing: 0.05em
+}
+dt {font-size: 0.9em;}
+ul li ul {font-size: 1em;}
+ul li ul {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+
+code {font-family: monospace; font-size: 1.20em; color: #E20000}
+
+/* p span {font-size: 1.50em; font-weight: bold} /\* shouting words *\/ */
+
+a:link, a:visited {
+ color: #792533;
+ /* font-weight: bold; */
+ /* I can see why a border-bottom was used, but I do not have time to
+ fix it now */
+ /* text-decoration: none; */
+ /* border-bottom: 1px solid #792533; */
+}
+a:hover, a:active {color: #fff; border-color: #fff}
+
+#getit a {
+ text-decoration: none;
+}
+#getit a:visited {
+ color: #792533;
+}
+#getit a:hover, #getit a:active {
+ color: red;
+}
+#nxhtml-home a:hover, #nxhtml-home a:active {
+ color: red;
+}
+#nxhtml-home {
+ margin-bottom:3em;
+ background-color:white;
+ padding: 0.5em;
+}
+
+nul {list-style: inside square} /* general lists */
+nul ul {list-style: inside circle} /* general lists */
+
+acronym {font-weight: bold; border-bottom: 1px dashed #000; cursor: help}
+
+p, li, dt, dd {
+ margin-right: 1em;
+}
+dt {
+ margin-top: 1em;
+ margin-bottom: 0.5em;
+}
+li ul li {
+ margin-right: 0;
+}
+table, td {
+ margin: 0;
+ padding: 0;
+ cell-padding: 0;
+ //font-size:0.9em;
+}
+
+li p {
+ font-size: 1em;
+}
+
+/*-----------------------------------------------Layout DIVS------------------------------------------------*/
+
+#xgetit {
+ font-size: 0.6em;
+ float: left;
+ width: 20em;
+ background: white;
+ text-decoration: none;
+ padding: 0.5em;
+ padding-left: 1em;
+ margin-left: 1em;
+ margin-top: 1em;
+}
+/* * { text-decoration: none; } */
+#container { /* keeps everything together */
+ position: absolute;
+ margin: 0 auto;
+ margin-top: 0;
+ /* width: 620px; */
+ margin-right: 17%;
+ background: url(images/bkgrnd.gif) 0 0 repeat-y #CCCC33; /* Important image, do not remove */
+ xoverflow: hidden;
+}
+
+#hdr { /* div containing h1, nav and grapes image */
+ float: left;
+ width: 260px;
+ height: 250px;
+ background: url(images/grapes.jpg) 0 0 no-repeat #CCCC33 /* Image of Grapes */
+}
+
+#xmainhdr {
+ xfloat: right;
+ width: 100px;
+ height: 100px;
+}
+
+#lftcol table li a {
+ /* text-decoration: none; */
+}
+#lftcol { /* left column */
+ /* position: absolute; */
+ float: right;
+ /* left: 0px; */
+ /* top: 200px; */
+ /* margin-left: 50px; /* leave this so that background image lines up with edge of this div */
+ margin-bottom: 50px; /* Quck fix for img menu */
+ margin-right: 1em;
+ background: transparent;
+}
+
+#rgtcol {
+ xfloat: left;
+ clear: both;
+ margin-left: 100px;
+ max-width: 600px;
+ padding-bottom: 30px; background: transparent; xoverflow: hidden; /* right column */
+}
+
+.footer {
+ float: left;
+ width: 19em;
+ clear: both;
+}
+hr.footer {
+ width: 19em;
+ float: left;
+ text-align: left;
+ margin-bottom: 0;
+ margin-left: 0;
+ padding-left: 0;
+}
+p.footer {
+ margin-left: 1em;
+ margin-right: 1em;
+ color: #564;
+ //font-size: 0.8em;
+ //padding: 0;
+ //margin-bottom: 1em;
+ //padding-bottom: 1em;
+}
+
+#bttmbar {float: right; text-align: center; font-size: 0.70em; height: 4em; line-height: 4em; width: 570px; background: #CCCC33; border-top: 1px solid #D9D93C}
+
+#quote { /* Quote box in left column */
+ float: left;
+ margin: 10px 0 20px 10px;
+ padding: 10px 0;
+ width: 170px;
+ text-align: center;
+ background: url(images/quote.gif) no-repeat 0 0
+}
+
+#quote p {color: #444; font-size: 0.80em; font-weight: bold; line-height: 2.00em} /* Quote box text */
+
+
+/*---------------------------------------------Main Navigation-----------------------------------------------*/
+
+ul#nav { /* navigation list */
+ margin: 53px 0 20px 0; /* the 53px is where the nav begins (margin top) */
+ padding: 0;
+ list-style: none inside
+}
+
+ul#nav li {float: left; display: block}
+
+ul#nav li a {
+ width: 170px;
+ margin: 3px 0 0 0; /* a little top margin */
+ border: 0;
+ border-left: 10px solid #CCCC33;
+ padding: 10px 5px;
+ font-family: Georgia, Georgia, serif;
+ font-weight: normal;
+ text-decoration: none;
+ display: block;
+ color: #450F1F;
+ background: #D9D93C
+}
+
+ul#nav li a#current {border-color: #fff} /* current page, move id in the xhtml when creating a new page */
+
+ul#nav li a:hover {background: #9EA219; color: #fff}
+
+#PAGETOC {
+ float: left;
+}
+#PAGETOC * {
+ font-size: 12px;
+}
+#PAGETOC ul {
+ margin: 0;
+ margin-top: 1em;
+ padding: 0;
+}
+#PAGETOC li {
+ font-size: 1em;
+ list-style-type: none;
+ margin: 0em;
+}
+#PAGETOC ul li ul {
+ padding-left: 1.5em;
+ margin: 0em;
+}
+#PAGETOC li, #PAGETOC li ul li {
+ font-weight: bold;
+ display: block;
+}
+#PAGETOC li ul li {
+ font-weight: 500;
+}
+
+#PAGETOC .tochead {
+ font-size: 10px;
+ background-color: #c0ff3e;
+ background-color: #9acd32;
+ background-color: #b3ee3a;
+ padding: 4px;
+}
+
diff --git a/emacs.d/nxhtml/nxhtml/doc/working-demo.html b/emacs.d/nxhtml/nxhtml/doc/working-demo.html
new file mode 100644
index 0000000..0752f85
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/doc/working-demo.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>Something</title>
+ <script type="text/javascript" src="js/smoothgallery/scripts/mootools.uncompressed.js"></script>
+ <script type="text/javascript" src="js/smoothgallery/scripts/jd.gallery.js"></script>
+ <link rel="stylesheet" href="js/smoothgallery/css/jd.gallery.css" type="text/css" media="screen" charset="utf-8" />
+ </head>
+ <body>
+ <h1>My 1st demo</h1>
+ <script type="text/javascript">
+ function startGallery() {
+ var myGallery = new gallery($('myGallery'), {
+ timed: true,
+ delay: 9000,
+ embedLinks: false,
+ showArrows: true,
+ showCarousel: false,
+ showInfopane: true,
+ });
+ }
+ window.onDomReady(startGallery);
+ </script>
+
+ <div class="content">
+ <div id="myGallery">
+ <div class="imageElement">
+ <h3>Popup completion</h3>
+ <p>
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ popup stlye completion
+ </p>
+ <img src="img/popup-compl.png" class="full" />
+ </div>
+ <div class="imageElement">
+ <h3>Emacs style completion</h3>
+ <p> emacs stlye completion </p>
+ <a href="#" title="open image" class="open"></a>
+ <img src="img/emacs-style-completion.png" class="full" />
+ <img src="ximages/brugges2006/1-mini.jpg" class="thumbnail" />
+ </div>
+ <div class="imageElement">
+ <h3>Edit part</h3>
+ <p> edit part </p>
+ <a href="#" title="open image" class="open"></a>
+ <img src="img/edit-part.png" class="full" />
+ <img src="ximages/brugges2006/1-mini.jpg" class="thumbnail" />
+ </div>
+ </div>
+ </body>
+ </html>