Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <bryan@olenepal.org>2009-09-03 01:25:37 (GMT)
committer root <bryan@olenepal.org>2009-09-03 01:25:37 (GMT)
commit54306d8e286171cd3c6ed281ea3338a79c93ce91 (patch)
treea595323865ddde483459a892b2467f23de1867a4
parentfc2f4f903be9d7e4ebcdf4b2c71bef65c29f473e (diff)
got rid of example adding_up_to_10_old as it was redundant
-rwxr-xr-xexamples/adding_up_to_10/css/mytest.css13
-rwxr-xr-xexamples/adding_up_to_10/js/mytest.js12
-rwxr-xr-xexamples/adding_up_to_10/mytest.html3
-rwxr-xr-xexamples/adding_up_to_10_old/assets/generic/images/Sketch.bmpbin2880054 -> 0 bytes
-rwxr-xr-xexamples/adding_up_to_10_old/assets/generic/images/Sketch3527.pngbin6988 -> 0 bytes
-rwxr-xr-xexamples/adding_up_to_10_old/assets/generic/images/bg_original.pngbin1258398 -> 0 bytes
-rwxr-xr-xexamples/adding_up_to_10_old/assets/generic/images/bgf.pngbin275387 -> 0 bytes
-rwxr-xr-xexamples/adding_up_to_10_old/css/adding_up_to_10.css16
-rwxr-xr-xexamples/adding_up_to_10_old/css/adding_up_to_10.css~16
-rwxr-xr-xexamples/adding_up_to_10_old/index.html61
-rwxr-xr-xexamples/adding_up_to_10_old/index.html~61
-rwxr-xr-xexamples/adding_up_to_10_old/js/adding_up_to_10.js70
-rwxr-xr-xexamples/adding_up_to_10_old/js/adding_up_to_10.js~70
-rwxr-xr-xexamples/adding_up_to_10_old/js/gettext.js1264
-rwxr-xr-xexamples/adding_up_to_10_old/js/jquery-1.3.2.min.js19
-rwxr-xr-xexamples/adding_up_to_10_old/js/jquery.jgrowl_minimized.js4
-rwxr-xr-xexamples/adding_up_to_10_old/js/jquery.localisation.min.js7
-rwxr-xr-xexamples/adding_up_to_10_old/js/jquery.localisation.pack.js7
-rwxr-xr-xexamples/adding_up_to_10_old/js/jquery.ui.all.js7531
-rwxr-xr-xexamples/adding_up_to_10_old/po/en-US.po28
-rwxr-xr-xexamples/adding_up_to_10_old/po/en-US.po~25
-rwxr-xr-xexamples/adding_up_to_10_old/po/es-MX.po~26
-rwxr-xr-xexamples/adding_up_to_10_old/po/he-IL.po~25
-rwxr-xr-xexamples/adding_up_to_10_old/po/ne-NE.po28
-rwxr-xr-xexamples/adding_up_to_10_old/po/ne-NE.po~26
-rw-r--r--experiments/mytest1.html11
-rwxr-xr-xutils/README.md62
-rwxr-xr-xutils/bin/activate.bash31
-rwxr-xr-xutils/bin/narwhal33
-rwxr-xr-xutils/bin/sea2
-rwxr-xr-xutils/catalog.json14
-rwxr-xr-xutils/docs/packages.md6
-rwxr-xr-xutils/docs/platforms.md10
-rwxr-xr-xutils/lib/file.js122
-rwxr-xr-xutils/lib/logger.js2
-rwxr-xr-xutils/lib/narwhal/repl.js8
-rwxr-xr-xutils/lib/narwhal/tusk.js3
-rwxr-xr-xutils/lib/narwhal/tusk/init.js1
-rwxr-xr-xutils/lib/narwhal/tusk/reheat.js2
-rwxr-xr-xutils/lib/packages.js28
-rwxr-xr-xutils/lib/sandbox.js137
-rwxr-xr-xutils/lib/test/assert.js6
-rwxr-xr-xutils/lib/test/runner.js10
-rwxr-xr-xutils/lib/uri.js10
-rwxr-xr-xutils/lib/util.js108
-rwxr-xr-xutils/narwhal.js67
-rwxr-xr-xutils/platforms/default/lib/date.js2
-rwxr-xr-xutils/platforms/default/lib/file-platform.js141
-rwxr-xr-xutils/platforms/default/lib/io-platform.js6
-rwxr-xr-xutils/platforms/default/lib/object.js6
-rwxr-xr-xutils/platforms/rhino/bin/narwhal-rhino21
-rwxr-xr-xutils/platforms/rhino/bootstrap.js61
-rwxr-xr-xutils/platforms/rhino/lib/file-platform.js30
-rwxr-xr-xutils/platforms/rhino/lib/packages-platform.js9
-rwxr-xr-xutils/platforms/template/bootstrap.js3
-rwxr-xr-xutils/platforms/template/lib/file-platform.js4
-rwxr-xr-xutils/platforms/xulrunner/lib/file-platform.js8
-rwxr-xr-xutils/platforms/xulrunner/lib/io-platform.js117
-rwxr-xr-xutils/platforms/xulrunner/lib/os-platform.js12
-rwxr-xr-xutils/sources.json8
-rwxr-xr-xutils/tests/all-tests.js2
-rwxr-xr-xutils/tests/file/all-tests.js2
-rwxr-xr-xutils/tests/iojs/program.js27
-rwxr-xr-xutils/tests/serverjs/all-tests.js2
-rwxr-xr-xutils/tests/serverjs/bytearray-tests.js270
-rwxr-xr-xutils/tests/serverjs/bytestring-tests.js241
-rwxr-xr-xutils/tests/serverjs/file-tests.js2
-rwxr-xr-xutils/tests/serverjs/file/resolve.js2
68 files changed, 1090 insertions, 9871 deletions
diff --git a/examples/adding_up_to_10/css/mytest.css b/examples/adding_up_to_10/css/mytest.css
index 3a22fd9..3b69126 100755
--- a/examples/adding_up_to_10/css/mytest.css
+++ b/examples/adding_up_to_10/css/mytest.css
@@ -156,19 +156,6 @@ top:10px;
left:25px;
}
-#chimpDiv {
- width: 100%;
- float: left;
-}
-
-#chimp {
-width:60%;
-height:80%;
-display:block;
-margin-left:auto;
-margin-right:auto;
-float:left;
-}
#chimpCanvas {
position:absolute;
diff --git a/examples/adding_up_to_10/js/mytest.js b/examples/adding_up_to_10/js/mytest.js
index b8b602c..0600351 100755
--- a/examples/adding_up_to_10/js/mytest.js
+++ b/examples/adding_up_to_10/js/mytest.js
@@ -2,10 +2,18 @@ window.addEventListener('load', function() {
var actionTopLeftCanvas = document.getElementById('actionTopLeftCanvas');
var atlCtx = actionTopLeftCanvas.getContext('2d');
+ var chimpCanvas = document.getElementById('chimpCanvas');
+ var chimpCtx = chimpCanvas.getContext('2d');
+
+
var ballImg = document.getElementById('ball');
atlCtx.drawImage(ballImg, 0, 0);
- actionTopLeftCanvas.setAttribute('width', '45%');
- atlCtx.drawImage(ballImg, 2, 2, 30, 15);
+// actionTopLeftCanvas.setAttribute('width', '100%');
+ atlCtx.drawImage(ballImg, 77, 77);
+
+ var chimpImg = document.getElementById('chimp');
+ chimpCtx.drawImage(chimpImg, 0, 0);
+ chimpCanvas.setAttribute('width', '100%');
/* var mainTopCanvas = document.getElementById('mainTopCanvas');
diff --git a/examples/adding_up_to_10/mytest.html b/examples/adding_up_to_10/mytest.html
index 0f1f955..51bd125 100755
--- a/examples/adding_up_to_10/mytest.html
+++ b/examples/adding_up_to_10/mytest.html
@@ -61,10 +61,11 @@
<canvas id="scoreboxCanvas" width="100" height="140" />
</div>
<div class="sidebarItem">
- <img id="chimp" src="assets/generic/images/normalChimp_200x209.png" alt=""/> <canvas id="chimpCanvas" width="100px" height="140px"> </canvas>
+ <canvas id="chimpCanvas" width="120px" height="125px"> </canvas>
</div>
+<img id="chimp" src="assets/generic/images/normalChimp_120x125.png" alt="" height="0px" width="0px"/>
</div>
diff --git a/examples/adding_up_to_10_old/assets/generic/images/Sketch.bmp b/examples/adding_up_to_10_old/assets/generic/images/Sketch.bmp
deleted file mode 100755
index fcd0664..0000000
--- a/examples/adding_up_to_10_old/assets/generic/images/Sketch.bmp
+++ /dev/null
Binary files differ
diff --git a/examples/adding_up_to_10_old/assets/generic/images/Sketch3527.png b/examples/adding_up_to_10_old/assets/generic/images/Sketch3527.png
deleted file mode 100755
index 89a5619..0000000
--- a/examples/adding_up_to_10_old/assets/generic/images/Sketch3527.png
+++ /dev/null
Binary files differ
diff --git a/examples/adding_up_to_10_old/assets/generic/images/bg_original.png b/examples/adding_up_to_10_old/assets/generic/images/bg_original.png
deleted file mode 100755
index 84f6aaa..0000000
--- a/examples/adding_up_to_10_old/assets/generic/images/bg_original.png
+++ /dev/null
Binary files differ
diff --git a/examples/adding_up_to_10_old/assets/generic/images/bgf.png b/examples/adding_up_to_10_old/assets/generic/images/bgf.png
deleted file mode 100755
index 1a4249f..0000000
--- a/examples/adding_up_to_10_old/assets/generic/images/bgf.png
+++ /dev/null
Binary files differ
diff --git a/examples/adding_up_to_10_old/css/adding_up_to_10.css b/examples/adding_up_to_10_old/css/adding_up_to_10.css
deleted file mode 100755
index 2975fb1..0000000
--- a/examples/adding_up_to_10_old/css/adding_up_to_10.css
+++ /dev/null
@@ -1,16 +0,0 @@
-#karma {
- position: relative;
- background-image: url('../images/bg.png');
- background-repeat: no-repeat;
-}
-#canvas {
- position: relative;
- /*height: 800;
- width: 1200;*/
-}
-
-#canvasDrawing {
- position: absolute;
- /*height: 800;
- width: 1200;*/
-}
diff --git a/examples/adding_up_to_10_old/css/adding_up_to_10.css~ b/examples/adding_up_to_10_old/css/adding_up_to_10.css~
deleted file mode 100755
index e62cf7c..0000000
--- a/examples/adding_up_to_10_old/css/adding_up_to_10.css~
+++ /dev/null
@@ -1,16 +0,0 @@
-#karma {
- position: relative;
- background-image: url('../images/bg.png');
- background-repeat: no-repeat;
-}
-#canvas {
- position: relative;
- /*height: 800;
- width: 1200;*/
-}
-
-#canvasDrawing {
- position: relative;
- /*height: 800;
- width: 1200;*/
-}
diff --git a/examples/adding_up_to_10_old/index.html b/examples/adding_up_to_10_old/index.html
deleted file mode 100755
index a283b1f..0000000
--- a/examples/adding_up_to_10_old/index.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html lang="en">
-
-<head>
-<title>Karma - Adding Up to 10</title>
-<meta name="keywords" content="karma,javascript,html5,sugar,sugarlabs,gsoc,ole,nepal">
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-
-<link rel="icon" type="image/ico" href="favicon.ico" />
-
-<link rel="stylesheet" type="text/css" href="css/karma.css" />
-<link rel="stylesheet" type="text/css" href="css/jquery.jgrowl.css" />
-<link rel="stylesheet" type="text/css" href="css/adding_up_to_10.css" />
-
-<script type="text/javascript" src="../../js/jquery-1.3.2.min.js"></script>
-<script type="text/javascript" src="../../js/jquery.ui.all.js"></script>
-<script type="text/javascript" src="../../js/jquery.jgrowl_minimized.js"></script>
-<script type="text/javascript" src="js/jquery.localisation.min.js"></script>
-<script type="text/javascript" src="../../js/Gettext.js"></script>
-<script type="text/javascript" src="js/adding_up_to_10.js"></script>
-
-<link rel="gettext" type="application/x-po" href="po/en-US.po">
-<link rel="gettext" type="application/x-po" href="po/es-MX.po">
-<link rel="gettext" type="application/x-po" href="po/ne-NE.po">
-<link rel="gettext" type="application/x-po" href="po/he-IL.po">
-
-</head>
-
-<body>
-
- <noscript>
- Man, you need to enable JavaScript.
- </noscript>
-
-
- <div id="karma">
- <canvas id="canvas" width="1200" height="800"></canvas>
- <canvas id="canvasDrawing" width="1200" height="800"></canvas>
- </div>
-
-
- <div id="test">
- Change to another language:
- <form name=langSelector >
-
- <!-- <input type="radio" name="lang" value="def" checked> Default: English - United States <br/> -->
- <input type="radio" name="lang" value="en-US" /> English - United States <br/>
- <input type="radio" name="lang" value="es-MX" /> Spanish - Mexico <br/>
- <input type="radio" name="lang" value="ne-NE" /> Nepalli - Nepal <br/>
- <input type="radio" name="lang" value="he-IL" /> Hebrew - Israel <br/>
- </form>
- </div>
- <div id="debug">
- </div>
-
-</body>
-</html>
-
-
-
-
-
diff --git a/examples/adding_up_to_10_old/index.html~ b/examples/adding_up_to_10_old/index.html~
deleted file mode 100755
index c6c86fb..0000000
--- a/examples/adding_up_to_10_old/index.html~
+++ /dev/null
@@ -1,61 +0,0 @@
-<html lang="en">
-
-<head>
-<title>Karma - Adding Up to 10</title>
-<meta name="keywords" content="karma,javascript,html5,sugar,sugarlabs,gsoc,ole,nepal">
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-
-<link rel="icon" type="image/ico" href="favicon.ico" />
-
-<link rel="stylesheet" type="text/css" href="css/karma.css" />
-<link rel="stylesheet" type="text/css" href="css/jquery.jgrowl.css" />
-<link rel="stylesheet" type="text/css" href="css/adding_up_to_10.css" />
-
-<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
-<script type="text/javascript" src="js/jquery.ui.all.js"></script>
-<script type="text/javascript" src="js/jquery.jgrowl_minimized.js"></script>
-<script type="text/javascript" src="js/jquery.localisation.min.js"></script>
-<script type="text/javascript" src="js/Gettext.js"></script>
-<script type="text/javascript" src="js/adding_up_to_10.js"></script>
-
-<link rel="gettext" type="application/x-po" href="po/en-US.po">
-<link rel="gettext" type="application/x-po" href="po/es-MX.po">
-<link rel="gettext" type="application/x-po" href="po/ne-NE.po">
-<link rel="gettext" type="application/x-po" href="po/he-IL.po">
-
-</head>
-
-<body>
-
- <noscript>
- Man, you need to enable JavaScript.
- </noscript>
-
-
- <div id="karma">
- <canvas id="canvas" width="1200" height="800"></canvas>
- <canvas id="canvasDrawing" width="1200" height="800"></canvas>
- </div>
-
-
- <div id="test">
- Change to another language:
- <form name=langSelector >
-
- <!-- <input type="radio" name="lang" value="def" checked> Default: English - United States <br/> -->
- <input type="radio" id="langid" name="lang" value="en-US" /> English - United States <br/>
- <input type="radio" id="langid" name="lang" value="es-MX" /> Spanish - Mexico <br/>
- <input type="radio" id="langid" name="lang" value="ne-NE" /> Nepalli - Nepal <br/>
- <input type="radio" id="langid" name="lang" value="he-IL" /> Hebrew - Israel <br/>
- </form>
- </div>
- <div id="debug">
- </div>
-
-</body>
-</html>
-
-
-
-
-
diff --git a/examples/adding_up_to_10_old/js/adding_up_to_10.js b/examples/adding_up_to_10_old/js/adding_up_to_10.js
deleted file mode 100755
index 28ac90c..0000000
--- a/examples/adding_up_to_10_old/js/adding_up_to_10.js
+++ /dev/null
@@ -1,70 +0,0 @@
-$(document).ready(function(){
-
- var canvasDrawing = $("#canvasDrawing")[0];
- var ctxDrawing = canvasDrawing.getContext("2d");
-
- var canvas =$("#canvas")[0];
- var ctx = canvas.getContext("2d");
-
-
- var path={
- images: "images/"
- };
-
- //f of functions, a "place" to put functions ;)
- var f= {
- rand: function ( lower, upper){
- return Math.round ( Math.random() * (upper - lower) + lower );
- }
-
- }
- //logic game
- var total, n0, n1, correct;
- var choice=new Array();
-
- total = f.rand( 3, 9 ); //the total
- n0 = total - f.rand(1, total - 1 ); //first number
- n1 = total - n1; //second number
-
- for (var i=0; i<3; i++) {
- choice[ i ] = f.rand( 3, 9 ); // generate the 3 options
- }
- correct = f.rand( 0, 2 ); //chose one option (correct option) and then put the correct value into it
- choice[ correct ] = total;
-
- //
- var lang, gt;
- var supportedLangs = [ "en-US", "es-MX", "ne-NE", "he-IL"];
- function init( userLang ) {
- if (userLang===undefined) {
- lang = $.localise.defaultLanguage.substr(0,2);
- for (var i=0; i < supportedLangs.length; i++) {
- if (supportedLangs[i].substr(0,2) == lang ) {
- lang = supportedLangs[i];
- $("input[@name='langSelector']:eq("+ i +")").attr("checked", true);
- break;
- }
- }
- }else {
- lang = userLang;
- }
- gt = new Gettext({ 'domain' : lang });
-
- //debug info
- var l= ["choose an option", "Time", "Level", "Restart"];
- var s="";
- $.each( l, function( i, val ){
- s+=val+": "+ gt.gettext( val ) + "<br/>";
- });
- $("#debug").html( s );
-
- //
- }
-
- $(":input[@name='langSelector']").change(function(){
- init ( $("input[@name='langSelector']:checked").val() );
- });
-
- init();
-
-});
diff --git a/examples/adding_up_to_10_old/js/adding_up_to_10.js~ b/examples/adding_up_to_10_old/js/adding_up_to_10.js~
deleted file mode 100755
index d5013fa..0000000
--- a/examples/adding_up_to_10_old/js/adding_up_to_10.js~
+++ /dev/null
@@ -1,70 +0,0 @@
-$(document).ready(function(){
-
- var canvasDrawing = $("#canvasDrawing")[0];
- var ctxDrawing = canvasDrawing.getContext("2d");
-
- var canvas =$("#canvas")[0];
- var ctx = canvas.getContext("2d");
-
-
- var path={
- images: "images/"
- };
-
- //f of functions, a "place" to put functions ;)
- var f= {
- rand: function ( lower, upper){
- return Math.round ( Math.random() * (upper - lower) + lower );
- }
-
- }
- //logic game
- var total, n0, n1, correct;
- var choice=new Array();
-
- total = f.rand( 3, 9 ); //the total
- n0 = total - f.rand(1, total - 1 ); //first number
- n1 = total - n1; //second number
-
- for (var i=0; i<3; i++) {
- choice[ i ] = f.rand( 3, 9 ); // generate the 3 options
- }
- correct = f.rand( 0, 2 ); //chose one option (correct option) and then put the correct value into it
- choice[ correct ] = total;
-
- //
- var lang, gt;
- var supportedLangs = [ "en-US", "es-MX", "ne-NE", "he-IL"];
- function init( userLang ) {
- if (userLang===undefined) {
- lang = $.localise.defaultLanguage.substr(0,2);
- for (var i=0; i < supportedLangs.length; i++) {
- if (supportedLangs[i].substr(0,2) == lang ) {
- lang = supportedLangs[i];
- $("input[@name='langSelector']:eq("+ i +")").attr("checked", true);
- break;
- }
- }
- }else {
- lang = userLang;
- }
- gt = new Gettext({ 'domain' : lang });
-
- //debug info
- var l= ["choose an option", "Time", "Level", "Restart"];
- var s="";
- $.each( l, function( i, val ){
- s+=val+": "+ gt.gettext( val ) + " ";
- });
- $("#debug").html( s );
-
- //
- }
-
- $(":input[@name='langSelector']").change(function(){
- init ( $("input[@name='langSelector']:checked").val() );
- });
-
- init();
-
-});
diff --git a/examples/adding_up_to_10_old/js/gettext.js b/examples/adding_up_to_10_old/js/gettext.js
deleted file mode 100755
index ee5b47b..0000000
--- a/examples/adding_up_to_10_old/js/gettext.js
+++ /dev/null
@@ -1,1264 +0,0 @@
-/*
-Pure Javascript implementation of Uniforum message translation.
-Copyright (C) 2008 Joshua I. Miller <unrtst@cpan.org>, all rights reserved
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU Library General Public License as published
-by the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-USA.
-
-=head1 NAME
-
-Javascript Gettext - Javascript implemenation of GNU Gettext API.
-
-=head1 SYNOPSIS
-
- // //////////////////////////////////////////////////////////
- // Optimum caching way
- <script language="javascript" src="/path/LC_MESSAGES/myDomain.json"></script>
- <script language="javascript" src="/path/Gettext.js'></script>
-
- // assuming myDomain.json defines variable json_locale_data
- var params = { "domain" : "myDomain",
- "locale_data" : json_locale_data
- };
- var gt = new Gettext(params);
- // create a shortcut if you'd like
- function _ (msgid) { return gt.gettext(msgid); }
- alert(_("some string"));
- // or use fully named method
- alert(gt.gettext("some string"));
- // change to use a different "domain"
- gt.textdomain("anotherDomain");
- alert(gt.gettext("some string"));
-
-
- // //////////////////////////////////////////////////////////
- // The other way to load the language lookup is a "link" tag
- // Downside is that not all browsers cache XMLHttpRequests the
- // same way, so caching of the language data isn't guarenteed
- // across page loads.
- // Upside is that it's easy to specify multiple files
- <link rel="gettext" href="/path/LC_MESSAGES/myDomain.json" />
- <script language="javascript" src="/path/Gettext.js'></script>
-
- var gt = new Gettext({ "domain" : "myDomain" });
- // rest is the same
-
-
- // //////////////////////////////////////////////////////////
- // The reson the shortcuts aren't exported by default is because they'd be
- // glued to the single domain you created. So, if you're adding i18n support
- // to some js library, you should use it as so:
-
- if (typeof(MyNamespace) == 'undefined') MyNamespace = {};
- MyNamespace.MyClass = function () {
- var gtParms = { "domain" : 'MyNamespace_MyClass' };
- this.gt = new Gettext(gtParams);
- return this;
- };
- MyNamespace.MyClass.prototype._ = function (msgid) {
- return this.gt.gettext(msgid);
- };
- MyNamespace.MyClass.prototype.something = function () {
- var myString = this._("this will get translated");
- };
-
- // //////////////////////////////////////////////////////////
- // Adding the shortcuts to a global scope is easier. If that's
- // ok in your app, this is certainly easier.
- var myGettext = new Gettext({ 'domain' : 'myDomain' });
- function _ (msgid) {
- return myGettext.gettext(msgid);
- }
- alert( _("text") );
-
- // //////////////////////////////////////////////////////////
- // Data structure of the json data
- // NOTE: if you're loading via the <script> tag, you can only
- // load one file, but it can contain multiple domains.
- var json_locale_data = {
- "MyDomain" : {
- "" : {
- "header_key" : "header value",
- "header_key" : "header value",
- "msgid" : [ "msgid_plural", "msgstr", "msgstr_plural", "msgstr_pluralN" ],
- "msgctxt\004msgid" : [ null, "msgstr" ],
- },
- "AnotherDomain" : {
- },
- }
-
-=head1 DESCRIPTION
-
-This is a javascript implementation of GNU Gettext, providing internationalization support for javascript. It differs from existing javascript implementations in that it will support all current Gettext features (ex. plural and context support), and will also support loading language catalogs from .mo, .po, or preprocessed json files (converter included).
-
-The locale initialization differs from that of GNU Gettext / POSIX. Rather than setting the category, domain, and paths, and letting the libs find the right file, you must explicitly load the file at some point. The "domain" will still be honored. Future versions may be expanded to include support for set_locale like features.
-
-
-=head1 INSTALL
-
-To install this module, simply copy the file lib/Gettext.js to a web accessable location, and reference it from your application.
-
-
-=head1 CONFIGURATION
-
-Configure in one of two ways:
-
-=over
-
-=item 1. Optimal. Load language definition from statically defined json data.
-
- <script language="javascript" src="/path/locale/domain.json"></script>
-
- // in domain.json
- json_locale_data = {
- "mydomain" : {
- // po header fields
- "" : {
- "plural-forms" : "...",
- "lang" : "en",
- },
- // all the msgid strings and translations
- "msgid" : [ "msgid_plural", "translation", "plural_translation" ],
- },
- };
- // please see the included bin/po2json script for the details on this format
-
-This method also allows you to use unsupported file formats, so long as you can parse them into the above format.
-
-=item 2. Use AJAX to load language file.
-
-Use XMLHttpRequest (actually, SJAX - syncronous) to load an external resource.
-
-Supported external formats are:
-
-=over
-
-=item * Javascript Object Notation (.json)
-
-(see bin/po2json)
-
- type=application/json
-
-=item * Uniforum Portable Object (.po)
-
-(see GNU Gettext's xgettext)
-
- type=application/x-po
-
-=item * Machine Object (compiled .po) (.mo)
-
-NOTE: .mo format isn't actually supported just yet, but support is planned.
-
-(see GNU Gettext's msgfmt)
-
- type=application/x-mo
-
-=back
-
-=back
-
-=head1 METHODS
-
-The following methods are implemented:
-
- new Gettext(args)
- textdomain (domain)
- gettext (msgid)
- dgettext (domainname, msgid)
- dcgettext (domainname, msgid, LC_MESSAGES)
- ngettext (msgid, msgid_plural, count)
- dngettext (domainname, msgid, msgid_plural, count)
- dcngettext (domainname, msgid, msgid_plural, count, LC_MESSAGES)
- pgettext (msgctxt, msgid)
- dpgettext (domainname, msgctxt, msgid)
- dcpgettext (domainname, msgctxt, msgid, LC_MESSAGES)
- npgettext (msgctxt, msgid, msgid_plural, count)
- dnpgettext (domainname, msgctxt, msgid, msgid_plural, count)
- dcnpgettext (domainname, msgctxt, msgid, msgid_plural, count, LC_MESSAGES)
- strargs (string, args_array)
-
-
-=head2 new Gettext (args)
-
-Several methods of loading locale data are included. You may specify a plugin or alternative method of loading data by passing the data in as the "locale_data" option. For example:
-
- var get_locale_data = function () {
- // plugin does whatever to populate locale_data
- return locale_data;
- };
- var gt = new Gettext( 'domain' : 'messages',
- 'locale_data' : get_locale_data() );
-
-The above can also be used if locale data is specified in a statically included <SCRIPT> tag. Just specify the variable name in the call to new. Ex:
-
- var gt = new Gettext( 'domain' : 'messages',
- 'locale_data' : json_locale_data_variable );
-
-Finally, you may load the locale data by referencing it in a <LINK> tag. Simply exclude the 'locale_data' option, and all <LINK rel="gettext" ...> items will be tried. The <LINK> should be specified as:
-
- <link rel="gettext" type="application/json" href="/path/to/file.json">
- <link rel="gettext" type="text/javascript" href="/path/to/file.json">
- <link rel="gettext" type="application/x-po" href="/path/to/file.po">
- <link rel="gettext" type="application/x-mo" href="/path/to/file.mo">
-
-args:
-
-=over
-
-=item domain
-
-The Gettext domain, not www.whatev.com. It's usually your applications basename. If the .po file was "myapp.po", this would be "myapp".
-
-=item locale_data
-
-Raw locale data (in json structure). If specified, from_link data will be ignored.
-
-=back
-
-=cut
-
-*/
-
-Gettext = function (args) {
- this.domain = 'messages';
- // locale_data will be populated from <link...> if not specified in args
- this.locale_data = undefined;
-
- // set options
- var options = [ "domain", "locale_data" ];
- if (this.isValidObject(args)) {
- for (var i in args) {
- for (var j=0; j<options.length; j++) {
- if (i == options[j]) {
- // don't set it if it's null or undefined
- if (this.isValidObject(args[i]))
- this[i] = args[i];
- }
- }
- }
- }
-
-
- // try to load the lang file from somewhere
- this.try_load_lang();
-
- return this;
-}
-
-Gettext.context_glue = "\004";
-Gettext._locale_data = {};
-
-Gettext.prototype.try_load_lang = function() {
- // check to see if language is statically included
- if (typeof(this.locale_data) != 'undefined') {
- // we're going to reformat it, and overwrite the variable
- var locale_copy = this.locale_data;
- this.locale_data = undefined;
- this.parse_locale_data(locale_copy);
-
- if (typeof(Gettext._locale_data[this.domain]) == 'undefined') {
- throw new Error("Error: Gettext 'locale_data' does not contain the domain '"+this.domain+"'");
- }
- }
-
-
- // try loading from JSON
- // get lang links
- var lang_link = this.get_lang_refs();
-
- if (typeof(lang_link) == 'object' && lang_link.length > 0) {
- // NOTE: there will be a delay here, as this is async.
- // So, any i18n calls made right after page load may not
- // get translated.
- // XXX: we may want to see if we can "fix" this behavior
- for (var i=0; i<lang_link.length; i++) {
- var link = lang_link[i];
- if (link.type == 'application/json') {
- if (! this.try_load_lang_json(link.href) ) {
- throw new Error("Error: Gettext 'try_load_lang_json' failed. Unable to exec xmlhttprequest for link ["+link.href+"]");
- }
- } else if (link.type == 'application/x-po') {
- if (! this.try_load_lang_po(link.href) ) {
- throw new Error("Error: Gettext 'try_load_lang_po' failed. Unable to exec xmlhttprequest for link ["+link.href+"]");
- }
- } else {
- // TODO: implement the other types (.mo)
- throw new Error("TODO: link type ["+link.type+"] found, and support is planned, but not implemented at this time.");
- }
- }
- }
-};
-
-// This takes the bin/po2json'd data, and moves it into an internal form
-// for use in our lib, and puts it in our object as:
-// Gettext._locale_data = {
-// domain : {
-// head : { headfield : headvalue },
-// msgs : {
-// msgid : [ msgid_plural, msgstr, msgstr_plural ],
-// },
-Gettext.prototype.parse_locale_data = function(locale_data) {
- if (typeof(Gettext._locale_data) == 'undefined') {
- Gettext._locale_data = { };
- }
-
- // suck in every domain defined in the supplied data
- for (var domain in locale_data) {
- // skip empty specs (flexibly)
- if ((! locale_data.hasOwnProperty(domain)) || (! this.isValidObject(locale_data[domain])))
- continue;
- // skip if it has no msgid's
- var has_msgids = false;
- for (var msgid in locale_data[domain]) {
- has_msgids = true;
- break;
- }
- if (! has_msgids) continue;
-
- // grab shortcut to data
- var data = locale_data[domain];
-
- // if they specifcy a blank domain, default to "messages"
- if (domain == "") domain = "messages";
- // init the data structure
- if (! this.isValidObject(Gettext._locale_data[domain]) )
- Gettext._locale_data[domain] = { };
- if (! this.isValidObject(Gettext._locale_data[domain].head) )
- Gettext._locale_data[domain].head = { };
- if (! this.isValidObject(Gettext._locale_data[domain].msgs) )
- Gettext._locale_data[domain].msgs = { };
-
- for (var key in data) {
- if (key == "") {
- var header = data[key];
- for (var head in header) {
- var h = head.toLowerCase();
- Gettext._locale_data[domain].head[h] = header[head];
- }
- } else {
- Gettext._locale_data[domain].msgs[key] = data[key];
- }
- }
- }
-
- // build the plural forms function
- for (var domain in Gettext._locale_data) {
- if (this.isValidObject(Gettext._locale_data[domain].head['plural-forms']) &&
- typeof(Gettext._locale_data[domain].head.plural_func) == 'undefined') {
- // untaint data
- var plural_forms = Gettext._locale_data[domain].head['plural-forms'];
- var pf_re = new RegExp('^(\\s*nplurals\\s*=\\s*[0-9]+\\s*;\\s*plural\\s*=\\s*(?:\\s|[-\\?\\|&=!<>+*/%:;a-zA-Z0-9_\(\)])+)', 'm');
- if (pf_re.test(plural_forms)) {
- //ex english: "Plural-Forms: nplurals=2; plural=(n != 1);\n"
- //pf = "nplurals=2; plural=(n != 1);";
- //ex russian: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10< =4 && (n%100<10 or n%100>=20) ? 1 : 2)
- //pf = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)";
-
- var pf = Gettext._locale_data[domain].head['plural-forms'];
- if (! /;\s*$/.test(pf)) pf = pf.concat(';');
- /* We used to use eval, but it seems IE has issues with it.
- * We now use "new Function", though it carries a slightly
- * bigger performance hit.
- var code = 'function (n) { var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) }; };';
- Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
- */
- var code = 'var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) };';
- Gettext._locale_data[domain].head.plural_func = new Function("n", code);
- } else {
- throw new Error("Syntax error in language file. Plural-Forms header is invalid ["+plural_forms+"]");
- }
-
- // default to english plural form
- } else if (typeof(Gettext._locale_data[domain].head.plural_func) == 'undefined') {
- Gettext._locale_data[domain].head.plural_func = function (n) {
- var p = (n != 1) ? 1 : 0;
- return { 'nplural' : 2, 'plural' : p };
- };
- } // else, plural_func already created
- }
-
- return;
-};
-
-
-// try_load_lang_po : do an ajaxy call to load in the .po lang defs
-Gettext.prototype.try_load_lang_po = function(uri) {
- var data = this.sjax(uri);
- if (! data) return;
-
- var domain = this.uri_basename(uri);
- var parsed = this.parse_po(data);
-
- var rv = {};
- // munge domain into/outof header
- if (parsed) {
- if (! parsed[""]) parsed[""] = {};
- if (! parsed[""]["domain"]) parsed[""]["domain"] = domain;
- domain = parsed[""]["domain"];
- rv[domain] = parsed;
-
- this.parse_locale_data(rv);
- }
-
- return 1;
-};
-
-Gettext.prototype.uri_basename = function(uri) {
- var rv;
- if (rv = uri.match(/^(.*\/)?(.*)/)) {
- var ext_strip;
- if (ext_strip = rv[2].match(/^(.*)\..+$/))
- return ext_strip[1];
- else
- return rv[2];
- } else {
- return "";
- }
-};
-
-Gettext.prototype.parse_po = function(data) {
- var rv = {};
- var buffer = {};
- var lastbuffer = "";
- var errors = [];
- var lines = data.split("\n");
- for (var i=0; i<lines.length; i++) {
- // chomp
- lines[i] = lines[i].replace(/(\n|\r)+$/, '');
-
- var match;
-
- // Empty line / End of an entry.
- if (/^$/.test(lines[i])) {
- if (typeof(buffer['msgid']) != 'undefined') {
- var msg_ctxt_id = (typeof(buffer['msgctxt']) != 'undefined' &&
- buffer['msgctxt'].length) ?
- buffer['msgctxt']+Gettext.context_glue+buffer['msgid'] :
- buffer['msgid'];
- var msgid_plural = (typeof(buffer['msgid_plural']) != 'undefined' &&
- buffer['msgid_plural'].length) ?
- buffer['msgid_plural'] :
- null;
-
- // find msgstr_* translations and push them on
- var trans = [];
- for (var str in buffer) {
- var match;
- if (match = str.match(/^msgstr_(\d+)/))
- trans[parseInt(match[1])] = buffer[str];
- }
- trans.unshift(msgid_plural);
-
- // only add it if we've got a translation
- // NOTE: this doesn't conform to msgfmt specs
- if (trans.length > 1) rv[msg_ctxt_id] = trans;
-
- buffer = {};
- lastbuffer = "";
- }
-
- // comments
- } else if (/^#/.test(lines[i])) {
- continue;
-
- // msgctxt
- } else if (match = lines[i].match(/^msgctxt\s+(.*)/)) {
- lastbuffer = 'msgctxt';
- buffer[lastbuffer] = this.parse_po_dequote(match[1]);
-
- // msgid
- } else if (match = lines[i].match(/^msgid\s+(.*)/)) {
- lastbuffer = 'msgid';
- buffer[lastbuffer] = this.parse_po_dequote(match[1]);
-
- // msgid_plural
- } else if (match = lines[i].match(/^msgid_plural\s+(.*)/)) {
- lastbuffer = 'msgid_plural';
- buffer[lastbuffer] = this.parse_po_dequote(match[1]);
-
- // msgstr
- } else if (match = lines[i].match(/^msgstr\s+(.*)/)) {
- lastbuffer = 'msgstr_0';
- buffer[lastbuffer] = this.parse_po_dequote(match[1]);
-
- // msgstr[0] (treak like msgstr)
- } else if (match = lines[i].match(/^msgstr\[0\]\s+(.*)/)) {
- lastbuffer = 'msgstr_0';
- buffer[lastbuffer] = this.parse_po_dequote(match[1]);
-
- // msgstr[n]
- } else if (match = lines[i].match(/^msgstr\[(\d+)\]\s+(.*)/)) {
- lastbuffer = 'msgstr_'+match[1];
- buffer[lastbuffer] = this.parse_po_dequote(match[2]);
-
- // continued string
- } else if (/^"/.test(lines[i])) {
- buffer[lastbuffer] += this.parse_po_dequote(lines[i]);
-
- // something strange
- } else {
- errors.push("Strange line ["+i+"] : "+lines[i]);
- }
- }
-
-
- // handle the final entry
- if (typeof(buffer['msgid']) != 'undefined') {
- var msg_ctxt_id = (typeof(buffer['msgctxt']) != 'undefined' &&
- buffer['msgctxt'].length) ?
- buffer['msgctxt']+Gettext.context_glue+buffer['msgid'] :
- buffer['msgid'];
- var msgid_plural = (typeof(buffer['msgid_plural']) != 'undefined' &&
- buffer['msgid_plural'].length) ?
- buffer['msgid_plural'] :
- null;
-
- // find msgstr_* translations and push them on
- var trans = [];
- for (var str in buffer) {
- var match;
- if (match = str.match(/^msgstr_(\d+)/))
- trans[parseInt(match[1])] = buffer[str];
- }
- trans.unshift(msgid_plural);
-
- // only add it if we've got a translation
- // NOTE: this doesn't conform to msgfmt specs
- if (trans.length > 1) rv[msg_ctxt_id] = trans;
-
- buffer = {};
- lastbuffer = "";
- }
-
-
- // parse out the header
- if (rv[""] && rv[""][1]) {
- var cur = {};
- var hlines = rv[""][1].split(/\\n/);
- for (var i=0; i<hlines.length; i++) {
- if (! hlines.length) continue;
-
- var pos = hlines[i].indexOf(':', 0);
- if (pos != -1) {
- var key = hlines[i].substring(0, pos);
- var val = hlines[i].substring(pos +1);
- var keylow = key.toLowerCase();
-
- if (cur[keylow] && cur[keylow].length) {
- errors.push("SKIPPING DUPLICATE HEADER LINE: "+hlines[i]);
- } else if (/#-#-#-#-#/.test(keylow)) {
- errors.push("SKIPPING ERROR MARKER IN HEADER: "+hlines[i]);
- } else {
- // remove begining spaces if any
- val = val.replace(/^\s+/, '');
- cur[keylow] = val;
- }
-
- } else {
- errors.push("PROBLEM LINE IN HEADER: "+hlines[i]);
- cur[hlines[i]] = '';
- }
- }
-
- // replace header string with assoc array
- rv[""] = cur;
- } else {
- rv[""] = {};
- }
-
- // TODO: XXX: if there are errors parsing, what do we want to do?
- // GNU Gettext silently ignores errors. So will we.
- // alert( "Errors parsing po file:\n" + errors.join("\n") );
-
- return rv;
-};
-
-
-Gettext.prototype.parse_po_dequote = function(str) {
- var match;
- if (match = str.match(/^"(.*)"/)) {
- str = match[1];
- }
- str = str.replace(/\\"/, "");
- return str;
-};
-
-
-// try_load_lang_json : do an ajaxy call to load in the lang defs
-Gettext.prototype.try_load_lang_json = function(uri) {
- var data = this.sjax(uri);
- if (! data) return;
-
- var rv = this.JSON(data);
- this.parse_locale_data(rv);
-
- return 1;
-};
-
-// this finds all <link> tags, filters out ones that match our
-// specs, and returns a list of hashes of those
-Gettext.prototype.get_lang_refs = function() {
- var langs = new Array();
- var links = document.getElementsByTagName("link");
- // find all <link> tags in dom; filter ours
- for (var i=0; i<links.length; i++) {
- if (links[i].rel == 'gettext' && links[i].href) {
- if (typeof(links[i].type) == 'undefined' ||
- links[i].type == '') {
- if (/\.json$/i.test(links[i].href)) {
- links[i].type = 'application/json';
- } else if (/\.js$/i.test(links[i].href)) {
- links[i].type = 'application/json';
- } else if (/\.po$/i.test(links[i].href)) {
- links[i].type = 'application/x-po';
- } else if (/\.mo$/i.test(links[i].href)) {
- links[i].type = 'application/x-mo';
- } else {
- throw new Error("LINK tag with rel=gettext found, but the type and extension are unrecognized.");
- }
- }
-
- links[i].type = links[i].type.toLowerCase();
- if (links[i].type == 'application/json') {
- links[i].type = 'application/json';
- } else if (links[i].type == 'text/javascript') {
- links[i].type = 'application/json';
- } else if (links[i].type == 'application/x-po') {
- links[i].type = 'application/x-po';
- } else if (links[i].type == 'application/x-mo') {
- links[i].type = 'application/x-mo';
- } else {
- throw new Error("LINK tag with rel=gettext found, but the type attribute ["+links[i].type+"] is unrecognized.");
- }
-
- langs.push(links[i]);
- }
- }
- return langs;
-};
-
-
-/*
-
-=head2 textdomain( domain )
-
-Set domain for future gettext() calls
-
-A message domain is a set of translatable msgid messages. Usually,
-every software package has its own message domain. The domain name is
-used to determine the message catalog where a translation is looked up;
-it must be a non-empty string.
-
-The current message domain is used by the gettext, ngettext, pgettext,
-npgettext functions, and by the dgettext, dcgettext, dngettext, dcngettext,
-dpgettext, dcpgettext, dnpgettext and dcnpgettext functions when called
-with a NULL domainname argument.
-
-If domainname is not NULL, the current message domain is set to
-domainname.
-
-If domainname is undefined, null, or empty string, the function returns
-the current message domain.
-
-If successful, the textdomain function returns the current message
-domain, after possibly changing it. (ie. if you set a new domain, the
-value returned will NOT be the previous domain).
-
-=cut
-
-*/
-Gettext.prototype.textdomain = function (domain) {
- if (domain && domain.length) this.domain = domain;
- return this.domain;
-}
-
-/*
-
-=head2 gettext( MSGID )
-
-Returns the translation for B<MSGID>. Example:
-
- alert( gt.gettext("Hello World!\n") );
-
-If no translation can be found, the unmodified B<MSGID> is returned,
-i. e. the function can I<never> fail, and will I<never> mess up your
-original message.
-
-One common mistake is to interpolate a variable into the string like this:
-
- var translated = gt.gettext("Hello " + full_name);
-
-The interpolation will happen before it's passed to gettext, and it's
-unlikely you'll have a translation for every "Hello Tom" and "Hello Dick"
-and "Hellow Harry" that may arise.
-
-Use C<strargs()> (see below) to solve this problem:
-
- var translated = Gettext.strargs( gt.gettext("Hello %1"), [full_name] );
-
-This is espeically useful when multiple replacements are needed, as they
-may not appear in the same order within the translation. As an English to
-French example:
-
- Expected result: "This is the red ball"
- English: "This is the %1 %2"
- French: "C'est le %2 %1"
- Code: Gettext.strargs( gt.gettext("This is the %1 %2"), ["red", "ball"] );
-
-(The example is stupid because neither color nor thing will get
-translated here ...).
-
-=head2 dgettext( TEXTDOMAIN, MSGID )
-
-Like gettext(), but retrieves the message for the specified
-B<TEXTDOMAIN> instead of the default domain. In case you wonder what
-a textdomain is, see above section on the textdomain() call.
-
-=head2 dcgettext( TEXTDOMAIN, MSGID, CATEGORY )
-
-Like dgettext() but retrieves the message from the specified B<CATEGORY>
-instead of the default category C<LC_MESSAGES>.
-
-NOTE: the categories are really useless in javascript context. This is
-here for GNU Gettext API compatability. In practice, you'll never need
-to use this. This applies to all the calls including the B<CATEGORY>.
-
-
-=head2 ngettext( MSGID, MSGID_PLURAL, COUNT )
-
-Retrieves the correct translation for B<COUNT> items. In legacy software
-you will often find something like:
-
- alert( count + " file(s) deleted.\n" );
-
-or
-
- printf(count + " file%s deleted.\n", $count == 1 ? '' : 's');
-
-I<NOTE: javascript lacks a builtin printf, so the above isn't a working example>
-
-The first example looks awkward, the second will only work in English
-and languages with similar plural rules. Before ngettext() was introduced,
-the best practice for internationalized programs was:
-
- if (count == 1) {
- alert( gettext("One file deleted.\n") );
- } else {
- printf( gettext("%d files deleted.\n"), count );
- }
-
-This is a nuisance for the programmer and often still not sufficient
-for an adequate translation. Many languages have completely different
-ideas on numerals. Some (French, Italian, ...) treat 0 and 1 alike,
-others make no distinction at all (Japanese, Korean, Chinese, ...),
-others have two or more plural forms (Russian, Latvian, Czech,
-Polish, ...). The solution is:
-
- printf( ngettext("One file deleted.\n",
- "%d files deleted.\n",
- count), // argument to ngettext!
- count); // argument to printf!
-
-In English, or if no translation can be found, the first argument
-(B<MSGID>) is picked if C<count> is one, the second one otherwise.
-For other languages, the correct plural form (of 1, 2, 3, 4, ...)
-is automatically picked, too. You don't have to know anything about
-the plural rules in the target language, ngettext() will take care
-of that.
-
-This is most of the time sufficient but you will have to prove your
-creativity in cases like
-
- "%d file(s) deleted, and %d file(s) created.\n"
-
-That said, javascript lacks C<printf()> support. Supplied with Gettext.js
-is the C<strargs()> method, which can be used for these cases:
-
- Gettext.strargs( gt.ngettext( "One file deleted.\n",
- "%d files deleted.\n",
- count), // argument to ngettext!
- count); // argument to strargs!
-
-NOTE: the variable replacement isn't done for you, so you must
-do it yourself as in the above.
-
-=head2 dngettext( TEXTDOMAIN, MSGID, MSGID_PLURAL, COUNT )
-
-Like ngettext() but retrieves the translation from the specified
-textdomain instead of the default domain.
-
-=head2 dcngettext( TEXTDOMAIN, MSGID, MSGID_PLURAL, COUNT, CATEGORY )
-
-Like dngettext() but retrieves the translation from the specified
-category, instead of the default category C<LC_MESSAGES>.
-
-
-=head2 pgettext( MSGCTXT, MSGID )
-
-Returns the translation of MSGID, given the context of MSGCTXT.
-
-Both items are used as a unique key into the message catalog.
-
-This allows the translator to have two entries for words that may
-translate to different foreign words based on their context. For
-example, the word "View" may be a noun or a verb, which may be
-used in a menu as File->View or View->Source.
-
- alert( pgettext( "Verb: To View", "View" ) );
- alert( pgettext( "Noun: A View", "View" ) );
-
-The above will both lookup different entries in the message catalog.
-
-In English, or if no translation can be found, the second argument
-(B<MSGID>) is returned.
-
-=head2 dpgettext( TEXTDOMAIN, MSGCTXT, MSGID )
-
-Like pgettext(), but retrieves the message for the specified
-B<TEXTDOMAIN> instead of the default domain.
-
-=head2 dcpgettext( TEXTDOMAIN, MSGCTXT, MSGID, CATEGORY )
-
-Like dpgettext() but retrieves the message from the specified B<CATEGORY>
-instead of the default category C<LC_MESSAGES>.
-
-
-=head2 npgettext( MSGCTXT, MSGID, MSGID_PLURAL, COUNT )
-
-Like ngettext() with the addition of context as in pgettext().
-
-In English, or if no translation can be found, the second argument
-(MSGID) is picked if B<COUNT> is one, the third one otherwise.
-
-=head2 dnpgettext( TEXTDOMAIN, MSGCTXT, MSGID, MSGID_PLURAL, COUNT )
-
-Like npgettext() but retrieves the translation from the specified
-textdomain instead of the default domain.
-
-=head2 dcnpgettext( TEXTDOMAIN, MSGCTXT, MSGID, MSGID_PLURAL, COUNT, CATEGORY )
-
-Like dnpgettext() but retrieves the translation from the specified
-category, instead of the default category C<LC_MESSAGES>.
-
-=cut
-
-*/
-
-// gettext
-Gettext.prototype.gettext = function (msgid) {
- var msgctxt;
- var msgid_plural;
- var n;
- var category;
- return this.dcnpgettext(null, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dgettext = function (domain, msgid) {
- var msgctxt;
- var msgid_plural;
- var n;
- var category;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dcgettext = function (domain, msgid, category) {
- var msgctxt;
- var msgid_plural;
- var n;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category);
-};
-
-// ngettext
-Gettext.prototype.ngettext = function (msgid, msgid_plural, n) {
- var msgctxt;
- var category;
- return this.dcnpgettext(null, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dngettext = function (domain, msgid, msgid_plural, n) {
- var msgctxt;
- var category;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dcngettext = function (domain, msgid, msgid_plural, n, category) {
- var msgctxt;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category, category);
-};
-
-// pgettext
-Gettext.prototype.pgettext = function (msgctxt, msgid) {
- var msgid_plural;
- var n;
- var category;
- return this.dcnpgettext(null, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dpgettext = function (domain, msgctxt, msgid) {
- var msgid_plural;
- var n;
- var category;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dcpgettext = function (domain, msgctxt, msgid, category) {
- var msgid_plural;
- var n;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category);
-};
-
-// npgettext
-Gettext.prototype.npgettext = function (msgctxt, msgid, msgid_plural, n) {
- var category;
- return this.dcnpgettext(null, msgctxt, msgid, msgid_plural, n, category);
-};
-
-Gettext.prototype.dnpgettext = function (domain, msgctxt, msgid, msgid_plural, n) {
- var category;
- return this.dcnpgettext(domain, msgctxt, msgid, msgid_plural, n, category);
-};
-
-// this has all the options, so we use it for all of them.
-Gettext.prototype.dcnpgettext = function (domain, msgctxt, msgid, msgid_plural, n, category) {
- if (! this.isValidObject(msgid)) return '';
-
- var plural = this.isValidObject(msgid_plural);
- var msg_ctxt_id = this.isValidObject(msgctxt) ? msgctxt+Gettext.context_glue+msgid : msgid;
-
- var domainname = this.isValidObject(domain) ? domain :
- this.isValidObject(this.domain) ? this.domain :
- 'messages';
-
- // category is always LC_MESSAGES. We ignore all else
- var category_name = 'LC_MESSAGES';
- var category = 5;
-
- var locale_data = new Array();
- if (typeof(Gettext._locale_data) != 'undefined' &&
- this.isValidObject(Gettext._locale_data[domainname])) {
- locale_data.push( Gettext._locale_data[domainname] );
-
- } else if (typeof(Gettext._locale_data) != 'undefined') {
- // didn't find domain we're looking for. Search all of them.
- for (var dom in Gettext._locale_data) {
- locale_data.push( Gettext._locale_data[dom] );
- }
- }
-
- var trans = [];
- var found = false;
- var domain_used; // so we can find plural-forms if needed
- if (locale_data.length) {
- for (var i=0; i<locale_data.length; i++) {
- var locale = locale_data[i];
- if (this.isValidObject(locale.msgs[msg_ctxt_id])) {
- // make copy of that array (cause we'll be destructive)
- for (var j=0; j<locale.msgs[msg_ctxt_id].length; j++) {
- trans[j] = locale.msgs[msg_ctxt_id][j];
- }
- trans.shift(); // throw away the msgid_plural
- domain_used = locale;
- found = true;
- // only break if found translation actually has a translation.
- if ( trans.length > 0 && trans[0].length != 0 )
- break;
- }
- }
- }
-
- // default to english if we lack a match, or match has zero length
- if ( trans.length == 0 || trans[0].length == 0 ) {
- trans = [ msgid, msgid_plural ];
- }
-
- var translation = trans[0];
- if (plural) {
- var p;
- if (found && this.isValidObject(domain_used.head.plural_func) ) {
- var rv = domain_used.head.plural_func(n);
- if (! rv.plural) rv.plural = 0;
- if (! rv.nplural) rv.nplural = 0;
- // if plurals returned is out of bound for total plural forms
- if (rv.nplural <= rv.plural) rv.plural = 0;
- p = rv.plural;
- } else {
- p = (n != 1) ? 1 : 0;
- }
- if (this.isValidObject(trans[p]))
- translation = trans[p];
- }
-
- return translation;
-};
-
-
-/*
-
-=head2 strargs (string, argument_array)
-
- string : a string that potentially contains formatting characters.
- argument_array : an array of positional replacement values
-
-This is a utility method to provide some way to support positional parameters within a string, as javascript lacks a printf() method.
-
-The format is similar to printf(), but greatly simplified (ie. fewer features).
-
-Any percent signs followed by numbers are replaced with the corrosponding item from the B<argument_array>.
-
-Example:
-
- var string = "%2 roses are red, %1 violets are blue";
- var args = new Array("10", "15");
- var result = Gettext.strargs(string, args);
- // result is "15 roses are red, 10 violets are blue"
-
-The format numbers are 1 based, so the first itme is %1.
-
-A lone percent sign may be escaped by preceeding it with another percent sign.
-
-A percent sign followed by anything other than a number or another percent sign will be passed through as is.
-
-Some more examples should clear up any abmiguity. The following were called with the orig string, and the array as Array("[one]", "[two]") :
-
- orig string "blah" becomes "blah"
- orig string "" becomes ""
- orig string "%%" becomes "%"
- orig string "%%%" becomes "%%"
- orig string "%%%%" becomes "%%"
- orig string "%%%%%" becomes "%%%"
- orig string "tom%%dick" becomes "tom%dick"
- orig string "thing%1bob" becomes "thing[one]bob"
- orig string "thing%1%2bob" becomes "thing[one][two]bob"
- orig string "thing%1asdf%2asdf" becomes "thing[one]asdf[two]asdf"
- orig string "%1%2%3" becomes "[one][two]"
- orig string "tom%1%%2%aDick" becomes "tom[one]%2%aDick"
-
-This is especially useful when using plurals, as the string will nearly always contain the number.
-
-It's also useful in translated strings where the translator may have needed to move the position of the parameters.
-
-For example:
-
- var count = 14;
- Gettext.strargs( gt.ngettext('one banana', '%1 bananas', count), [count] );
-
-NOTE: this may be called as an instance method, or as a class method.
-
- // instance method:
- var gt = new Gettext(params);
- gt.strargs(string, args);
-
- // class method:
- Gettext.strargs(string, args);
-
-=cut
-
-*/
-/* utility method, since javascript lacks a printf */
-Gettext.strargs = function (str, args) {
- // make sure args is an array
- if ( null == args ||
- 'undefined' == typeof(args) ) {
- args = [];
- } else if (args.constructor != Array) {
- args = [args];
- }
-
- // NOTE: javascript lacks support for zero length negative look-behind
- // in regex, so we must step through w/ index.
- // The perl equiv would simply be:
- // $string =~ s/(?<!\%)\%([0-9]+)/$args[$1]/g;
- // $string =~ s/\%\%/\%/g; # restore escaped percent signs
-
- var newstr = "";
- while (true) {
- var i = str.indexOf('%');
- var match_n;
-
- // no more found. Append whatever remains
- if (i == -1) {
- newstr += str;
- break;
- }
-
- // we found it, append everything up to that
- newstr += str.substr(0, i);
-
- // check for escpaed %%
- if (str.substr(i, 2) == '%%') {
- newstr += '%';
- str = str.substr((i+2));
-
- // % followed by number
- } else if ( match_n = str.substr(i).match(/^%(\d+)/) ) {
- var arg_n = parseInt(match_n[1]);
- var length_n = match_n[1].length;
- if ( arg_n > 0 && args[arg_n -1] != null && typeof(args[arg_n -1]) != 'undefined' )
- newstr += args[arg_n -1];
- str = str.substr( (i + 1 + length_n) );
-
- // % followed by some other garbage - just remove the %
- } else {
- newstr += '%';
- str = str.substr((i+1));
- }
- }
-
- return newstr;
-}
-
-/* instance method wrapper of strargs */
-Gettext.prototype.strargs = function (str, args) {
- return Gettext.strargs(str, args);
-}
-
-/* verify that something is an array */
-Gettext.prototype.isArray = function (thisObject) {
- return this.isValidObject(thisObject) && thisObject.constructor == Array;
-};
-
-/* verify that an object exists and is valid */
-Gettext.prototype.isValidObject = function (thisObject) {
- if (null == thisObject) {
- return false;
- } else if ('undefined' == typeof(thisObject) ) {
- return false;
- } else {
- return true;
- }
-};
-
-Gettext.prototype.sjax = function (uri) {
- var xmlhttp;
- if (window.XMLHttpRequest) {
- xmlhttp = new XMLHttpRequest();
- } else if (navigator.userAgent.toLowerCase().indexOf('msie 5') != -1) {
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- } else {
- xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
- }
-
- if (! xmlhttp)
- throw new Error("Your browser doesn't do Ajax. Unable to support external language files.");
-
- xmlhttp.open('GET', uri, false);
- try { xmlhttp.send(null); }
- catch (e) { return; }
-
- // we consider status 200 and 0 as ok.
- // 0 happens when we request local file, allowing this to run on local files
- var sjax_status = xmlhttp.status;
- if (sjax_status == 200 || sjax_status == 0) {
- return xmlhttp.responseText;
- } else {
- var error = xmlhttp.statusText + " (Error " + xmlhttp.status + ")";
- if (xmlhttp.responseText.length) {
- error += "\n" + xmlhttp.responseText;
- }
- alert(error);
- return;
- }
-}
-
-Gettext.prototype.JSON = function (data) {
- return eval('(' + data + ')');
-}
-
-
-/*
-
-=head1 NOTES
-
-These are some notes on the internals
-
-=over
-
-=item LOCALE CACHING
-
-Loaded locale data is currently cached class-wide. This means that if two scripts are both using Gettext.js, and both share the same gettext domain, that domain will only be loaded once. This will allow you to grab a new object many times from different places, utilize the same domain, and share a single translation file. The downside is that a domain won't be RE-loaded if a new object is instantiated on a domain that had already been instantiated.
-
-=back
-
-=head1 BUGS / TODO
-
-=over
-
-=item error handling
-
-Currently, there are several places that throw errors. In GNU Gettext, there are no fatal errors, which allows text to still be displayed regardless of how broken the environment becomes. We should evaluate and determine where we want to stand on that issue.
-
-=item syncronous only support (no ajax support)
-
-Currently, fetching language data is done purely syncronous, which means the page will halt while those files are fetched/loaded.
-
-This is often what you want, as then following translation requests will actually be translated. However, if all your calls are done dynamically (ie. error handling only or something), loading in the background may be more adventagous.
-
-It's still recommended to use the statically defined <script ...> method, which should have the same delay, but it will cache the result.
-
-=item domain support
-
-domain support while using shortcut methods like C<_('string')> or C<i18n('string')>.
-
-Under normal apps, the domain is usually set globally to the app, and a single language file is used. Under javascript, you may have multiple libraries or applications needing translation support, but the namespace is essentially global.
-
-It's recommended that your app initialize it's own shortcut with it's own domain. (See examples/wrapper/i18n.js for an example.)
-
-Basically, you'll want to accomplish something like this:
-
- // in some other .js file that needs i18n
- this.i18nObj = new i18n;
- this.i18n = this.i18nObj.init('domain');
- // do translation
- alert( this.i18n("string") );
-
-If you use this raw Gettext object, then this is all handled for you, as you have your own object then, and will be calling C<myGettextObject.gettext('string')> and such.
-
-
-=item encoding
-
-May want to add encoding/reencoding stuff. See GNU iconv, or the perl module Locale::Recode from libintl-perl.
-
-=back
-
-
-=head1 COMPATABILITY
-
-This has been tested on the following browsers. It may work on others, but these are all those to which I have access.
-
- FF1.5, FF2, FF3, IE6, IE7, Opera9, Opera10, Safari3.1, Chrome
-
- *FF = Firefox
- *IE = Internet Explorer
-
-
-=head1 REQUIRES
-
-bin/po2json requires perl, and the perl modules Locale::PO and JSON.
-
-=head1 SEE ALSO
-
-bin/po2json (included),
-examples/normal/index.html,
-examples/wrapper/i18n.html, examples/wrapper/i18n.js,
-Locale::gettext_pp(3pm), POSIX(3pm), gettext(1), gettext(3)
-
-=head1 AUTHOR
-
-Copyright (C) 2008, Joshua I. Miller E<lt>unrtst@cpan.orgE<gt>, all rights reserved. See the source code for details.
-
-=cut
-
-*/
-
diff --git a/examples/adding_up_to_10_old/js/jquery-1.3.2.min.js b/examples/adding_up_to_10_old/js/jquery-1.3.2.min.js
deleted file mode 100755
index b1ae21d..0000000
--- a/examples/adding_up_to_10_old/js/jquery-1.3.2.min.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * jQuery JavaScript Library v1.3.2
- * http://jquery.com/
- *
- * Copyright (c) 2009 John Resig
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- *
- * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
- * Revision: 6246
- */
-(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
-/*
- * Sizzle CSS Selector Engine - v0.9.3
- * Copyright 2009, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file
diff --git a/examples/adding_up_to_10_old/js/jquery.jgrowl_minimized.js b/examples/adding_up_to_10_old/js/jquery.jgrowl_minimized.js
deleted file mode 100755
index 09ddc88..0000000
--- a/examples/adding_up_to_10_old/js/jquery.jgrowl_minimized.js
+++ /dev/null
@@ -1,4 +0,0 @@
-
-(function($){$.jGrowl=function(m,o){if($('#jGrowl').size()==0)$('<div id="jGrowl"></div>').addClass($.jGrowl.defaults.position).appendTo('body');$('#jGrowl').jGrowl(m,o);};$.fn.jGrowl=function(m,o){if($.isFunction(this.each)){var args=arguments;return this.each(function(){var self=this;if($(this).data('jGrowl.instance')==undefined){$(this).data('jGrowl.instance',new $.fn.jGrowl());$(this).data('jGrowl.instance').startup(this);}
-if($.isFunction($(this).data('jGrowl.instance')[m])){$(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'),$.makeArray(args).slice(1));}else{$(this).data('jGrowl.instance').create(m,o);}});};};$.extend($.fn.jGrowl.prototype,{defaults:{pool:0,header:'',group:'',sticky:false,position:'top-right',glue:'after',theme:'default',corners:'10px',check:250,life:3000,speed:'normal',easing:'swing',closer:true,closeTemplate:'&times;',closerTemplate:'<div>[ close all ]</div>',log:function(e,m,o){},beforeOpen:function(e,m,o){},open:function(e,m,o){},beforeClose:function(e,m,o){},close:function(e,m,o){},animateOpen:{opacity:'show'},animateClose:{opacity:'hide'}},notifications:[],element:null,interval:null,create:function(message,o){var o=$.extend({},this.defaults,o);this.notifications[this.notifications.length]={message:message,options:o};o.log.apply(this.element,[this.element,message,o]);},render:function(notification){var self=this;var message=notification.message;var o=notification.options;var notification=$('<div class="jGrowl-notification'+((o.group!=undefined&&o.group!='')?' '+o.group:'')+'"><div class="close">'+o.closeTemplate+'</div><div class="header">'+o.header+'</div><div class="message">'+message+'</div></div>').data("jGrowl",o).addClass(o.theme).children('div.close').bind("click.jGrowl",function(){$(this).parent().trigger('jGrowl.close');}).parent();(o.glue=='after')?$('div.jGrowl-notification:last',this.element).after(notification):$('div.jGrowl-notification:first',this.element).before(notification);$(notification).bind("mouseover.jGrowl",function(){$(this).data("jGrowl").pause=true;}).bind("mouseout.jGrowl",function(){$(this).data("jGrowl").pause=false;}).bind('jGrowl.beforeOpen',function(){o.beforeOpen.apply(self.element,[self.element,message,o]);}).bind('jGrowl.open',function(){o.open.apply(self.element,[self.element,message,o]);}).bind('jGrowl.beforeClose',function(){o.beforeClose.apply(self.element,[self.element,message,o]);}).bind('jGrowl.close',function(){$(this).trigger('jGrowl.beforeClose').animate(o.animateClose,o.speed,o.easing,function(){$(this).remove();o.close.apply(self.element,[self.element,message,o]);});}).trigger('jGrowl.beforeOpen').animate(o.animateOpen,o.speed,o.easing,function(){$(this).data("jGrowl").created=new Date();}).trigger('jGrowl.open');if($.fn.corner!=undefined)$(notification).corner(o.corners);if($('div.jGrowl-notification:parent',this.element).size()>1&&$('div.jGrowl-closer',this.element).size()==0&&this.defaults.closer!=false){$(this.defaults.closerTemplate).addClass('jGrowl-closer').addClass(this.defaults.theme).appendTo(this.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){$(this).siblings().children('div.close').trigger("click.jGrowl");if($.isFunction(self.defaults.closer))self.defaults.closer.apply($(this).parent()[0],[$(this).parent()[0]]);});};},update:function(){$(this.element).find('div.jGrowl-notification:parent').each(function(){if($(this).data("jGrowl")!=undefined&&$(this).data("jGrowl").created!=undefined&&($(this).data("jGrowl").created.getTime()+$(this).data("jGrowl").life)<(new Date()).getTime()&&$(this).data("jGrowl").sticky!=true&&($(this).data("jGrowl").pause==undefined||$(this).data("jGrowl").pause!=true)){$(this).trigger('jGrowl.close');}});if(this.notifications.length>0&&(this.defaults.pool==0||$(this.element).find('div.jGrowl-notification:parent').size()<this.defaults.pool)){this.render(this.notifications.shift());}
-if($(this.element).find('div.jGrowl-notification:parent').size()<2){$(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){$(this).remove();});};},startup:function(e){this.element=$(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');this.interval=setInterval(function(){jQuery(e).data('jGrowl.instance').update();},this.defaults.check);if($.browser.msie&&parseInt($.browser.version)<7&&!window["XMLHttpRequest"])$(this.element).addClass('ie6');},shutdown:function(){$(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove();clearInterval(this.interval);}});$.jGrowl.defaults=$.fn.jGrowl.prototype.defaults;})(jQuery); \ No newline at end of file
diff --git a/examples/adding_up_to_10_old/js/jquery.localisation.min.js b/examples/adding_up_to_10_old/js/jquery.localisation.min.js
deleted file mode 100755
index b7d0019..0000000
--- a/examples/adding_up_to_10_old/js/jquery.localisation.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/localisation.html
- Localisation assistance for jQuery v1.0.4.
- Written by Keith Wood (kbwood{at}iinet.com.au) June 2007.
- Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
- MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
- Please attribute the author if you use it. */
-(function($){$.localise=function(c,d,e,f,g){if(typeof d!='object'&&typeof d!='string'){g=f;f=e;e=d;d=''}if(typeof e!='boolean'){g=f;f=e;e=false}if(typeof f!='string'&&!isArray(f)){g=f;f=['','']}var h={async:$.ajaxSettings.async,timeout:$.ajaxSettings.timeout};d=(typeof d!='string'?d||{}:{language:d,loadBase:e,path:f,timeout:g});var j=(!d.path?['','']:(isArray(d.path)?d.path:[d.path,d.path]));$.ajaxSetup({async:false,timeout:(d.timeout||500)});var k=function(a,b){if(d.loadBase){$.getScript(j[0]+a+'.js')}if(b.length>=2){$.getScript(j[1]+a+'-'+b.substring(0,2)+'.js')}if(b.length>=5){$.getScript(j[1]+a+'-'+b.substring(0,5)+'.js')}};var l=normaliseLang(d.language||$.localise.defaultLanguage);c=(isArray(c)?c:[c]);for(i=0;i<c.length;i++){k(c[i],l)}$.ajaxSetup(h)};$.localize=$.localise;$.localise.defaultLanguage=normaliseLang(navigator.language||navigator.userLanguage);function normaliseLang(a){a=a.replace(/_/,'-').toLowerCase();if(a.length>3){a=a.substring(0,3)+a.substring(3).toUpperCase()}return a}function isArray(a){return(a&&a.constructor==Array)}})(jQuery); \ No newline at end of file
diff --git a/examples/adding_up_to_10_old/js/jquery.localisation.pack.js b/examples/adding_up_to_10_old/js/jquery.localisation.pack.js
deleted file mode 100755
index f705cde..0000000
--- a/examples/adding_up_to_10_old/js/jquery.localisation.pack.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* http://keith-wood.name/localisation.html
- Localisation assistance for jQuery v1.0.4.
- Written by Keith Wood (kbwood{at}iinet.com.au) June 2007.
- Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
- MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
- Please attribute the author if you use it. */
-eval(function(p,a,c,k,e,r){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--)r[e(c)]=k[c]||e(c);k=[function(e){return r[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}('(7($){$.m=7(c,d,e,f,g){4(8 d!=\'E\'&&8 d!=\'r\'){g=f;f=e;e=d;d=\'\'}4(8 e!=\'F\'){g=f;f=e;e=x}4(8 f!=\'r\'&&!n(f)){g=f;f=[\'\',\'\']}o h={s:$.y.s,9:$.y.9};d=(8 d!=\'r\'?d||{}:{t:d,z:e,6:f,9:g});o j=(!d.6?[\'\',\'\']:(n(d.6)?d.6:[d.6,d.6]));$.A({s:x,9:(d.9||G)});o k=7(a,b){4(d.z){$.u(j[0]+a+\'.v\')}4(b.p>=2){$.u(j[1]+a+\'-\'+b.q(0,2)+\'.v\')}4(b.p>=5){$.u(j[1]+a+\'-\'+b.q(0,5)+\'.v\')}};o l=w(d.t||$.m.B);c=(n(c)?c:[c]);H(i=0;i<c.p;i++){k(c[i],l)}$.A(h)};$.I=$.m;$.m.B=w(C.t||C.J);7 w(a){a=a.K(/L/,\'-\').M();4(a.p>3){a=a.q(0,3)+a.q(3).N()}D a}7 n(a){D(a&&a.O==P)}})(Q);',53,53,'||||if||path|function|typeof|timeout|||||||||||||localise|isArray|var|length|substring|string|async|language|getScript|js|normaliseLang|false|ajaxSettings|loadBase|ajaxSetup|defaultLanguage|navigator|return|object|boolean|500|for|localize|userLanguage|replace|_|toLowerCase|toUpperCase|constructor|Array|jQuery'.split('|'),0,{})) \ No newline at end of file
diff --git a/examples/adding_up_to_10_old/js/jquery.ui.all.js b/examples/adding_up_to_10_old/js/jquery.ui.all.js
deleted file mode 100755
index 7ef2f75..0000000
--- a/examples/adding_up_to_10_old/js/jquery.ui.all.js
+++ /dev/null
@@ -1,7531 +0,0 @@
-/*
- * jQuery UI 1.5.1
- *
- * Copyright (c) 2008 Paul Bakaus (ui.jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI
- */
-;(function($) {
-
-$.ui = {
- plugin: {
- add: function(module, option, set) {
- var proto = $.ui[module].prototype;
- for(var i in set) {
- proto.plugins[i] = proto.plugins[i] || [];
- proto.plugins[i].push([option, set[i]]);
- }
- },
- call: function(instance, name, args) {
- var set = instance.plugins[name];
- if(!set) { return; }
-
- for (var i = 0; i < set.length; i++) {
- if (instance.options[set[i][0]]) {
- set[i][1].apply(instance.element, args);
- }
- }
- }
- },
- cssCache: {},
- css: function(name) {
- if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; }
- var tmp = $('<div class="ui-gen">').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body');
-
- //if (!$.browser.safari)
- //tmp.appendTo('body');
-
- //Opera and Safari set width and height to 0px instead of auto
- //Safari returns rgba(0,0,0,0) when bgcolor is not set
- $.ui.cssCache[name] = !!(
- (!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) ||
- !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor')))
- );
- try { $('body').get(0).removeChild(tmp.get(0)); } catch(e){}
- return $.ui.cssCache[name];
- },
- disableSelection: function(e) {
- e.unselectable = "on";
- e.onselectstart = function() { return false; };
- if (e.style) { e.style.MozUserSelect = "none"; }
- },
- enableSelection: function(e) {
- e.unselectable = "off";
- e.onselectstart = function() { return true; };
- if (e.style) { e.style.MozUserSelect = ""; }
- },
- hasScroll: function(e, a) {
- var scroll = /top/.test(a||"top") ? 'scrollTop' : 'scrollLeft', has = false;
- if (e[scroll] > 0) return true; e[scroll] = 1;
- has = e[scroll] > 0 ? true : false; e[scroll] = 0;
- return has;
- }
-};
-
-
-/** jQuery core modifications and additions **/
-
-var _remove = $.fn.remove;
-$.fn.remove = function() {
- $("*", this).add(this).trigger("remove");
- return _remove.apply(this, arguments );
-};
-
-// $.widget is a factory to create jQuery plugins
-// taking some boilerplate code out of the plugin code
-// created by Scott González and Jörn Zaefferer
-function getter(namespace, plugin, method) {
- var methods = $[namespace][plugin].getter || [];
- methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods);
- return ($.inArray(method, methods) != -1);
-}
-
-$.widget = function(name, prototype) {
- var namespace = name.split(".")[0];
- name = name.split(".")[1];
-
- // create plugin method
- $.fn[name] = function(options) {
- var isMethodCall = (typeof options == 'string'),
- args = Array.prototype.slice.call(arguments, 1);
-
- if (isMethodCall && getter(namespace, name, options)) {
- var instance = $.data(this[0], name);
- return (instance ? instance[options].apply(instance, args)
- : undefined);
- }
-
- return this.each(function() {
- var instance = $.data(this, name);
- if (isMethodCall && instance && $.isFunction(instance[options])) {
- instance[options].apply(instance, args);
- } else if (!isMethodCall) {
- $.data(this, name, new $[namespace][name](this, options));
- }
- });
- };
-
- // create widget constructor
- $[namespace][name] = function(element, options) {
- var self = this;
-
- this.widgetName = name;
- this.widgetBaseClass = namespace + '-' + name;
-
- this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, options);
- this.element = $(element)
- .bind('setData.' + name, function(e, key, value) {
- return self.setData(key, value);
- })
- .bind('getData.' + name, function(e, key) {
- return self.getData(key);
- })
- .bind('remove', function() {
- return self.destroy();
- });
- this.init();
- };
-
- // add widget prototype
- $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
-};
-
-$.widget.prototype = {
- init: function() {},
- destroy: function() {
- this.element.removeData(this.widgetName);
- },
-
- getData: function(key) {
- return this.options[key];
- },
- setData: function(key, value) {
- this.options[key] = value;
-
- if (key == 'disabled') {
- this.element[value ? 'addClass' : 'removeClass'](
- this.widgetBaseClass + '-disabled');
- }
- },
-
- enable: function() {
- this.setData('disabled', false);
- },
- disable: function() {
- this.setData('disabled', true);
- }
-};
-
-$.widget.defaults = {
- disabled: false
-};
-
-
-/** Mouse Interaction Plugin **/
-
-$.ui.mouse = {
- mouseInit: function() {
- var self = this;
-
- this.element.bind('mousedown.'+this.widgetName, function(e) {
- return self.mouseDown(e);
- });
-
- // Prevent text selection in IE
- if ($.browser.msie) {
- this._mouseUnselectable = this.element.attr('unselectable');
- this.element.attr('unselectable', 'on');
- }
-
- this.started = false;
- },
-
- // TODO: make sure destroying one instance of mouse doesn't mess with
- // other instances of mouse
- mouseDestroy: function() {
- this.element.unbind('.'+this.widgetName);
-
- // Restore text selection in IE
- ($.browser.msie
- && this.element.attr('unselectable', this._mouseUnselectable));
- },
-
- mouseDown: function(e) {
- // we may have missed mouseup (out of window)
- (this._mouseStarted && this.mouseUp(e));
-
- this._mouseDownEvent = e;
-
- var self = this,
- btnIsLeft = (e.which == 1),
- elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).is(this.options.cancel) : false);
- if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) {
- return true;
- }
-
- this._mouseDelayMet = !this.options.delay;
- if (!this._mouseDelayMet) {
- this._mouseDelayTimer = setTimeout(function() {
- self._mouseDelayMet = true;
- }, this.options.delay);
- }
-
- if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
- this._mouseStarted = (this.mouseStart(e) !== false);
- if (!this._mouseStarted) {
- e.preventDefault();
- return true;
- }
- }
-
- // these delegates are required to keep context
- this._mouseMoveDelegate = function(e) {
- return self.mouseMove(e);
- };
- this._mouseUpDelegate = function(e) {
- return self.mouseUp(e);
- };
- $(document)
- .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
- .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
- return false;
- },
-
- mouseMove: function(e) {
- // IE mouseup check - mouseup happened when mouse was out of window
- if ($.browser.msie && !e.button) {
- return this.mouseUp(e);
- }
-
- if (this._mouseStarted) {
- this.mouseDrag(e);
- return false;
- }
-
- if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
- this._mouseStarted =
- (this.mouseStart(this._mouseDownEvent, e) !== false);
- (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e));
- }
-
- return !this._mouseStarted;
- },
-
- mouseUp: function(e) {
- $(document)
- .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
- .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
- if (this._mouseStarted) {
- this._mouseStarted = false;
- this.mouseStop(e);
- }
-
- return false;
- },
-
- mouseDistanceMet: function(e) {
- return (Math.max(
- Math.abs(this._mouseDownEvent.pageX - e.pageX),
- Math.abs(this._mouseDownEvent.pageY - e.pageY)
- ) >= this.options.distance
- );
- },
-
- mouseDelayMet: function(e) {
- return this._mouseDelayMet;
- },
-
- // These are placeholder methods, to be overriden by extending plugin
- mouseStart: function(e) {},
- mouseDrag: function(e) {},
- mouseStop: function(e) {},
- mouseCapture: function(e) { return true; }
-};
-
-$.ui.mouse.defaults = {
- cancel: null,
- distance: 1,
- delay: 0
-};
-
-})(jQuery);
-/*
- * jQuery UI Draggable
- *
- * Copyright (c) 2008 Paul Bakaus
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Draggables
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-$.widget("ui.draggable", $.extend($.ui.mouse, {
- init: function() {
-
- //Initialize needed constants
- var o = this.options;
-
- //Position the node
- if (o.helper == 'original' && !(/(relative|absolute|fixed)/).test(this.element.css('position')))
- this.element.css('position', 'relative');
-
- this.element.addClass('ui-draggable');
- (o.disabled && this.element.addClass('ui-draggable-disabled'));
-
- this.mouseInit();
-
- },
- mouseStart: function(e) {
- var o = this.options;
-
- if (this.helper || o.disabled || $(e.target).is('.ui-resizable-handle')) return false;
-
- var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
-
-
- $(this.options.handle, this.element).find("*").andSelf().each(function() {
- if(this == e.target) handle = true;
- });
- if (!handle) return false;
-
- if($.ui.ddmanager) $.ui.ddmanager.current = this;
-
- //Create and append the visible helper
- this.helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [e])) : (o.helper == 'clone' ? this.element.clone() : this.element);
- if(!this.helper.parents('body').length) this.helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
- if(this.helper[0] != this.element[0] && !(/(fixed|absolute)/).test(this.helper.css("position"))) this.helper.css("position", "absolute");
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- this.margins = { //Cache the margins
- left: (parseInt(this.element.css("marginLeft"),10) || 0),
- top: (parseInt(this.element.css("marginTop"),10) || 0)
- };
-
- this.cssPosition = this.helper.css("position"); //Store the helper's css position
- this.offset = this.element.offset(); //The element's absolute position on the page
- this.offset = { //Substract the margins from the element's absolute offset
- top: this.offset.top - this.margins.top,
- left: this.offset.left - this.margins.left
- };
-
- this.offset.click = { //Where the click happened, relative to the element
- left: e.pageX - this.offset.left,
- top: e.pageY - this.offset.top
- };
-
- this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); //Get the offsetParent and cache its position
- if(this.offsetParent[0] == document.body && $.browser.mozilla) po = { top: 0, left: 0 }; //Ugly FF3 fix
- this.offset.parent = { //Store its position plus border
- top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
- left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
- };
-
- var p = this.element.position(); //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helpers
- this.offset.relative = this.cssPosition == "relative" ? {
- top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.offsetParent[0].scrollTop,
- left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.offsetParent[0].scrollLeft
- } : { top: 0, left: 0 };
-
- this.originalPosition = this.generatePosition(e); //Generate the original position
- this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size
-
- if(o.cursorAt) {
- if(o.cursorAt.left != undefined) this.offset.click.left = o.cursorAt.left + this.margins.left;
- if(o.cursorAt.right != undefined) this.offset.click.left = this.helperProportions.width - o.cursorAt.right + this.margins.left;
- if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top + this.margins.top;
- if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom + this.margins.top;
- }
-
-
- /*
- * - Position constraining -
- * Here we prepare position constraining like grid and containment.
- */
-
- if(o.containment) {
- if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
- if(o.containment == 'document' || o.containment == 'window') this.containment = [
- 0 - this.offset.relative.left - this.offset.parent.left,
- 0 - this.offset.relative.top - this.offset.parent.top,
- $(o.containment == 'document' ? document : window).width() - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0),
- ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0)
- ];
-
- if(!(/^(document|window|parent)$/).test(o.containment)) {
- var ce = $(o.containment)[0];
- var co = $(o.containment).offset();
-
- this.containment = [
- co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left,
- co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top,
- co.left+Math.max(ce.scrollWidth,ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.relative.left - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0),
- co.top+Math.max(ce.scrollHeight,ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.relative.top - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0)
- ];
- }
- }
-
- //Call plugins and callbacks
- this.propagate("start", e);
-
- this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Recache the helper size
- if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e);
-
- this.helper.addClass("ui-draggable-dragging");
- this.mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position
- return true;
- },
- convertPositionTo: function(d, pos) {
- if(!pos) pos = this.position;
- var mod = d == "absolute" ? 1 : -1;
- return {
- top: (
- pos.top // the calculated relative position
- + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
- + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
- - (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollTop) * mod // The offsetParent's scroll position, not if the element is fixed
- + (this.cssPosition == "fixed" ? $(document).scrollTop() : 0) * mod
- + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods)
- ),
- left: (
- pos.left // the calculated relative position
- + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
- + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
- - (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollLeft) * mod // The offsetParent's scroll position, not if the element is fixed
- + (this.cssPosition == "fixed" ? $(document).scrollLeft() : 0) * mod
- + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods)
- )
- };
- },
- generatePosition: function(e) {
-
- var o = this.options;
- var position = {
- top: (
- e.pageY // The absolute mouse position
- - this.offset.click.top // Click offset (relative to the element)
- - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
- - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
- + (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollTop) // The offsetParent's scroll position, not if the element is fixed
- - (this.cssPosition == "fixed" ? $(document).scrollTop() : 0)
- ),
- left: (
- e.pageX // The absolute mouse position
- - this.offset.click.left // Click offset (relative to the element)
- - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
- - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
- + (this.cssPosition == "fixed" || (this.cssPosition == "absolute" && this.offsetParent[0] == document.body) ? 0 : this.offsetParent[0].scrollLeft) // The offsetParent's scroll position, not if the element is fixed
- - (this.cssPosition == "fixed" ? $(document).scrollLeft() : 0)
- )
- };
-
- if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
- if(this.containment) {
- if(position.left < this.containment[0]) position.left = this.containment[0];
- if(position.top < this.containment[1]) position.top = this.containment[1];
- if(position.left > this.containment[2]) position.left = this.containment[2];
- if(position.top > this.containment[3]) position.top = this.containment[3];
- }
-
- if(o.grid) {
- var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1];
- position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
- var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0];
- position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
- }
-
- return position;
- },
- mouseDrag: function(e) {
-
- //Compute the helpers position
- this.position = this.generatePosition(e);
- this.positionAbs = this.convertPositionTo("absolute");
-
- //Call plugins and callbacks and use the resulting position if something is returned
- this.position = this.propagate("drag", e) || this.position;
-
- if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
- if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
- if($.ui.ddmanager) $.ui.ddmanager.drag(this, e);
-
- return false;
- },
- mouseStop: function(e) {
-
- //If we are using droppables, inform the manager about the drop
- if ($.ui.ddmanager && !this.options.dropBehaviour)
- $.ui.ddmanager.drop(this, e);
-
- if(this.options.revert) {
- var self = this;
- $(this.helper).animate(this.originalPosition, parseInt(this.options.revert, 10) || 500, function() {
- self.propagate("stop", e);
- self.clear();
- });
- } else {
- this.propagate("stop", e);
- this.clear();
- }
-
- return false;
- },
- clear: function() {
- this.helper.removeClass("ui-draggable-dragging");
- if(this.options.helper != 'original' && !this.cancelHelperRemoval) this.helper.remove();
- //if($.ui.ddmanager) $.ui.ddmanager.current = null;
- this.helper = null;
- this.cancelHelperRemoval = false;
- },
-
- // From now on bulk stuff - mainly helpers
- plugins: {},
- uiHash: function(e) {
- return {
- helper: this.helper,
- position: this.position,
- absolutePosition: this.positionAbs,
- options: this.options
- };
- },
- propagate: function(n,e) {
- $.ui.plugin.call(this, n, [e, this.uiHash()]);
- return this.element.triggerHandler(n == "drag" ? n : "drag"+n, [e, this.uiHash()], this.options[n]);
- },
- destroy: function() {
- if(!this.element.data('draggable')) return;
- this.element.removeData("draggable").unbind(".draggable").removeClass('ui-draggable');
- this.mouseDestroy();
- }
-}));
-
-$.extend($.ui.draggable, {
- defaults: {
- appendTo: "parent",
- axis: false,
- cancel: ":input",
- delay: 0,
- distance: 1,
- helper: "original"
- }
-});
-
-$.ui.plugin.add("draggable", "cursor", {
- start: function(e, ui) {
- var t = $('body');
- if (t.css("cursor")) ui.options._cursor = t.css("cursor");
- t.css("cursor", ui.options.cursor);
- },
- stop: function(e, ui) {
- if (ui.options._cursor) $('body').css("cursor", ui.options._cursor);
- }
-});
-
-$.ui.plugin.add("draggable", "zIndex", {
- start: function(e, ui) {
- var t = $(ui.helper);
- if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex");
- t.css('zIndex', ui.options.zIndex);
- },
- stop: function(e, ui) {
- if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex);
- }
-});
-
-$.ui.plugin.add("draggable", "opacity", {
- start: function(e, ui) {
- var t = $(ui.helper);
- if(t.css("opacity")) ui.options._opacity = t.css("opacity");
- t.css('opacity', ui.options.opacity);
- },
- stop: function(e, ui) {
- if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity);
- }
-});
-
-$.ui.plugin.add("draggable", "iframeFix", {
- start: function(e, ui) {
- $(ui.options.iframeFix === true ? "iframe" : ui.options.iframeFix).each(function() {
- $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
- .css({
- width: this.offsetWidth+"px", height: this.offsetHeight+"px",
- position: "absolute", opacity: "0.001", zIndex: 1000
- })
- .css($(this).offset())
- .appendTo("body");
- });
- },
- stop: function(e, ui) {
- $("div.DragDropIframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
- }
-});
-
-$.ui.plugin.add("draggable", "scroll", {
- start: function(e, ui) {
- var o = ui.options;
- var i = $(this).data("draggable");
- o.scrollSensitivity = o.scrollSensitivity || 20;
- o.scrollSpeed = o.scrollSpeed || 20;
-
- i.overflowY = function(el) {
- do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode);
- return $(document);
- }(this);
- i.overflowX = function(el) {
- do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode);
- return $(document);
- }(this);
-
- if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') i.overflowYOffset = i.overflowY.offset();
- if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') i.overflowXOffset = i.overflowX.offset();
-
- },
- drag: function(e, ui) {
-
- var o = ui.options;
- var i = $(this).data("draggable");
-
- if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') {
- if((i.overflowYOffset.top + i.overflowY[0].offsetHeight) - e.pageY < o.scrollSensitivity)
- i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed;
- if(e.pageY - i.overflowYOffset.top < o.scrollSensitivity)
- i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed;
-
- } else {
- if(e.pageY - $(document).scrollTop() < o.scrollSensitivity)
- $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
- if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity)
- $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
- }
-
- if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') {
- if((i.overflowXOffset.left + i.overflowX[0].offsetWidth) - e.pageX < o.scrollSensitivity)
- i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed;
- if(e.pageX - i.overflowXOffset.left < o.scrollSensitivity)
- i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed;
- } else {
- if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity)
- $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
- if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
- $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
- }
-
- }
-});
-
-$.ui.plugin.add("draggable", "snap", {
- start: function(e, ui) {
-
- var inst = $(this).data("draggable");
- inst.snapElements = [];
- $(ui.options.snap === true ? '.ui-draggable' : ui.options.snap).each(function() {
- var $t = $(this); var $o = $t.offset();
- if(this != inst.element[0]) inst.snapElements.push({
- item: this,
- width: $t.outerWidth(), height: $t.outerHeight(),
- top: $o.top, left: $o.left
- });
- });
-
- },
- drag: function(e, ui) {
-
- var inst = $(this).data("draggable");
- var d = ui.options.snapTolerance || 20;
- var x1 = ui.absolutePosition.left, x2 = x1 + inst.helperProportions.width,
- y1 = ui.absolutePosition.top, y2 = y1 + inst.helperProportions.height;
-
- for (var i = inst.snapElements.length - 1; i >= 0; i--){
-
- var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
- t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
-
- //Yes, I know, this is insane ;)
- if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) continue;
-
- if(ui.options.snapMode != 'inner') {
- var ts = Math.abs(t - y2) <= 20;
- var bs = Math.abs(b - y1) <= 20;
- var ls = Math.abs(l - x2) <= 20;
- var rs = Math.abs(r - x1) <= 20;
- if(ts) ui.position.top = inst.convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
- if(bs) ui.position.top = inst.convertPositionTo("relative", { top: b, left: 0 }).top;
- if(ls) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
- if(rs) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: r }).left;
- }
-
- if(ui.options.snapMode != 'outer') {
- var ts = Math.abs(t - y1) <= 20;
- var bs = Math.abs(b - y2) <= 20;
- var ls = Math.abs(l - x1) <= 20;
- var rs = Math.abs(r - x2) <= 20;
- if(ts) ui.position.top = inst.convertPositionTo("relative", { top: t, left: 0 }).top;
- if(bs) ui.position.top = inst.convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
- if(ls) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: l }).left;
- if(rs) ui.position.left = inst.convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
- }
-
- };
- }
-});
-
-$.ui.plugin.add("draggable", "connectToSortable", {
- start: function(e,ui) {
-
- var inst = $(this).data("draggable");
- inst.sortables = [];
- $(ui.options.connectToSortable).each(function() {
- if($.data(this, 'sortable')) {
- var sortable = $.data(this, 'sortable');
- inst.sortables.push({
- instance: sortable,
- shouldRevert: sortable.options.revert
- });
- sortable.refreshItems(); //Do a one-time refresh at start to refresh the containerCache
- sortable.propagate("activate", e, inst);
- }
- });
-
- },
- stop: function(e,ui) {
-
- //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
- var inst = $(this).data("draggable");
-
- $.each(inst.sortables, function() {
- if(this.instance.isOver) {
- this.instance.isOver = 0;
- inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
- this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
- if(this.shouldRevert) this.instance.options.revert = true; //revert here
- this.instance.mouseStop(e);
-
- //Also propagate receive event, since the sortable is actually receiving a element
- this.instance.element.triggerHandler("sortreceive", [e, $.extend(this.instance.ui(), { sender: inst.element })], this.instance.options["receive"]);
-
- this.instance.options.helper = this.instance.options._helper;
- } else {
- this.instance.propagate("deactivate", e, inst);
- }
-
- });
-
- },
- drag: function(e,ui) {
-
- var inst = $(this).data("draggable"), self = this;
-
- var checkPos = function(o) {
-
- var l = o.left, r = l + o.width,
- t = o.top, b = t + o.height;
-
- return (l < (this.positionAbs.left + this.offset.click.left) && (this.positionAbs.left + this.offset.click.left) < r
- && t < (this.positionAbs.top + this.offset.click.top) && (this.positionAbs.top + this.offset.click.top) < b);
- };
-
- $.each(inst.sortables, function(i) {
-
- if(checkPos.call(inst, this.instance.containerCache)) {
-
- //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
- if(!this.instance.isOver) {
- this.instance.isOver = 1;
-
- //Now we fake the start of dragging for the sortable instance,
- //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
- //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
- this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
- this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
- this.instance.options.helper = function() { return ui.helper[0]; };
-
- e.target = this.instance.currentItem[0];
- this.instance.mouseCapture(e, true);
- this.instance.mouseStart(e, true, true);
-
- //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
- this.instance.offset.click.top = inst.offset.click.top;
- this.instance.offset.click.left = inst.offset.click.left;
- this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
- this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
-
- inst.propagate("toSortable", e);
-
- }
-
- //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
- if(this.instance.currentItem) this.instance.mouseDrag(e);
-
- } else {
-
- //If it doesn't intersect with the sortable, and it intersected before,
- //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
- if(this.instance.isOver) {
- this.instance.isOver = 0;
- this.instance.cancelHelperRemoval = true;
- this.instance.options.revert = false; //No revert here
- this.instance.mouseStop(e, true);
- this.instance.options.helper = this.instance.options._helper;
-
- //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
- this.instance.currentItem.remove();
- if(this.instance.placeholder) this.instance.placeholder.remove();
-
- inst.propagate("fromSortable", e);
- }
-
- };
-
- });
-
- }
-});
-
-$.ui.plugin.add("draggable", "stack", {
- start: function(e,ui) {
- var group = $.makeArray($(ui.options.stack.group)).sort(function(a,b) {
- return (parseInt($(a).css("zIndex"),10) || ui.options.stack.min) - (parseInt($(b).css("zIndex"),10) || ui.options.stack.min);
- });
-
- $(group).each(function(i) {
- this.style.zIndex = ui.options.stack.min + i;
- });
-
- this[0].style.zIndex = ui.options.stack.min + group.length;
- }
-});
-
-})(jQuery);
-/*
- * jQuery UI Droppable
- *
- * Copyright (c) 2008 Paul Bakaus
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Droppables
- *
- * Depends:
- * ui.core.js
- * ui.draggable.js
- */
-(function($) {
-
-$.widget("ui.droppable", {
- init: function() {
-
- this.element.addClass("ui-droppable");
- this.isover = 0; this.isout = 1;
-
- //Prepare the passed options
- var o = this.options, accept = o.accept;
- o = $.extend(o, {
- accept: o.accept && o.accept.constructor == Function ? o.accept : function(d) {
- return $(d).is(accept);
- }
- });
-
- //Store the droppable's proportions
- this.proportions = { width: this.element.outerWidth(), height: this.element.outerHeight() };
-
- // Add the reference and positions to the manager
- $.ui.ddmanager.droppables.push(this);
-
- },
- plugins: {},
- ui: function(c) {
- return {
- draggable: (c.currentItem || c.element),
- helper: c.helper,
- position: c.position,
- absolutePosition: c.positionAbs,
- options: this.options,
- element: this.element
- };
- },
- destroy: function() {
- var drop = $.ui.ddmanager.droppables;
- for ( var i = 0; i < drop.length; i++ )
- if ( drop[i] == this )
- drop.splice(i, 1);
-
- this.element
- .removeClass("ui-droppable ui-droppable-disabled")
- .removeData("droppable")
- .unbind(".droppable");
- },
- over: function(e) {
-
- var draggable = $.ui.ddmanager.current;
- if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
- if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
- $.ui.plugin.call(this, 'over', [e, this.ui(draggable)]);
- this.element.triggerHandler("dropover", [e, this.ui(draggable)], this.options.over);
- }
-
- },
- out: function(e) {
-
- var draggable = $.ui.ddmanager.current;
- if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
- if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
- $.ui.plugin.call(this, 'out', [e, this.ui(draggable)]);
- this.element.triggerHandler("dropout", [e, this.ui(draggable)], this.options.out);
- }
-
- },
- drop: function(e,custom) {
-
- var draggable = custom || $.ui.ddmanager.current;
- if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
-
- var childrenIntersection = false;
- this.element.find(".ui-droppable").not(".ui-draggable-dragging").each(function() {
- var inst = $.data(this, 'droppable');
- if(inst.options.greedy && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)) {
- childrenIntersection = true; return false;
- }
- });
- if(childrenIntersection) return false;
-
- if(this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
- $.ui.plugin.call(this, 'drop', [e, this.ui(draggable)]);
- this.element.triggerHandler("drop", [e, this.ui(draggable)], this.options.drop);
- return true;
- }
-
- return false;
-
- },
- activate: function(e) {
-
- var draggable = $.ui.ddmanager.current;
- $.ui.plugin.call(this, 'activate', [e, this.ui(draggable)]);
- if(draggable) this.element.triggerHandler("dropactivate", [e, this.ui(draggable)], this.options.activate);
-
- },
- deactivate: function(e) {
-
- var draggable = $.ui.ddmanager.current;
- $.ui.plugin.call(this, 'deactivate', [e, this.ui(draggable)]);
- if(draggable) this.element.triggerHandler("dropdeactivate", [e, this.ui(draggable)], this.options.deactivate);
-
- }
-});
-
-$.extend($.ui.droppable, {
- defaults: {
- disabled: false,
- tolerance: 'intersect'
- }
-});
-
-$.ui.intersect = function(draggable, droppable, toleranceMode) {
-
- if (!droppable.offset) return false;
-
- var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
- y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
- var l = droppable.offset.left, r = l + droppable.proportions.width,
- t = droppable.offset.top, b = t + droppable.proportions.height;
-
- switch (toleranceMode) {
- case 'fit':
- return (l < x1 && x2 < r
- && t < y1 && y2 < b);
- break;
- case 'intersect':
- return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
- && x2 - (draggable.helperProportions.width / 2) < r // Left Half
- && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
- && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
- break;
- case 'pointer':
- return (l < ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left) && ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left) < r
- && t < ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top) && ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top) < b);
- break;
- case 'touch':
- return (
- (y1 >= t && y1 <= b) || // Top edge touching
- (y2 >= t && y2 <= b) || // Bottom edge touching
- (y1 < t && y2 > b) // Surrounded vertically
- ) && (
- (x1 >= l && x1 <= r) || // Left edge touching
- (x2 >= l && x2 <= r) || // Right edge touching
- (x1 < l && x2 > r) // Surrounded horizontally
- );
- break;
- default:
- return false;
- break;
- }
-
-};
-
-/*
- This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
- current: null,
- droppables: [],
- prepareOffsets: function(t, e) {
-
- var m = $.ui.ddmanager.droppables;
- var type = e ? e.type : null; // workaround for #2317
- for (var i = 0; i < m.length; i++) {
-
- if(m[i].options.disabled || (t && !m[i].options.accept.call(m[i].element,(t.currentItem || t.element)))) continue;
- m[i].visible = m[i].element.is(":visible"); if(!m[i].visible) continue; //If the element is not visible, continue
- m[i].offset = m[i].element.offset();
- m[i].proportions = { width: m[i].element.outerWidth(), height: m[i].element.outerHeight() };
-
- if(type == "dragstart" || type == "sortactivate") m[i].activate.call(m[i], e); //Activate the droppable if used directly from draggables
- }
-
- },
- drop: function(draggable, e) {
-
- var dropped = false;
- $.each($.ui.ddmanager.droppables, function() {
-
- if(!this.options) return;
- if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
- dropped = this.drop.call(this, e);
-
- if (!this.options.disabled && this.visible && this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
- this.isout = 1; this.isover = 0;
- this.deactivate.call(this, e);
- }
-
- });
- return dropped;
-
- },
- drag: function(draggable, e) {
-
- //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
- if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, e);
-
- //Run through all droppables and check their positions based on specific tolerance options
- $.each($.ui.ddmanager.droppables, function() {
-
- if(this.options.disabled || this.greedyChild || !this.visible) return;
- var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
-
- var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
- if(!c) return;
-
- var parentInstance;
- if (this.options.greedy) {
- var parent = this.element.parents('.ui-droppable:eq(0)');
- if (parent.length) {
- parentInstance = $.data(parent[0], 'droppable');
- parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
- }
- }
-
- // we just moved into a greedy child
- if (parentInstance && c == 'isover') {
- parentInstance['isover'] = 0;
- parentInstance['isout'] = 1;
- parentInstance.out.call(parentInstance, e);
- }
-
- this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
- this[c == "isover" ? "over" : "out"].call(this, e);
-
- // we just moved out of a greedy child
- if (parentInstance && c == 'isout') {
- parentInstance['isout'] = 0;
- parentInstance['isover'] = 1;
- parentInstance.over.call(parentInstance, e);
- }
- });
-
- }
-};
-
-/*
- * Droppable Extensions
- */
-
-$.ui.plugin.add("droppable", "activeClass", {
- activate: function(e, ui) {
- $(this).addClass(ui.options.activeClass);
- },
- deactivate: function(e, ui) {
- $(this).removeClass(ui.options.activeClass);
- },
- drop: function(e, ui) {
- $(this).removeClass(ui.options.activeClass);
- }
-});
-
-$.ui.plugin.add("droppable", "hoverClass", {
- over: function(e, ui) {
- $(this).addClass(ui.options.hoverClass);
- },
- out: function(e, ui) {
- $(this).removeClass(ui.options.hoverClass);
- },
- drop: function(e, ui) {
- $(this).removeClass(ui.options.hoverClass);
- }
-});
-
-})(jQuery);
-/*
- * jQuery UI Resizable
- *
- * Copyright (c) 2008 Paul Bakaus
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Resizables
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-$.widget("ui.resizable", $.extend($.ui.mouse, {
- init: function() {
-
- var self = this, o = this.options;
-
- var elpos = this.element.css('position');
-
- this.originalElement = this.element;
-
- // simulate .ui-resizable { position: relative; }
- this.element.addClass("ui-resizable").css({ position: /static/.test(elpos) ? 'relative' : elpos });
-
- $.extend(o, {
- _aspectRatio: !!(o.aspectRatio),
- helper: o.helper || o.ghost || o.animate ? o.helper || 'proxy' : null,
- knobHandles: o.knobHandles === true ? 'ui-resizable-knob-handle' : o.knobHandles
- });
-
- //Default Theme
- var aBorder = '1px solid #DEDEDE';
-
- o.defaultTheme = {
- 'ui-resizable': { display: 'block' },
- 'ui-resizable-handle': { position: 'absolute', background: '#F2F2F2', fontSize: '0.1px' },
- 'ui-resizable-n': { cursor: 'n-resize', height: '4px', left: '0px', right: '0px', borderTop: aBorder },
- 'ui-resizable-s': { cursor: 's-resize', height: '4px', left: '0px', right: '0px', borderBottom: aBorder },
- 'ui-resizable-e': { cursor: 'e-resize', width: '4px', top: '0px', bottom: '0px', borderRight: aBorder },
- 'ui-resizable-w': { cursor: 'w-resize', width: '4px', top: '0px', bottom: '0px', borderLeft: aBorder },
- 'ui-resizable-se': { cursor: 'se-resize', width: '4px', height: '4px', borderRight: aBorder, borderBottom: aBorder },
- 'ui-resizable-sw': { cursor: 'sw-resize', width: '4px', height: '4px', borderBottom: aBorder, borderLeft: aBorder },
- 'ui-resizable-ne': { cursor: 'ne-resize', width: '4px', height: '4px', borderRight: aBorder, borderTop: aBorder },
- 'ui-resizable-nw': { cursor: 'nw-resize', width: '4px', height: '4px', borderLeft: aBorder, borderTop: aBorder }
- };
-
- o.knobTheme = {
- 'ui-resizable-handle': { background: '#F2F2F2', border: '1px solid #808080', height: '8px', width: '8px' },
- 'ui-resizable-n': { cursor: 'n-resize', top: '0px', left: '45%' },
- 'ui-resizable-s': { cursor: 's-resize', bottom: '0px', left: '45%' },
- 'ui-resizable-e': { cursor: 'e-resize', right: '0px', top: '45%' },
- 'ui-resizable-w': { cursor: 'w-resize', left: '0px', top: '45%' },
- 'ui-resizable-se': { cursor: 'se-resize', right: '0px', bottom: '0px' },
- 'ui-resizable-sw': { cursor: 'sw-resize', left: '0px', bottom: '0px' },
- 'ui-resizable-nw': { cursor: 'nw-resize', left: '0px', top: '0px' },
- 'ui-resizable-ne': { cursor: 'ne-resize', right: '0px', top: '0px' }
- };
-
- o._nodeName = this.element[0].nodeName;
-
- //Wrap the element if it cannot hold child nodes
- if(o._nodeName.match(/canvas|textarea|input|select|button|img/i)) {
- var el = this.element;
-
- //Opera fixing relative position
- if (/relative/.test(el.css('position')) && $.browser.opera)
- el.css({ position: 'relative', top: 'auto', left: 'auto' });
-
- //Create a wrapper element and set the wrapper to the new current internal element
- el.wrap(
- $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css( {
- position: el.css('position'),
- width: el.outerWidth(),
- height: el.outerHeight(),
- top: el.css('top'),
- left: el.css('left')
- })
- );
-
- var oel = this.element; this.element = this.element.parent();
-
- // store instance on wrapper
- this.element.data('resizable', this);
-
- //Move margins to the wrapper
- this.element.css({ marginLeft: oel.css("marginLeft"), marginTop: oel.css("marginTop"),
- marginRight: oel.css("marginRight"), marginBottom: oel.css("marginBottom")
- });
-
- oel.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
-
- //Prevent Safari textarea resize
- if ($.browser.safari && o.preventDefault) oel.css('resize', 'none');
-
- o.proportionallyResize = oel.css({ position: 'static', zoom: 1, display: 'block' });
-
- // avoid IE jump
- this.element.css({ margin: oel.css('margin') });
-
- // fix handlers offset
- this._proportionallyResize();
- }
-
- if(!o.handles) o.handles = !$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' };
- if(o.handles.constructor == String) {
-
- o.zIndex = o.zIndex || 1000;
-
- if(o.handles == 'all') o.handles = 'n,e,s,w,se,sw,ne,nw';
-
- var n = o.handles.split(","); o.handles = {};
-
- // insertions are applied when don't have theme loaded
- var insertionsDefault = {
- handle: 'position: absolute; display: none; overflow:hidden;',
- n: 'top: 0pt; width:100%;',
- e: 'right: 0pt; height:100%;',
- s: 'bottom: 0pt; width:100%;',
- w: 'left: 0pt; height:100%;',
- se: 'bottom: 0pt; right: 0px;',
- sw: 'bottom: 0pt; left: 0px;',
- ne: 'top: 0pt; right: 0px;',
- nw: 'top: 0pt; left: 0px;'
- };
-
- for(var i = 0; i < n.length; i++) {
- var handle = $.trim(n[i]), dt = o.defaultTheme, hname = 'ui-resizable-'+handle, loadDefault = !$.ui.css(hname) && !o.knobHandles, userKnobClass = $.ui.css('ui-resizable-knob-handle'),
- allDefTheme = $.extend(dt[hname], dt['ui-resizable-handle']), allKnobTheme = $.extend(o.knobTheme[hname], !userKnobClass ? o.knobTheme['ui-resizable-handle'] : {});
-
- // increase zIndex of sw, se, ne, nw axis
- var applyZIndex = /sw|se|ne|nw/.test(handle) ? { zIndex: ++o.zIndex } : {};
-
- var defCss = (loadDefault ? insertionsDefault[handle] : ''),
- axis = $(['<div class="ui-resizable-handle ', hname, '" style="', defCss, insertionsDefault.handle, '"></div>'].join('')).css( applyZIndex );
- o.handles[handle] = '.ui-resizable-'+handle;
-
- this.element.append(
- //Theme detection, if not loaded, load o.defaultTheme
- axis.css( loadDefault ? allDefTheme : {} )
- // Load the knobHandle css, fix width, height, top, left...
- .css( o.knobHandles ? allKnobTheme : {} ).addClass(o.knobHandles ? 'ui-resizable-knob-handle' : '').addClass(o.knobHandles)
- );
- }
-
- if (o.knobHandles) this.element.addClass('ui-resizable-knob').css( !$.ui.css('ui-resizable-knob') ? { /*border: '1px #fff dashed'*/ } : {} );
- }
-
- this._renderAxis = function(target) {
- target = target || this.element;
-
- for(var i in o.handles) {
- if(o.handles[i].constructor == String)
- o.handles[i] = $(o.handles[i], this.element).show();
-
- if (o.transparent)
- o.handles[i].css({opacity:0});
-
- //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
- if (this.element.is('.ui-wrapper') &&
- o._nodeName.match(/textarea|input|select|button/i)) {
-
- var axis = $(o.handles[i], this.element), padWrapper = 0;
-
- //Checking the correct pad and border
- padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
-
- //The padding type i have to apply...
- var padPos = [ 'padding',
- /ne|nw|n/.test(i) ? 'Top' :
- /se|sw|s/.test(i) ? 'Bottom' :
- /^e$/.test(i) ? 'Right' : 'Left' ].join("");
-
- if (!o.transparent)
- target.css(padPos, padWrapper);
-
- this._proportionallyResize();
- }
- if(!$(o.handles[i]).length) continue;
- }
- };
-
- this._renderAxis(this.element);
- o._handles = $('.ui-resizable-handle', self.element);
-
- if (o.disableSelection)
- o._handles.each(function(i, e) { $.ui.disableSelection(e); });
-
- //Matching axis name
- o._handles.mouseover(function() {
- if (!o.resizing) {
- if (this.className)
- var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
- //Axis, default = se
- self.axis = o.axis = axis && axis[1] ? axis[1] : 'se';
- }
- });
-
- //If we want to auto hide the elements
- if (o.autoHide) {
- o._handles.hide();
- $(self.element).addClass("ui-resizable-autohide").hover(function() {
- $(this).removeClass("ui-resizable-autohide");
- o._handles.show();
- },
- function(){
- if (!o.resizing) {
- $(this).addClass("ui-resizable-autohide");
- o._handles.hide();
- }
- });
- }
-
- this.mouseInit();
- },
- plugins: {},
- ui: function() {
- return {
- originalElement: this.originalElement,
- element: this.element,
- helper: this.helper,
- position: this.position,
- size: this.size,
- options: this.options,
- originalSize: this.originalSize,
- originalPosition: this.originalPosition
- };
- },
- propagate: function(n,e) {
- $.ui.plugin.call(this, n, [e, this.ui()]);
- if (n != "resize") this.element.triggerHandler(["resize", n].join(""), [e, this.ui()], this.options[n]);
- },
- destroy: function() {
- var el = this.element, wrapped = el.children(".ui-resizable").get(0);
-
- this.mouseDestroy();
-
- var _destroy = function(exp) {
- $(exp).removeClass("ui-resizable ui-resizable-disabled")
- .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
- };
-
- _destroy(el);
-
- if (el.is('.ui-wrapper') && wrapped) {
- el.parent().append(
- $(wrapped).css({
- position: el.css('position'),
- width: el.outerWidth(),
- height: el.outerHeight(),
- top: el.css('top'),
- left: el.css('left')
- })
- ).end().remove();
-
- _destroy(wrapped);
- }
- },
- mouseStart: function(e) {
- if(this.options.disabled) return false;
-
- var handle = false;
- for(var i in this.options.handles) {
- if($(this.options.handles[i])[0] == e.target) handle = true;
- }
- if (!handle) return false;
-
- var o = this.options, iniPos = this.element.position(), el = this.element,
- num = function(v) { return parseInt(v, 10) || 0; }, ie6 = $.browser.msie && $.browser.version < 7;
- o.resizing = true;
- o.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
-
- // bugfix #1749
- if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
-
- // sOffset decides if document scrollOffset will be added to the top/left of the resizable element
- var sOffset = $.browser.msie && !o.containment && (/absolute/).test(el.css('position')) && !(/relative/).test(el.parent().css('position'));
- var dscrollt = sOffset ? o.documentScroll.top : 0, dscrolll = sOffset ? o.documentScroll.left : 0;
-
- el.css({ position: 'absolute', top: (iniPos.top + dscrollt), left: (iniPos.left + dscrolll) });
- }
-
- //Opera fixing relative position
- if ($.browser.opera && /relative/.test(el.css('position')))
- el.css({ position: 'relative', top: 'auto', left: 'auto' });
-
- this._renderProxy();
-
- var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
-
- //Store needed variables
- this.offset = this.helper.offset();
- this.position = { left: curleft, top: curtop };
- this.size = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
- this.originalSize = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
- this.originalPosition = { left: curleft, top: curtop };
- this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
- this.originalMousePosition = { left: e.pageX, top: e.pageY };
-
- //Aspect Ratio
- o.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.height / this.originalSize.width)||1);
-
- if (o.preserveCursor)
- $('body').css('cursor', this.axis + '-resize');
-
- this.propagate("start", e);
- return true;
- },
- mouseDrag: function(e) {
-
- //Increase performance, avoid regex
- var el = this.helper, o = this.options, props = {},
- self = this, smp = this.originalMousePosition, a = this.axis;
-
- var dx = (e.pageX-smp.left)||0, dy = (e.pageY-smp.top)||0;
- var trigger = this._change[a];
- if (!trigger) return false;
-
- // Calculate the attrs that will be change
- var data = trigger.apply(this, [e, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
-
- if (o._aspectRatio || e.shiftKey)
- data = this._updateRatio(data, e);
-
- data = this._respectSize(data, e);
-
- // plugins callbacks need to be called first
- this.propagate("resize", e);
-
- el.css({
- top: this.position.top + "px", left: this.position.left + "px",
- width: this.size.width + "px", height: this.size.height + "px"
- });
-
- if (!o.helper && o.proportionallyResize)
- this._proportionallyResize();
-
- this._updateCache(data);
-
- // calling the user callback at the end
- this.element.triggerHandler("resize", [e, this.ui()], this.options["resize"]);
-
- return false;
- },
- mouseStop: function(e) {
-
- this.options.resizing = false;
- var o = this.options, num = function(v) { return parseInt(v, 10) || 0; }, self = this;
-
- if(o.helper) {
- var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName),
- soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
- soffsetw = ista ? 0 : self.sizeDiff.width;
-
- var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
- left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
- top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
-
- if (!o.animate)
- this.element.css($.extend(s, { top: top, left: left }));
-
- if (o.helper && !o.animate) this._proportionallyResize();
- }
-
- if (o.preserveCursor)
- $('body').css('cursor', 'auto');
-
- this.propagate("stop", e);
-
- if (o.helper) this.helper.remove();
-
- return false;
- },
- _updateCache: function(data) {
- var o = this.options;
- this.offset = this.helper.offset();
- if (data.left) this.position.left = data.left;
- if (data.top) this.position.top = data.top;
- if (data.height) this.size.height = data.height;
- if (data.width) this.size.width = data.width;
- },
- _updateRatio: function(data, e) {
- var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
-
- if (data.height) data.width = (csize.height / o.aspectRatio);
- else if (data.width) data.height = (csize.width * o.aspectRatio);
-
- if (a == 'sw') {
- data.left = cpos.left + (csize.width - data.width);
- data.top = null;
- }
- if (a == 'nw') {
- data.top = cpos.top + (csize.height - data.height);
- data.left = cpos.left + (csize.width - data.width);
- }
-
- return data;
- },
- _respectSize: function(data, e) {
-
- var el = this.helper, o = this.options, pRatio = o._aspectRatio || e.shiftKey, a = this.axis,
- ismaxw = data.width && o.maxWidth && o.maxWidth < data.width, ismaxh = data.height && o.maxHeight && o.maxHeight < data.height,
- isminw = data.width && o.minWidth && o.minWidth > data.width, isminh = data.height && o.minHeight && o.minHeight > data.height;
-
- if (isminw) data.width = o.minWidth;
- if (isminh) data.height = o.minHeight;
- if (ismaxw) data.width = o.maxWidth;
- if (ismaxh) data.height = o.maxHeight;
-
- var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
- var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
-
- if (isminw && cw) data.left = dw - o.minWidth;
- if (ismaxw && cw) data.left = dw - o.maxWidth;
- if (isminh && ch) data.top = dh - o.minHeight;
- if (ismaxh && ch) data.top = dh - o.maxHeight;
-
- // fixing jump error on top/left - bug #2330
- var isNotwh = !data.width && !data.height;
- if (isNotwh && !data.left && data.top) data.top = null;
- else if (isNotwh && !data.top && data.left) data.left = null;
-
- return data;
- },
- _proportionallyResize: function() {
- var o = this.options;
- if (!o.proportionallyResize) return;
- var prel = o.proportionallyResize, el = this.helper || this.element;
-
- if (!o.borderDif) {
- var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
- p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
-
- o.borderDif = $.map(b, function(v, i) {
- var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
- return border + padding;
- });
- }
- prel.css({
- height: (el.height() - o.borderDif[0] - o.borderDif[2]) + "px",
- width: (el.width() - o.borderDif[1] - o.borderDif[3]) + "px"
- });
- },
- _renderProxy: function() {
- var el = this.element, o = this.options;
- this.elementOffset = el.offset();
-
- if(o.helper) {
- this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
-
- // fix ie6 offset
- var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
- pxyoffset = ( ie6 ? 2 : -1 );
-
- this.helper.addClass(o.helper).css({
- width: el.outerWidth() + pxyoffset,
- height: el.outerHeight() + pxyoffset,
- position: 'absolute',
- left: this.elementOffset.left - ie6offset +'px',
- top: this.elementOffset.top - ie6offset +'px',
- zIndex: ++o.zIndex
- });
-
- this.helper.appendTo("body");
-
- if (o.disableSelection)
- $.ui.disableSelection(this.helper.get(0));
-
- } else {
- this.helper = el;
- }
- },
- _change: {
- e: function(e, dx, dy) {
- return { width: this.originalSize.width + dx };
- },
- w: function(e, dx, dy) {
- var o = this.options, cs = this.originalSize, sp = this.originalPosition;
- return { left: sp.left + dx, width: cs.width - dx };
- },
- n: function(e, dx, dy) {
- var o = this.options, cs = this.originalSize, sp = this.originalPosition;
- return { top: sp.top + dy, height: cs.height - dy };
- },
- s: function(e, dx, dy) {
- return { height: this.originalSize.height + dy };
- },
- se: function(e, dx, dy) {
- return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [e, dx, dy]));
- },
- sw: function(e, dx, dy) {
- return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [e, dx, dy]));
- },
- ne: function(e, dx, dy) {
- return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [e, dx, dy]));
- },
- nw: function(e, dx, dy) {
- return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [e, dx, dy]));
- }
- }
-}));
-
-$.extend($.ui.resizable, {
- defaults: {
- cancel: ":input",
- distance: 1,
- delay: 0,
- preventDefault: true,
- transparent: false,
- minWidth: 10,
- minHeight: 10,
- aspectRatio: false,
- disableSelection: true,
- preserveCursor: true,
- autoHide: false,
- knobHandles: false
- }
-});
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add("resizable", "containment", {
-
- start: function(e, ui) {
- var o = ui.options, self = $(this).data("resizable"), el = self.element;
- var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
- if (!ce) return;
-
- self.containerElement = $(ce);
-
- if (/document/.test(oc) || oc == document) {
- self.containerOffset = { left: 0, top: 0 };
- self.containerPosition = { left: 0, top: 0 };
-
- self.parentData = {
- element: $(document), left: 0, top: 0,
- width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
- };
- }
-
-
- // i'm a node, so compute top, left, right, bottom
- else{
- self.containerOffset = $(ce).offset();
- self.containerPosition = $(ce).position();
- self.containerSize = { height: $(ce).innerHeight(), width: $(ce).innerWidth() };
-
- var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width,
- width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
-
- self.parentData = {
- element: ce, left: co.left, top: co.top, width: width, height: height
- };
- }
- },
-
- resize: function(e, ui) {
- var o = ui.options, self = $(this).data("resizable"),
- ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
- pRatio = o._aspectRatio || e.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
-
- if (ce[0] != document && /static/.test(ce.css('position')))
- cop = self.containerPosition;
-
- if (cp.left < (o.helper ? co.left : cop.left)) {
- self.size.width = self.size.width + (o.helper ? (self.position.left - co.left) : (self.position.left - cop.left));
- if (pRatio) self.size.height = self.size.width * o.aspectRatio;
- self.position.left = o.helper ? co.left : cop.left;
- }
-
- if (cp.top < (o.helper ? co.top : 0)) {
- self.size.height = self.size.height + (o.helper ? (self.position.top - co.top) : self.position.top);
- if (pRatio) self.size.width = self.size.height / o.aspectRatio;
- self.position.top = o.helper ? co.top : 0;
- }
-
- var woset = (o.helper ? self.offset.left - co.left : (self.position.left - cop.left)) + self.sizeDiff.width,
- hoset = (o.helper ? self.offset.top - co.top : self.position.top) + self.sizeDiff.height;
-
- if (woset + self.size.width >= self.parentData.width) {
- self.size.width = self.parentData.width - woset;
- if (pRatio) self.size.height = self.size.width * o.aspectRatio;
- }
-
- if (hoset + self.size.height >= self.parentData.height) {
- self.size.height = self.parentData.height - hoset;
- if (pRatio) self.size.width = self.size.height / o.aspectRatio;
- }
- },
-
- stop: function(e, ui){
- var o = ui.options, self = $(this).data("resizable"), cp = self.position,
- co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
-
- var helper = $(self.helper), ho = helper.offset(), w = helper.innerWidth(), h = helper.innerHeight();
-
-
- if (o.helper && !o.animate && /relative/.test(ce.css('position')))
- $(this).css({ left: (ho.left - co.left), top: (ho.top - co.top), width: w, height: h });
-
- if (o.helper && !o.animate && /static/.test(ce.css('position')))
- $(this).css({ left: cop.left + (ho.left - co.left), top: cop.top + (ho.top - co.top), width: w, height: h });
-
- }
-});
-
-$.ui.plugin.add("resizable", "grid", {
-
- resize: function(e, ui) {
- var o = ui.options, self = $(this).data("resizable"), cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || e.shiftKey;
- o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
- var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
-
- if (/^(se|s|e)$/.test(a)) {
- self.size.width = os.width + ox;
- self.size.height = os.height + oy;
- }
- else if (/^(ne)$/.test(a)) {
- self.size.width = os.width + ox;
- self.size.height = os.height + oy;
- self.position.top = op.top - oy;
- }
- else if (/^(sw)$/.test(a)) {
- self.size.width = os.width + ox;
- self.size.height = os.height + oy;
- self.position.left = op.left - ox;
- }
- else {
- self.size.width = os.width + ox;
- self.size.height = os.height + oy;
- self.position.top = op.top - oy;
- self.position.left = op.left - ox;
- }
- }
-
-});
-
-$.ui.plugin.add("resizable", "animate", {
-
- stop: function(e, ui) {
- var o = ui.options, self = $(this).data("resizable");
-
- var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName),
- soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
- soffsetw = ista ? 0 : self.sizeDiff.width;
-
- var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
- left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
- top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
-
- self.element.animate(
- $.extend(style, top && left ? { top: top, left: left } : {}), {
- duration: o.animateDuration || "slow", easing: o.animateEasing || "swing",
- step: function() {
-
- var data = {
- width: parseInt(self.element.css('width'), 10),
- height: parseInt(self.element.css('height'), 10),
- top: parseInt(self.element.css('top'), 10),
- left: parseInt(self.element.css('left'), 10)
- };
-
- if (pr) pr.css({ width: data.width, height: data.height });
-
- // propagating resize, and updating values for each animation step
- self._updateCache(data);
- self.propagate("animate", e);
-
- }
- }
- );
- }
-
-});
-
-$.ui.plugin.add("resizable", "ghost", {
-
- start: function(e, ui) {
- var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize, cs = self.size;
-
- if (!pr) self.ghost = self.element.clone();
- else self.ghost = pr.clone();
-
- self.ghost.css(
- { opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }
- )
- .addClass('ui-resizable-ghost').addClass(typeof o.ghost == 'string' ? o.ghost : '');
-
- self.ghost.appendTo(self.helper);
-
- },
-
- resize: function(e, ui){
- var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize;
-
- if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
-
- },
-
- stop: function(e, ui){
- var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize;
- if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
- }
-
-});
-
-$.ui.plugin.add("resizable", "alsoResize", {
-
- start: function(e, ui) {
- var o = ui.options, self = $(this).data("resizable"),
-
- _store = function(exp) {
- $(exp).each(function() {
- $(this).data("resizable-alsoresize", {
- width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),
- left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)
- });
- });
- };
-
- if (typeof(o.alsoResize) == 'object') {
- if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
- else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }
- }else{
- _store(o.alsoResize);
- }
- },
-
- resize: function(e, ui){
- var o = ui.options, self = $(this).data("resizable"), os = self.originalSize, op = self.originalPosition;
-
- var delta = {
- height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
- top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
- },
-
- _alsoResize = function(exp, c) {
- $(exp).each(function() {
- var start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];
-
- $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {
- var sum = (start[prop]||0) + (delta[prop]||0);
- if (sum && sum >= 0)
- style[prop] = sum || null;
- });
- $(this).css(style);
- });
- };
-
- if (typeof(o.alsoResize) == 'object') {
- $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });
- }else{
- _alsoResize(o.alsoResize);
- }
- },
-
- stop: function(e, ui){
- $(this).removeData("resizable-alsoresize-start");
- }
-});
-
-})(jQuery);
-/*
- * jQuery UI Selectable
- *
- * Copyright (c) 2008 Richard D. Worth (rdworth.org)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Selectables
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-$.widget("ui.selectable", $.extend($.ui.mouse, {
- init: function() {
- var self = this;
-
- this.element.addClass("ui-selectable");
-
- this.dragged = false;
-
- // cache selectee children based on filter
- var selectees;
- this.refresh = function() {
- selectees = $(self.options.filter, self.element[0]);
- selectees.each(function() {
- var $this = $(this);
- var pos = $this.offset();
- $.data(this, "selectable-item", {
- element: this,
- $element: $this,
- left: pos.left,
- top: pos.top,
- right: pos.left + $this.width(),
- bottom: pos.top + $this.height(),
- startselected: false,
- selected: $this.hasClass('ui-selected'),
- selecting: $this.hasClass('ui-selecting'),
- unselecting: $this.hasClass('ui-unselecting')
- });
- });
- };
- this.refresh();
-
- this.selectees = selectees.addClass("ui-selectee");
-
- this.mouseInit();
-
- this.helper = $(document.createElement('div')).css({border:'1px dotted black'});
- },
- toggle: function() {
- if(this.options.disabled){
- this.enable();
- } else {
- this.disable();
- }
- },
- destroy: function() {
- this.element
- .removeClass("ui-selectable ui-selectable-disabled")
- .removeData("selectable")
- .unbind(".selectable");
- this.mouseDestroy();
- },
- mouseStart: function(e) {
- var self = this;
-
- this.opos = [e.pageX, e.pageY];
-
- if (this.options.disabled)
- return;
-
- var options = this.options;
-
- this.selectees = $(options.filter, this.element[0]);
-
- // selectable START callback
- this.element.triggerHandler("selectablestart", [e, {
- "selectable": this.element[0],
- "options": options
- }], options.start);
-
- $('body').append(this.helper);
- // position helper (lasso)
- this.helper.css({
- "z-index": 100,
- "position": "absolute",
- "left": e.clientX,
- "top": e.clientY,
- "width": 0,
- "height": 0
- });
-
- if (options.autoRefresh) {
- this.refresh();
- }
-
- this.selectees.filter('.ui-selected').each(function() {
- var selectee = $.data(this, "selectable-item");
- selectee.startselected = true;
- if (!e.ctrlKey) {
- selectee.$element.removeClass('ui-selected');
- selectee.selected = false;
- selectee.$element.addClass('ui-unselecting');
- selectee.unselecting = true;
- // selectable UNSELECTING callback
- self.element.triggerHandler("selectableunselecting", [e, {
- selectable: self.element[0],
- unselecting: selectee.element,
- options: options
- }], options.unselecting);
- }
- });
-
- var isSelectee = false;
- $(e.target).parents().andSelf().each(function() {
- if($.data(this, "selectable-item")) isSelectee = true;
- });
- return this.options.keyboard ? !isSelectee : true;
- },
- mouseDrag: function(e) {
- var self = this;
- this.dragged = true;
-
- if (this.options.disabled)
- return;
-
- var options = this.options;
-
- var x1 = this.opos[0], y1 = this.opos[1], x2 = e.pageX, y2 = e.pageY;
- if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
- if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
- this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
-
- this.selectees.each(function() {
- var selectee = $.data(this, "selectable-item");
- //prevent helper from being selected if appendTo: selectable
- if (!selectee || selectee.element == self.element[0])
- return;
- var hit = false;
- if (options.tolerance == 'touch') {
- hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
- } else if (options.tolerance == 'fit') {
- hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
- }
-
- if (hit) {
- // SELECT
- if (selectee.selected) {
- selectee.$element.removeClass('ui-selected');
- selectee.selected = false;
- }
- if (selectee.unselecting) {
- selectee.$element.removeClass('ui-unselecting');
- selectee.unselecting = false;
- }
- if (!selectee.selecting) {
- selectee.$element.addClass('ui-selecting');
- selectee.selecting = true;
- // selectable SELECTING callback
- self.element.triggerHandler("selectableselecting", [e, {
- selectable: self.element[0],
- selecting: selectee.element,
- options: options
- }], options.selecting);
- }
- } else {
- // UNSELECT
- if (selectee.selecting) {
- if (e.ctrlKey && selectee.startselected) {
- selectee.$element.removeClass('ui-selecting');
- selectee.selecting = false;
- selectee.$element.addClass('ui-selected');
- selectee.selected = true;
- } else {
- selectee.$element.removeClass('ui-selecting');
- selectee.selecting = false;
- if (selectee.startselected) {
- selectee.$element.addClass('ui-unselecting');
- selectee.unselecting = true;
- }
- // selectable UNSELECTING callback
- self.element.triggerHandler("selectableunselecting", [e, {
- selectable: self.element[0],
- unselecting: selectee.element,
- options: options
- }], options.unselecting);
- }
- }
- if (selectee.selected) {
- if (!e.ctrlKey && !selectee.startselected) {
- selectee.$element.removeClass('ui-selected');
- selectee.selected = false;
-
- selectee.$element.addClass('ui-unselecting');
- selectee.unselecting = true;
- // selectable UNSELECTING callback
- self.element.triggerHandler("selectableunselecting", [e, {
- selectable: self.element[0],
- unselecting: selectee.element,
- options: options
- }], options.unselecting);
- }
- }
- }
- });
-
- return false;
- },
- mouseStop: function(e) {
- var self = this;
-
- this.dragged = false;
-
- var options = this.options;
-
- $('.ui-unselecting', this.element[0]).each(function() {
- var selectee = $.data(this, "selectable-item");
- selectee.$element.removeClass('ui-unselecting');
- selectee.unselecting = false;
- selectee.startselected = false;
- self.element.triggerHandler("selectableunselected", [e, {
- selectable: self.element[0],
- unselected: selectee.element,
- options: options
- }], options.unselected);
- });
- $('.ui-selecting', this.element[0]).each(function() {
- var selectee = $.data(this, "selectable-item");
- selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
- selectee.selecting = false;
- selectee.selected = true;
- selectee.startselected = true;
- self.element.triggerHandler("selectableselected", [e, {
- selectable: self.element[0],
- selected: selectee.element,
- options: options
- }], options.selected);
- });
- this.element.triggerHandler("selectablestop", [e, {
- selectable: self.element[0],
- options: this.options
- }], this.options.stop);
-
- this.helper.remove();
-
- return false;
- }
-}));
-
-$.extend($.ui.selectable, {
- defaults: {
- distance: 1,
- delay: 0,
- cancel: ":input",
- appendTo: 'body',
- autoRefresh: true,
- filter: '*',
- tolerance: 'touch'
- }
-});
-
-})(jQuery);
-/*
- * jQuery UI Sortable
- *
- * Copyright (c) 2008 Paul Bakaus
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Sortables
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-function contains(a, b) {
- var safari2 = $.browser.safari && $.browser.version < 522;
- if (a.contains && !safari2) {
- return a.contains(b);
- }
- if (a.compareDocumentPosition)
- return !!(a.compareDocumentPosition(b) & 16);
- while (b = b.parentNode)
- if (b == a) return true;
- return false;
-};
-
-$.widget("ui.sortable", $.extend($.ui.mouse, {
- init: function() {
-
- var o = this.options;
- this.containerCache = {};
- this.element.addClass("ui-sortable");
-
- //Get the items
- this.refresh();
-
- //Let's determine if the items are floating
- this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
-
- //Let's determine the parent's offset
- if(!(/(relative|absolute|fixed)/).test(this.element.css('position'))) this.element.css('position', 'relative');
- this.offset = this.element.offset();
-
- //Initialize mouse events for interaction
- this.mouseInit();
-
- },
- plugins: {},
- ui: function(inst) {
- return {
- helper: (inst || this)["helper"],
- placeholder: (inst || this)["placeholder"] || $([]),
- position: (inst || this)["position"],
- absolutePosition: (inst || this)["positionAbs"],
- options: this.options,
- element: this.element,
- item: (inst || this)["currentItem"],
- sender: inst ? inst.element : null
- };
- },
- propagate: function(n,e,inst, noPropagation) {
- $.ui.plugin.call(this, n, [e, this.ui(inst)]);
- if(!noPropagation) this.element.triggerHandler(n == "sort" ? n : "sort"+n, [e, this.ui(inst)], this.options[n]);
- },
- serialize: function(o) {
-
- var items = ($.isFunction(this.options.items) ? this.options.items.call(this.element) : $(this.options.items, this.element)).not('.ui-sortable-helper'); //Only the items of the sortable itself
- var str = []; o = o || {};
-
- items.each(function() {
- var res = ($(this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
- if(res) str.push((o.key || res[1])+'[]='+(o.key && o.expression ? res[1] : res[2]));
- });
-
- return str.join('&');
-
- },
- toArray: function(attr) {
-
- var items = ($.isFunction(this.options.items) ? this.options.items.call(this.element) : $(this.options.items, this.element)).not('.ui-sortable-helper'); //Only the items of the sortable itself
- var ret = [];
-
- items.each(function() { ret.push($(this).attr(attr || 'id')); });
- return ret;
-
- },
- /* Be careful with the following core functions */
- intersectsWith: function(item) {
-
- var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width,
- y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height;
- var l = item.left, r = l + item.width,
- t = item.top, b = t + item.height;
-
- if(this.options.tolerance == "pointer" || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) {
- return (y1 + this.offset.click.top > t && y1 + this.offset.click.top < b && x1 + this.offset.click.left > l && x1 + this.offset.click.left < r);
- } else {
-
- return (l < x1 + (this.helperProportions.width / 2) // Right Half
- && x2 - (this.helperProportions.width / 2) < r // Left Half
- && t < y1 + (this.helperProportions.height / 2) // Bottom Half
- && y2 - (this.helperProportions.height / 2) < b ); // Top Half
-
- }
-
- },
- intersectsWithEdge: function(item) {
- var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width,
- y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height;
- var l = item.left, r = l + item.width,
- t = item.top, b = t + item.height;
-
- if(this.options.tolerance == "pointer" || (this.options.tolerance == "guess" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])) {
-
- if(!(y1 + this.offset.click.top > t && y1 + this.offset.click.top < b && x1 + this.offset.click.left > l && x1 + this.offset.click.left < r)) return false;
-
- if(this.floating) {
- if(x1 + this.offset.click.left > l && x1 + this.offset.click.left < l + item.width/2) return 2;
- if(x1 + this.offset.click.left > l+item.width/2 && x1 + this.offset.click.left < r) return 1;
- } else {
- if(y1 + this.offset.click.top > t && y1 + this.offset.click.top < t + item.height/2) return 2;
- if(y1 + this.offset.click.top > t+item.height/2 && y1 + this.offset.click.top < b) return 1;
- }
-
- } else {
-
- if (!(l < x1 + (this.helperProportions.width / 2) // Right Half
- && x2 - (this.helperProportions.width / 2) < r // Left Half
- && t < y1 + (this.helperProportions.height / 2) // Bottom Half
- && y2 - (this.helperProportions.height / 2) < b )) return false; // Top Half
-
- if(this.floating) {
- if(x2 > l && x1 < l) return 2; //Crosses left edge
- if(x1 < r && x2 > r) return 1; //Crosses right edge
- } else {
- if(y2 > t && y1 < t) return 1; //Crosses top edge
- if(y1 < b && y2 > b) return 2; //Crosses bottom edge
- }
-
- }
-
- return false;
-
- },
- refresh: function() {
- this.refreshItems();
- this.refreshPositions();
- },
- refreshItems: function() {
-
- this.items = [];
- this.containers = [this];
- var items = this.items;
- var self = this;
- var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element), this]];
-
- if(this.options.connectWith) {
- for (var i = this.options.connectWith.length - 1; i >= 0; i--){
- var cur = $(this.options.connectWith[i]);
- for (var j = cur.length - 1; j >= 0; j--){
- var inst = $.data(cur[j], 'sortable');
- if(inst && !inst.options.disabled) {
- queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element), inst]);
- this.containers.push(inst);
- }
- };
- };
- }
-
- for (var i = queries.length - 1; i >= 0; i--){
- queries[i][0].each(function() {
- $.data(this, 'sortable-item', queries[i][1]); // Data for target checking (mouse manager)
- items.push({
- item: $(this),
- instance: queries[i][1],
- width: 0, height: 0,
- left: 0, top: 0
- });
- });
- };
-
- },
- refreshPositions: function(fast) {
-
- //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
- if(this.offsetParent) {
- var po = this.offsetParent.offset();
- this.offset.parent = { top: po.top + this.offsetParentBorders.top, left: po.left + this.offsetParentBorders.left };
- }
-
- for (var i = this.items.length - 1; i >= 0; i--){
-
- //We ignore calculating positions of all connected containers when we're not over them
- if(this.items[i].instance != this.currentContainer && this.currentContainer && this.items[i].item[0] != this.currentItem[0])
- continue;
-
- var t = this.options.toleranceElement ? $(this.options.toleranceElement, this.items[i].item) : this.items[i].item;
-
- if(!fast) {
- this.items[i].width = t.outerWidth();
- this.items[i].height = t.outerHeight();
- }
-
- var p = t.offset();
- this.items[i].left = p.left;
- this.items[i].top = p.top;
-
- };
-
- for (var i = this.containers.length - 1; i >= 0; i--){
- var p =this.containers[i].element.offset();
- this.containers[i].containerCache.left = p.left;
- this.containers[i].containerCache.top = p.top;
- this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
- this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
- };
-
- },
- destroy: function() {
- this.element
- .removeClass("ui-sortable ui-sortable-disabled")
- .removeData("sortable")
- .unbind(".sortable");
- this.mouseDestroy();
-
- for ( var i = this.items.length - 1; i >= 0; i-- )
- this.items[i].item.removeData("sortable-item");
- },
- createPlaceholder: function(that) {
-
- var self = that || this, o = self.options;
-
- if(o.placeholder.constructor == String) {
- var className = o.placeholder;
- o.placeholder = {
- element: function() {
- return $('<div></div>').addClass(className)[0];
- },
- update: function(i, p) {
- p.css(i.offset()).css({ width: i.outerWidth(), height: i.outerHeight() });
- }
- };
- }
-
- self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)).appendTo('body').css({ position: 'absolute' });
- o.placeholder.update.call(self.element, self.currentItem, self.placeholder);
- },
- contactContainers: function(e) {
- for (var i = this.containers.length - 1; i >= 0; i--){
-
- if(this.intersectsWith(this.containers[i].containerCache)) {
- if(!this.containers[i].containerCache.over) {
-
-
- if(this.currentContainer != this.containers[i]) {
-
- //When entering a new container, we will find the item with the least distance and append our item near it
- var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top'];
- for (var j = this.items.length - 1; j >= 0; j--) {
- if(!contains(this.containers[i].element[0], this.items[j].item[0])) continue;
- var cur = this.items[j][this.containers[i].floating ? 'left' : 'top'];
- if(Math.abs(cur - base) < dist) {
- dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
- }
- }
-
- if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
- continue;
-
- //We also need to exchange the placeholder
- if(this.placeholder) this.placeholder.remove();
- if(this.containers[i].options.placeholder) {
- this.containers[i].createPlaceholder(this);
- } else {
- this.placeholder = null;;
- }
-
- this.currentContainer = this.containers[i];
- itemWithLeastDistance ? this.rearrange(e, itemWithLeastDistance, null, true) : this.rearrange(e, null, this.containers[i].element, true);
- this.propagate("change", e); //Call plugins and callbacks
- this.containers[i].propagate("change", e, this); //Call plugins and callbacks
-
- }
-
- this.containers[i].propagate("over", e, this);
- this.containers[i].containerCache.over = 1;
- }
- } else {
- if(this.containers[i].containerCache.over) {
- this.containers[i].propagate("out", e, this);
- this.containers[i].containerCache.over = 0;
- }
- }
-
- };
- },
- mouseCapture: function(e, overrideHandle) {
-
- if(this.options.disabled || this.options.type == 'static') return false;
-
- //We have to refresh the items data once first
- this.refreshItems();
-
- //Find out if the clicked node (or one of its parents) is a actual item in this.items
- var currentItem = null, self = this, nodes = $(e.target).parents().each(function() {
- if($.data(this, 'sortable-item') == self) {
- currentItem = $(this);
- return false;
- }
- });
- if($.data(e.target, 'sortable-item') == self) currentItem = $(e.target);
-
- if(!currentItem) return false;
- if(this.options.handle && !overrideHandle) {
- var validHandle = false;
-
- $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == e.target) validHandle = true; });
- if(!validHandle) return false;
- }
-
- this.currentItem = currentItem;
- return true;
-
- },
- mouseStart: function(e, overrideHandle, noActivation) {
-
- var o = this.options;
- this.currentContainer = this;
-
- //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
- this.refreshPositions();
-
- //Create and append the visible helper
- this.helper = typeof o.helper == 'function' ? $(o.helper.apply(this.element[0], [e, this.currentItem])) : this.currentItem.clone();
- if(!this.helper.parents('body').length) this.helper.appendTo((o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)); //Add the helper to the DOM if that didn't happen already
- this.helper.css({ position: 'absolute', clear: 'both' }).addClass('ui-sortable-helper'); //Position it absolutely and add a helper class
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- this.margins = { //Cache the margins
- left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
- top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
- };
-
- this.offset = this.currentItem.offset(); //The element's absolute position on the page
- this.offset = { //Substract the margins from the element's absolute offset
- top: this.offset.top - this.margins.top,
- left: this.offset.left - this.margins.left
- };
-
- this.offset.click = { //Where the click happened, relative to the element
- left: e.pageX - this.offset.left,
- top: e.pageY - this.offset.top
- };
-
- this.offsetParent = this.helper.offsetParent(); //Get the offsetParent and cache its position
- var po = this.offsetParent.offset();
-
- this.offsetParentBorders = {
- top: (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
- left: (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
- };
- this.offset.parent = { //Store its position plus border
- top: po.top + this.offsetParentBorders.top,
- left: po.left + this.offsetParentBorders.left
- };
-
- this.originalPosition = this.generatePosition(e); //Generate the original position
- this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; //Cache the former DOM position
-
- //If o.placeholder is used, create a new element at the given position with the class
- this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Cache the helper size
- if(o.placeholder) this.createPlaceholder();
-
- //Call plugins and callbacks
- this.propagate("start", e);
- this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() };//Recache the helper size
-
- if(o.cursorAt) {
- if(o.cursorAt.left != undefined) this.offset.click.left = o.cursorAt.left;
- if(o.cursorAt.right != undefined) this.offset.click.left = this.helperProportions.width - o.cursorAt.right;
- if(o.cursorAt.top != undefined) this.offset.click.top = o.cursorAt.top;
- if(o.cursorAt.bottom != undefined) this.offset.click.top = this.helperProportions.height - o.cursorAt.bottom;
- }
-
- /*
- * - Position constraining -
- * Here we prepare position constraining like grid and containment.
- */
-
- if(o.containment) {
- if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
- if(o.containment == 'document' || o.containment == 'window') this.containment = [
- 0 - this.offset.parent.left,
- 0 - this.offset.parent.top,
- $(o.containment == 'document' ? document : window).width() - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.element.css("marginRight"),10) || 0),
- ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.element.css("marginBottom"),10) || 0)
- ];
-
- if(!(/^(document|window|parent)$/).test(o.containment)) {
- var ce = $(o.containment)[0];
- var co = $(o.containment).offset();
-
- this.containment = [
- co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.parent.left,
- co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.parent.top,
- co.left+Math.max(ce.scrollWidth,ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - this.offset.parent.left - this.helperProportions.width - this.margins.left - (parseInt(this.currentItem.css("marginRight"),10) || 0),
- co.top+Math.max(ce.scrollHeight,ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - this.offset.parent.top - this.helperProportions.height - this.margins.top - (parseInt(this.currentItem.css("marginBottom"),10) || 0)
- ];
- }
- }
-
- //Set the original element visibility to hidden to still fill out the white space
- if(this.options.placeholder != 'clone')
- this.currentItem.css('visibility', 'hidden');
-
- //Post 'activate' events to possible containers
- if(!noActivation) {
- for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i].propagate("activate", e, this); }
- }
-
- //Prepare possible droppables
- if($.ui.ddmanager) $.ui.ddmanager.current = this;
- if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets(this, e);
-
- this.dragging = true;
-
- this.mouseDrag(e); //Execute the drag once - this causes the helper not to be visible before getting its correct position
- return true;
-
-
- },
- convertPositionTo: function(d, pos) {
- if(!pos) pos = this.position;
- var mod = d == "absolute" ? 1 : -1;
- return {
- top: (
- pos.top // the calculated relative position
- + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
- - (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) * mod // The offsetParent's scroll position
- + this.margins.top * mod //Add the margin (you don't want the margin counting in intersection methods)
- ),
- left: (
- pos.left // the calculated relative position
- + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
- - (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft) * mod // The offsetParent's scroll position
- + this.margins.left * mod //Add the margin (you don't want the margin counting in intersection methods)
- )
- };
- },
- generatePosition: function(e) {
-
- var o = this.options;
- var position = {
- top: (
- e.pageY // The absolute mouse position
- - this.offset.click.top // Click offset (relative to the element)
- - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
- + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) // The offsetParent's scroll position, not if the element is fixed
- ),
- left: (
- e.pageX // The absolute mouse position
- - this.offset.click.left // Click offset (relative to the element)
- - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
- + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft) // The offsetParent's scroll position, not if the element is fixed
- )
- };
-
- if(!this.originalPosition) return position; //If we are not dragging yet, we won't check for options
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
- if(this.containment) {
- if(position.left < this.containment[0]) position.left = this.containment[0];
- if(position.top < this.containment[1]) position.top = this.containment[1];
- if(position.left > this.containment[2]) position.left = this.containment[2];
- if(position.top > this.containment[3]) position.top = this.containment[3];
- }
-
- if(o.grid) {
- var top = this.originalPosition.top + Math.round((position.top - this.originalPosition.top) / o.grid[1]) * o.grid[1];
- position.top = this.containment ? (!(top < this.containment[1] || top > this.containment[3]) ? top : (!(top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
- var left = this.originalPosition.left + Math.round((position.left - this.originalPosition.left) / o.grid[0]) * o.grid[0];
- position.left = this.containment ? (!(left < this.containment[0] || left > this.containment[2]) ? left : (!(left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
- }
-
- return position;
- },
- mouseDrag: function(e) {
-
-
- //Compute the helpers position
- this.position = this.generatePosition(e);
- this.positionAbs = this.convertPositionTo("absolute");
-
- //Rearrange
- for (var i = this.items.length - 1; i >= 0; i--) {
- var intersection = this.intersectsWithEdge(this.items[i]);
- if(!intersection) continue;
-
- if(this.items[i].item[0] != this.currentItem[0] //cannot intersect with itself
- && this.currentItem[intersection == 1 ? "next" : "prev"]()[0] != this.items[i].item[0] //no useless actions that have been done before
- && !contains(this.currentItem[0], this.items[i].item[0]) //no action if the item moved is the parent of the item checked
- && (this.options.type == 'semi-dynamic' ? !contains(this.element[0], this.items[i].item[0]) : true)
- ) {
-
- this.direction = intersection == 1 ? "down" : "up";
- this.rearrange(e, this.items[i]);
- this.propagate("change", e); //Call plugins and callbacks
- break;
- }
- }
-
- //Post events to containers
- this.contactContainers(e);
-
- //Call plugins and callbacks
- this.propagate("sort", e);
-
- if(!this.options.axis || this.options.axis == "x") this.helper[0].style.left = this.position.left+'px';
- if(!this.options.axis || this.options.axis == "y") this.helper[0].style.top = this.position.top+'px';
-
- //Interconnect with droppables
- if($.ui.ddmanager) $.ui.ddmanager.drag(this, e);
-
- return false;
-
- },
- rearrange: function(e, i, a, hardRefresh) {
- a ? a.append(this.currentItem) : i.item[this.direction == 'down' ? 'before' : 'after'](this.currentItem);
-
- //Various things done here to improve the performance:
- // 1. we create a setTimeout, that calls refreshPositions
- // 2. on the instance, we have a counter variable, that get's higher after every append
- // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
- // 4. this lets only the last addition to the timeout stack through
- this.counter = this.counter ? ++this.counter : 1;
- var self = this, counter = this.counter;
-
- window.setTimeout(function() {
- if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
- },0);
-
- if(this.options.placeholder)
- this.options.placeholder.update.call(this.element, this.currentItem, this.placeholder);
- },
- mouseStop: function(e, noPropagation) {
-
- //If we are using droppables, inform the manager about the drop
- if ($.ui.ddmanager && !this.options.dropBehaviour)
- $.ui.ddmanager.drop(this, e);
-
- if(this.options.revert) {
- var self = this;
- var cur = self.currentItem.offset();
-
- //Also animate the placeholder if we have one
- if(self.placeholder) self.placeholder.animate({ opacity: 'hide' }, (parseInt(this.options.revert, 10) || 500)-50);
-
- $(this.helper).animate({
- left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
- top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
- }, parseInt(this.options.revert, 10) || 500, function() {
- self.clear(e);
- });
- } else {
- this.clear(e, noPropagation);
- }
-
- return false;
-
- },
- clear: function(e, noPropagation) {
-
- if(this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) this.propagate("update", e, null, noPropagation); //Trigger update callback if the DOM position has changed
- if(!contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
- this.propagate("remove", e, null, noPropagation);
- for (var i = this.containers.length - 1; i >= 0; i--){
- if(contains(this.containers[i].element[0], this.currentItem[0])) {
- this.containers[i].propagate("update", e, this, noPropagation);
- this.containers[i].propagate("receive", e, this, noPropagation);
- }
- };
- };
-
- //Post events to containers
- for (var i = this.containers.length - 1; i >= 0; i--){
- this.containers[i].propagate("deactivate", e, this, noPropagation);
- if(this.containers[i].containerCache.over) {
- this.containers[i].propagate("out", e, this);
- this.containers[i].containerCache.over = 0;
- }
- }
-
- this.dragging = false;
- if(this.cancelHelperRemoval) {
- this.propagate("stop", e, null, noPropagation);
- return false;
- }
-
- $(this.currentItem).css('visibility', '');
- if(this.placeholder) this.placeholder.remove();
- this.helper.remove(); this.helper = null;
- this.propagate("stop", e, null, noPropagation);
-
- return true;
-
- }
-}));
-
-$.extend($.ui.sortable, {
- getter: "serialize toArray",
- defaults: {
- helper: "clone",
- tolerance: "guess",
- distance: 1,
- delay: 0,
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- cancel: ":input",
- items: '> *',
- zIndex: 1000,
- dropOnEmpty: true,
- appendTo: "parent"
- }
-});
-
-/*
- * Sortable Extensions
- */
-
-$.ui.plugin.add("sortable", "cursor", {
- start: function(e, ui) {
- var t = $('body');
- if (t.css("cursor")) ui.options._cursor = t.css("cursor");
- t.css("cursor", ui.options.cursor);
- },
- stop: function(e, ui) {
- if (ui.options._cursor) $('body').css("cursor", ui.options._cursor);
- }
-});
-
-$.ui.plugin.add("sortable", "zIndex", {
- start: function(e, ui) {
- var t = ui.helper;
- if(t.css("zIndex")) ui.options._zIndex = t.css("zIndex");
- t.css('zIndex', ui.options.zIndex);
- },
- stop: function(e, ui) {
- if(ui.options._zIndex) $(ui.helper).css('zIndex', ui.options._zIndex);
- }
-});
-
-$.ui.plugin.add("sortable", "opacity", {
- start: function(e, ui) {
- var t = ui.helper;
- if(t.css("opacity")) ui.options._opacity = t.css("opacity");
- t.css('opacity', ui.options.opacity);
- },
- stop: function(e, ui) {
- if(ui.options._opacity) $(ui.helper).css('opacity', ui.options._opacity);
- }
-});
-
-$.ui.plugin.add("sortable", "scroll", {
- start: function(e, ui) {
- var o = ui.options;
- var i = $(this).data("sortable");
-
- i.overflowY = function(el) {
- do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-y'))) return el; el = el.parent(); } while (el[0].parentNode);
- return $(document);
- }(i.currentItem);
- i.overflowX = function(el) {
- do { if(/auto|scroll/.test(el.css('overflow')) || (/auto|scroll/).test(el.css('overflow-x'))) return el; el = el.parent(); } while (el[0].parentNode);
- return $(document);
- }(i.currentItem);
-
- if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') i.overflowYOffset = i.overflowY.offset();
- if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') i.overflowXOffset = i.overflowX.offset();
-
- },
- sort: function(e, ui) {
-
- var o = ui.options;
- var i = $(this).data("sortable");
-
- if(i.overflowY[0] != document && i.overflowY[0].tagName != 'HTML') {
- if((i.overflowYOffset.top + i.overflowY[0].offsetHeight) - e.pageY < o.scrollSensitivity)
- i.overflowY[0].scrollTop = i.overflowY[0].scrollTop + o.scrollSpeed;
- if(e.pageY - i.overflowYOffset.top < o.scrollSensitivity)
- i.overflowY[0].scrollTop = i.overflowY[0].scrollTop - o.scrollSpeed;
- } else {
- if(e.pageY - $(document).scrollTop() < o.scrollSensitivity)
- $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
- if($(window).height() - (e.pageY - $(document).scrollTop()) < o.scrollSensitivity)
- $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
- }
-
- if(i.overflowX[0] != document && i.overflowX[0].tagName != 'HTML') {
- if((i.overflowXOffset.left + i.overflowX[0].offsetWidth) - e.pageX < o.scrollSensitivity)
- i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft + o.scrollSpeed;
- if(e.pageX - i.overflowXOffset.left < o.scrollSensitivity)
- i.overflowX[0].scrollLeft = i.overflowX[0].scrollLeft - o.scrollSpeed;
- } else {
- if(e.pageX - $(document).scrollLeft() < o.scrollSensitivity)
- $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
- if($(window).width() - (e.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
- $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
- }
-
- }
-});
-
-})(jQuery);
-/*
- * jQuery UI Effects 1.5.1
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/
- */
-;(function($) {
-
-$.effects = $.effects || {}; //Add the 'effects' scope
-
-$.extend($.effects, {
- save: function(el, set) {
- for(var i=0;i<set.length;i++) {
- if(set[i] !== null) $.data(el[0], "ec.storage."+set[i], el[0].style[set[i]]);
- }
- },
- restore: function(el, set) {
- for(var i=0;i<set.length;i++) {
- if(set[i] !== null) el.css(set[i], $.data(el[0], "ec.storage."+set[i]));
- }
- },
- setMode: function(el, mode) {
- if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
- return mode;
- },
- getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
- // this should be a little more flexible in the future to handle a string & hash
- var y, x;
- switch (origin[0]) {
- case 'top': y = 0; break;
- case 'middle': y = 0.5; break;
- case 'bottom': y = 1; break;
- default: y = origin[0] / original.height;
- };
- switch (origin[1]) {
- case 'left': x = 0; break;
- case 'center': x = 0.5; break;
- case 'right': x = 1; break;
- default: x = origin[1] / original.width;
- };
- return {x: x, y: y};
- },
- createWrapper: function(el) {
- if (el.parent().attr('id') == 'fxWrapper')
- return el;
- var props = {width: el.outerWidth({margin:true}), height: el.outerHeight({margin:true}), 'float': el.css('float')};
- el.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');
- var wrapper = el.parent();
- if (el.css('position') == 'static'){
- wrapper.css({position: 'relative'});
- el.css({position: 'relative'});
- } else {
- var top = parseInt(el.css('top'), 10); if(isNaN(top)) top = 'auto';
- var left = parseInt(el.css('left'), 10); if(isNaN(left)) left = 'auto';
- wrapper.css({ position: el.css('position'), top: top, left: left, zIndex: el.css('z-index') }).show();
- el.css({position: 'relative', top:0, left:0});
- }
- wrapper.css(props);
- return wrapper;
- },
- removeWrapper: function(el) {
- if (el.parent().attr('id') == 'fxWrapper')
- return el.parent().replaceWith(el);
- return el;
- },
- setTransition: function(el, list, factor, val) {
- val = val || {};
- $.each(list,function(i, x){
- unit = el.cssUnit(x);
- if (unit[0] > 0) val[x] = unit[0] * factor + unit[1];
- });
- return val;
- },
- animateClass: function(value, duration, easing, callback) {
-
- var cb = (typeof easing == "function" ? easing : (callback ? callback : null));
- var ea = (typeof easing == "object" ? easing : null);
-
- return this.each(function() {
-
- var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || '';
- if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */
- if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; }
-
- //Let's get a style offset
- var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));
- if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove);
- var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));
- if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove);
-
- // The main function to form the object for animation
- for(var n in newStyle) {
- if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */
- && n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */
- && newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */
- && (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */
- && (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */
- ) offset[n] = newStyle[n];
- }
-
- that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object
- // Change style attribute back to original. For stupid IE, we need to clear the damn object.
- if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr);
- if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove);
- if(cb) cb.apply(this, arguments);
- });
-
- });
- }
-});
-
-//Extend the methods of jQuery
-$.fn.extend({
- //Save old methods
- _show: $.fn.show,
- _hide: $.fn.hide,
- __toggle: $.fn.toggle,
- _addClass: $.fn.addClass,
- _removeClass: $.fn.removeClass,
- _toggleClass: $.fn.toggleClass,
- // New ec methods
- effect: function(fx,o,speed,callback) {
- return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: o || {}, duration: speed, callback: callback }) : null;
- },
- show: function() {
- if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))
- return this._show.apply(this, arguments);
- else {
- var o = arguments[1] || {}; o['mode'] = 'show';
- return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
- }
- },
- hide: function() {
- if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))
- return this._hide.apply(this, arguments);
- else {
- var o = arguments[1] || {}; o['mode'] = 'hide';
- return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
- }
- },
- toggle: function(){
- if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function))
- return this.__toggle.apply(this, arguments);
- else {
- var o = arguments[1] || {}; o['mode'] = 'toggle';
- return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
- }
- },
- addClass: function(classNames,speed,easing,callback) {
- return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
- },
- removeClass: function(classNames,speed,easing,callback) {
- return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
- },
- toggleClass: function(classNames,speed,easing,callback) {
- return speed ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames);
- },
- morph: function(remove,add,speed,easing,callback) {
- return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
- },
- switchClass: function() {
- return this.morph.apply(this, arguments);
- },
- // helper functions
- cssUnit: function(key) {
- var style = this.css(key), val = [];
- $.each( ['em','px','%','pt'], function(i, unit){
- if(style.indexOf(unit) > 0)
- val = [parseFloat(style), unit];
- });
- return val;
- }
-});
-
-/*
- * jQuery Color Animations
- * Copyright 2007 John Resig
- * Released under the MIT and GPL licenses.
- */
-
-// We override the animation for all of these color styles
-jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
- jQuery.fx.step[attr] = function(fx){
- if ( fx.state == 0 ) {
- fx.start = getColor( fx.elem, attr );
- fx.end = getRGB( fx.end );
- }
-
- fx.elem.style[attr] = "rgb(" + [
- Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
- Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
- Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
- ].join(",") + ")";
- }
-});
-
-// Color Conversion functions from highlightFade
-// By Blair Mitchelmore
-// http://jquery.offput.ca/highlightFade/
-
-// Parse strings looking for color tuples [255,255,255]
-function getRGB(color) {
- var result;
-
- // Check if we're already dealing with an array of colors
- if ( color && color.constructor == Array && color.length == 3 )
- return color;
-
- // Look for rgb(num,num,num)
- if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
- return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];
-
- // Look for rgb(num%,num%,num%)
- if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
- return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
-
- // Look for #a0b1c2
- if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
- return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
-
- // Look for #fff
- if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
- return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
-
- // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
- if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
- return colors['transparent']
-
- // Otherwise, we're most likely dealing with a named color
- return colors[jQuery.trim(color).toLowerCase()];
-}
-
-function getColor(elem, attr) {
- var color;
-
- do {
- color = jQuery.curCSS(elem, attr);
-
- // Keep going until we find an element that has color, or we hit the body
- if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
- break;
-
- attr = "backgroundColor";
- } while ( elem = elem.parentNode );
-
- return getRGB(color);
-};
-
-// Some named colors to work with
-// From Interface by Stefan Petre
-// http://interface.eyecon.ro/
-
-var colors = {
- aqua:[0,255,255],
- azure:[240,255,255],
- beige:[245,245,220],
- black:[0,0,0],
- blue:[0,0,255],
- brown:[165,42,42],
- cyan:[0,255,255],
- darkblue:[0,0,139],
- darkcyan:[0,139,139],
- darkgrey:[169,169,169],
- darkgreen:[0,100,0],
- darkkhaki:[189,183,107],
- darkmagenta:[139,0,139],
- darkolivegreen:[85,107,47],
- darkorange:[255,140,0],
- darkorchid:[153,50,204],
- darkred:[139,0,0],
- darksalmon:[233,150,122],
- darkviolet:[148,0,211],
- fuchsia:[255,0,255],
- gold:[255,215,0],
- green:[0,128,0],
- indigo:[75,0,130],
- khaki:[240,230,140],
- lightblue:[173,216,230],
- lightcyan:[224,255,255],
- lightgreen:[144,238,144],
- lightgrey:[211,211,211],
- lightpink:[255,182,193],
- lightyellow:[255,255,224],
- lime:[0,255,0],
- magenta:[255,0,255],
- maroon:[128,0,0],
- navy:[0,0,128],
- olive:[128,128,0],
- orange:[255,165,0],
- pink:[255,192,203],
- purple:[128,0,128],
- violet:[128,0,128],
- red:[255,0,0],
- silver:[192,192,192],
- white:[255,255,255],
- yellow:[255,255,0],
- transparent: [255,255,255]
-};
-
-/*
- * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
- *
- * Uses the built in easing capabilities added In jQuery 1.1
- * to offer multiple easing options
- *
- * TERMS OF USE - jQuery Easing
- *
- * Open source under the BSD License.
- *
- * Copyright © 2008 George McGinley Smith
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * Neither the name of the author nor the names of contributors may be used to endorse
- * or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
-*/
-
-// t: current time, b: begInnIng value, c: change In value, d: duration
-jQuery.easing['jswing'] = jQuery.easing['swing'];
-
-jQuery.extend( jQuery.easing,
-{
- def: 'easeOutQuad',
- swing: function (x, t, b, c, d) {
- //alert(jQuery.easing.default);
- return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
- },
- easeInQuad: function (x, t, b, c, d) {
- return c*(t/=d)*t + b;
- },
- easeOutQuad: function (x, t, b, c, d) {
- return -c *(t/=d)*(t-2) + b;
- },
- easeInOutQuad: function (x, t, b, c, d) {
- if ((t/=d/2) < 1) return c/2*t*t + b;
- return -c/2 * ((--t)*(t-2) - 1) + b;
- },
- easeInCubic: function (x, t, b, c, d) {
- return c*(t/=d)*t*t + b;
- },
- easeOutCubic: function (x, t, b, c, d) {
- return c*((t=t/d-1)*t*t + 1) + b;
- },
- easeInOutCubic: function (x, 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;
- },
- easeInQuart: function (x, t, b, c, d) {
- return c*(t/=d)*t*t*t + b;
- },
- easeOutQuart: function (x, t, b, c, d) {
- return -c * ((t=t/d-1)*t*t*t - 1) + b;
- },
- easeInOutQuart: function (x, 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;
- },
- easeInQuint: function (x, t, b, c, d) {
- return c*(t/=d)*t*t*t*t + b;
- },
- easeOutQuint: function (x, t, b, c, d) {
- return c*((t=t/d-1)*t*t*t*t + 1) + b;
- },
- easeInOutQuint: function (x, 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;
- },
- easeInSine: function (x, t, b, c, d) {
- return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
- },
- easeOutSine: function (x, t, b, c, d) {
- return c * Math.sin(t/d * (Math.PI/2)) + b;
- },
- easeInOutSine: function (x, t, b, c, d) {
- return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
- },
- easeInExpo: function (x, t, b, c, d) {
- return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
- },
- easeOutExpo: function (x, t, b, c, d) {
- return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
- },
- easeInOutExpo: function (x, 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;
- },
- easeInCirc: function (x, t, b, c, d) {
- return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
- },
- easeOutCirc: function (x, t, b, c, d) {
- return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
- },
- easeInOutCirc: function (x, 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;
- },
- easeInElastic: function (x, t, b, c, d) {
- var s=1.70158;var p=0;var a=c;
- if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
- 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;
- },
- easeOutElastic: function (x, t, b, c, d) {
- var s=1.70158;var p=0;var a=c;
- if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
- 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;
- },
- easeInOutElastic: function (x, t, b, c, d) {
- var s=1.70158;var p=0;var a=c;
- if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
- 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;
- },
- easeInBack: function (x, t, b, c, d, s) {
- if (s == undefined) s = 1.70158;
- return c*(t/=d)*t*((s+1)*t - s) + b;
- },
- easeOutBack: function (x, t, b, c, d, s) {
- if (s == undefined) s = 1.70158;
- return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
- },
- easeInOutBack: function (x, t, b, c, d, s) {
- if (s == undefined) 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;
- },
- easeInBounce: function (x, t, b, c, d) {
- return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
- },
- easeOutBounce: function (x, 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;
- }
- },
- easeInOutBounce: function (x, t, b, c, d) {
- if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
- return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
- }
-});
-
-/*
- *
- * TERMS OF USE - EASING EQUATIONS
- *
- * Open source under the BSD License.
- *
- * Copyright © 2001 Robert Penner
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of
- * conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list
- * of conditions and the following disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * Neither the name of the author nor the names of contributors may be used to endorse
- * or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-})(jQuery);
-/*
- * jQuery UI Effects Blind
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Blind
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.blind = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
- var direction = o.options.direction || 'vertical'; // Default direction
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
- var ref = (direction == 'vertical') ? 'height' : 'width';
- var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
- if(mode == 'show') wrapper.css(ref, 0); // Shift
-
- // Animation
- var animation = {};
- animation[ref] = mode == 'show' ? distance : 0;
-
- // Animate
- wrapper.animate(animation, o.duration, o.options.easing, function() {
- if(mode == 'hide') el.hide(); // Hide
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(el[0], arguments); // Callback
- el.dequeue();
- });
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Bounce
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Bounce
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.bounce = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
- var direction = o.options.direction || 'up'; // Default direction
- var distance = o.options.distance || 20; // Default distance
- var times = o.options.times || 5; // Default # of times
- var speed = o.duration || 250; // Default speed per bounce
- if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- $.effects.createWrapper(el); // Create Wrapper
- var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
- var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
- var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
- if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
- if (mode == 'hide') distance = distance / (times * 2);
- if (mode != 'hide') times--;
-
- // Animate
- if (mode == 'show') { // Show Bounce
- var animation = {opacity: 1};
- animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
- el.animate(animation, speed / 2, o.options.easing);
- distance = distance / 2;
- times--;
- };
- for (var i = 0; i < times; i++) { // Bounces
- var animation1 = {}, animation2 = {};
- animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
- animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
- el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
- distance = (mode == 'hide') ? distance * 2 : distance / 2;
- };
- if (mode == 'hide') { // Last Bounce
- var animation = {opacity: 0};
- animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
- el.animate(animation, speed / 2, o.options.easing, function(){
- el.hide(); // Hide
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(this, arguments); // Callback
- });
- } else {
- var animation1 = {}, animation2 = {};
- animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
- animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
- el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(this, arguments); // Callback
- });
- };
- el.queue('fx', function() { el.dequeue(); });
- el.dequeue();
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Clip
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Clip
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.clip = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left','height','width'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
- var direction = o.options.direction || 'vertical'; // Default direction
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
- var animate = el[0].tagName == 'IMG' ? wrapper : el;
- var ref = {
- size: (direction == 'vertical') ? 'height' : 'width',
- position: (direction == 'vertical') ? 'top' : 'left'
- };
- var distance = (direction == 'vertical') ? animate.height() : animate.width();
- if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
-
- // Animation
- var animation = {};
- animation[ref.size] = mode == 'show' ? distance : 0;
- animation[ref.position] = mode == 'show' ? 0 : distance / 2;
-
- // Animate
- animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
- if(mode == 'hide') el.hide(); // Hide
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(el[0], arguments); // Callback
- el.dequeue();
- }});
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Drop
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Drop
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.drop = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left','opacity'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
- var direction = o.options.direction || 'left'; // Default Direction
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- $.effects.createWrapper(el); // Create Wrapper
- var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
- var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
- var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
- if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-
- // Animation
- var animation = {opacity: mode == 'show' ? 1 : 0};
- animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
- // Animate
- el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
- if(mode == 'hide') el.hide(); // Hide
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(this, arguments); // Callback
- el.dequeue();
- }});
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Explode
- *
- * Copyright (c) 2008 Paul Bakaus (ui.jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Explode
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.explode = function(o) {
-
- return this.queue(function() {
-
- var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
- var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-
- o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
- var el = $(this).show().css('visibility', 'hidden');
- var offset = el.offset();
-
- //Substract the margins - not fixing the problem yet.
- offset.top -= parseInt(el.css("marginTop")) || 0;
- offset.left -= parseInt(el.css("marginLeft")) || 0;
-
- var width = el.outerWidth(true);
- var height = el.outerHeight(true);
-
- for(var i=0;i<rows;i++) { // =
- for(var j=0;j<cells;j++) { // ||
- el
- .clone()
- .appendTo('body')
- .wrap('<div></div>')
- .css({
- position: 'absolute',
- visibility: 'visible',
- left: -j*(width/cells),
- top: -i*(height/rows)
- })
- .parent()
- .addClass('effects-explode')
- .css({
- position: 'absolute',
- overflow: 'hidden',
- width: width/cells,
- height: height/rows,
- left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
- top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
- opacity: o.options.mode == 'show' ? 0 : 1
- }).animate({
- left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
- top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
- opacity: o.options.mode == 'show' ? 1 : 0
- }, o.duration || 500);
- }
- }
-
- // Set a timeout, to call the callback approx. when the other animations have finished
- setTimeout(function() {
-
- o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
- if(o.callback) o.callback.apply(el[0]); // Callback
- el.dequeue();
-
- $('.effects-explode').remove();
-
- }, o.duration || 500);
-
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Fold
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Fold
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.fold = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
- var size = o.options.size || 15; // Default fold size
- var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
- var widthFirst = ((mode == 'show') != horizFirst);
- var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
- var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
- var percent = /([0-9]+)%/.exec(size);
- if(percent) size = parseInt(percent[1]) / 100 * distance[mode == 'hide' ? 0 : 1];
- if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
-
- // Animation
- var animation1 = {}, animation2 = {};
- animation1[ref[0]] = mode == 'show' ? distance[0] : size;
- animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
-
- // Animate
- wrapper.animate(animation1, o.duration / 2, o.options.easing)
- .animate(animation2, o.duration / 2, o.options.easing, function() {
- if(mode == 'hide') el.hide(); // Hide
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(el[0], arguments); // Callback
- el.dequeue();
- });
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Highlight
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Highlight
- *
- * Depends:
- * effects.core.js
- */
-;(function($) {
-
-$.effects.highlight = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['backgroundImage','backgroundColor','opacity'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
- var color = o.options.color || "#ffff99"; // Default highlight color
- var oldColor = el.css("backgroundColor");
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- el.css({backgroundImage: 'none', backgroundColor: color}); // Shift
-
- // Animation
- var animation = {backgroundColor: oldColor };
- if (mode == "hide") animation['opacity'] = 0;
-
- // Animate
- el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
- if(mode == "hide") el.hide();
- $.effects.restore(el, props);
- if (mode == "show" && jQuery.browser.msie) this.style.removeAttribute('filter');
- if(o.callback) o.callback.apply(this, arguments);
- el.dequeue();
- }});
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Pulsate
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Pulsate
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.pulsate = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this);
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
- var times = o.options.times || 5; // Default # of times
-
- // Adjust
- if (mode == 'hide') times--;
- if (el.is(':hidden')) { // Show fadeIn
- el.css('opacity', 0);
- el.show(); // Show
- el.animate({opacity: 1}, o.duration / 2, o.options.easing);
- times = times-2;
- }
-
- // Animate
- for (var i = 0; i < times; i++) { // Pulsate
- el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing);
- };
- if (mode == 'hide') { // Last Pulse
- el.animate({opacity: 0}, o.duration / 2, o.options.easing, function(){
- el.hide(); // Hide
- if(o.callback) o.callback.apply(this, arguments); // Callback
- });
- } else {
- el.animate({opacity: 0}, o.duration / 2, o.options.easing).animate({opacity: 1}, o.duration / 2, o.options.easing, function(){
- if(o.callback) o.callback.apply(this, arguments); // Callback
- });
- };
- el.queue('fx', function() { el.dequeue(); });
- el.dequeue();
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Scale
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Scale
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.puff = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this);
-
- // Set options
- var options = $.extend(true, {}, o.options);
- var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
- var percent = parseInt(o.options.percent) || 150; // Set default puff percent
- options.fade = true; // It's not a puff if it doesn't fade! :)
- var original = {height: el.height(), width: el.width()}; // Save original
-
- // Adjust
- var factor = percent / 100;
- el.from = (mode == 'hide') ? original : {height: original.height * factor, width: original.width * factor};
-
- // Animation
- options.from = el.from;
- options.percent = (mode == 'hide') ? percent : 100;
- options.mode = mode;
-
- // Animate
- el.effect('scale', options, o.duration, o.callback);
- el.dequeue();
- });
-
-};
-
-$.effects.scale = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this);
-
- // Set options
- var options = $.extend(true, {}, o.options);
- var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
- var percent = parseInt(o.options.percent) || (parseInt(o.options.percent) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
- var direction = o.options.direction || 'both'; // Set default axis
- var origin = o.options.origin; // The origin of the scaling
- if (mode != 'effect') { // Set default origin and restore for show/hide
- options.origin = origin || ['middle','center'];
- options.restore = true;
- }
- var original = {height: el.height(), width: el.width()}; // Save original
- el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
-
- // Adjust
- var factor = { // Set scaling factor
- y: direction != 'horizontal' ? (percent / 100) : 1,
- x: direction != 'vertical' ? (percent / 100) : 1
- };
- el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
-
- if (o.options.fade) { // Fade option to support puff
- if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
- if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
- };
-
- // Animation
- options.from = el.from; options.to = el.to; options.mode = mode;
-
- // Animate
- el.effect('size', options, o.duration, o.callback);
- el.dequeue();
- });
-
-};
-
-$.effects.size = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
- var props1 = ['position','top','left','overflow','opacity']; // Always restore
- var props2 = ['width','height','overflow']; // Copy for children
- var cProps = ['fontSize'];
- var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
- var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
- var restore = o.options.restore || false; // Default restore
- var scale = o.options.scale || 'both'; // Default scale mode
- var origin = o.options.origin; // The origin of the sizing
- var original = {height: el.height(), width: el.width()}; // Save original
- el.from = o.options.from || original; // Default from state
- el.to = o.options.to || original; // Default to state
- // Adjust
- if (origin) { // Calculate baseline shifts
- var baseline = $.effects.getBaseline(origin, original);
- el.from.top = (original.height - el.from.height) * baseline.y;
- el.from.left = (original.width - el.from.width) * baseline.x;
- el.to.top = (original.height - el.to.height) * baseline.y;
- el.to.left = (original.width - el.to.width) * baseline.x;
- };
- var factor = { // Set scaling factor
- from: {y: el.from.height / original.height, x: el.from.width / original.width},
- to: {y: el.to.height / original.height, x: el.to.width / original.width}
- };
- if (scale == 'box' || scale == 'both') { // Scale the css box
- if (factor.from.y != factor.to.y) { // Vertical props scaling
- props = props.concat(vProps);
- el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
- el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
- };
- if (factor.from.x != factor.to.x) { // Horizontal props scaling
- props = props.concat(hProps);
- el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
- el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
- };
- };
- if (scale == 'content' || scale == 'both') { // Scale the content
- if (factor.from.y != factor.to.y) { // Vertical props scaling
- props = props.concat(cProps);
- el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
- el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
- };
- };
- $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
- $.effects.createWrapper(el); // Create Wrapper
- el.css('overflow','hidden').css(el.from); // Shift
-
- // Animate
- if (scale == 'content' || scale == 'both') { // Scale the children
- vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
- hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
- props2 = props.concat(vProps).concat(hProps); // Concat
- el.find("*[width]").each(function(){
- child = $(this);
- if (restore) $.effects.save(child, props2);
- var c_original = {height: child.height(), width: child.width()}; // Save original
- child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
- child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
- if (factor.from.y != factor.to.y) { // Vertical props scaling
- child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
- child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
- };
- if (factor.from.x != factor.to.x) { // Horizontal props scaling
- child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
- child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
- };
- child.css(child.from); // Shift children
- child.animate(child.to, o.duration, o.options.easing, function(){
- if (restore) $.effects.restore(child, props2); // Restore children
- }); // Animate children
- });
- };
-
- // Animate
- el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
- if(mode == 'hide') el.hide(); // Hide
- $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(this, arguments); // Callback
- el.dequeue();
- }});
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Shake
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Shake
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.shake = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
- var direction = o.options.direction || 'left'; // Default direction
- var distance = o.options.distance || 20; // Default distance
- var times = o.options.times || 3; // Default # of times
- var speed = o.duration || o.options.duration || 140; // Default speed per shake
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- $.effects.createWrapper(el); // Create Wrapper
- var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
- var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-
- // Animation
- var animation = {}, animation1 = {}, animation2 = {};
- animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
- animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2;
- animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2;
-
- // Animate
- el.animate(animation, speed, o.options.easing);
- for (var i = 1; i < times; i++) { // Shakes
- el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
- };
- el.animate(animation1, speed, o.options.easing).
- animate(animation, speed / 2, o.options.easing, function(){ // Last shake
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(this, arguments); // Callback
- });
- el.queue('fx', function() { el.dequeue(); });
- el.dequeue();
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Slide
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Slide
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.slide = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this), props = ['position','top','left'];
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
- var direction = o.options.direction || 'left'; // Default Direction
-
- // Adjust
- $.effects.save(el, props); el.show(); // Save & Show
- $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
- var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
- var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
- var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
- if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance); // Shift
-
- // Animation
- var animation = {};
- animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
- // Animate
- el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
- if(mode == 'hide') el.hide(); // Hide
- $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
- if(o.callback) o.callback.apply(this, arguments); // Callback
- el.dequeue();
- }});
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Effects Transfer
- *
- * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Effects/Transfer
- *
- * Depends:
- * effects.core.js
- */
-(function($) {
-
-$.effects.transfer = function(o) {
-
- return this.queue(function() {
-
- // Create element
- var el = $(this);
-
- // Set options
- var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
- var target = $(o.options.to); // Find Target
- var position = el.offset();
- var transfer = $('<div class="ui-effects-transfer"></div>').appendTo(document.body);
- if(o.options.className) transfer.addClass(o.options.className);
-
- // Set target css
- transfer.addClass(o.options.className);
- transfer.css({
- top: position.top,
- left: position.left,
- height: el.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')),
- width: el.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth')),
- position: 'absolute'
- });
-
- // Animation
- position = target.offset();
- animation = {
- top: position.top,
- left: position.left,
- height: target.outerHeight() - parseInt(transfer.css('borderTopWidth')) - parseInt(transfer.css('borderBottomWidth')),
- width: target.outerWidth() - parseInt(transfer.css('borderLeftWidth')) - parseInt(transfer.css('borderRightWidth'))
- };
-
- // Animate
- transfer.animate(animation, o.duration, o.options.easing, function() {
- transfer.remove(); // Remove div
- if(o.callback) o.callback.apply(el[0], arguments); // Callback
- el.dequeue();
- });
-
- });
-
-};
-
-})(jQuery);
-/*
- * jQuery UI Accordion
- *
- * Copyright (c) 2007, 2008 Jörn Zaefferer
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Accordion
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-$.widget("ui.accordion", {
- init: function() {
- var options = this.options;
-
- if ( options.navigation ) {
- var current = this.element.find("a").filter(options.navigationFilter);
- if ( current.length ) {
- if ( current.filter(options.header).length ) {
- options.active = current;
- } else {
- options.active = current.parent().parent().prev();
- current.addClass("current");
- }
- }
- }
-
- // calculate active if not specified, using the first header
- options.headers = this.element.find(options.header);
- options.active = findActive(options.headers, options.active);
-
- // IE7-/Win - Extra vertical space in Lists fixed
- if ($.browser.msie) {
- this.element.find('a').css('zoom', '1');
- }
-
- if (!this.element.hasClass("ui-accordion")) {
- this.element.addClass("ui-accordion");
- $("<span class='ui-accordion-left'/>").insertBefore(options.headers);
- $("<span class='ui-accordion-right'/>").appendTo(options.headers);
- options.headers.addClass("ui-accordion-header").attr("tabindex", "0");
- }
-
- var maxHeight;
- if ( options.fillSpace ) {
- maxHeight = this.element.parent().height();
- options.headers.each(function() {
- maxHeight -= $(this).outerHeight();
- });
- var maxPadding = 0;
- options.headers.next().each(function() {
- maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height());
- }).height(maxHeight - maxPadding);
- } else if ( options.autoHeight ) {
- maxHeight = 0;
- options.headers.next().each(function() {
- maxHeight = Math.max(maxHeight, $(this).outerHeight());
- }).height(maxHeight);
- }
-
- options.headers
- .not(options.active || "")
- .next()
- .hide();
- options.active.parent().andSelf().addClass(options.selectedClass);
-
- if (options.event) {
- this.element.bind((options.event) + ".accordion", clickHandler);
- }
- },
- activate: function(index) {
- // call clickHandler with custom event
- clickHandler.call(this.element[0], {
- target: findActive( this.options.headers, index )[0]
- });
- },
- destroy: function() {
- this.options.headers.next().css("display", "");
- if ( this.options.fillSpace || this.options.autoHeight ) {
- this.options.headers.next().css("height", "");
- }
- $.removeData(this.element[0], "accordion");
- this.element.removeClass("ui-accordion").unbind(".accordion");
- }
-});
-
-function scopeCallback(callback, scope) {
- return function() {
- return callback.apply(scope, arguments);
- };
-};
-
-function completed(cancel) {
- // if removed while animated data can be empty
- if (!$.data(this, "accordion")) {
- return;
- }
-
- var instance = $.data(this, "accordion");
- var options = instance.options;
- options.running = cancel ? 0 : --options.running;
- if ( options.running ) {
- return;
- }
- if ( options.clearStyle ) {
- options.toShow.add(options.toHide).css({
- height: "",
- overflow: ""
- });
- }
- $(this).triggerHandler("accordionchange", [null, options.data], options.change);
-}
-
-function toggle(toShow, toHide, data, clickedActive, down) {
- var options = $.data(this, "accordion").options;
- options.toShow = toShow;
- options.toHide = toHide;
- options.data = data;
- var complete = scopeCallback(completed, this);
-
- // count elements to animate
- options.running = toHide.size() === 0 ? toShow.size() : toHide.size();
-
- if ( options.animated ) {
- if ( !options.alwaysOpen && clickedActive ) {
- $.ui.accordion.animations[options.animated]({
- toShow: jQuery([]),
- toHide: toHide,
- complete: complete,
- down: down,
- autoHeight: options.autoHeight
- });
- } else {
- $.ui.accordion.animations[options.animated]({
- toShow: toShow,
- toHide: toHide,
- complete: complete,
- down: down,
- autoHeight: options.autoHeight
- });
- }
- } else {
- if ( !options.alwaysOpen && clickedActive ) {
- toShow.toggle();
- } else {
- toHide.hide();
- toShow.show();
- }
- complete(true);
- }
-}
-
-function clickHandler(event) {
- var options = $.data(this, "accordion").options;
- if (options.disabled) {
- return false;
- }
-
- // called only when using activate(false) to close all parts programmatically
- if ( !event.target && !options.alwaysOpen ) {
- options.active.parent().andSelf().toggleClass(options.selectedClass);
- var toHide = options.active.next(),
- data = {
- options: options,
- newHeader: jQuery([]),
- oldHeader: options.active,
- newContent: jQuery([]),
- oldContent: toHide
- },
- toShow = (options.active = $([]));
- toggle.call(this, toShow, toHide, data );
- return false;
- }
- // get the click target
- var clicked = $(event.target);
-
- // due to the event delegation model, we have to check if one
- // of the parent elements is our actual header, and find that
- // otherwise stick with the initial target
- clicked = $( clicked.parents(options.header)[0] || clicked );
-
- var clickedActive = clicked[0] == options.active[0];
-
- // if animations are still active, or the active header is the target, ignore click
- if (options.running || (options.alwaysOpen && clickedActive)) {
- return false;
- }
- if (!clicked.is(options.header)) {
- return;
- }
-
- // switch classes
- options.active.parent().andSelf().toggleClass(options.selectedClass);
- if ( !clickedActive ) {
- clicked.parent().andSelf().addClass(options.selectedClass);
- }
-
- // find elements to show and hide
- var toShow = clicked.next(),
- toHide = options.active.next(),
- //data = [clicked, options.active, toShow, toHide],
- data = {
- options: options,
- newHeader: clicked,
- oldHeader: options.active,
- newContent: toShow,
- oldContent: toHide
- },
- down = options.headers.index( options.active[0] ) > options.headers.index( clicked[0] );
-
- options.active = clickedActive ? $([]) : clicked;
- toggle.call(this, toShow, toHide, data, clickedActive, down );
-
- return false;
-};
-
-function findActive(headers, selector) {
- return selector != undefined
- ? typeof selector == "number"
- ? headers.filter(":eq(" + selector + ")")
- : headers.not(headers.not(selector))
- : selector === false
- ? $([])
- : headers.filter(":eq(0)");
-}
-
-$.extend($.ui.accordion, {
- defaults: {
- selectedClass: "selected",
- alwaysOpen: true,
- animated: 'slide',
- event: "click",
- header: "a",
- autoHeight: true,
- running: 0,
- navigationFilter: function() {
- return this.href.toLowerCase() == location.href.toLowerCase();
- }
- },
- animations: {
- slide: function(options, additions) {
- options = $.extend({
- easing: "swing",
- duration: 300
- }, options, additions);
- if ( !options.toHide.size() ) {
- options.toShow.animate({height: "show"}, options);
- return;
- }
- var hideHeight = options.toHide.height(),
- showHeight = options.toShow.height(),
- difference = showHeight / hideHeight;
- options.toShow.css({ height: 0, overflow: 'hidden' }).show();
- options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate({height:"hide"},{
- step: function(now) {
- var current = (hideHeight - now) * difference;
- if ($.browser.msie || $.browser.opera) {
- current = Math.ceil(current);
- }
- options.toShow.height( current );
- },
- duration: options.duration,
- easing: options.easing,
- complete: function() {
- if ( !options.autoHeight ) {
- options.toShow.css("height", "auto");
- }
- options.complete();
- }
- });
- },
- bounceslide: function(options) {
- this.slide(options, {
- easing: options.down ? "bounceout" : "swing",
- duration: options.down ? 1000 : 200
- });
- },
- easeslide: function(options) {
- this.slide(options, {
- easing: "easeinout",
- duration: 700
- });
- }
- }
-});
-
-// deprecated, use accordion("activate", index) instead
-$.fn.activate = function(index) {
- return this.accordion("activate", index);
-};
-
-})(jQuery);
-/*
- * jQuery UI Datepicker
- *
- * Copyright (c) 2006, 2007, 2008 Marc Grabanski
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Datepicker
- *
- * Depends:
- * ui.core.js
- *
- * Marc Grabanski (m@marcgrabanski.com) and Keith Wood (kbwood@virginbroadband.com.au).
- */
-
-(function($) { // hide the namespace
-
-/* Date picker manager.
- Use the singleton instance of this class, $.datepicker, to interact with the date picker.
- Settings for (groups of) date pickers are maintained in an instance object
- (DatepickerInstance), allowing multiple different settings on the same page. */
-
-function Datepicker() {
- this.debug = false; // Change this to true to start debugging
- this._nextId = 0; // Next ID for a date picker instance
- this._inst = []; // List of instances indexed by ID
- this._curInst = null; // The current instance in use
- this._disabledInputs = []; // List of date picker inputs that have been disabled
- this._datepickerShowing = false; // True if the popup picker is showing , false if not
- this._inDialog = false; // True if showing within a "dialog", false if not
- this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
- this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
- this._wrapClass = 'ui-datepicker-wrap'; // The name of the wrapper marker class
- this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
- this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
- this._promptClass = 'ui-datepicker-prompt'; // The name of the dialog prompt marker class
- this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
- this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
- this.regional = []; // Available regional settings, indexed by language code
- this.regional[''] = { // Default regional settings
- clearText: 'Clear', // Display text for clear link
- clearStatus: 'Erase the current date', // Status text for clear link
- closeText: 'Close', // Display text for close link
- closeStatus: 'Close without change', // Status text for close link
- prevText: '&#x3c;Prev', // Display text for previous month link
- prevStatus: 'Show the previous month', // Status text for previous month link
- nextText: 'Next&#x3e;', // Display text for next month link
- nextStatus: 'Show the next month', // Status text for next month link
- currentText: 'Today', // Display text for current month link
- currentStatus: 'Show the current month', // Status text for current month link
- monthNames: ['January','February','March','April','May','June',
- 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
- monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
- monthStatus: 'Show a different month', // Status text for selecting a month
- yearStatus: 'Show a different year', // Status text for selecting a year
- weekHeader: 'Wk', // Header for the week of the year column
- weekStatus: 'Week of the year', // Status text for the week of the year column
- dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
- dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
- dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
- dayStatus: 'Set DD as first week day', // Status text for the day of the week selection
- dateStatus: 'Select DD, M d', // Status text for the date selection
- dateFormat: 'mm/dd/yy', // See format options on parseDate
- firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
- initStatus: 'Select a date', // Initial Status text on opening
- isRTL: false // True if right-to-left language, false if left-to-right
- };
- this._defaults = { // Global defaults for all the date picker instances
- showOn: 'focus', // 'focus' for popup on focus,
- // 'button' for trigger button, or 'both' for either
- showAnim: 'show', // Name of jQuery animation for popup
- defaultDate: null, // Used when field is blank: actual date,
- // +/-number for offset from today, null for today
- appendText: '', // Display text following the input box, e.g. showing the format
- buttonText: '...', // Text for trigger button
- buttonImage: '', // URL for trigger button image
- buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
- closeAtTop: true, // True to have the clear/close at the top,
- // false to have them at the bottom
- mandatory: false, // True to hide the Clear link, false to include it
- hideIfNoPrevNext: false, // True to hide next/previous month links
- // if not applicable, false to just disable them
- navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
- changeMonth: true, // True if month can be selected directly, false if only prev/next
- changeYear: true, // True if year can be selected directly, false if only prev/next
- yearRange: '-10:+10', // Range of years to display in drop-down,
- // either relative to current year (-nn:+nn) or absolute (nnnn:nnnn)
- changeFirstDay: true, // True to click on day name to change, false to remain as set
- highlightWeek: false, // True to highlight the selected week
- showOtherMonths: false, // True to show dates in other months, false to leave blank
- showWeeks: false, // True to show week of the year, false to omit
- calculateWeek: this.iso8601Week, // How to calculate the week of the year,
- // takes a Date and returns the number of the week for it
- shortYearCutoff: '+10', // Short year values < this are in the current century,
- // > this are in the previous century,
- // string value starting with '+' for current year + value
- showStatus: false, // True to show status bar at bottom, false to not show it
- statusForDate: this.dateStatus, // Function to provide status text for a date -
- // takes date and instance as parameters, returns display text
- minDate: null, // The earliest selectable date, or null for no limit
- maxDate: null, // The latest selectable date, or null for no limit
- speed: 'normal', // Speed of display/closure
- beforeShowDay: null, // Function that takes a date and returns an array with
- // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
- // [2] = cell title (optional), e.g. $.datepicker.noWeekends
- beforeShow: null, // Function that takes an input field and
- // returns a set of custom settings for the date picker
- onSelect: null, // Define a callback function when a date is selected
- onChangeMonthYear: null, // Define a callback function when the month or year is changed
- onClose: null, // Define a callback function when the datepicker is closed
- numberOfMonths: 1, // Number of months to show at a time
- stepMonths: 1, // Number of months to step back/forward
- rangeSelect: false, // Allows for selecting a date range on one date picker
- rangeSeparator: ' - ', // Text between two dates in a range
- altField: '', // Selector for an alternate field to store selected dates into
- altFormat: '' // The date format to use for the alternate field
- };
- $.extend(this._defaults, this.regional['']);
- this._datepickerDiv = $('<div id="' + this._mainDivId + '"></div>');
-}
-
-$.extend(Datepicker.prototype, {
- /* Class name added to elements to indicate already configured with a date picker. */
- markerClassName: 'hasDatepicker',
-
- /* Debug logging (if enabled). */
- log: function () {
- if (this.debug)
- console.log.apply('', arguments);
- },
-
- /* Register a new date picker instance - with custom settings. */
- _register: function(inst) {
- var id = this._nextId++;
- this._inst[id] = inst;
- return id;
- },
-
- /* Retrieve a particular date picker instance based on its ID. */
- _getInst: function(id) {
- return this._inst[id] || id;
- },
-
- /* Override the default settings for all instances of the date picker.
- @param settings object - the new settings to use as defaults (anonymous object)
- @return the manager object */
- setDefaults: function(settings) {
- extendRemove(this._defaults, settings || {});
- return this;
- },
-
- /* Attach the date picker to a jQuery selection.
- @param target element - the target input field or division or span
- @param settings object - the new settings to use for this date picker instance (anonymous) */
- _attachDatepicker: function(target, settings) {
- // check for settings on the control itself - in namespace 'date:'
- var inlineSettings = null;
- for (attrName in this._defaults) {
- var attrValue = target.getAttribute('date:' + attrName);
- if (attrValue) {
- inlineSettings = inlineSettings || {};
- try {
- inlineSettings[attrName] = eval(attrValue);
- } catch (err) {
- inlineSettings[attrName] = attrValue;
- }
- }
- }
- var nodeName = target.nodeName.toLowerCase();
- var instSettings = (inlineSettings ?
- $.extend(settings || {}, inlineSettings) : settings);
- if (nodeName == 'input') {
- var inst = (inst && !inlineSettings ? inst :
- new DatepickerInstance(instSettings, false));
- this._connectDatepicker(target, inst);
- } else if (nodeName == 'div' || nodeName == 'span') {
- var inst = new DatepickerInstance(instSettings, true);
- this._inlineDatepicker(target, inst);
- }
- },
-
- /* Detach a datepicker from its control.
- @param target element - the target input field or division or span */
- _destroyDatepicker: function(target) {
- var nodeName = target.nodeName.toLowerCase();
- var calId = target._calId;
- var $target = $(target);
- $target.removeAttr('_calId');
- if (nodeName == 'input') {
- $target.siblings('.' + this._appendClass).replaceWith('').end()
- .siblings('.' + this._triggerClass).replaceWith('').end()
- .removeClass(this.markerClassName)
- .unbind('focus', this._showDatepicker)
- .unbind('keydown', this._doKeyDown)
- .unbind('keypress', this._doKeyPress);
- var wrapper = $target.parents('.' + this._wrapClass);
- if (wrapper)
- wrapper.siblings('.' + this._appendClass).replaceWith('').end()
- .replaceWith(wrapper.html());
- } else if (nodeName == 'div' || nodeName == 'span')
- $target.removeClass(this.markerClassName).empty();
- if ($('input[_calId=' + calId + ']').length == 0)
- // clean up if last for this ID
- this._inst[calId] = null;
- },
-
- /* Enable the date picker to a jQuery selection.
- @param target element - the target input field or division or span */
- _enableDatepicker: function(target) {
- target.disabled = false;
- $(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = false; }).end()
- .siblings('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''});
- this._disabledInputs = $.map(this._disabledInputs,
- function(value) { return (value == target ? null : value); }); // delete entry
- },
-
- /* Disable the date picker to a jQuery selection.
- @param target element - the target input field or division or span */
- _disableDatepicker: function(target) {
- target.disabled = true;
- $(target).siblings('button.' + this._triggerClass).each(function() { this.disabled = true; }).end()
- .siblings('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'});
- this._disabledInputs = $.map($.datepicker._disabledInputs,
- function(value) { return (value == target ? null : value); }); // delete entry
- this._disabledInputs[$.datepicker._disabledInputs.length] = target;
- },
-
- /* Is the first field in a jQuery collection disabled as a datepicker?
- @param target element - the target input field or division or span
- @return boolean - true if disabled, false if enabled */
- _isDisabledDatepicker: function(target) {
- if (!target)
- return false;
- for (var i = 0; i < this._disabledInputs.length; i++) {
- if (this._disabledInputs[i] == target)
- return true;
- }
- return false;
- },
-
- /* Update the settings for a date picker attached to an input field or division.
- @param target element - the target input field or division or span
- @param name string - the name of the setting to change or
- object - the new settings to update
- @param value any - the new value for the setting (omit if above is an object) */
- _changeDatepicker: function(target, name, value) {
- var settings = name || {};
- if (typeof name == 'string') {
- settings = {};
- settings[name] = value;
- }
- if (inst = this._getInst(target._calId)) {
- extendRemove(inst._settings, settings);
- this._updateDatepicker(inst);
- }
- },
-
- /* Set the dates for a jQuery selection.
- @param target element - the target input field or division or span
- @param date Date - the new date
- @param endDate Date - the new end date for a range (optional) */
- _setDateDatepicker: function(target, date, endDate) {
- if (inst = this._getInst(target._calId)) {
- inst._setDate(date, endDate);
- this._updateDatepicker(inst);
- }
- },
-
- /* Get the date(s) for the first entry in a jQuery selection.
- @param target element - the target input field or division or span
- @return Date - the current date or
- Date[2] - the current dates for a range */
- _getDateDatepicker: function(target) {
- var inst = this._getInst(target._calId);
- if (inst)
- inst._setDateFromField($(target));
- return (inst ? inst._getDate() : null);
- },
-
- /* Handle keystrokes. */
- _doKeyDown: function(e) {
- var inst = $.datepicker._getInst(this._calId);
- if ($.datepicker._datepickerShowing)
- switch (e.keyCode) {
- case 9: $.datepicker._hideDatepicker(null, '');
- break; // hide on tab out
- case 13: $.datepicker._selectDay(inst, inst._selectedMonth, inst._selectedYear,
- $('td.ui-datepicker-days-cell-over', inst._datepickerDiv)[0]);
- return false; // don't submit the form
- break; // select the value on enter
- case 27: $.datepicker._hideDatepicker(null, inst._get('speed'));
- break; // hide on escape
- case 33: $.datepicker._adjustDate(inst,
- (e.ctrlKey ? -1 : -inst._get('stepMonths')), (e.ctrlKey ? 'Y' : 'M'));
- break; // previous month/year on page up/+ ctrl
- case 34: $.datepicker._adjustDate(inst,
- (e.ctrlKey ? +1 : +inst._get('stepMonths')), (e.ctrlKey ? 'Y' : 'M'));
- break; // next month/year on page down/+ ctrl
- case 35: if (e.ctrlKey) $.datepicker._clearDate(inst);
- break; // clear on ctrl+end
- case 36: if (e.ctrlKey) $.datepicker._gotoToday(inst);
- break; // current on ctrl+home
- case 37: if (e.ctrlKey) $.datepicker._adjustDate(inst, -1, 'D');
- break; // -1 day on ctrl+left
- case 38: if (e.ctrlKey) $.datepicker._adjustDate(inst, -7, 'D');
- break; // -1 week on ctrl+up
- case 39: if (e.ctrlKey) $.datepicker._adjustDate(inst, +1, 'D');
- break; // +1 day on ctrl+right
- case 40: if (e.ctrlKey) $.datepicker._adjustDate(inst, +7, 'D');
- break; // +1 week on ctrl+down
- }
- else if (e.keyCode == 36 && e.ctrlKey) // display the date picker on ctrl+home
- $.datepicker._showDatepicker(this);
- },
-
- /* Filter entered characters - based on date format. */
- _doKeyPress: function(e) {
- var inst = $.datepicker._getInst(this._calId);
- var chars = $.datepicker._possibleChars(inst._get('dateFormat'));
- var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode : e.charCode);
- return e.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
- },
-
- /* Attach the date picker to an input field. */
- _connectDatepicker: function(target, inst) {
- var input = $(target);
- if (input.hasClass(this.markerClassName))
- return;
- var appendText = inst._get('appendText');
- var isRTL = inst._get('isRTL');
- if (appendText)
- input[isRTL ? 'before' : 'after']('<span class="' + this._appendClass + '">' + appendText + '</span>');
- var showOn = inst._get('showOn');
- if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
- input.focus(this._showDatepicker);
- if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
- input.wrap('<span class="' + this._wrapClass + '"></span>');
- var buttonText = inst._get('buttonText');
- var buttonImage = inst._get('buttonImage');
- var trigger = $(inst._get('buttonImageOnly') ?
- $('<img/>').addClass(this._triggerClass).attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
- $('<button></button>').addClass(this._triggerClass).html(buttonImage != '' ?
- $('<img/>').attr({ src:buttonImage, alt:buttonText, title:buttonText }) : buttonText));
- input[isRTL ? 'before' : 'after'](trigger);
- trigger.click(function() {
- if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target)
- $.datepicker._hideDatepicker();
- else
- $.datepicker._showDatepicker(target);
- });
- }
- input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress)
- .bind("setData.datepicker", function(event, key, value) {
- inst._settings[key] = value;
- }).bind("getData.datepicker", function(event, key) {
- return inst._get(key);
- });
- input[0]._calId = inst._id;
- },
-
- /* Attach an inline date picker to a div. */
- _inlineDatepicker: function(target, inst) {
- var input = $(target);
- if (input.hasClass(this.markerClassName))
- return;
- input.addClass(this.markerClassName).append(inst._datepickerDiv)
- .bind("setData.datepicker", function(event, key, value){
- inst._settings[key] = value;
- }).bind("getData.datepicker", function(event, key){
- return inst._get(key);
- });
- input[0]._calId = inst._id;
- this._updateDatepicker(inst);
- },
-
- /* Tidy up after displaying the date picker. */
- _inlineShow: function(inst) {
- var numMonths = inst._getNumberOfMonths(); // fix width for dynamic number of date pickers
- inst._datepickerDiv.width(numMonths[1] * $('.ui-datepicker', inst._datepickerDiv[0]).width());
- },
-
- /* Pop-up the date picker in a "dialog" box.
- @param input element - ignored
- @param dateText string - the initial date to display (in the current format)
- @param onSelect function - the function(dateText) to call when a date is selected
- @param settings object - update the dialog date picker instance's settings (anonymous object)
- @param pos int[2] - coordinates for the dialog's position within the screen or
- event - with x/y coordinates or
- leave empty for default (screen centre)
- @return the manager object */
- _dialogDatepicker: function(input, dateText, onSelect, settings, pos) {
- var inst = this._dialogInst; // internal instance
- if (!inst) {
- inst = this._dialogInst = new DatepickerInstance({}, false);
- this._dialogInput = $('<input type="text" size="1" style="position: absolute; top: -100px;"/>');
- this._dialogInput.keydown(this._doKeyDown);
- $('body').append(this._dialogInput);
- this._dialogInput[0]._calId = inst._id;
- }
- extendRemove(inst._settings, settings || {});
- this._dialogInput.val(dateText);
-
- this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
- if (!this._pos) {
- var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
- var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
- var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
- var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
- this._pos = // should use actual width/height below
- [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
- }
-
- // move input on screen for focus, but hidden behind dialog
- this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px');
- inst._settings.onSelect = onSelect;
- this._inDialog = true;
- this._datepickerDiv.addClass(this._dialogClass);
- this._showDatepicker(this._dialogInput[0]);
- if ($.blockUI)
- $.blockUI(this._datepickerDiv);
- return this;
- },
-
- /* Pop-up the date picker for a given input field.
- @param input element - the input field attached to the date picker or
- event - if triggered by focus */
- _showDatepicker: function(input) {
- input = input.target || input;
- if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
- input = $('input', input.parentNode)[0];
- if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
- return;
- var inst = $.datepicker._getInst(input._calId);
- var beforeShow = inst._get('beforeShow');
- extendRemove(inst._settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
- $.datepicker._hideDatepicker(null, '');
- $.datepicker._lastInput = input;
- inst._setDateFromField(input);
- if ($.datepicker._inDialog) // hide cursor
- input.value = '';
- if (!$.datepicker._pos) { // position below input
- $.datepicker._pos = $.datepicker._findPos(input);
- $.datepicker._pos[1] += input.offsetHeight; // add the height
- }
- var isFixed = false;
- $(input).parents().each(function() {
- isFixed |= $(this).css('position') == 'fixed';
- return !isFixed;
- });
- if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
- $.datepicker._pos[0] -= document.documentElement.scrollLeft;
- $.datepicker._pos[1] -= document.documentElement.scrollTop;
- }
- var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
- $.datepicker._pos = null;
- inst._rangeStart = null;
- // determine sizing offscreen
- inst._datepickerDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
- $.datepicker._updateDatepicker(inst);
- // fix width for dynamic number of date pickers
- inst._datepickerDiv.width(inst._getNumberOfMonths()[1] *
- $('.ui-datepicker', inst._datepickerDiv[0])[0].offsetWidth);
- // and adjust position before showing
- offset = $.datepicker._checkOffset(inst, offset, isFixed);
- inst._datepickerDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
- 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
- left: offset.left + 'px', top: offset.top + 'px'});
- if (!inst._inline) {
- var showAnim = inst._get('showAnim') || 'show';
- var speed = inst._get('speed');
- var postProcess = function() {
- $.datepicker._datepickerShowing = true;
- if ($.browser.msie && parseInt($.browser.version) < 7) // fix IE < 7 select problems
- $('iframe.ui-datepicker-cover').css({width: inst._datepickerDiv.width() + 4,
- height: inst._datepickerDiv.height() + 4});
- };
- inst._datepickerDiv[showAnim](speed, postProcess);
- if (speed == '')
- postProcess();
- if (inst._input[0].type != 'hidden')
- inst._input[0].focus();
- $.datepicker._curInst = inst;
- }
- },
-
- /* Generate the date picker content. */
- _updateDatepicker: function(inst) {
- var dims = {width: inst._datepickerDiv.width() + 4,
- height: inst._datepickerDiv.height() + 4};
- inst._datepickerDiv.empty().append(inst._generateDatepicker()).
- find('iframe.ui-datepicker-cover').
- css({width: dims.width, height: dims.height});
- var numMonths = inst._getNumberOfMonths();
- if (numMonths[0] != 1 || numMonths[1] != 1)
- inst._datepickerDiv.addClass('ui-datepicker-multi');
- else
- inst._datepickerDiv.removeClass('ui-datepicker-multi');
-
- if (inst._get('isRTL'))
- inst._datepickerDiv.addClass('ui-datepicker-rtl');
- else
- inst._datepickerDiv.removeClass('ui-datepicker-rtl');
-
- if (inst._input && inst._input[0].type != 'hidden')
- $(inst._input[0]).focus();
- },
-
- /* Check positioning to remain on screen. */
- _checkOffset: function(inst, offset, isFixed) {
- var pos = inst._input ? $.datepicker._findPos(inst._input[0]) : null;
- var browserWidth = window.innerWidth || document.documentElement.clientWidth;
- var browserHeight = window.innerHeight || document.documentElement.clientHeight;
- var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
- var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
- // reposition date picker horizontally if outside the browser window
- if ((offset.left + inst._datepickerDiv.width() - scrollX) > browserWidth)
- offset.left = Math.max((isFixed ? 0 : scrollX),
- pos[0] + (inst._input ? inst._input.width() : 0) - (isFixed ? scrollX : 0) - inst._datepickerDiv.width() -
- (isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0));
- else
- offset.left -= (isFixed ? scrollX : 0);
- // reposition date picker vertically if outside the browser window
- if ((offset.top + inst._datepickerDiv.height() - scrollY) > browserHeight)
- offset.top = Math.max((isFixed ? 0 : scrollY),
- pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst._datepickerDiv.height()) -
- (isFixed && $.browser.opera ? document.documentElement.scrollTop : 0));
- else
- offset.top -= (isFixed ? scrollY : 0);
- return offset;
- },
-
- /* Find an object's position on the screen. */
- _findPos: function(obj) {
- while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
- obj = obj.nextSibling;
- }
- var position = $(obj).offset();
- return [position.left, position.top];
- },
-
- /* Hide the date picker from view.
- @param input element - the input field attached to the date picker
- @param speed string - the speed at which to close the date picker */
- _hideDatepicker: function(input, speed) {
- var inst = this._curInst;
- if (!inst)
- return;
- var rangeSelect = inst._get('rangeSelect');
- if (rangeSelect && this._stayOpen)
- this._selectDate(inst, inst._formatDate(
- inst._currentDay, inst._currentMonth, inst._currentYear));
- this._stayOpen = false;
- if (this._datepickerShowing) {
- speed = (speed != null ? speed : inst._get('speed'));
- var showAnim = inst._get('showAnim');
- inst._datepickerDiv[(showAnim == 'slideDown' ? 'slideUp' :
- (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](speed, function() {
- $.datepicker._tidyDialog(inst);
- });
- if (speed == '')
- this._tidyDialog(inst);
- var onClose = inst._get('onClose');
- if (onClose)
- onClose.apply((inst._input ? inst._input[0] : null),
- [inst._getDate(), inst]); // trigger custom callback
- this._datepickerShowing = false;
- this._lastInput = null;
- inst._settings.prompt = null;
- if (this._inDialog) {
- this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
- if ($.blockUI) {
- $.unblockUI();
- $('body').append(this._datepickerDiv);
- }
- }
- this._inDialog = false;
- }
- this._curInst = null;
- },
-
- /* Tidy up after a dialog display. */
- _tidyDialog: function(inst) {
- inst._datepickerDiv.removeClass(this._dialogClass).unbind('.ui-datepicker');
- $('.' + this._promptClass, inst._datepickerDiv).remove();
- },
-
- /* Close date picker if clicked elsewhere. */
- _checkExternalClick: function(event) {
- if (!$.datepicker._curInst)
- return;
- var $target = $(event.target);
- if (($target.parents('#' + $.datepicker._mainDivId).length == 0) &&
- !$target.hasClass($.datepicker.markerClassName) &&
- !$target.hasClass($.datepicker._triggerClass) &&
- $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
- $.datepicker._hideDatepicker(null, '');
- },
-
- /* Adjust one of the date sub-fields. */
- _adjustDate: function(id, offset, period) {
- var inst = this._getInst(id);
- inst._adjustDate(offset, period);
- this._updateDatepicker(inst);
- },
-
- /* Action for current link. */
- _gotoToday: function(id) {
- var date = new Date();
- var inst = this._getInst(id);
- inst._selectedDay = date.getDate();
- inst._drawMonth = inst._selectedMonth = date.getMonth();
- inst._drawYear = inst._selectedYear = date.getFullYear();
- this._adjustDate(inst);
- inst._notifyChange();
- },
-
- /* Action for selecting a new month/year. */
- _selectMonthYear: function(id, select, period) {
- var inst = this._getInst(id);
- inst._selectingMonthYear = false;
- inst[period == 'M' ? '_drawMonth' : '_drawYear'] =
- select.options[select.selectedIndex].value - 0;
- this._adjustDate(inst);
- inst._notifyChange();
- },
-
- /* Restore input focus after not changing month/year. */
- _clickMonthYear: function(id) {
- var inst = this._getInst(id);
- if (inst._input && inst._selectingMonthYear && !$.browser.msie)
- inst._input[0].focus();
- inst._selectingMonthYear = !inst._selectingMonthYear;
- },
-
- /* Action for changing the first week day. */
- _changeFirstDay: function(id, day) {
- var inst = this._getInst(id);
- inst._settings.firstDay = day;
- this._updateDatepicker(inst);
- },
-
- /* Action for selecting a day. */
- _selectDay: function(id, month, year, td) {
- if ($(td).hasClass(this._unselectableClass))
- return;
- var inst = this._getInst(id);
- var rangeSelect = inst._get('rangeSelect');
- if (rangeSelect) {
- this._stayOpen = !this._stayOpen;
- if (this._stayOpen) {
- $('.ui-datepicker td').removeClass(this._currentClass);
- $(td).addClass(this._currentClass);
- }
- }
- inst._selectedDay = inst._currentDay = $('a', td).html();
- inst._selectedMonth = inst._currentMonth = month;
- inst._selectedYear = inst._currentYear = year;
- if (this._stayOpen) {
- inst._endDay = inst._endMonth = inst._endYear = null;
- }
- else if (rangeSelect) {
- inst._endDay = inst._currentDay;
- inst._endMonth = inst._currentMonth;
- inst._endYear = inst._currentYear;
- }
- this._selectDate(id, inst._formatDate(
- inst._currentDay, inst._currentMonth, inst._currentYear));
- if (this._stayOpen) {
- inst._rangeStart = new Date(inst._currentYear, inst._currentMonth, inst._currentDay);
- this._updateDatepicker(inst);
- }
- else if (rangeSelect) {
- inst._selectedDay = inst._currentDay = inst._rangeStart.getDate();
- inst._selectedMonth = inst._currentMonth = inst._rangeStart.getMonth();
- inst._selectedYear = inst._currentYear = inst._rangeStart.getFullYear();
- inst._rangeStart = null;
- if (inst._inline)
- this._updateDatepicker(inst);
- }
- },
-
- /* Erase the input field and hide the date picker. */
- _clearDate: function(id) {
- var inst = this._getInst(id);
- if (inst._get('mandatory'))
- return;
- this._stayOpen = false;
- inst._endDay = inst._endMonth = inst._endYear = inst._rangeStart = null;
- this._selectDate(inst, '');
- },
-
- /* Update the input field with the selected date. */
- _selectDate: function(id, dateStr) {
- var inst = this._getInst(id);
- dateStr = (dateStr != null ? dateStr : inst._formatDate());
- if (inst._get('rangeSelect') && dateStr)
- dateStr = (inst._rangeStart ? inst._formatDate(inst._rangeStart) :
- dateStr) + inst._get('rangeSeparator') + dateStr;
- if (inst._input)
- inst._input.val(dateStr);
- this._updateAlternate(inst);
- var onSelect = inst._get('onSelect');
- if (onSelect)
- onSelect.apply((inst._input ? inst._input[0] : null), [dateStr, inst]); // trigger custom callback
- else if (inst._input)
- inst._input.trigger('change'); // fire the change event
- if (inst._inline)
- this._updateDatepicker(inst);
- else if (!this._stayOpen) {
- this._hideDatepicker(null, inst._get('speed'));
- this._lastInput = inst._input[0];
- if (typeof(inst._input[0]) != 'object')
- inst._input[0].focus(); // restore focus
- this._lastInput = null;
- }
- },
-
- /* Update any alternate field to synchronise with the main field. */
- _updateAlternate: function(inst) {
- var altField = inst._get('altField');
- if (altField) { // update alternate field too
- var altFormat = inst._get('altFormat');
- var date = inst._getDate();
- dateStr = (isArray(date) ? (!date[0] && !date[1] ? '' :
- $.datepicker.formatDate(altFormat, date[0], inst._getFormatConfig()) +
- inst._get('rangeSeparator') + $.datepicker.formatDate(
- altFormat, date[1] || date[0], inst._getFormatConfig())) :
- $.datepicker.formatDate(altFormat, date, inst._getFormatConfig()));
- $(altField).each(function() { $(this).val(dateStr); });
- }
- },
-
- /* Set as beforeShowDay function to prevent selection of weekends.
- @param date Date - the date to customise
- @return [boolean, string] - is this date selectable?, what is its CSS class? */
- noWeekends: function(date) {
- var day = date.getDay();
- return [(day > 0 && day < 6), ''];
- },
-
- /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
- @param date Date - the date to get the week for
- @return number - the number of the week within the year that contains this date */
- iso8601Week: function(date) {
- var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), (date.getTimezoneOffset() / -60));
- var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First week always contains 4 Jan
- var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun = 7
- firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday
- if (firstDay < 4 && checkDate < firstMon) { // Adjust first three days in year if necessary
- checkDate.setDate(checkDate.getDate() - 3); // Generate for previous year
- return $.datepicker.iso8601Week(checkDate);
- } else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) { // Check last three days in year
- firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7;
- if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) { // Adjust if necessary
- checkDate.setDate(checkDate.getDate() + 3); // Generate for next year
- return $.datepicker.iso8601Week(checkDate);
- }
- }
- return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1; // Weeks to given date
- },
-
- /* Provide status text for a particular date.
- @param date the date to get the status for
- @param inst the current datepicker instance
- @return the status display text for this date */
- dateStatus: function(date, inst) {
- return $.datepicker.formatDate(inst._get('dateStatus'), date, inst._getFormatConfig());
- },
-
- /* Parse a string value into a date object.
- The format can be combinations of the following:
- d - day of month (no leading zero)
- dd - day of month (two digit)
- D - day name short
- DD - day name long
- m - month of year (no leading zero)
- mm - month of year (two digit)
- M - month name short
- MM - month name long
- y - year (two digit)
- yy - year (four digit)
- '...' - literal text
- '' - single quote
-
- @param format String - the expected format of the date
- @param value String - the date in the above format
- @param settings Object - attributes include:
- shortYearCutoff Number - the cutoff year for determining the century (optional)
- dayNamesShort String[7] - abbreviated names of the days from Sunday (optional)
- dayNames String[7] - names of the days from Sunday (optional)
- monthNamesShort String[12] - abbreviated names of the months (optional)
- monthNames String[12] - names of the months (optional)
- @return Date - the extracted date value or null if value is blank */
- parseDate: function (format, value, settings) {
- if (format == null || value == null)
- throw 'Invalid arguments';
- value = (typeof value == 'object' ? value.toString() : value + '');
- if (value == '')
- return null;
- var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
- var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
- var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
- var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
- var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
- var year = -1;
- var month = -1;
- var day = -1;
- var literal = false;
- // Check whether a format character is doubled
- var lookAhead = function(match) {
- var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
- if (matches)
- iFormat++;
- return matches;
- };
- // Extract a number from the string value
- var getNumber = function(match) {
- lookAhead(match);
- var size = (match == 'y' ? 4 : 2);
- var num = 0;
- while (size > 0 && iValue < value.length &&
- value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') {
- num = num * 10 + (value.charAt(iValue++) - 0);
- size--;
- }
- if (size == (match == 'y' ? 4 : 2))
- throw 'Missing number at position ' + iValue;
- return num;
- };
- // Extract a name from the string value and convert to an index
- var getName = function(match, shortNames, longNames) {
- var names = (lookAhead(match) ? longNames : shortNames);
- var size = 0;
- for (var j = 0; j < names.length; j++)
- size = Math.max(size, names[j].length);
- var name = '';
- var iInit = iValue;
- while (size > 0 && iValue < value.length) {
- name += value.charAt(iValue++);
- for (var i = 0; i < names.length; i++)
- if (name == names[i])
- return i + 1;
- size--;
- }
- throw 'Unknown name at position ' + iInit;
- };
- // Confirm that a literal character matches the string value
- var checkLiteral = function() {
- if (value.charAt(iValue) != format.charAt(iFormat))
- throw 'Unexpected literal at position ' + iValue;
- iValue++;
- };
- var iValue = 0;
- for (var iFormat = 0; iFormat < format.length; iFormat++) {
- if (literal)
- if (format.charAt(iFormat) == "'" && !lookAhead("'"))
- literal = false;
- else
- checkLiteral();
- else
- switch (format.charAt(iFormat)) {
- case 'd':
- day = getNumber('d');
- break;
- case 'D':
- getName('D', dayNamesShort, dayNames);
- break;
- case 'm':
- month = getNumber('m');
- break;
- case 'M':
- month = getName('M', monthNamesShort, monthNames);
- break;
- case 'y':
- year = getNumber('y');
- break;
- case "'":
- if (lookAhead("'"))
- checkLiteral();
- else
- literal = true;
- break;
- default:
- checkLiteral();
- }
- }
- if (year < 100)
- year += new Date().getFullYear() - new Date().getFullYear() % 100 +
- (year <= shortYearCutoff ? 0 : -100);
- var date = new Date(year, month - 1, day);
- if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
- throw 'Invalid date'; // E.g. 31/02/*
- return date;
- },
-
- /* Format a date object into a string value.
- The format can be combinations of the following:
- d - day of month (no leading zero)
- dd - day of month (two digit)
- D - day name short
- DD - day name long
- m - month of year (no leading zero)
- mm - month of year (two digit)
- M - month name short
- MM - month name long
- y - year (two digit)
- yy - year (four digit)
- '...' - literal text
- '' - single quote
-
- @param format String - the desired format of the date
- @param date Date - the date value to format
- @param settings Object - attributes include:
- dayNamesShort String[7] - abbreviated names of the days from Sunday (optional)
- dayNames String[7] - names of the days from Sunday (optional)
- monthNamesShort String[12] - abbreviated names of the months (optional)
- monthNames String[12] - names of the months (optional)
- @return String - the date in the above format */
- formatDate: function (format, date, settings) {
- if (!date)
- return '';
- var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
- var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
- var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
- var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
- // Check whether a format character is doubled
- var lookAhead = function(match) {
- var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
- if (matches)
- iFormat++;
- return matches;
- };
- // Format a number, with leading zero if necessary
- var formatNumber = function(match, value) {
- return (lookAhead(match) && value < 10 ? '0' : '') + value;
- };
- // Format a name, short or long as requested
- var formatName = function(match, value, shortNames, longNames) {
- return (lookAhead(match) ? longNames[value] : shortNames[value]);
- };
- var output = '';
- var literal = false;
- if (date)
- for (var iFormat = 0; iFormat < format.length; iFormat++) {
- if (literal)
- if (format.charAt(iFormat) == "'" && !lookAhead("'"))
- literal = false;
- else
- output += format.charAt(iFormat);
- else
- switch (format.charAt(iFormat)) {
- case 'd':
- output += formatNumber('d', date.getDate());
- break;
- case 'D':
- output += formatName('D', date.getDay(), dayNamesShort, dayNames);
- break;
- case 'm':
- output += formatNumber('m', date.getMonth() + 1);
- break;
- case 'M':
- output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
- break;
- case 'y':
- output += (lookAhead('y') ? date.getFullYear() :
- (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
- break;
- case "'":
- if (lookAhead("'"))
- output += "'";
- else
- literal = true;
- break;
- default:
- output += format.charAt(iFormat);
- }
- }
- return output;
- },
-
- /* Extract all possible characters from the date format. */
- _possibleChars: function (format) {
- var chars = '';
- var literal = false;
- for (var iFormat = 0; iFormat < format.length; iFormat++)
- if (literal)
- if (format.charAt(iFormat) == "'" && !lookAhead("'"))
- literal = false;
- else
- chars += format.charAt(iFormat);
- else
- switch (format.charAt(iFormat)) {
- case 'd': case 'm': case 'y':
- chars += '0123456789';
- break;
- case 'D': case 'M':
- return null; // Accept anything
- case "'":
- if (lookAhead("'"))
- chars += "'";
- else
- literal = true;
- break;
- default:
- chars += format.charAt(iFormat);
- }
- return chars;
- }
-});
-
-/* Individualised settings for date picker functionality applied to one or more related inputs.
- Instances are managed and manipulated through the Datepicker manager. */
-function DatepickerInstance(settings, inline) {
- this._id = $.datepicker._register(this);
- this._selectedDay = 0; // Current date for selection
- this._selectedMonth = 0; // 0-11
- this._selectedYear = 0; // 4-digit year
- this._drawMonth = 0; // Current month at start of datepicker
- this._drawYear = 0;
- this._input = null; // The attached input field
- this._inline = inline; // True if showing inline, false if used in a popup
- this._datepickerDiv = (!inline ? $.datepicker._datepickerDiv :
- $('<div id="' + $.datepicker._mainDivId + '-' + this._id + '" class="ui-datepicker-inline">'));
- // customise the date picker object - uses manager defaults if not overridden
- this._settings = extendRemove(settings || {}); // clone
- if (inline)
- this._setDate(this._getDefaultDate());
-}
-
-$.extend(DatepickerInstance.prototype, {
- /* Get a setting value, defaulting if necessary. */
- _get: function(name) {
- return this._settings[name] !== undefined ? this._settings[name] : $.datepicker._defaults[name];
- },
-
- /* Parse existing date and initialise date picker. */
- _setDateFromField: function(input) {
- this._input = $(input);
- var dateFormat = this._get('dateFormat');
- var dates = this._input ? this._input.val().split(this._get('rangeSeparator')) : null;
- this._endDay = this._endMonth = this._endYear = null;
- var date = defaultDate = this._getDefaultDate();
- if (dates.length > 0) {
- var settings = this._getFormatConfig();
- if (dates.length > 1) {
- date = $.datepicker.parseDate(dateFormat, dates[1], settings) || defaultDate;
- this._endDay = date.getDate();
- this._endMonth = date.getMonth();
- this._endYear = date.getFullYear();
- }
- try {
- date = $.datepicker.parseDate(dateFormat, dates[0], settings) || defaultDate;
- } catch (e) {
- $.datepicker.log(e);
- date = defaultDate;
- }
- }
- this._selectedDay = date.getDate();
- this._drawMonth = this._selectedMonth = date.getMonth();
- this._drawYear = this._selectedYear = date.getFullYear();
- this._currentDay = (dates[0] ? date.getDate() : 0);
- this._currentMonth = (dates[0] ? date.getMonth() : 0);
- this._currentYear = (dates[0] ? date.getFullYear() : 0);
- this._adjustDate();
- },
-
- /* Retrieve the default date shown on opening. */
- _getDefaultDate: function() {
- var date = this._determineDate('defaultDate', new Date());
- var minDate = this._getMinMaxDate('min', true);
- var maxDate = this._getMinMaxDate('max');
- date = (minDate && date < minDate ? minDate : date);
- date = (maxDate && date > maxDate ? maxDate : date);
- return date;
- },
-
- /* A date may be specified as an exact value or a relative one. */
- _determineDate: function(name, defaultDate) {
- var offsetNumeric = function(offset) {
- var date = new Date();
- date.setDate(date.getDate() + offset);
- return date;
- };
- var offsetString = function(offset, getDaysInMonth) {
- var date = new Date();
- var year = date.getFullYear();
- var month = date.getMonth();
- var day = date.getDate();
- var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
- var matches = pattern.exec(offset);
- while (matches) {
- switch (matches[2] || 'd') {
- case 'd' : case 'D' :
- day += (matches[1] - 0); break;
- case 'w' : case 'W' :
- day += (matches[1] * 7); break;
- case 'm' : case 'M' :
- month += (matches[1] - 0);
- day = Math.min(day, getDaysInMonth(year, month));
- break;
- case 'y': case 'Y' :
- year += (matches[1] - 0);
- day = Math.min(day, getDaysInMonth(year, month));
- break;
- }
- matches = pattern.exec(offset);
- }
- return new Date(year, month, day);
- };
- var date = this._get(name);
- return (date == null ? defaultDate :
- (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) :
- (typeof date == 'number' ? offsetNumeric(date) : date)));
- },
-
- /* Set the date(s) directly. */
- _setDate: function(date, endDate) {
- this._selectedDay = this._currentDay = date.getDate();
- this._drawMonth = this._selectedMonth = this._currentMonth = date.getMonth();
- this._drawYear = this._selectedYear = this._currentYear = date.getFullYear();
- if (this._get('rangeSelect')) {
- if (endDate) {
- this._endDay = endDate.getDate();
- this._endMonth = endDate.getMonth();
- this._endYear = endDate.getFullYear();
- } else {
- this._endDay = this._currentDay;
- this._endMonth = this._currentMonth;
- this._endYear = this._currentYear;
- }
- }
- this._adjustDate();
- },
-
- /* Retrieve the date(s) directly. */
- _getDate: function() {
- var startDate = (!this._currentYear || (this._input && this._input.val() == '') ? null :
- new Date(this._currentYear, this._currentMonth, this._currentDay));
- if (this._get('rangeSelect')) {
- return [this._rangeStart || startDate, (!this._endYear ? null :
- new Date(this._endYear, this._endMonth, this._endDay))];
- } else
- return startDate;
- },
-
- /* Generate the HTML for the current state of the date picker. */
- _generateDatepicker: function() {
- var today = new Date();
- today = new Date(today.getFullYear(), today.getMonth(), today.getDate()); // clear time
- var showStatus = this._get('showStatus');
- var isRTL = this._get('isRTL');
- // build the date picker HTML
- var clear = (this._get('mandatory') ? '' :
- '<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(' + this._id + ');"' +
- (showStatus ? this._addStatus(this._get('clearStatus') || '&#xa0;') : '') + '>' +
- this._get('clearText') + '</a></div>');
- var controls = '<div class="ui-datepicker-control">' + (isRTL ? '' : clear) +
- '<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"' +
- (showStatus ? this._addStatus(this._get('closeStatus') || '&#xa0;') : '') + '>' +
- this._get('closeText') + '</a></div>' + (isRTL ? clear : '') + '</div>';
- var prompt = this._get('prompt');
- var closeAtTop = this._get('closeAtTop');
- var hideIfNoPrevNext = this._get('hideIfNoPrevNext');
- var navigationAsDateFormat = this._get('navigationAsDateFormat');
- var numMonths = this._getNumberOfMonths();
- var stepMonths = this._get('stepMonths');
- var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
- var minDate = this._getMinMaxDate('min', true);
- var maxDate = this._getMinMaxDate('max');
- var drawMonth = this._drawMonth;
- var drawYear = this._drawYear;
- if (maxDate) {
- var maxDraw = new Date(maxDate.getFullYear(),
- maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate());
- maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
- while (new Date(drawYear, drawMonth, 1) > maxDraw) {
- drawMonth--;
- if (drawMonth < 0) {
- drawMonth = 11;
- drawYear--;
- }
- }
- }
- // controls and links
- var prevText = this._get('prevText');
- prevText = (!navigationAsDateFormat ? prevText : $.datepicker.formatDate(
- prevText, new Date(drawYear, drawMonth - stepMonths, 1), this._getFormatConfig()));
- var prev = '<div class="ui-datepicker-prev">' + (this._canAdjustMonth(-1, drawYear, drawMonth) ?
- '<a onclick="jQuery.datepicker._adjustDate(' + this._id + ', -' + stepMonths + ', \'M\');"' +
- (showStatus ? this._addStatus(this._get('prevStatus') || '&#xa0;') : '') + '>' + prevText + '</a>' :
- (hideIfNoPrevNext ? '' : '<label>' + prevText + '</label>')) + '</div>';
- var nextText = this._get('nextText');
- nextText = (!navigationAsDateFormat ? nextText : $.datepicker.formatDate(
- nextText, new Date(drawYear, drawMonth + stepMonths, 1), this._getFormatConfig()));
- var next = '<div class="ui-datepicker-next">' + (this._canAdjustMonth(+1, drawYear, drawMonth) ?
- '<a onclick="jQuery.datepicker._adjustDate(' + this._id + ', +' + stepMonths + ', \'M\');"' +
- (showStatus ? this._addStatus(this._get('nextStatus') || '&#xa0;') : '') + '>' + nextText + '</a>' :
- (hideIfNoPrevNext ? '' : '<label>' + nextText + '</label>')) + '</div>';
- var currentText = this._get('currentText');
- currentText = (!navigationAsDateFormat ? currentText: $.datepicker.formatDate(
- currentText, today, this._getFormatConfig()));
- var html = (prompt ? '<div class="' + $.datepicker._promptClass + '">' + prompt + '</div>' : '') +
- (closeAtTop && !this._inline ? controls : '') +
- '<div class="ui-datepicker-links">' + (isRTL ? next : prev) +
- (this._isInRange(today) ? '<div class="ui-datepicker-current">' +
- '<a onclick="jQuery.datepicker._gotoToday(' + this._id + ');"' +
- (showStatus ? this._addStatus(this._get('currentStatus') || '&#xa0;') : '') + '>' +
- currentText + '</a></div>' : '') + (isRTL ? prev : next) + '</div>';
- var showWeeks = this._get('showWeeks');
- for (var row = 0; row < numMonths[0]; row++)
- for (var col = 0; col < numMonths[1]; col++) {
- var selectedDate = new Date(drawYear, drawMonth, this._selectedDay);
- html += '<div class="ui-datepicker-one-month' + (col == 0 ? ' ui-datepicker-new-row' : '') + '">' +
- this._generateMonthYearHeader(drawMonth, drawYear, minDate, maxDate,
- selectedDate, row > 0 || col > 0) + // draw month headers
- '<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>' +
- '<tr class="ui-datepicker-title-row">' +
- (showWeeks ? '<td>' + this._get('weekHeader') + '</td>' : '');
- var firstDay = this._get('firstDay');
- var changeFirstDay = this._get('changeFirstDay');
- var dayNames = this._get('dayNames');
- var dayNamesShort = this._get('dayNamesShort');
- var dayNamesMin = this._get('dayNamesMin');
- for (var dow = 0; dow < 7; dow++) { // days of the week
- var day = (dow + firstDay) % 7;
- var status = this._get('dayStatus') || '&#xa0;';
- status = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) :
- status.replace(/D/, dayNamesShort[day]));
- html += '<td' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"' : '') + '>' +
- (!changeFirstDay ? '<span' :
- '<a onclick="jQuery.datepicker._changeFirstDay(' + this._id + ', ' + day + ');"') +
- (showStatus ? this._addStatus(status) : '') + ' title="' + dayNames[day] + '">' +
- dayNamesMin[day] + (changeFirstDay ? '</a>' : '</span>') + '</td>';
- }
- html += '</tr></thead><tbody>';
- var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
- if (drawYear == this._selectedYear && drawMonth == this._selectedMonth)
- this._selectedDay = Math.min(this._selectedDay, daysInMonth);
- var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
- var currentDate = (!this._currentDay ? new Date(9999, 9, 9) :
- new Date(this._currentYear, this._currentMonth, this._currentDay));
- var endDate = this._endDay ? new Date(this._endYear, this._endMonth, this._endDay) : currentDate;
- var printDate = new Date(drawYear, drawMonth, 1 - leadDays);
- var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
- var beforeShowDay = this._get('beforeShowDay');
- var highlightWeek = this._get('highlightWeek');
- var showOtherMonths = this._get('showOtherMonths');
- var calculateWeek = this._get('calculateWeek') || $.datepicker.iso8601Week;
- var dateStatus = this._get('statusForDate') || $.datepicker.dateStatus;
- for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
- html += '<tr class="ui-datepicker-days-row">' +
- (showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + '</td>' : '');
- for (var dow = 0; dow < 7; dow++) { // create date picker days
- var daySettings = (beforeShowDay ?
- beforeShowDay.apply((this._input ? this._input[0] : null), [printDate]) : [true, '']);
- var otherMonth = (printDate.getMonth() != drawMonth);
- var unselectable = otherMonth || !daySettings[0] ||
- (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
- html += '<td class="ui-datepicker-days-cell' +
- ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end-cell' : '') + // highlight weekends
- (otherMonth ? ' ui-datepicker-otherMonth' : '') + // highlight days from other months
- (printDate.getTime() == selectedDate.getTime() && drawMonth == this._selectedMonth ?
- ' ui-datepicker-days-cell-over' : '') + // highlight selected day
- (unselectable ? ' ' + $.datepicker._unselectableClass : '') + // highlight unselectable days
- (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
- (printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? // in current range
- ' ' + $.datepicker._currentClass : '') + // highlight selected day
- (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
- ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
- (unselectable ? (highlightWeek ? ' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"' + // highlight selection week
- ' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"' : '') : // unhighlight selection week
- ' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')' + // highlight selection
- (highlightWeek ? '.parent().addClass(\'ui-datepicker-week-over\')' : '') + ';' + // highlight selection week
- (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' +
- this._id + '\').html(\'' + (dateStatus.apply((this._input ? this._input[0] : null),
- [printDate, this]) || '&#xa0;') +'\');') + '"' +
- ' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')' + // unhighlight selection
- (highlightWeek ? '.parent().removeClass(\'ui-datepicker-week-over\')' : '') + ';' + // unhighlight selection week
- (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' +
- this._id + '\').html(\'&#xa0;\');') + '" onclick="jQuery.datepicker._selectDay(' +
- this._id + ',' + drawMonth + ',' + drawYear + ', this);"') + '>' + // actions
- (otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : // display for other months
- (unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>'; // display for this month
- printDate.setDate(printDate.getDate() + 1);
- }
- html += '</tr>';
- }
- drawMonth++;
- if (drawMonth > 11) {
- drawMonth = 0;
- drawYear++;
- }
- html += '</tbody></table></div>';
- }
- html += (showStatus ? '<div style="clear: both;"></div><div id="ui-datepicker-status-' + this._id +
- '" class="ui-datepicker-status">' + (this._get('initStatus') || '&#xa0;') + '</div>' : '') +
- (!closeAtTop && !this._inline ? controls : '') +
- '<div style="clear: both;"></div>' +
- ($.browser.msie && parseInt($.browser.version) < 7 && !this._inline ?
- '<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>' : '');
- return html;
- },
-
- /* Generate the month and year header. */
- _generateMonthYearHeader: function(drawMonth, drawYear, minDate, maxDate, selectedDate, secondary) {
- minDate = (this._rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate);
- var showStatus = this._get('showStatus');
- var html = '<div class="ui-datepicker-header">';
- // month selection
- var monthNames = this._get('monthNames');
- if (secondary || !this._get('changeMonth'))
- html += monthNames[drawMonth] + '&#xa0;';
- else {
- var inMinYear = (minDate && minDate.getFullYear() == drawYear);
- var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
- html += '<select class="ui-datepicker-new-month" ' +
- 'onchange="jQuery.datepicker._selectMonthYear(' + this._id + ', this, \'M\');" ' +
- 'onclick="jQuery.datepicker._clickMonthYear(' + this._id + ');"' +
- (showStatus ? this._addStatus(this._get('monthStatus') || '&#xa0;') : '') + '>';
- for (var month = 0; month < 12; month++) {
- if ((!inMinYear || month >= minDate.getMonth()) &&
- (!inMaxYear || month <= maxDate.getMonth()))
- html += '<option value="' + month + '"' +
- (month == drawMonth ? ' selected="selected"' : '') +
- '>' + monthNames[month] + '</option>';
- }
- html += '</select>';
- }
- // year selection
- if (secondary || !this._get('changeYear'))
- html += drawYear;
- else {
- // determine range of years to display
- var years = this._get('yearRange').split(':');
- var year = 0;
- var endYear = 0;
- if (years.length != 2) {
- year = drawYear - 10;
- endYear = drawYear + 10;
- } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') {
- year = endYear = new Date().getFullYear();
- year += parseInt(years[0], 10);
- endYear += parseInt(years[1], 10);
- } else {
- year = parseInt(years[0], 10);
- endYear = parseInt(years[1], 10);
- }
- year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
- endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
- html += '<select class="ui-datepicker-new-year" ' +
- 'onchange="jQuery.datepicker._selectMonthYear(' + this._id + ', this, \'Y\');" ' +
- 'onclick="jQuery.datepicker._clickMonthYear(' + this._id + ');"' +
- (showStatus ? this._addStatus(this._get('yearStatus') || '&#xa0;') : '') + '>';
- for (; year <= endYear; year++) {
- html += '<option value="' + year + '"' +
- (year == drawYear ? ' selected="selected"' : '') +
- '>' + year + '</option>';
- }
- html += '</select>';
- }
- html += '</div>'; // Close datepicker_header
- return html;
- },
-
- /* Provide code to set and clear the status panel. */
- _addStatus: function(text) {
- return ' onmouseover="jQuery(\'#ui-datepicker-status-' + this._id + '\').html(\'' + text + '\');" ' +
- 'onmouseout="jQuery(\'#ui-datepicker-status-' + this._id + '\').html(\'&#xa0;\');"';
- },
-
- /* Adjust one of the date sub-fields. */
- _adjustDate: function(offset, period) {
- var year = this._drawYear + (period == 'Y' ? offset : 0);
- var month = this._drawMonth + (period == 'M' ? offset : 0);
- var day = Math.min(this._selectedDay, this._getDaysInMonth(year, month)) +
- (period == 'D' ? offset : 0);
- var date = new Date(year, month, day);
- // ensure it is within the bounds set
- var minDate = this._getMinMaxDate('min', true);
- var maxDate = this._getMinMaxDate('max');
- date = (minDate && date < minDate ? minDate : date);
- date = (maxDate && date > maxDate ? maxDate : date);
- this._selectedDay = date.getDate();
- this._drawMonth = this._selectedMonth = date.getMonth();
- this._drawYear = this._selectedYear = date.getFullYear();
- if (period == 'M' || period == 'Y')
- this._notifyChange();
- },
-
- /* Notify change of month/year. */
- _notifyChange: function() {
- var onChange = this._get('onChangeMonthYear');
- if (onChange)
- onChange.apply((this._input ? this._input[0] : null),
- [new Date(this._selectedYear, this._selectedMonth, 1), this]);
- },
-
- /* Determine the number of months to show. */
- _getNumberOfMonths: function() {
- var numMonths = this._get('numberOfMonths');
- return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
- },
-
- /* Determine the current maximum date - ensure no time components are set - may be overridden for a range. */
- _getMinMaxDate: function(minMax, checkRange) {
- var date = this._determineDate(minMax + 'Date', null);
- if (date) {
- date.setHours(0);
- date.setMinutes(0);
- date.setSeconds(0);
- date.setMilliseconds(0);
- }
- return (!checkRange || !this._rangeStart ? date :
- (!date || this._rangeStart > date ? this._rangeStart : date));
- },
-
- /* Find the number of days in a given month. */
- _getDaysInMonth: function(year, month) {
- return 32 - new Date(year, month, 32).getDate();
- },
-
- /* Find the day of the week of the first of a month. */
- _getFirstDayOfMonth: function(year, month) {
- return new Date(year, month, 1).getDay();
- },
-
- /* Determines if we should allow a "next/prev" month display change. */
- _canAdjustMonth: function(offset, curYear, curMonth) {
- var numMonths = this._getNumberOfMonths();
- var date = new Date(curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1);
- if (offset < 0)
- date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
- return this._isInRange(date);
- },
-
- /* Is the given date in the accepted range? */
- _isInRange: function(date) {
- // during range selection, use minimum of selected date and range start
- var newMinDate = (!this._rangeStart ? null :
- new Date(this._selectedYear, this._selectedMonth, this._selectedDay));
- newMinDate = (newMinDate && this._rangeStart < newMinDate ? this._rangeStart : newMinDate);
- var minDate = newMinDate || this._getMinMaxDate('min');
- var maxDate = this._getMinMaxDate('max');
- return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate));
- },
-
- /* Provide the configuration settings for formatting/parsing. */
- _getFormatConfig: function() {
- var shortYearCutoff = this._get('shortYearCutoff');
- shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
- new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
- return {shortYearCutoff: shortYearCutoff,
- dayNamesShort: this._get('dayNamesShort'), dayNames: this._get('dayNames'),
- monthNamesShort: this._get('monthNamesShort'), monthNames: this._get('monthNames')};
- },
-
- /* Format the given date for display. */
- _formatDate: function(day, month, year) {
- if (!day) {
- this._currentDay = this._selectedDay;
- this._currentMonth = this._selectedMonth;
- this._currentYear = this._selectedYear;
- }
- var date = (day ? (typeof day == 'object' ? day : new Date(year, month, day)) :
- new Date(this._currentYear, this._currentMonth, this._currentDay));
- return $.datepicker.formatDate(this._get('dateFormat'), date, this._getFormatConfig());
- }
-});
-
-/* jQuery extend now ignores nulls! */
-function extendRemove(target, props) {
- $.extend(target, props);
- for (var name in props)
- if (props[name] == null || props[name] == undefined)
- target[name] = props[name];
- return target;
-};
-
-/* Determine whether an object is an array. */
-function isArray(a) {
- return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
- (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
-};
-
-/* Invoke the datepicker functionality.
- @param options String - a command, optionally followed by additional parameters or
- Object - settings for attaching new datepicker functionality
- @return jQuery object */
-$.fn.datepicker = function(options){
- var otherArgs = Array.prototype.slice.call(arguments, 1);
- if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate'))
- return $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this[0]].concat(otherArgs));
- return this.each(function() {
- typeof options == 'string' ?
- $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this].concat(otherArgs)) :
- $.datepicker._attachDatepicker(this, options);
- });
-};
-
-$.datepicker = new Datepicker(); // singleton instance
-
-/* Initialise the date picker. */
-$(document).ready(function() {
- $(document.body).append($.datepicker._datepickerDiv).
- mousedown($.datepicker._checkExternalClick);
-});
-
-})(jQuery);
-/*
- * jQuery UI Dialog
- *
- * Copyright (c) 2008 Richard D. Worth (rdworth.org)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Dialog
- *
- * Depends:
- * ui.core.js
- * ui.draggable.js
- * ui.resizable.js
- */
-(function($) {
-
-var setDataSwitch = {
- dragStart: "start.draggable",
- drag: "drag.draggable",
- dragStop: "stop.draggable",
- maxHeight: "maxHeight.resizable",
- minHeight: "minHeight.resizable",
- maxWidth: "maxWidth.resizable",
- minWidth: "minWidth.resizable",
- resizeStart: "start.resizable",
- resize: "drag.resizable",
- resizeStop: "stop.resizable"
-};
-
-$.widget("ui.dialog", {
- init: function() {
- var self = this,
- options = this.options,
- resizeHandles = typeof options.resizable == 'string'
- ? options.resizable
- : 'n,e,s,w,se,sw,ne,nw',
-
- uiDialogContent = this.element
- .addClass('ui-dialog-content')
- .wrap('<div/>')
- .wrap('<div/>'),
-
- uiDialogContainer = (this.uiDialogContainer = uiDialogContent.parent()
- .addClass('ui-dialog-container')
- .css({position: 'relative', width: '100%', height: '100%'})),
-
- title = options.title || uiDialogContent.attr('title') || '',
- uiDialogTitlebar = (this.uiDialogTitlebar =
- $('<div class="ui-dialog-titlebar"/>'))
- .append('<span class="ui-dialog-title">' + title + '</span>')
- .append('<a href="#" class="ui-dialog-titlebar-close"><span>X</span></a>')
- .prependTo(uiDialogContainer),
-
- uiDialog = (this.uiDialog = uiDialogContainer.parent())
- .appendTo(document.body)
- .hide()
- .addClass('ui-dialog')
- .addClass(options.dialogClass)
- // add content classes to dialog
- // to inherit theme at top level of element
- .addClass(uiDialogContent.attr('className'))
- .removeClass('ui-dialog-content')
- .css({
- position: 'absolute',
- width: options.width,
- height: options.height,
- overflow: 'hidden',
- zIndex: options.zIndex
- })
- // setting tabIndex makes the div focusable
- // setting outline to 0 prevents a border on focus in Mozilla
- .attr('tabIndex', -1).css('outline', 0).keydown(function(ev) {
- if (options.closeOnEscape) {
- var ESC = 27;
- (ev.keyCode && ev.keyCode == ESC && self.close());
- }
- })
- .mousedown(function() {
- self.moveToTop();
- }),
-
- uiDialogButtonPane = (this.uiDialogButtonPane = $('<div/>'))
- .addClass('ui-dialog-buttonpane')
- .appendTo(uiDialog);
-
- this.uiDialogTitlebarClose = $('.ui-dialog-titlebar-close', uiDialogTitlebar)
- .hover(
- function() {
- $(this).addClass('ui-dialog-titlebar-close-hover');
- },
- function() {
- $(this).removeClass('ui-dialog-titlebar-close-hover');
- }
- )
- .mousedown(function(ev) {
- ev.stopPropagation();
- })
- .click(function() {
- self.close();
- return false;
- });
-
- if ($.fn.draggable) {
- uiDialog.draggable({
- helper: options.dragHelper,
- handle: '.ui-dialog-titlebar',
- start: function(e, ui) {
- self.moveToTop();
- (options.dragStart && options.dragStart.apply(self.element[0], arguments));
- },
- drag: function(e, ui) {
- (options.drag && options.drag.apply(self.element[0], arguments));
- },
- stop: function(e, ui) {
- (options.dragStop && options.dragStop.apply(self.element[0], arguments));
- $.ui.dialog.overlay.resize();
- }
- });
- (options.draggable || uiDialog.draggable('disable'));
- }
-
- if ($.fn.resizable) {
- uiDialog.resizable({
- proxy: options.resizeHelper,
- maxWidth: options.maxWidth,
- maxHeight: options.maxHeight,
- minWidth: options.minWidth,
- minHeight: options.minHeight,
- start: function() {
- (options.resizeStart && options.resizeStart.apply(self.element[0], arguments));
- },
- resize: function(e, ui) {
- (options.autoResize && self.size.apply(self));
- (options.resize && options.resize.apply(self.element[0], arguments));
- },
- handles: resizeHandles,
- stop: function(e, ui) {
- (options.autoResize && self.size.apply(self));
- (options.resizeStop && options.resizeStop.apply(self.element[0], arguments));
- $.ui.dialog.overlay.resize();
- }
- });
- (options.resizable || uiDialog.resizable('disable'));
- }
-
- this.createButtons(options.buttons);
- this.isOpen = false;
-
- (options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe());
- (options.autoOpen && this.open());
- },
-
- setData: function(key, value){
- (setDataSwitch[key] && this.uiDialog.data(setDataSwitch[key], value));
- switch (key) {
- case "buttons":
- this.createButtons(value);
- break;
- case "draggable":
- this.uiDialog.draggable(value ? 'enable' : 'disable');
- break;
- case "height":
- this.uiDialog.height(value);
- break;
- case "position":
- this.position(value);
- break;
- case "resizable":
- (typeof value == 'string' && this.uiDialog.data('handles.resizable', value));
- this.uiDialog.resizable(value ? 'enable' : 'disable');
- break;
- case "title":
- $(".ui-dialog-title", this.uiDialogTitlebar).text(value);
- break;
- case "width":
- this.uiDialog.width(value);
- break;
- }
-
- $.widget.prototype.setData.apply(this, arguments);
- },
-
- position: function(pos) {
- var wnd = $(window), doc = $(document),
- pTop = doc.scrollTop(), pLeft = doc.scrollLeft(),
- minTop = pTop;
-
- if ($.inArray(pos, ['center','top','right','bottom','left']) >= 0) {
- pos = [
- pos == 'right' || pos == 'left' ? pos : 'center',
- pos == 'top' || pos == 'bottom' ? pos : 'middle'
- ];
- }
- if (pos.constructor != Array) {
- pos = ['center', 'middle'];
- }
- if (pos[0].constructor == Number) {
- pLeft += pos[0];
- } else {
- switch (pos[0]) {
- case 'left':
- pLeft += 0;
- break;
- case 'right':
- pLeft += wnd.width() - this.uiDialog.width();
- break;
- default:
- case 'center':
- pLeft += (wnd.width() - this.uiDialog.width()) / 2;
- }
- }
- if (pos[1].constructor == Number) {
- pTop += pos[1];
- } else {
- switch (pos[1]) {
- case 'top':
- pTop += 0;
- break;
- case 'bottom':
- pTop += wnd.height() - this.uiDialog.height();
- break;
- default:
- case 'middle':
- pTop += (wnd.height() - this.uiDialog.height()) / 2;
- }
- }
-
- // prevent the dialog from being too high (make sure the titlebar
- // is accessible)
- pTop = Math.max(pTop, minTop);
- this.uiDialog.css({top: pTop, left: pLeft});
- },
-
- size: function() {
- var container = this.uiDialogContainer,
- titlebar = this.uiDialogTitlebar,
- content = this.element,
- tbMargin = parseInt(content.css('margin-top')) + parseInt(content.css('margin-bottom')),
- lrMargin = parseInt(content.css('margin-left')) + parseInt(content.css('margin-right'));
- content.height(container.height() - titlebar.outerHeight() - tbMargin);
- content.width(container.width() - lrMargin);
- },
-
- open: function() {
- if (this.isOpen) { return; }
-
- this.overlay = this.options.modal ? new $.ui.dialog.overlay(this) : null;
- this.uiDialog.appendTo('body');
- this.position(this.options.position);
- this.uiDialog.show(this.options.show);
- this.options.autoResize && this.size();
- this.moveToTop(true);
-
- // CALLBACK: open
- var openEV = null;
- var openUI = {
- options: this.options
- };
- this.uiDialogTitlebarClose.focus();
- this.element.triggerHandler("dialogopen", [openEV, openUI], this.options.open);
-
- this.isOpen = true;
- },
-
- // the force parameter allows us to move modal dialogs to their correct
- // position on open
- moveToTop: function(force) {
- if ((this.options.modal && !force)
- || (!this.options.stack && !this.options.modal)) { return; }
-
- var maxZ = this.options.zIndex, options = this.options;
- $('.ui-dialog:visible').each(function() {
- maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10) || options.zIndex);
- });
- (this.overlay && this.overlay.$el.css('z-index', ++maxZ));
- this.uiDialog.css('z-index', ++maxZ);
- },
-
- close: function() {
- (this.overlay && this.overlay.destroy());
- this.uiDialog.hide(this.options.hide);
-
- // CALLBACK: close
- var closeEV = null;
- var closeUI = {
- options: this.options
- };
- this.element.triggerHandler("dialogclose", [closeEV, closeUI], this.options.close);
- $.ui.dialog.overlay.resize();
-
- this.isOpen = false;
- },
-
- destroy: function() {
- (this.overlay && this.overlay.destroy());
- this.uiDialog.hide();
- this.element
- .unbind('.dialog')
- .removeData('dialog')
- .removeClass('ui-dialog-content')
- .hide().appendTo('body');
- this.uiDialog.remove();
- },
-
- createButtons: function(buttons) {
- var self = this,
- hasButtons = false,
- uiDialogButtonPane = this.uiDialogButtonPane;
-
- // remove any existing buttons
- uiDialogButtonPane.empty().hide();
-
- $.each(buttons, function() { return !(hasButtons = true); });
- if (hasButtons) {
- uiDialogButtonPane.show();
- $.each(buttons, function(name, fn) {
- $('<button/>')
- .text(name)
- .click(function() { fn.apply(self.element[0], arguments); })
- .appendTo(uiDialogButtonPane);
- });
- }
- }
-});
-
-$.extend($.ui.dialog, {
- defaults: {
- autoOpen: true,
- autoResize: true,
- bgiframe: false,
- buttons: {},
- closeOnEscape: true,
- draggable: true,
- height: 200,
- minHeight: 100,
- minWidth: 150,
- modal: false,
- overlay: {},
- position: 'center',
- resizable: true,
- stack: true,
- width: 300,
- zIndex: 1000
- },
-
- overlay: function(dialog) {
- this.$el = $.ui.dialog.overlay.create(dialog);
- }
-});
-
-$.extend($.ui.dialog.overlay, {
- instances: [],
- events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
- function(e) { return e + '.dialog-overlay'; }).join(' '),
- create: function(dialog) {
- if (this.instances.length === 0) {
- // prevent use of anchors and inputs
- // we use a setTimeout in case the overlay is created from an
- // event that we're going to be cancelling (see #2804)
- setTimeout(function() {
- $('a, :input').bind($.ui.dialog.overlay.events, function() {
- // allow use of the element if inside a dialog and
- // - there are no modal dialogs
- // - there are modal dialogs, but we are in front of the topmost modal
- var allow = false;
- var $dialog = $(this).parents('.ui-dialog');
- if ($dialog.length) {
- var $overlays = $('.ui-dialog-overlay');
- if ($overlays.length) {
- var maxZ = parseInt($overlays.css('z-index'), 10);
- $overlays.each(function() {
- maxZ = Math.max(maxZ, parseInt($(this).css('z-index'), 10));
- });
- allow = parseInt($dialog.css('z-index'), 10) > maxZ;
- } else {
- allow = true;
- }
- }
- return allow;
- });
- }, 1);
-
- // allow closing by pressing the escape key
- $(document).bind('keydown.dialog-overlay', function(e) {
- var ESC = 27;
- (e.keyCode && e.keyCode == ESC && dialog.close());
- });
-
- // handle window resize
- $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
- }
-
- var $el = $('<div/>').appendTo(document.body)
- .addClass('ui-dialog-overlay').css($.extend({
- borderWidth: 0, margin: 0, padding: 0,
- position: 'absolute', top: 0, left: 0,
- width: this.width(),
- height: this.height()
- }, dialog.options.overlay));
-
- (dialog.options.bgiframe && $.fn.bgiframe && $el.bgiframe());
-
- this.instances.push($el);
- return $el;
- },
-
- destroy: function($el) {
- this.instances.splice($.inArray(this.instances, $el), 1);
-
- if (this.instances.length === 0) {
- $('a, :input').add([document, window]).unbind('.dialog-overlay');
- }
-
- $el.remove();
- },
-
- height: function() {
- if ($.browser.msie && $.browser.version < 7) {
- var scrollHeight = Math.max(
- document.documentElement.scrollHeight,
- document.body.scrollHeight
- );
- var offsetHeight = Math.max(
- document.documentElement.offsetHeight,
- document.body.offsetHeight
- );
-
- if (scrollHeight < offsetHeight) {
- return $(window).height() + 'px';
- } else {
- return scrollHeight + 'px';
- }
- } else {
- return $(document).height() + 'px';
- }
- },
-
- width: function() {
- if ($.browser.msie && $.browser.version < 7) {
- var scrollWidth = Math.max(
- document.documentElement.scrollWidth,
- document.body.scrollWidth
- );
- var offsetWidth = Math.max(
- document.documentElement.offsetWidth,
- document.body.offsetWidth
- );
-
- if (scrollWidth < offsetWidth) {
- return $(window).width() + 'px';
- } else {
- return scrollWidth + 'px';
- }
- } else {
- return $(document).width() + 'px';
- }
- },
-
- resize: function() {
- /* If the dialog is draggable and the user drags it past the
- * right edge of the window, the document becomes wider so we
- * need to stretch the overlay. If the user then drags the
- * dialog back to the left, the document will become narrower,
- * so we need to shrink the overlay to the appropriate size.
- * This is handled by shrinking the overlay before setting it
- * to the full document size.
- */
- var $overlays = $([]);
- $.each($.ui.dialog.overlay.instances, function() {
- $overlays = $overlays.add(this);
- });
-
- $overlays.css({
- width: 0,
- height: 0
- }).css({
- width: $.ui.dialog.overlay.width(),
- height: $.ui.dialog.overlay.height()
- });
- }
-});
-
-$.extend($.ui.dialog.overlay.prototype, {
- destroy: function() {
- $.ui.dialog.overlay.destroy(this.$el);
- }
-});
-
-})(jQuery);
-/*
- * jQuery UI Slider
- *
- * Copyright (c) 2008 Paul Bakaus
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Slider
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-$.fn.unwrap = $.fn.unwrap || function(expr) {
- return this.each(function(){
- $(this).parents(expr).eq(0).after(this).remove();
- });
-};
-
-$.widget("ui.slider", {
- plugins: {},
- ui: function(e) {
- return {
- options: this.options,
- handle: this.currentHandle,
- value: this.options.axis != "both" || !this.options.axis ? Math.round(this.value(null,this.options.axis == "vertical" ? "y" : "x")) : {
- x: Math.round(this.value(null,"x")),
- y: Math.round(this.value(null,"y"))
- },
- range: this.getRange()
- };
- },
- propagate: function(n,e) {
- $.ui.plugin.call(this, n, [e, this.ui()]);
- this.element.triggerHandler(n == "slide" ? n : "slide"+n, [e, this.ui()], this.options[n]);
- },
- destroy: function() {
-
- this.element
- .removeClass("ui-slider ui-slider-disabled")
- .removeData("slider")
- .unbind(".slider");
-
- if(this.handle && this.handle.length) {
- this.handle
- .unwrap("a");
- this.handle.each(function() {
- $(this).data("mouse").mouseDestroy();
- });
- }
-
- this.generated && this.generated.remove();
-
- },
- setData: function(key, value) {
- $.widget.prototype.setData.apply(this, arguments);
- if (/min|max|steps/.test(key)) {
- this.initBoundaries();
- }
-
- if(key == "range") {
- value ? this.handle.length == 2 && this.createRange() : this.removeRange();
- }
-
- },
-
- init: function() {
-
- var self = this;
- this.element.addClass("ui-slider");
- this.initBoundaries();
-
- // Initialize mouse and key events for interaction
- this.handle = $(this.options.handle, this.element);
- if (!this.handle.length) {
- self.handle = self.generated = $(self.options.handles || [0]).map(function() {
- var handle = $("<div/>").addClass("ui-slider-handle").appendTo(self.element);
- if (this.id)
- handle.attr("id", this.id);
- return handle[0];
- });
- }
-
-
- var handleclass = function(el) {
- this.element = $(el);
- this.element.data("mouse", this);
- this.options = self.options;
-
- this.element.bind("mousedown", function() {
- if(self.currentHandle) this.blur(self.currentHandle);
- self.focus(this,1);
- });
-
- this.mouseInit();
- };
-
- $.extend(handleclass.prototype, $.ui.mouse, {
- mouseStart: function(e) { return self.start.call(self, e, this.element[0]); },
- mouseStop: function(e) { return self.stop.call(self, e, this.element[0]); },
- mouseDrag: function(e) { return self.drag.call(self, e, this.element[0]); },
- mouseCapture: function() { return true; },
- trigger: function(e) { this.mouseDown(e); }
- });
-
-
- $(this.handle)
- .each(function() {
- new handleclass(this);
- })
- .wrap('<a href="javascript:void(0)" style="cursor:default;"></a>')
- .parent()
- .bind('focus', function(e) { self.focus(this.firstChild); })
- .bind('blur', function(e) { self.blur(this.firstChild); })
- .bind('keydown', function(e) { if(!self.options.noKeyboard) self.keydown(e.keyCode, this.firstChild); })
- ;
-
- // Bind the click to the slider itself
- this.element.bind('mousedown.slider', function(e) {
- self.click.apply(self, [e]);
- self.currentHandle.data("mouse").trigger(e);
- self.firstValue = self.firstValue + 1; //This is for always triggering the change event
- });
-
- // Move the first handle to the startValue
- $.each(this.options.handles || [], function(index, handle) {
- self.moveTo(handle.start, index, true);
- });
- if (!isNaN(this.options.startValue))
- this.moveTo(this.options.startValue, 0, true);
-
- this.previousHandle = $(this.handle[0]); //set the previous handle to the first to allow clicking before selecting the handle
- if(this.handle.length == 2 && this.options.range) this.createRange();
- },
- initBoundaries: function() {
-
- var element = this.element[0], o = this.options;
- this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() };
-
- $.extend(o, {
- axis: o.axis || (element.offsetWidth < element.offsetHeight ? 'vertical' : 'horizontal'),
- max: !isNaN(parseInt(o.max,10)) ? { x: parseInt(o.max, 10), y: parseInt(o.max, 10) } : ({ x: o.max && o.max.x || 100, y: o.max && o.max.y || 100 }),
- min: !isNaN(parseInt(o.min,10)) ? { x: parseInt(o.min, 10), y: parseInt(o.min, 10) } : ({ x: o.min && o.min.x || 0, y: o.min && o.min.y || 0 })
- });
- //Prepare the real maxValue
- o.realMax = {
- x: o.max.x - o.min.x,
- y: o.max.y - o.min.y
- };
- //Calculate stepping based on steps
- o.stepping = {
- x: o.stepping && o.stepping.x || parseInt(o.stepping, 10) || (o.steps ? o.realMax.x/(o.steps.x || parseInt(o.steps, 10) || o.realMax.x) : 0),
- y: o.stepping && o.stepping.y || parseInt(o.stepping, 10) || (o.steps ? o.realMax.y/(o.steps.y || parseInt(o.steps, 10) || o.realMax.y) : 0)
- };
- },
-
-
- keydown: function(keyCode, handle) {
- if(/(37|38|39|40)/.test(keyCode)) {
- this.moveTo({
- x: /(37|39)/.test(keyCode) ? (keyCode == 37 ? '-' : '+') + '=' + this.oneStep("x") : 0,
- y: /(38|40)/.test(keyCode) ? (keyCode == 38 ? '-' : '+') + '=' + this.oneStep("y") : 0
- }, handle);
- }
- },
- focus: function(handle,hard) {
- this.currentHandle = $(handle).addClass('ui-slider-handle-active');
- if (hard)
- this.currentHandle.parent()[0].focus();
- },
- blur: function(handle) {
- $(handle).removeClass('ui-slider-handle-active');
- if(this.currentHandle && this.currentHandle[0] == handle) { this.previousHandle = this.currentHandle; this.currentHandle = null; };
- },
- click: function(e) {
- // This method is only used if:
- // - The user didn't click a handle
- // - The Slider is not disabled
- // - There is a current, or previous selected handle (otherwise we wouldn't know which one to move)
-
- var pointer = [e.pageX,e.pageY];
-
- var clickedHandle = false;
- this.handle.each(function() {
- if(this == e.target)
- clickedHandle = true;
- });
- if (clickedHandle || this.options.disabled || !(this.currentHandle || this.previousHandle))
- return;
-
- // If a previous handle was focussed, focus it again
- if (!this.currentHandle && this.previousHandle)
- this.focus(this.previousHandle, true);
-
- // propagate only for distance > 0, otherwise propagation is done my drag
- this.offset = this.element.offset();
-
- this.moveTo({
- y: this.convertValue(e.pageY - this.offset.top - this.currentHandle[0].offsetHeight/2, "y"),
- x: this.convertValue(e.pageX - this.offset.left - this.currentHandle[0].offsetWidth/2, "x")
- }, null, !this.options.distance);
- },
-
-
-
- createRange: function() {
- if(this.rangeElement) return;
- this.rangeElement = $('<div></div>')
- .addClass('ui-slider-range')
- .css({ position: 'absolute' })
- .appendTo(this.element);
- this.updateRange();
- },
- removeRange: function() {
- this.rangeElement.remove();
- this.rangeElement = null;
- },
- updateRange: function() {
- var prop = this.options.axis == "vertical" ? "top" : "left";
- var size = this.options.axis == "vertical" ? "height" : "width";
- this.rangeElement.css(prop, (parseInt($(this.handle[0]).css(prop),10) || 0) + this.handleSize(0, this.options.axis == "vertical" ? "y" : "x")/2);
- this.rangeElement.css(size, (parseInt($(this.handle[1]).css(prop),10) || 0) - (parseInt($(this.handle[0]).css(prop),10) || 0));
- },
- getRange: function() {
- return this.rangeElement ? this.convertValue(parseInt(this.rangeElement.css(this.options.axis == "vertical" ? "height" : "width"),10), this.options.axis == "vertical" ? "y" : "x") : null;
- },
-
- handleIndex: function() {
- return this.handle.index(this.currentHandle[0]);
- },
- value: function(handle, axis) {
- if(this.handle.length == 1) this.currentHandle = this.handle;
- if(!axis) axis = this.options.axis == "vertical" ? "y" : "x";
-
- var curHandle = $(handle != undefined && handle !== null ? this.handle[handle] || handle : this.currentHandle);
-
- if(curHandle.data("mouse").sliderValue) {
- return parseInt(curHandle.data("mouse").sliderValue[axis],10);
- } else {
- return parseInt(((parseInt(curHandle.css(axis == "x" ? "left" : "top"),10) / (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(handle,axis))) * this.options.realMax[axis]) + this.options.min[axis],10);
- }
-
- },
- convertValue: function(value,axis) {
- return this.options.min[axis] + (value / (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis))) * this.options.realMax[axis];
- },
-
- translateValue: function(value,axis) {
- return ((value - this.options.min[axis]) / this.options.realMax[axis]) * (this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis));
- },
- translateRange: function(value,axis) {
- if (this.rangeElement) {
- if (this.currentHandle[0] == this.handle[0] && value >= this.translateValue(this.value(1),axis))
- value = this.translateValue(this.value(1,axis) - this.oneStep(axis), axis);
- if (this.currentHandle[0] == this.handle[1] && value <= this.translateValue(this.value(0),axis))
- value = this.translateValue(this.value(0,axis) + this.oneStep(axis), axis);
- }
- if (this.options.handles) {
- var handle = this.options.handles[this.handleIndex()];
- if (value < this.translateValue(handle.min,axis)) {
- value = this.translateValue(handle.min,axis);
- } else if (value > this.translateValue(handle.max,axis)) {
- value = this.translateValue(handle.max,axis);
- }
- }
- return value;
- },
- translateLimits: function(value,axis) {
- if (value >= this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis))
- value = this.actualSize[axis == "x" ? "width" : "height"] - this.handleSize(null,axis);
- if (value <= 0)
- value = 0;
- return value;
- },
- handleSize: function(handle,axis) {
- return $(handle != undefined && handle !== null ? this.handle[handle] : this.currentHandle)[0]["offset"+(axis == "x" ? "Width" : "Height")];
- },
- oneStep: function(axis) {
- return this.options.stepping[axis] || 1;
- },
-
-
- start: function(e, handle) {
-
- var o = this.options;
- if(o.disabled) return false;
-
- // Prepare the outer size
- this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() };
-
- // This is a especially ugly fix for strange blur events happening on mousemove events
- if (!this.currentHandle)
- this.focus(this.previousHandle, true);
-
- this.offset = this.element.offset();
-
- this.handleOffset = this.currentHandle.offset();
- this.clickOffset = { top: e.pageY - this.handleOffset.top, left: e.pageX - this.handleOffset.left };
-
- this.firstValue = this.value();
-
- this.propagate('start', e);
- this.drag(e, handle);
- return true;
-
- },
- stop: function(e) {
- this.propagate('stop', e);
- if (this.firstValue != this.value())
- this.propagate('change', e);
- // This is a especially ugly fix for strange blur events happening on mousemove events
- this.focus(this.currentHandle, true);
- return false;
- },
- drag: function(e, handle) {
-
- var o = this.options;
- var position = { top: e.pageY - this.offset.top - this.clickOffset.top, left: e.pageX - this.offset.left - this.clickOffset.left};
- if(!this.currentHandle) this.focus(this.previousHandle, true); //This is a especially ugly fix for strange blur events happening on mousemove events
-
- position.left = this.translateLimits(position.left, "x");
- position.top = this.translateLimits(position.top, "y");
-
- if (o.stepping.x) {
- var value = this.convertValue(position.left, "x");
- value = Math.round(value / o.stepping.x) * o.stepping.x;
- position.left = this.translateValue(value, "x");
- }
- if (o.stepping.y) {
- var value = this.convertValue(position.top, "y");
- value = Math.round(value / o.stepping.y) * o.stepping.y;
- position.top = this.translateValue(value, "y");
- }
-
- position.left = this.translateRange(position.left, "x");
- position.top = this.translateRange(position.top, "y");
-
- if(o.axis != "vertical") this.currentHandle.css({ left: position.left });
- if(o.axis != "horizontal") this.currentHandle.css({ top: position.top });
-
- //Store the slider's value
- this.currentHandle.data("mouse").sliderValue = {
- x: Math.round(this.convertValue(position.left, "x")) || 0,
- y: Math.round(this.convertValue(position.top, "y")) || 0
- };
-
- if (this.rangeElement)
- this.updateRange();
- this.propagate('slide', e);
- return false;
- },
-
- moveTo: function(value, handle, noPropagation) {
-
- var o = this.options;
-
- // Prepare the outer size
- this.actualSize = { width: this.element.outerWidth() , height: this.element.outerHeight() };
-
- //If no handle has been passed, no current handle is available and we have multiple handles, return false
- if (handle == undefined && !this.currentHandle && this.handle.length != 1)
- return false;
-
- //If only one handle is available, use it
- if (handle == undefined && !this.currentHandle)
- handle = 0;
-
- if (handle != undefined)
- this.currentHandle = this.previousHandle = $(this.handle[handle] || handle);
-
-
- if(value.x !== undefined && value.y !== undefined) {
- var x = value.x, y = value.y;
- } else {
- var x = value, y = value;
- }
-
- if(x !== undefined && x.constructor != Number) {
- var me = /^\-\=/.test(x), pe = /^\+\=/.test(x);
- if(me || pe) {
- x = this.value(null, "x") + parseInt(x.replace(me ? '=' : '+=', ''), 10);
- } else {
- x = isNaN(parseInt(x, 10)) ? undefined : parseInt(x, 10);
- }
- }
-
- if(y !== undefined && y.constructor != Number) {
- var me = /^\-\=/.test(y), pe = /^\+\=/.test(y);
- if(me || pe) {
- y = this.value(null, "y") + parseInt(y.replace(me ? '=' : '+=', ''), 10);
- } else {
- y = isNaN(parseInt(y, 10)) ? undefined : parseInt(y, 10);
- }
- }
-
- if(o.axis != "vertical" && x !== undefined) {
- if(o.stepping.x) x = Math.round(x / o.stepping.x) * o.stepping.x;
- x = this.translateValue(x, "x");
- x = this.translateLimits(x, "x");
- x = this.translateRange(x, "x");
- this.currentHandle.css({ left: x });
- }
-
- if(o.axis != "horizontal" && y !== undefined) {
- if(o.stepping.y) y = Math.round(y / o.stepping.y) * o.stepping.y;
- y = this.translateValue(y, "y");
- y = this.translateLimits(y, "y");
- y = this.translateRange(y, "y");
- this.currentHandle.css({ top: y });
- }
-
- if (this.rangeElement)
- this.updateRange();
-
- //Store the slider's value
- this.currentHandle.data("mouse").sliderValue = {
- x: Math.round(this.convertValue(x, "x")) || 0,
- y: Math.round(this.convertValue(y, "y")) || 0
- };
-
- if (!noPropagation) {
- this.propagate('start', null);
- this.propagate('stop', null);
- this.propagate('change', null);
- this.propagate("slide", null);
- }
- }
-});
-
-$.ui.slider.getter = "value";
-
-$.ui.slider.defaults = {
- handle: ".ui-slider-handle",
- distance: 1
-};
-
-})(jQuery);
-/*
- * jQuery UI Tabs
- *
- * Copyright (c) 2007, 2008 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://docs.jquery.com/UI/Tabs
- *
- * Depends:
- * ui.core.js
- */
-(function($) {
-
-$.widget("ui.tabs", {
- init: function() {
- this.options.event += '.tabs'; // namespace event
-
- // create tabs
- this.tabify(true);
- },
- setData: function(key, value) {
- if ((/^selected/).test(key))
- this.select(value);
- else {
- this.options[key] = value;
- this.tabify();
- }
- },
- length: function() {
- return this.$tabs.length;
- },
- tabId: function(a) {
- return a.title && a.title.replace(/\s/g, '_').replace(/[^A-Za-z0-9\-_:\.]/g, '')
- || this.options.idPrefix + $.data(a);
- },
- ui: function(tab, panel) {
- return {
- options: this.options,
- tab: tab,
- panel: panel
- };
- },
- tabify: function(init) {
-
- this.$lis = $('li:has(a[href])', this.element);
- this.$tabs = this.$lis.map(function() { return $('a', this)[0]; });
- this.$panels = $([]);
-
- var self = this, o = this.options;
-
- this.$tabs.each(function(i, a) {
- // inline tab
- if (a.hash && a.hash.replace('#', '')) // Safari 2 reports '#' for an empty hash
- self.$panels = self.$panels.add(a.hash);
- // remote tab
- else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#"
- $.data(a, 'href.tabs', a.href); // required for restore on destroy
- $.data(a, 'load.tabs', a.href); // mutable
- var id = self.tabId(a);
- a.href = '#' + id;
- var $panel = $('#' + id);
- if (!$panel.length) {
- $panel = $(o.panelTemplate).attr('id', id).addClass(o.panelClass)
- .insertAfter( self.$panels[i - 1] || self.element );
- $panel.data('destroy.tabs', true);
- }
- self.$panels = self.$panels.add( $panel );
- }
- // invalid tab href
- else
- o.disabled.push(i + 1);
- });
-
- if (init) {
-
- // attach necessary classes for styling if not present
- this.element.addClass(o.navClass);
- this.$panels.each(function() {
- var $this = $(this);
- $this.addClass(o.panelClass);
- });
-
- // Selected tab
- // use "selected" option or try to retrieve:
- // 1. from fragment identifier in url
- // 2. from cookie
- // 3. from selected class attribute on <li>
- if (o.selected === undefined) {
- if (location.hash) {
- this.$tabs.each(function(i, a) {
- if (a.hash == location.hash) {
- o.selected = i;
- // prevent page scroll to fragment
- if ($.browser.msie || $.browser.opera) { // && !o.remote
- var $toShow = $(location.hash), toShowId = $toShow.attr('id');
- $toShow.attr('id', '');
- setTimeout(function() {
- $toShow.attr('id', toShowId); // restore id
- }, 500);
- }
- scrollTo(0, 0);
- return false; // break
- }
- });
- }
- else if (o.cookie) {
- var index = parseInt($.cookie('ui-tabs' + $.data(self.element)),10);
- if (index && self.$tabs[index])
- o.selected = index;
- }
- else if (self.$lis.filter('.' + o.selectedClass).length)
- o.selected = self.$lis.index( self.$lis.filter('.' + o.selectedClass)[0] );
- }
- o.selected = o.selected === null || o.selected !== undefined ? o.selected : 0; // first tab selected by default
-
- // Take disabling tabs via class attribute from HTML
- // into account and update option properly.
- // A selected tab cannot become disabled.
- o.disabled = $.unique(o.disabled.concat(
- $.map(this.$lis.filter('.' + o.disabledClass),
- function(n, i) { return self.$lis.index(n); } )
- )).sort();
- if ($.inArray(o.selected, o.disabled) != -1)
- o.disabled.splice($.inArray(o.selected, o.disabled), 1);
-
- // highlight selected tab
- this.$panels.addClass(o.hideClass);
- this.$lis.removeClass(o.selectedClass);
- if (o.selected !== null) {
- this.$panels.eq(o.selected).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before
- this.$lis.eq(o.selected).addClass(o.selectedClass);
-
- // seems to be expected behavior that the show callback is fired
- var onShow = function() {
- $(self.element).triggerHandler('tabsshow',
- [null, self.ui(self.$tabs[o.selected], self.$panels[o.selected])], o.show);
- };
-
- // load if remote tab
- if ($.data(this.$tabs[o.selected], 'load.tabs'))
- this.load(o.selected, onShow);
- // just trigger show event
- else
- onShow();
-
- }
-
- // clean up to avoid memory leaks in certain versions of IE 6
- $(window).bind('unload', function() {
- self.$tabs.unbind('.tabs');
- self.$lis = self.$tabs = self.$panels = null;
- });
-
- }
-
- // disable tabs
- for (var i = 0, li; li = this.$lis[i]; i++)
- $(li)[$.inArray(i, o.disabled) != -1 && !$(li).hasClass(o.selectedClass) ? 'addClass' : 'removeClass'](o.disabledClass);
-
- // reset cache if switching from cached to not cached
- if (o.cache === false)
- this.$tabs.removeData('cache.tabs');
-
- // set up animations
- var hideFx, showFx, baseFx = { 'min-width': 0, duration: 1 }, baseDuration = 'normal';
- if (o.fx && o.fx.constructor == Array)
- hideFx = o.fx[0] || baseFx, showFx = o.fx[1] || baseFx;
- else
- hideFx = showFx = o.fx || baseFx;
-
- // reset some styles to maintain print style sheets etc.
- var resetCSS = { display: '', overflow: '', height: '' };
- if (!$.browser.msie) // not in IE to prevent ClearType font issue
- resetCSS.opacity = '';
-
- // Hide a tab, animation prevents browser scrolling to fragment,
- // $show is optional.
- function hideTab(clicked, $hide, $show) {
- $hide.animate(hideFx, hideFx.duration || baseDuration, function() { //
- $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
- if ($.browser.msie && hideFx.opacity)
- $hide[0].style.filter = '';
- if ($show)
- showTab(clicked, $show, $hide);
- });
- }
-
- // Show a tab, animation prevents browser scrolling to fragment,
- // $hide is optional.
- function showTab(clicked, $show, $hide) {
- if (showFx === baseFx)
- $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels
- $show.animate(showFx, showFx.duration || baseDuration, function() {
- $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
- if ($.browser.msie && showFx.opacity)
- $show[0].style.filter = '';
-
- // callback
- $(self.element).triggerHandler('tabsshow',
- [null, self.ui(clicked, $show[0])], o.show);
-
- });
- }
-
- // switch a tab
- function switchTab(clicked, $li, $hide, $show) {
- /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click
- $.ajaxHistory.update(clicked.hash);
- }*/
- $li.addClass(o.selectedClass)
- .siblings().removeClass(o.selectedClass);
- hideTab(clicked, $hide, $show);
- }
-
- // attach tab event handler, unbind to avoid duplicates from former tabifying...
- this.$tabs.unbind('.tabs').bind(o.event, function() {
-
- //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click
- var $li = $(this).parents('li:eq(0)'),
- $hide = self.$panels.filter(':visible'),
- $show = $(this.hash);
-
- // If tab is already selected and not unselectable or tab disabled or
- // or is already loading or click callback returns false stop here.
- // Check if click handler returns false last so that it is not executed
- // for a disabled or loading tab!
- if (($li.hasClass(o.selectedClass) && !o.unselect)
- || $li.hasClass(o.disabledClass)
- || $(this).hasClass(o.loadingClass)
- || $(self.element).triggerHandler('tabsselect', [null, self.ui(this, $show[0])], o.select) === false
- ) {
- this.blur();
- return false;
- }
-
- self.options.selected = self.$tabs.index(this);
-
- // if tab may be closed
- if (o.unselect) {
- if ($li.hasClass(o.selectedClass)) {
- self.options.selected = null;
- $li.removeClass(o.selectedClass);
- self.$panels.stop();
- hideTab(this, $hide);
- this.blur();
- return false;
- } else if (!$hide.length) {
- self.$panels.stop();
- var a = this;
- self.load(self.$tabs.index(this), function() {
- $li.addClass(o.selectedClass).addClass(o.unselectClass);
- showTab(a, $show);
- });
- this.blur();
- return false;
- }
- }
-
- if (o.cookie)
- $.cookie('ui-tabs' + $.data(self.element), self.options.selected, o.cookie);
-
- // stop possibly running animations
- self.$panels.stop();
-
- // show new tab
- if ($show.length) {
-
- // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled
- /*if ($.browser.msie && o.bookmarkable) {
- var showId = this.hash.replace('#', '');
- $show.attr('id', '');
- setTimeout(function() {
- $show.attr('id', showId); // restore id
- }, 0);
- }*/
-
- var a = this;
- self.load(self.$tabs.index(this), $hide.length ?
- function() {
- switchTab(a, $li, $hide, $show);
- } :
- function() {
- $li.addClass(o.selectedClass);
- showTab(a, $show);
- }
- );
-
- // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash
- /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0;
- var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0;
- setTimeout(function() {
- scrollTo(scrollX, scrollY);
- }, 0);*/
-
- } else
- throw 'jQuery UI Tabs: Mismatching fragment identifier.';
-
- // Prevent IE from keeping other link focussed when using the back button
- // and remove dotted border from clicked link. This is controlled in modern
- // browsers via CSS, also blur removes focus from address bar in Firefox
- // which can become a usability and annoying problem with tabsRotate.
- if ($.browser.msie)
- this.blur();
-
- //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE
- return false;
-
- });
-
- // disable click if event is configured to something else
- if (!(/^click/).test(o.event))
- this.$tabs.bind('click.tabs', function() { return false; });
-
- },
- add: function(url, label, index) {
- if (index == undefined)
- index = this.$tabs.length; // append by default
-
- var o = this.options;
- var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, label));
- $li.data('destroy.tabs', true);
-
- var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] );
-
- // try to find an existing element before creating a new one
- var $panel = $('#' + id);
- if (!$panel.length) {
- $panel = $(o.panelTemplate).attr('id', id)
- .addClass(o.hideClass)
- .data('destroy.tabs', true);
- }
- $panel.addClass(o.panelClass);
- if (index >= this.$lis.length) {
- $li.appendTo(this.element);
- $panel.appendTo(this.element[0].parentNode);
- } else {
- $li.insertBefore(this.$lis[index]);
- $panel.insertBefore(this.$panels[index]);
- }
-
- o.disabled = $.map(o.disabled,
- function(n, i) { return n >= index ? ++n : n });
-
- this.tabify();
-
- if (this.$tabs.length == 1) {
- $li.addClass(o.selectedClass);
- $panel.removeClass(o.hideClass);
- var href = $.data(this.$tabs[0], 'load.tabs');
- if (href)
- this.load(index, href);
- }
-
- // callback
- this.element.triggerHandler('tabsadd',
- [null, this.ui(this.$tabs[index], this.$panels[index])], o.add
- );
- },
- remove: function(index) {
- var o = this.options, $li = this.$lis.eq(index).remove(),
- $panel = this.$panels.eq(index).remove();
-
- // If selected tab was removed focus tab to the right or
- // in case the last tab was removed the tab to the left.
- if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1)
- this.select(index + (index + 1 < this.$tabs.length ? 1 : -1));
-
- o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }),
- function(n, i) { return n >= index ? --n : n });
-
- this.tabify();
-
- // callback
- this.element.triggerHandler('tabsremove',
- [null, this.ui($li.find('a')[0], $panel[0])], o.remove
- );
- },
- enable: function(index) {
- var o = this.options;
- if ($.inArray(index, o.disabled) == -1)
- return;
-
- var $li = this.$lis.eq(index).removeClass(o.disabledClass);
- if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2...
- $li.css('display', 'inline-block');
- setTimeout(function() {
- $li.css('display', 'block');
- }, 0);
- }
-
- o.disabled = $.grep(o.disabled, function(n, i) { return n != index; });
-
- // callback
- this.element.triggerHandler('tabsenable',
- [null, this.ui(this.$tabs[index], this.$panels[index])], o.enable
- );
-
- },
- disable: function(index) {
- var self = this, o = this.options;
- if (index != o.selected) { // cannot disable already selected tab
- this.$lis.eq(index).addClass(o.disabledClass);
-
- o.disabled.push(index);
- o.disabled.sort();
-
- // callback
- this.element.triggerHandler('tabsdisable',
- [null, this.ui(this.$tabs[index], this.$panels[index])], o.disable
- );
- }
- },
- select: function(index) {
- if (typeof index == 'string')
- index = this.$tabs.index( this.$tabs.filter('[href$=' + index + ']')[0] );
- this.$tabs.eq(index).trigger(this.options.event);
- },
- load: function(index, callback) { // callback is for internal usage only
-
- var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0],
- bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs');
-
- callback = callback || function() {};
-
- // no remote or from cache - just finish with callback
- if (!url || !bypassCache && $.data(a, 'cache.tabs')) {
- callback();
- return;
- }
-
- // load remote from here on
-
- var inner = function(parent) {
- var $parent = $(parent), $inner = $parent.find('*:last');
- return $inner.length && $inner || $parent;
- };
- var cleanup = function() {
- self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass)
- .each(function() {
- if (o.spinner)
- inner(this).parent().html(inner(this).data('label.tabs'));
- });
- self.xhr = null;
- };
-
- if (o.spinner) {
- var label = inner(a).html();
- inner(a).wrapInner('<em></em>')
- .find('em').data('label.tabs', label).html(o.spinner);
- }
-
- var ajaxOptions = $.extend({}, o.ajaxOptions, {
- url: url,
- success: function(r, s) {
- $(a.hash).html(r);
- cleanup();
-
- if (o.cache)
- $.data(a, 'cache.tabs', true); // if loaded once do not load them again
-
- // callbacks
- $(self.element).triggerHandler('tabsload',
- [null, self.ui(self.$tabs[index], self.$panels[index])], o.load
- );
- o.ajaxOptions.success && o.ajaxOptions.success(r, s);
-
- // This callback is required because the switch has to take
- // place after loading has completed. Call last in order to
- // fire load before show callback...
- callback();
- }
- });
- if (this.xhr) {
- // terminate pending requests from other tabs and restore tab label
- this.xhr.abort();
- cleanup();
- }
- $a.addClass(o.loadingClass);
- setTimeout(function() { // timeout is again required in IE, "wait" for id being restored
- self.xhr = $.ajax(ajaxOptions);
- }, 0);
-
- },
- url: function(index, url) {
- this.$tabs.eq(index).removeData('cache.tabs').data('load.tabs', url);
- },
- destroy: function() {
- var o = this.options;
- this.element.unbind('.tabs')
- .removeClass(o.navClass).removeData('tabs');
- this.$tabs.each(function() {
- var href = $.data(this, 'href.tabs');
- if (href)
- this.href = href;
- var $this = $(this).unbind('.tabs');
- $.each(['href', 'load', 'cache'], function(i, prefix) {
- $this.removeData(prefix + '.tabs');
- });
- });
- this.$lis.add(this.$panels).each(function() {
- if ($.data(this, 'destroy.tabs'))
- $(this).remove();
- else
- $(this).removeClass([o.selectedClass, o.unselectClass,
- o.disabledClass, o.panelClass, o.hideClass].join(' '));
- });
- }
-});
-
-$.ui.tabs.defaults = {
- // basic setup
- unselect: false,
- event: 'click',
- disabled: [],
- cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
- // TODO history: false,
-
- // Ajax
- spinner: 'Loading&#8230;',
- cache: false,
- idPrefix: 'ui-tabs-',
- ajaxOptions: {},
-
- // animations
- fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
-
- // templates
- tabTemplate: '<li><a href="#{href}"><span>#{label}</span></a></li>',
- panelTemplate: '<div></div>',
-
- // CSS classes
- navClass: 'ui-tabs-nav',
- selectedClass: 'ui-tabs-selected',
- unselectClass: 'ui-tabs-unselect',
- disabledClass: 'ui-tabs-disabled',
- panelClass: 'ui-tabs-panel',
- hideClass: 'ui-tabs-hide',
- loadingClass: 'ui-tabs-loading'
-};
-
-$.ui.tabs.getter = "length";
-
-/*
- * Tabs Extensions
- */
-
-/*
- * Rotate
- */
-$.extend($.ui.tabs.prototype, {
- rotation: null,
- rotate: function(ms, continuing) {
-
- continuing = continuing || false;
-
- var self = this, t = this.options.selected;
-
- function start() {
- self.rotation = setInterval(function() {
- t = ++t < self.$tabs.length ? t : 0;
- self.select(t);
- }, ms);
- }
-
- function stop(e) {
- if (!e || e.clientX) { // only in case of a true click
- clearInterval(self.rotation);
- }
- }
-
- // start interval
- if (ms) {
- start();
- if (!continuing)
- this.$tabs.bind(this.options.event, stop);
- else
- this.$tabs.bind(this.options.event, function() {
- stop();
- t = self.options.selected;
- start();
- });
- }
- // stop interval
- else {
- stop();
- this.$tabs.unbind(this.options.event, stop);
- }
- }
-});
-
-})(jQuery);
diff --git a/examples/adding_up_to_10_old/po/en-US.po b/examples/adding_up_to_10_old/po/en-US.po
deleted file mode 100755
index cb09aac..0000000
--- a/examples/adding_up_to_10_old/po/en-US.po
+++ /dev/null
@@ -1,28 +0,0 @@
-# English translations for PACKAGE package.
-msgid ""
-msgstr ""
-"Project-Id-Version: adding up to 10 v1\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2009-07-07 04:46-0600\n"
-"Last-Translator: Felipe López Toledo <zer.subzero@gmail.com>\n"
-"Language-Team: karma <zer.subzero@gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: English\n"
-"X-Poedit-Country: United States\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-
-msgid "choose an option"
-msgstr "choose an option"
-
-msgid "Time"
-msgstr "Time"
-
-msgid "Level"
-msgstr "Level"
-
-msgid "Restart"
-msgstr "Restart"
-
diff --git a/examples/adding_up_to_10_old/po/en-US.po~ b/examples/adding_up_to_10_old/po/en-US.po~
deleted file mode 100755
index 7509aa8..0000000
--- a/examples/adding_up_to_10_old/po/en-US.po~
+++ /dev/null
@@ -1,25 +0,0 @@
-"Project-Id-Version: adding up to 10 v1\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2009-07-07 04:46-0600\n"
-"Last-Translator: Felipe López Toledo <zer.subzero@gmail.com>\n"
-"Language-Team: karma <zer.subzero@gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: English\n"
-"X-Poedit-Country: United States\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-
-msgid "choose an option"
-msgstr "choose an option"
-
-msgid "Time"
-msgstr "Time"
-
-msgid "Level"
-msgstr "Level"
-
-msgid "Restart"
-msgstr "Restart"
-
diff --git a/examples/adding_up_to_10_old/po/es-MX.po~ b/examples/adding_up_to_10_old/po/es-MX.po~
deleted file mode 100755
index 372a863..0000000
--- a/examples/adding_up_to_10_old/po/es-MX.po~
+++ /dev/null
@@ -1,26 +0,0 @@
-"Project-Id-Version: adding up to 10 v1\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2009-07-07 04:46-0600\n"
-"Last-Translator: Felipe López Toledo <zer.subzero@gmail.com>\n"
-"Language-Team: karma <zer.subzero@gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Spanish\n"
-"X-Poedit-Country: MEXICO\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-
-msgid "choose an option"
-msgstr "escoge una opción"
-
-msgid "Time"
-msgstr "Tiempo"
-
-msgid "Level"
-msgstr "Nivel"
-
-msgid "Restart"
-msgstr "Reinicia"
-
-
diff --git a/examples/adding_up_to_10_old/po/he-IL.po~ b/examples/adding_up_to_10_old/po/he-IL.po~
deleted file mode 100755
index b1ea579..0000000
--- a/examples/adding_up_to_10_old/po/he-IL.po~
+++ /dev/null
@@ -1,25 +0,0 @@
-"Project-Id-Version: adding up to 10 v1\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2009-07-07 04:46-0600\n"
-"Last-Translator: Felipe López Toledo <zer.subzero@gmail.com>\n"
-"Language-Team: karma <zer.subzero@gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Hebrew\n"
-"X-Poedit-Country: Israel\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-
-msgid "choose an option"
-msgstr "בחר באפשרות"
-
-msgid "Time"
-msgstr "שעה"
-
-msgid "Level"
-msgstr "רמת"
-
-msgid "Restart"
-msgstr "הפעל מחדש"
-
diff --git a/examples/adding_up_to_10_old/po/ne-NE.po b/examples/adding_up_to_10_old/po/ne-NE.po
deleted file mode 100755
index a496fc0..0000000
--- a/examples/adding_up_to_10_old/po/ne-NE.po
+++ /dev/null
@@ -1,28 +0,0 @@
-# Nepalli translations for PACKAGE package.
-msgid ""
-msgstr ""
-"Project-Id-Version: adding up to 10 v1\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2009-07-07 04:46-0600\n"
-"Last-Translator: Felipe López Toledo <zer.subzero@gmail.com>\n"
-"Language-Team: karma <zer.subzero@gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Nepalli\n"
-"X-Poedit-Country: Nepal\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-
-msgid "choose an option"
-msgstr ""
-
-msgid "Time"
-msgstr ""
-
-msgid "Level"
-msgstr ""
-
-msgid "Restart"
-msgstr ""
-
diff --git a/examples/adding_up_to_10_old/po/ne-NE.po~ b/examples/adding_up_to_10_old/po/ne-NE.po~
deleted file mode 100755
index 23a538f..0000000
--- a/examples/adding_up_to_10_old/po/ne-NE.po~
+++ /dev/null
@@ -1,26 +0,0 @@
-
-"Project-Id-Version: adding up to 10 v1\n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: 2009-07-07 04:46-0600\n"
-"Last-Translator: Felipe López Toledo <zer.subzero@gmail.com>\n"
-"Language-Team: karma <zer.subzero@gmail.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Nepalli\n"
-"X-Poedit-Country: Nepal\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-
-msgid "choose an option"
-msgstr ""
-
-msgid "Time"
-msgstr ""
-
-msgid "Level"
-msgstr ""
-
-msgid "Restart"
-msgstr ""
-
diff --git a/experiments/mytest1.html b/experiments/mytest1.html
index 2c45126..333c0e2 100644
--- a/experiments/mytest1.html
+++ b/experiments/mytest1.html
@@ -16,7 +16,7 @@
ltCtx.drawImage(ballImg, 0, 0, 77, 77);
ltCtx.drawImage(ballImg, 0, 0, 77, 77, 70, 70, 77, 77);
-
+ leftCanvas.setAttribute('width', '100%');
}, false);
@@ -50,10 +50,11 @@
border: black 2px solid;
}
-/*#image {
- width: 0px;
- height: 0px;
-}*/
+#leftCanvas {
+ width: 50%;
+ height: 50%;
+
+}
</style>
diff --git a/utils/README.md b/utils/README.md
index 6ded27d..e586bf9 100755
--- a/utils/README.md
+++ b/utils/README.md
@@ -1,43 +1,67 @@
-Narwhal: A flexible server-side JavaScript standard library
-===========================================================
+Narwhal
+=======
-Narwhal is a server-side JavaScript standard library conforming to the [ServerJS standard](https://wiki.mozilla.org/ServerJS). It is designed to work with multiple JavaScript interpreters, and to be easy to add support for new interpreters. Wherever possible, it is implemented in pure JavaScript to maximize reuse of code among platforms.
+A general purpose JavaScript platform
+-------------------------------------
+
+Narwhal is a cross-platform, multi-interpreter, general purpose JavaScript platform. It aims to provide a solid foundation for building JavaScript applications, primarily outside the web browser. Narwhal includes a package manager, module system, and standard library for multiple JavaScript interpreters. Currently Narwhal's [Rhino](http://www.mozilla.org/rhino/) support is the most complete, but [other platforms](platforms.html) are available too.
+
+Narwhal's standard library conforms to the [ServerJS standard](https://wiki.mozilla.org/ServerJS). It is designed to work with multiple JavaScript interpreters, and to be easy to add support for new interpreters. Wherever possible, it is implemented in pure JavaScript to maximize reuse of code among platforms.
+
+Combined with [Jack](http://jackjs.org/), a [Rack](http://rack.rubyforge.org/)-like [JSGI](http://jackjs.org/jsgi-spec.html) compatible library, Narwhal provides a platform for creating server-side JavaScript web applications and frameworks such as [Nitro](http://www.nitrojs.org/).
+
+
+### Homepage:
+
+* [http://narwhaljs.org/](http://narwhaljs.org/)
+
+### Source & Download:
+
+* [http://github.com/tlrobinson/narwhal/](http://github.com/tlrobinson/narwhal/)
+
+### Mailing list:
+
+* [http://groups.google.com/group/narwhaljs](http://groups.google.com/group/narwhaljs)
+
+### IRC:
+
+* [\#narwhal on irc.freenode.net](http://webchat.freenode.net/?channels=narwhal)
Documentation
-------------
-**The following links are relative and may not resolve properly depending on where and how they are viewed. Please visit the [canonical repository](http://github.com/tlrobinson/narwhal/tree/master/) or this repository's [master](master/) branch if they do not work.**
-
-* [Quick Start](doc/quick-start.md)
-* [Packages](doc/packages.md)
-* [How to Install Packages](doc/packages.md)
-* [How to Build Packages](doc/packages-howto.md)
-* [Modules](doc/modules.md)
-* [Virtual Environments / Seas](doc/sea.md)
-* [How to Build Platforms](doc/platforms.md)
-* [How Narwhal Works](doc/narwhal.md)
+* [Quick Start](quick-start.html)
+* [Packages](packages.html)
+* [How to Install Packages](packages.html)
+* [How to Build Packages](packages-howto.html)
+* [Modules](modules.html)
+* [Virtual Environments / Seas](sea.html)
+* [How to Build Platforms](platforms.html)
+* [How Narwhal Works](narwhal.html)
Contributors
------------
-* Tom Robinson
-* Kris Kowal
-* George Moschovitis
-* Kevin Dangoor
+* [Tom Robinson](http://tlrobinson.net/)
+* [Kris Kowal](http://askawizard.blogspot.com/)
+* [George Moschovitis](http://blog.gmosx.com/)
+* [Kevin Dangoor](http://www.blueskyonmars.com/)
* Hannes Wallnöfer
* Sébastien Pierre
* Irakli Gozalishvili
* Christoph Dorn
* Zach Carter
-* Nathan L Smith
+* Nathan L. Smith
+* Jan Varwig
+* Mark Porter
License
-------
-Copyright (c) 2009 Thomas Robinson <tlrobinson.net>
+Copyright (c) 2009 Thomas Robinson < 280north.com >
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
diff --git a/utils/bin/activate.bash b/utils/bin/activate.bash
index 8695009..e3cf2c7 100755
--- a/utils/bin/activate.bash
+++ b/utils/bin/activate.bash
@@ -1,8 +1,30 @@
-if [ -z "$PACKAGE_HOME" ]; then
+if [ -z "${BASH_ARGV[0]}" ]; then
+
+ # as a last recourse, use the present working directory
PACKAGE_HOME=$(pwd)
+
+else
+
+ # get the absolute path of the executable
+ SELF_PATH=$(
+ cd -P -- "$(dirname -- "${BASH_ARGV[0]}")" \
+ && pwd -P
+ ) && SELF_PATH=$SELF_PATH/$(basename -- "${BASH_ARGV[0]}")
+
+ # resolve symlinks
+ while [ -h "$SELF_PATH" ]; do
+ DIR=$(dirname -- "$SELF_PATH")
+ SYM=$(readlink -- "$SELF_PATH")
+ SELF_PATH=$(cd -- "$DIR" && cd -- $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
+ done
+
+ PACKAGE_HOME=$(dirname -- "$(dirname -- "$SELF_PATH")")
+
fi
+export PACKAGE_HOME
+
# which -s narwhal doesn't work (os x 10.5, kriskowal)
if [ -f "$PACKAGE_HOME"/bin/narwhal ]; then
NARWHAL="$PACKAGE_HOME"/bin/narwhal
@@ -13,8 +35,7 @@ else
if [ "$?" -ne 127 ]; then
NARWHAL=narwhal
else
- echo "ERROR: narwhal is not in your PATH or $PACKAGE_HOME/bin."
- exit
+ echo "ERROR: narwhal is not in your PATH nor in $PACKAGE_HOME/bin." >&2
fi
fi
@@ -23,5 +44,7 @@ if [ -f "$PACKAGE_HOME"/narwhal.conf ]; then
export NARWHAL_DEFAULT_PLATFORM
fi
-export PATH="$("$NARWHAL" --package "$PACKAGE_HOME" --path :)"
+if [ "$NARWHAL" ]; then
+ export PATH="$("$NARWHAL" --package "$PACKAGE_HOME" --path :)"
+fi
diff --git a/utils/bin/narwhal b/utils/bin/narwhal
index 1617491..01fd4b1 100755
--- a/utils/bin/narwhal
+++ b/utils/bin/narwhal
@@ -1,7 +1,7 @@
#!/bin/bash
# get the absolute path of the executable
-SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH=$SELF_PATH/$(basename -- "$0")
+SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH="$SELF_PATH/$(basename -- "$0")"
# resolve symlinks
while [ -h "$SELF_PATH" ]; do
@@ -10,50 +10,39 @@ while [ -h "$SELF_PATH" ]; do
SELF_PATH=$(cd -- "$DIR" && cd -- $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
done
+# NARWHAL_HOME is the 2nd ancestor directory of this shell script
NARWHAL_HOME=$(dirname -- "$(dirname -- "$SELF_PATH")")
+# use Rhino as the default if none is specified in narwhal.conf
NARWHAL_DEFAULT_PLATFORM="rhino"
+
+# load narwhal.conf if it exists
if [ -f "$NARWHAL_HOME/narwhal.conf" ]; then
source "$NARWHAL_HOME"/narwhal.conf
fi
+
+# if NARWHAL_PLATFORM isn't yet set, set it to the default platform, and export it
if [ -z "$NARWHAL_PLATFORM" ]; then
NARWHAL_PLATFORM=$NARWHAL_DEFAULT_PLATFORM
fi
-
-# get the absolute path of the executable
-SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH="$SELF_PATH/$(basename -- "$0")"
-
-# resolve symlinks
-while [ -h "$SELF_PATH" ]; do
- DIR=$(dirname -- "$SELF_PATH")
- SYM=$(readlink -- "$SELF_PATH")
- SELF_PATH=$(cd -- "$DIR" && cd "$(dirname -- "$SYM")" && pwd)/$(basename -- "$SYM")
-done
-
-SELF_DIR=`dirname -- "$SELF_PATH"`
-NARWHAL_HOME=`dirname -- "$SELF_DIR"`
-
-if [ ! "$NARWHAL_PLATFORM" ]; then
- NARWHAL_PLATFORM=$NARWHAL_DEFAULT_PLATFORM
-fi
-
export NARWHAL_HOME
+# build the executable name for the platform
EXECUTABLE_NAME="narwhal-$NARWHAL_PLATFORM"
+# search for the platform home directory
# try narwhal.conf setting
if [ "$NARWHAL_PLATFORM_HOME" ]; then
export NARWHAL_PLATFORM_HOME
- "$NARWHAL_PLATFORM_HOME"/bin/"$EXECUTABLE_NAME" "$@"
# try relative
elif [ -f "$NARWHAL_HOME/platforms/$NARWHAL_PLATFORM/bin/$EXECUTABLE_NAME" ]; then
export NARWHAL_PLATFORM_HOME="$NARWHAL_HOME/platforms/$NARWHAL_PLATFORM"
- "$NARWHAL_HOME/platforms/$NARWHAL_PLATFORM/bin/$EXECUTABLE_NAME" "$@"
# try $PATH
elif which -s "$EXECUTABLE_NAME"; then
export NARWHAL_PLATFORM_HOME=$(dirname -- "$(dirname -- "$EXECUTABLE_NAME")")
- "$EXECUTABLE_NAME" "$@"
else
echo "Can't find executable for $NARWHAL_PLATFORM"
+ exit 1
fi
+exec "$NARWHAL_PLATFORM_HOME"/bin/"$EXECUTABLE_NAME" "$@"
diff --git a/utils/bin/sea b/utils/bin/sea
index 5e6406c..13f7f52 100755
--- a/utils/bin/sea
+++ b/utils/bin/sea
@@ -13,7 +13,7 @@ while [ -h "$SELF_PATH" ]; do
SELF_PATH=$(cd -- "$DIR" && cd -- $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
done
-PACKAGE_HOME=$(dirname -- "$(dirname -- "$SELF_PATH")")
+export PACKAGE_HOME=$(dirname -- "$(dirname -- "$SELF_PATH")")
source "$PACKAGE_HOME/bin/activate.bash"
diff --git a/utils/catalog.json b/utils/catalog.json
index d32df16..302c53b 100755
--- a/utils/catalog.json
+++ b/utils/catalog.json
@@ -40,8 +40,14 @@
"jack",
"template"
],
+ "contributors": [
+ "Kris Kowal"
+ ],
"js": "lib",
"main": "examples/simple/jackconfig",
+ "lean": [
+ "lib"
+ ],
"githubName": "nitro",
"type": "zip",
"location": "http://github.com/gmosx/nitro/zipball/master"
@@ -126,12 +132,12 @@
"type": "zip",
"location": "http://github.com/tlrobinson/jack-servlet/zipball/master"
},
- "gae": {
+ "appengine-java-sdk": {
"name": "gae",
"title": "Google App Engine Java SDK",
- "description": "Java components necessary for depolying applications on Google's App Engine.",
+ "description": "Java components necessary for deploying applications on Google's App Engine.",
"author": "Google",
- "version": "1.2.1",
+ "version": "1.2.2",
"dependencies": [
"jack-servlet",
"jack",
@@ -139,7 +145,7 @@
],
"lib": [],
"type": "zip",
- "location": "http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.1.zip"
+ "location": "http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.2.zip"
},
"env": {
"githubName": "env-js",
diff --git a/utils/docs/packages.md b/utils/docs/packages.md
index a4e6df9..8b1e60c 100755
--- a/utils/docs/packages.md
+++ b/utils/docs/packages.md
@@ -4,7 +4,7 @@ Available Packages
You can download and install packages using the `tusk` application that comes with Narwhal. Check out `tusk help` for details. These are some of the packages:
-* `jack`: the webserver and web application/framework agnostic interface, similar to Ruby's Rack and Python's WSGI. Narwhal was concieved while building Jack, and was later extracted into it's own project.
+* `jack`: the webserver and web application/framework agnostic interface, similar to Ruby's Rack and Python's WSGI. Narwhal was conceived while building Jack, and was later extracted into it's own project.
[http://github.com/tlrobinson/jack](http://github.com/tlrobinson/jack)
@@ -16,10 +16,6 @@ You can download and install packages using the `tusk` application that comes wi
[http://github.com/gmosx/nitro](http://github.com/gmosx/nitro)
-* `getjs`: a JavaScript package manager for ServerJS implementations
-
-[http://github.com/dangoor/getjs](http://github.com/dangoor/getjs)
-
And others including:
* Narcissus
diff --git a/utils/docs/platforms.md b/utils/docs/platforms.md
index 18d3b89..5e25b26 100755
--- a/utils/docs/platforms.md
+++ b/utils/docs/platforms.md
@@ -20,9 +20,13 @@ Creating new Platform Adapters
We have a template for new platforms at "platforms/template" that you can copy to "platforms/{name}" and fill in the blanks. These consist of:
-1. A shell script at "platforms/{name}/bin/platform-{name}" that executes the interpreter engine of choice and causes it to load a bootstrap script. This script will be loaded by "bin/narwhal" with `NARWHAL_HOME` set to the Narwhal project directory. This script will be run if `NARWHAL_PLATFORM` is set to your platform name. You can set `NARWHAL_DEFAULT_PLATFORM` or `NARWHAL_PLATFORM` in a "narwhal.conf" in your Narwhal project directory (template provided).
+1. An executable (shell script or binary) at "platforms/{name}/bin/platform-{name}" that executes the interpreter engine of choice and causes it to load a bootstrap script. This script will be loaded by "bin/narwhal" with the environment variable `NARWHAL_HOME` set to the Narwhal project directory and `NARWHAL_PLATFORM_HOME` set to the platform directory. This script will be run if `NARWHAL_PLATFORM` is set to your platform name. You can set `NARWHAL_DEFAULT_PLATFORM` or `NARWHAL_PLATFORM` in a "narwhal.conf" in your Narwhal project directory (template provided).
-2. A "thunk", at `platforms/{name}/bootstrap.js` that evaluates `narwhal.js` and passes the returned function a preliminary `system` object with a few required properties (`global`, `evalGlobal`, `platform`, `platforms`, `print`, `evaluate`, `prefix`, `fs.read`, and `fs.isFile`).
+2. A "thunk", at `platforms/{name}/bootstrap.js` that evaluates `narwhal.js` and passes the returned function a preliminary `system` object with a few required properties (`global`, `evalGlobal`, `platform`, `platforms`, `print`, `evaluate`, `prefix`, `fs.read`, and `fs.isFile`). This should be enough to get to an interactive console.
-2. Platform implemenations for core modules, such as `file` and `system` located in `platforms/{name}/lib/`. You can implement `file-platform` instead of `file` if you implement the subset of the ServerJS file API used by `lib/file.js`. To get things running, you must implement the file module's `list`, `canonical`, `mtime`, `isDirectory`, `isFile`.
+3. Platform implementations for core modules, such as `file` and `system` located in `platforms/{name}/lib/`. You can implement `file-platform` instead of `file` if you implement the subset of the ServerJS file API used by `lib/file.js` (and similar for `io`, `os`, `binary`, etc). The next steps are:
+
+ * system: You must implement `system.args` to be able to pass command line options to Narwhal.
+
+ * file: To enable the package system you must implement `list`, `canonical`, `mtime`, `isDirectory`, `isFile`.
diff --git a/utils/lib/file.js b/utils/lib/file.js
index e7c2336..8c354ba 100755
--- a/utils/lib/file.js
+++ b/utils/lib/file.js
@@ -1,12 +1,8 @@
-var io = require('io');
-var implementation = require('file-platform');
+// NOTE: portions of the "file" module are implemented in "file-bootstrap" and "file-platform",
+// which are loaded at the bottom of this file to allow for overriding default implementations
-for (var name in implementation) {
- if (Object.prototype.hasOwnProperty.call(implementation, name)) {
- exports[name] = implementation[name];
- }
-}
+var io = require('io');
/* streams */
@@ -296,79 +292,20 @@ exports.rmtree = function(path) {
/* path manipulation */
-var ROOT = implementation.ROOT;
-var SEPARATOR = implementation.SEPARATOR;
-var ALT_SEPARATOR = implementation.ALT_SEPARATOR;
-var SEPARATORS_RE = new RegExp(
- "[" +
- RegExp.escape(SEPARATOR || '') +
- RegExp.escape(ALT_SEPARATOR || '') +
- "]"
-);
-
-exports.join = function () {
- return exports.normal(Array.prototype.join.call(arguments, SEPARATOR));
-};
-
-exports.split = function (path) {
- try {
- return String(path).split(SEPARATORS_RE);
- } catch (exception) {
- throw new Error("Cannot split " + (typeof path) + ', "' + path + '"');
- }
-};
-
-exports.resolve = function () {
- var root = "";
- var parents = [];
- var children = [];
- var leaf = "";
- for (var i = 0; i < arguments.length; i++) {
- var path = String(arguments[i]);
- if (path == "")
- continue;
- if (path.charAt(0) == SEPARATOR) {
- path = path.substring(1, path.length);
- root = ROOT;
- parents = [];
- children = [];
- }
- var parts = path.split(SEPARATOR);
- leaf = parts.pop();
- if (leaf == "." || leaf == "..") {
- parts.push(leaf);
- leaf = "";
- }
- for (var j = 0; j < parts.length; j++) {
- var part = parts[j];
- if (part == "." || part == '') {
- } else if (part == "..") {
- if (children.length) {
- children.pop();
- } else {
- if (root) {
- } else {
- parents.push("..");
- }
- }
- } else {
- children.push(part);
- }
- };
- }
- path = parents.concat(children).join(SEPARATOR);
- if (path) leaf = SEPARATOR + leaf;
- return root + path + leaf;
-};
-
exports.relative = function (source, target) {
+ if (!target) {
+ target = source;
+ source = exports.cwd() + '/';
+ }
source = exports.absolute(source);
target = exports.absolute(target);
- source = source.split(SEPARATOR);
- target = target.split(SEPARATOR);
- if (source[source.length - 1] == "")
- source.pop();
- while (source.length && target.length && target[0] == source[0]) {
+ source = source.split(exports.SEPARATORS_RE());
+ target = target.split(exports.SEPARATORS_RE());
+ source.pop();
+ while (
+ source.length &&
+ target.length &&
+ target[0] == source[0]) {
source.shift();
target.shift();
}
@@ -376,35 +313,13 @@ exports.relative = function (source, target) {
source.shift();
target.unshift("..");
}
- return target.join(SEPARATOR);
-};
-
-exports.normal = function (path) {
- return exports.resolve(path);
+ return target.join(exports.SEPARATORS_RE());
};
exports.absolute = function (path) {
return exports.resolve(exports.join(exports.cwd(), ''), path);
};
-exports.dirname = function (path) {
- var parts = exports.split(path);
- parts.pop();
- return exports.join.apply(null, parts);
-};
-
-exports.basename = function (path) {
- return path.split(SEPARATOR).pop();
-};
-
-exports.extension =
-exports.extname = function(path) {
- path = exports.basename(path);
- path = path.replace(/^\.*/, '');
- var index = path.lastIndexOf(".");
- return index <= 0 ? "" : path.substring(index);
-};
-
/* path wrapper, for chaining */
exports.path = function (/*path*/) {
@@ -463,7 +378,8 @@ var pathed = [
'basename',
'canonical',
'dirname',
- 'normal'
+ 'normal',
+ 'relative'
];
for (var i = 0; i < pathed.length; i++) {
@@ -525,3 +441,7 @@ for (var i = 0; i < trivia.length; i++) {
})(name);
}
+// load "file-bootstrap" and "file-platform", which in turn load "file" and modify it's module object.
+// "platform" gets priority so it's loaded last.
+require("file-bootstrap");
+require("file-platform");
diff --git a/utils/lib/logger.js b/utils/lib/logger.js
index 9cb818a..8db60e7 100755
--- a/utils/lib/logger.js
+++ b/utils/lib/logger.js
@@ -44,7 +44,7 @@ Logger.prototype.debug = function() {
Logger.prototype.add = function(severity, message, progname) {
if (severity > this.level)
return false;
- this.output.print(message || progname);
+ this.output.write(message || progname);
};
Logger.prototype.format = function(severity, args) {
diff --git a/utils/lib/narwhal/repl.js b/utils/lib/narwhal/repl.js
index 1c9e538..4eab332 100755
--- a/utils/lib/narwhal/repl.js
+++ b/utils/lib/narwhal/repl.js
@@ -1,4 +1,7 @@
-var Narcissus = require("narcissus/parse");
+try {
+ var Narcissus = require("narcissus/parse");
+} catch(e) {
+}
var util = require('util');
@@ -70,6 +73,9 @@ exports.repl = function() {
}
function incomplete(text) {
+ if (!Narcissus)
+ return false;
+
var incomp = true;
try {
var t = new Narcissus.Tokenizer(text);
diff --git a/utils/lib/narwhal/tusk.js b/utils/lib/narwhal/tusk.js
index ad5c257..ded05cc 100755
--- a/utils/lib/narwhal/tusk.js
+++ b/utils/lib/narwhal/tusk.js
@@ -36,6 +36,9 @@ parser.command('platform', module.id + '/platform');
parser.command('freeze', null)
.help('writes a freeze.json file');
+parser.command('bundle', null)
+ .help('creates an archive of your project and its package dependencies');
+
parser.command('reheat', module.id + '/reheat');
parser.command('clone', module.id + '/clone');
diff --git a/utils/lib/narwhal/tusk/init.js b/utils/lib/narwhal/tusk/init.js
index 213ffcf..3c73fda 100755
--- a/utils/lib/narwhal/tusk/init.js
+++ b/utils/lib/narwhal/tusk/init.js
@@ -41,6 +41,7 @@ parser.action(function (options, parentOptions) {
var activate = path.join('bin', 'activate.bash');
fs.path(system.prefix).join('bin', 'activate.bash')
.copy(activate);
+ activate.relative().symlink(activate.resolve('activate'));
path.join('README').touch();
path.join('narwhal.conf')
diff --git a/utils/lib/narwhal/tusk/reheat.js b/utils/lib/narwhal/tusk/reheat.js
index 60bc6f7..b1dd510 100755
--- a/utils/lib/narwhal/tusk/reheat.js
+++ b/utils/lib/narwhal/tusk/reheat.js
@@ -6,7 +6,7 @@ var args = require("args");
var packages = require('packages');
var parser = exports.parser = new args.Parser();
-parser.help('reconsistutes the exact versions of all dependencies from a frozen site.');
+parser.help('reconsistutes the exact versions of all dependencies from a frozen project');
parser.action(function (options, name) {
var names = packages.root.dependencies || [];
diff --git a/utils/lib/packages.js b/utils/lib/packages.js
index 2a18939..976f991 100755
--- a/utils/lib/packages.js
+++ b/utils/lib/packages.js
@@ -55,6 +55,16 @@ exports.load = function (packagePrefixes) {
// platform-specific synthesis
if (packagesPlatform)
packagesPlatform.synthesize(analysis);
+
+ // preload modules
+ analysis.preloadModules.forEach(function(id) {
+ system.log.debug("Preloading module: "+id);
+ try {
+ require(id);
+ } catch (e) {
+ system.log.warn("Error preloading module: "+e);
+ }
+ });
// record results
exports.catalog = catalog;
@@ -271,7 +281,8 @@ var _topo = function _topo(graph, name, visited) {
based on the given sorted package array.
*/
exports.analyze = function analyze(analysis, catalog) {
- var jsPaths = analysis.libPaths = []
+ analysis.libPaths = [];
+ analysis.preloadModules = [];
catalog.forEach(function (packageData) {
// libraries
@@ -296,7 +307,11 @@ exports.analyze = function analyze(analysis, catalog) {
packageData.lib[i] = packageData.directory.resolve(packageData.lib[i]);
}
- jsPaths.unshift.apply(jsPaths, packageData.lib);
+ analysis.libPaths.unshift.apply(analysis.libPaths, packageData.lib);
+
+ // add any preload librarys to analysis
+ if (packageData.preload)
+ analysis.preloadModules.unshift.apply(analysis.preloadModules, packageData.preload);
});
};
@@ -312,9 +327,10 @@ exports.synthesize = function synthesize(analysis) {
*/
exports.addJsPaths = function addJsPaths(jsPaths) {
// add package paths to the loader
- require.paths.splice.apply(
- require.paths,
- [0, require.paths.length].concat(jsPaths)
- );
+ if (require.paths)
+ require.paths.splice.apply(
+ require.paths,
+ [0, require.paths.length].concat(jsPaths)
+ );
};
diff --git a/utils/lib/sandbox.js b/utils/lib/sandbox.js
index 52394bc..93b77e0 100755
--- a/utils/lib/sandbox.js
+++ b/utils/lib/sandbox.js
@@ -1,4 +1,7 @@
+// NOTE: this file is used is the bootstrapping process,
+// so any "requires" must be accounted for in narwhal.js
+
exports.Loader = function (options) {
var loader = {};
var factories = options.factories || {};
@@ -6,22 +9,23 @@ exports.Loader = function (options) {
var extensions = options.extensions || ["", ".js"];
var timestamps = {};
- loader.resolve = function (id, baseId) {
- if (typeof id != "string")
- throw new Error("module id '" + id + "' is not a String");
- if (id.charAt(0) == ".") {
- id = dirname(baseId) + "/" + id;
- }
- return normal(id);
- };
+ loader.resolve = exports.resolve;
loader.find = function (topId) {
for (var j = 0; j < extensions.length; j++) {
- var ext = extensions[j];
- for (var i = 0; i < paths.length; i++) {
- var fileName = join(paths[i], topId + ext);
- if (system.fs.isFile(fileName))
- return fileName;
+ var extension = extensions[j];
+ if (system.fs.isAbsolute(topId)) {
+ var path = topId + extension;
+ if (system.fs.isFile(path)) {
+ return path;
+ }
+ }
+ else {
+ for (var i = 0; i < paths.length; i++) {
+ var path = system.fs.join(paths[i], topId + extension);
+ if (system.fs.isFile(path))
+ return path;
+ }
}
}
throw new Error("require error: couldn't find \"" + topId + '"');
@@ -89,26 +93,27 @@ exports.MultiLoader = function (options) {
[".js", self.loader]
];
- self.resolve = function (id, baseId) {
- if (typeof id != "string")
- throw new Error("module id '" + id + "' is not a String");
- if (id.charAt(0) == ".") {
- id = dirname(baseId) + "/" + id;
- }
- return normal(id);
- };
+ self.resolve = exports.resolve;
self.find = function (topId) {
for (var j = 0; j < self.loaders.length; j++) {
var pair = self.loaders[j];
var extension = pair[0];
var loader = pair[1];
- for (var i = 0; i < self.paths.length; i++) {
- var path = join(self.paths[i], topId + extension);
+ if (system.fs.isAbsolute(topId)) {
+ var path = topId + extension;
if (system.fs.isFile(path)) {
return [loader, path];
}
}
+ else {
+ for (var i = 0; i < self.paths.length; i++) {
+ var path = system.fs.join(self.paths[i], topId + extension);
+ if (system.fs.isFile(path)) {
+ return [loader, path];
+ }
+ }
+ }
}
throw "require error: couldn't find \"" + topId + '"';
};
@@ -131,10 +136,37 @@ exports.MultiLoader = function (options) {
return Object.prototype.hasOwnProperty.call(factories, topId);
};
-
return self;
};
+exports.AttenuatedLoader = function (loader) {
+ var self = {};
+
+ self.resolve = Object.freeze(function (id, baseId) {
+ return loader.resolve(id, baseId);
+ });
+
+ self.fetch = Object.freeze(function (topId) {
+ if (/\./.test(topId))
+ throw new Error("Invalid module identifier");
+ return loader.fetch(topId);
+ });
+
+ self.load = Object.freeze(function (topId, path) {
+ if (/\./.test(topId))
+ throw new Error("Invalid module identifier");
+ return loader.load(topId, path);
+ });
+
+ self.reload = Object.freeze(function (topId) {
+ if (/\./.test(topId))
+ throw new Error("Invalid module identifier");
+ return loader.reload(topId, path);
+ });
+
+ return Object.freeze(self);
+};
+
exports.Sandbox = function (options) {
options = options || {};
var loader = options.loader;
@@ -142,15 +174,15 @@ exports.Sandbox = function (options) {
var modules = options.modules || {};
var debug = options.debug !== undefined ? !!options.debug : system.debug;
- var debugDepth = 0;
- var mainId;
-
// managed print free variable in the sandbox forwards
// to system.print
- var print = function () {
+ var print = options.print || function () {
return sandboxSystem.print.apply(sandboxSystem, arguments);
};
+ var debugDepth = 0;
+ var mainId;
+
var sandbox = function (id, baseId, force, reload) {
id = loader.resolve(id, baseId);
@@ -333,6 +365,7 @@ exports.sandbox = function(main, system, options) {
var prefix = options['prefix'];
var loader = options['loader'] || require.loader;
var modules = options['modules'] || {};
+ var print = options['print'];
var debug = options['debug'];
if (!loader) throw new Error(
"sandbox cannot operate without a loader, either explicitly " +
@@ -345,51 +378,17 @@ exports.sandbox = function(main, system, options) {
modules: modules,
loader: loader,
system: system,
+ print: print,
debug: debug
});
return sandbox.main(main);
};
-
-
-////////////////////////////////////////////////
-// Ugh, these are duplicated from the File object, since they're required for
-// require, which is required for loading the File object.
-var dirname = function(path) {
- var raw = String(path),
- match = raw.match(/^(.*)\/[^\/]+\/?$/);
- if (match && match[1])
- return match[1]
- else if (raw.charAt(0) == "/")
- return "/"
- else
- return "."
-};
-
-var normal = function(path) {
- var original;
-
- do {
- original = path;
- path = path
- .replace(/[^\/]+\/\.\.\//g, "")
- .replace(/([^\.])\.\//g, "$1")
- .replace(/^\.\//g, "")
- .replace(/\/\/+/g, "/");
- } while (path !== original);
-
- return path;
-};
-
-var join = function (base) {
- for (var i = 1; i < arguments.length; i++) {
- var rel = arguments[i];
- if (rel.match(/^\//)) {
- base = rel;
- } else {
- base = base + '/' + rel;
- }
+exports.resolve = function (id, baseId) {
+ if (typeof id != "string")
+ throw new Error("module id '" + id + "' is not a String");
+ if (id.charAt(0) == ".") {
+ id = system.fs.dirname(baseId) + "/" + id;
}
- return normal(base);
+ return system.fs.normal(id);
};
-////////////////////////////////////////////////
diff --git a/utils/lib/test/assert.js b/utils/lib/test/assert.js
index 7d88e8b..dde0d2d 100755
--- a/utils/lib/test/assert.js
+++ b/utils/lib/test/assert.js
@@ -26,6 +26,12 @@ assert.isNull = function(assertion, message) {
"\nActual = " + assertion);
}
+assert.isNaN = function(assertion, message) {
+ if (!isNaN(assertion))
+ fail((message || "") + "\nExpected NaN." +
+ "\nActual = " + assertion);
+}
+
assert.isEqual = function(expected, actual, message) {
if (expected !== actual)
fail((message || "") + "\nExpected equal to = " + jsDump.parse(expected) +
diff --git a/utils/lib/test/runner.js b/utils/lib/test/runner.js
index cbfce2e..1bdb43c 100755
--- a/utils/lib/test/runner.js
+++ b/utils/lib/test/runner.js
@@ -30,10 +30,12 @@ exports.run = function(objectOrModule, context) {
try {
objectOrModule[property]();
} finally {
- for (var name in system.global) {
- if (!globals[name]) {
- delete system.global[name];
- throw new assert.AssertionError("New global introduced: " + util.enquote(name));
+ if (!objectOrModule.isMonkey) {
+ for (var name in system.global) {
+ if (!globals[name]) {
+ delete system.global[name];
+ throw new assert.AssertionError("New global introduced: " + util.enquote(name));
+ }
}
}
}
diff --git a/utils/lib/uri.js b/utils/lib/uri.js
index 07872d5..24a76d0 100755
--- a/utils/lib/uri.js
+++ b/utils/lib/uri.js
@@ -43,3 +43,13 @@ URI.prototype.toString = function () {
URI.parse = function(uri) {
return new URI(uri);
}
+
+URI.unescape = function(str, plus) {
+ return decodeURI(str).replace(/\+/g, " ");
+}
+
+URI.unescapeComponent = function(str, plus) {
+ return decodeURIComponent(str).replace(/\+/g, " ");
+}
+
+
diff --git a/utils/lib/util.js b/utils/lib/util.js
index 04865d8..510e322 100755
--- a/utils/lib/util.js
+++ b/utils/lib/util.js
@@ -13,6 +13,14 @@ exports.operator = function (name, length, block) {
var operator = function () {
var args = exports.array(arguments);
var completion = function (object) {
+ if (
+ typeof object == "object" &&
+ object !== null && // seriously? typeof null == "object"
+ name in object && // would throw if object === null
+ // not interested in literal objects:
+ !Object.prototype.hasOwnProperty.call(object, name)
+ )
+ return object[name].apply(object, args);
return block.apply(
this,
[object].concat(args)
@@ -26,6 +34,7 @@ exports.operator = function (name, length, block) {
return completion.call(this, args.shift());
}
};
+ operator.name = name;
operator.displayName = name;
operator.length = length;
operator.operator = block;
@@ -54,7 +63,7 @@ exports.object = exports.operator('object', 1, function (object) {
exports.object.copy = function (object) {
var copy = {};
- Object.keys(object).forEach(function (key) {
+ exports.object.keys(object).forEach(function (key) {
copy[key] = object[key];
});
return copy;
@@ -62,7 +71,7 @@ exports.object.copy = function (object) {
exports.object.deepCopy = function (object) {
var copy = {};
- Object.keys(object).forEach(function (key) {
+ exports.object.keys(object).forEach(function (key) {
copy[key] = exports.deepCopy(object[key]);
});
return copy;
@@ -72,28 +81,35 @@ exports.object.eq = function (a, b, stack) {
return (
!exports.no(a) && !exports.no(b) &&
exports.array.eq(
- Object.keys(a),
- Object.keys(b)
+ exports.sort(exports.object.keys(a)),
+ exports.sort(exports.object.keys(b))
) &&
- Object.keys(a).every(function (key) {
+ exports.object.keys(a).every(function (key) {
return exports.eq(a[key], b[key], stack);
})
);
};
exports.object.len = function (object) {
- return Object.keys(object).length;
+ return exports.object.keys(object).length;
};
exports.object.has = function (object, key) {
return Object.prototype.hasOwnProperty.call(object, key);
};
-exports.object.keys = Object.keys;
+exports.object.keys = function (object) {
+ var keys = [];
+ for (var key in object) {
+ if (exports.object.has(object, key))
+ keys.push(key);
+ }
+ return keys;
+};
exports.object.values = function (object) {
var values = [];
- Object.keys(object).forEach(function (key) {
+ exports.object.keys(object).forEach(function (key) {
values.push(object[key]);
});
return values;
@@ -101,7 +117,7 @@ exports.object.values = function (object) {
exports.object.items = function (object) {
var items = [];
- Object.keys(object).forEach(function (key) {
+ exports.object.keys(object).forEach(function (key) {
items.push([key, object[key]]);
});
return items;
@@ -128,7 +144,7 @@ exports.object.complete = function (target, source) {
exports.object.repr = function (object) {
return "{" +
- Object.keys(object)
+ exports.object.keys(object)
.map(function (key) {
return exports.enquote(key) + ": " +
exports.repr(object[key]);
@@ -139,6 +155,8 @@ exports.object.repr = function (object) {
// array
exports.array = function (array) {
+ if (!exports.isArrayLike(array))
+ return exports.items(array);
return Array.prototype.slice.call(array);
};
@@ -147,7 +165,7 @@ exports.isArrayLike = function(object) {
typeof object === "object" &&
(
object.constructor === Array ||
- object.callee
+ typeof object.callee !== "undefined"
);
};
@@ -166,19 +184,12 @@ exports.array.has = function (array, value) {
};
exports.array.put = function (array, key, value) {
- array.splice.apply(
- array,
- [
- key,
- 1
- ].concat([value])
- .concat(array.slice(key, array.length))
- );
+ array.splice(key, 0, value);
return array;
};
-exports.array.del = function (array, key, value) {
- array.splice(key, 1);
+exports.array.del = function (array, begin, end) {
+ array.splice(begin, end === undefined ? 1 : (end - begin));
return array;
};
@@ -191,7 +202,7 @@ exports.array.eq = function (a, b, stack) {
};
exports.array.lt = function (a, b) {
- var length = Math.max(a, b);
+ var length = Math.max(a.length, b.length);
for (var i = 0; i < length; i++)
if (!exports.eq(a[i], b[i]))
return exports.lt(a[i], b[i]);
@@ -206,7 +217,7 @@ exports.apply = exports.operator('apply', 2, function (args, block) {
return block.apply(this, args);
});
-exports.copy = function (object) {
+exports.copy = exports.operator('copy', 1, function (object) {
if (exports.no(object))
return object;
if (exports.isArrayLike(object))
@@ -214,9 +225,9 @@ exports.copy = function (object) {
if (typeof object == 'object')
return exports.object.copy(object);
return object;
-};
+});
-exports.deepCopy = function (object) {
+exports.deepCopy = exports.operator('deepCopy', 1, function (object) {
if (exports.no(object))
return object;
if (exports.isArrayLike(object))
@@ -224,9 +235,9 @@ exports.deepCopy = function (object) {
if (typeof object == 'object')
return exports.object.deepCopy(object);
return object;
-};
+});
-exports.repr = function (object) {
+exports.repr = exports.operator('repr', 1, function (object) {
if (exports.no(object))
return String(object);
if (exports.isArrayLike(object))
@@ -236,31 +247,31 @@ exports.repr = function (object) {
if (typeof object == 'string')
return exports.enquote(object);
return object.toString();
-};
+});
-exports.keys = function (object) {
+exports.keys = exports.operator('keys', 1, function (object) {
if (exports.isArrayLike(object))
return exports.range(object.length);
else if (typeof object == 'object')
- return Object.keys(object);
+ return exports.object.keys(object);
return [];
-};
+});
-exports.values = function (object) {
+exports.values = exports.operator('values', 1, function (object) {
if (exports.isArrayLike(object))
return exports.array(object);
else if (typeof object == 'object')
return exports.object.values(object);
return [];
-};
+});
-exports.items = function (object) {
+exports.items = exports.operator('items', 1, function (object) {
if (exports.isArrayLike(object) || typeof object == "string")
return exports.enumerate(object);
else if (typeof object == 'object')
return exports.object.items(object);
return [];
-};
+});
exports.len = exports.operator('len', 1, function (object) {
if (exports.isArrayLike(object))
@@ -312,7 +323,7 @@ exports.getset = exports.operator('getset', 3, function (object, key, value) {
exports.del = exports.operator('del', 2, function (object, begin, end) {
if (exports.isArrayLike(object))
- exports.array.del(object, begin, end);
+ return exports.array.del(object, begin, end);
delete object[begin];
return object;
});
@@ -434,9 +445,9 @@ exports.enumerate = function (array, start) {
// arithmetic, transitive, and logical operators
-exports.is = exports.operator('is', 2, function (a, b) {
+exports.is = function (a, b) {
return a === b;
-});
+};
exports.eq = exports.operator('eq', 2, function (a, b, stack) {
if (!stack)
@@ -550,16 +561,17 @@ exports.sort = function (array, compare) {
compare = exports.compare;
if (compare.by) {
/* schwartzian transform */
- array.splice(
- 0,
- array.length,
- array.map(function (value) {
- return [compare.by(value), value];
- }).sort(function (a, b) {
- return exports.compare(a[0], b[0]);
- }).map(function (pair) {
- return pair[1];
- })
+ array.splice.apply(
+ array,
+ [0, array.length].concat(
+ array.map(function (value) {
+ return [compare.by(value), value];
+ }).sort(function (a, b) {
+ return exports.compare(a[0], b[0]);
+ }).map(function (pair) {
+ return pair[1];
+ })
+ )
);
} else {
array.sort(compare);
diff --git a/utils/narwhal.js b/utils/narwhal.js
index 329114b..4967afb 100755
--- a/utils/narwhal.js
+++ b/utils/narwhal.js
@@ -1,35 +1,50 @@
(function (system) {
+// global reference
+global = system.global;
+global.global = global;
+global.system = system;
+global.print = system.print;
+
// logger shim
-var shim = function () {
- //if (system.debug && system.print) {
+var logFake = function () {
+ if (system.debug) {
system.print(Array.prototype.join.apply(arguments, [" "]));
- //}
+ }
};
-var log = {fatal:shim, error:shim, warn:shim, info:shim, debug:shim};
+var log = {fatal:logFake, error:logFake, warn:logFake, info:logFake, debug:logFake};
system.log = log;
-// global reference
-global = system.global;
-global.system = system;
-global.print = system.print;
+// this only works for modules with no dependencies and a known absolute path
+var requireFake = function(id, path, modules) {
+ modules = modules || {};
+ var exports = {};
+ var module = {id: id, path: path};
+
+ var factory = system.evaluate(system.fs.read(path), path, 1);
+ factory(
+ function(id) { return modules[id]; }, // require
+ exports, // exports
+ module, // module
+ system, // system
+ system.print // print
+ );
+
+ return exports;
+}
-// equivalent to "var sandbox = require('sandbox');"
-var sandboxPath = system.prefix + "/lib/sandbox.js";
-var sandboxFactory = system.evaluate(
- system.fs.read(sandboxPath),
- "sandbox.js",
- 1
-);
-var sandbox = {};
-var sandboxModule = {id: 'sandbox', path: sandboxPath};
-sandboxFactory(
- null, // require
- sandbox, // exports
- sandboxModule, // module
- system, // system
- system.print // print
-);
+// bootstrap sandbox module
+var sandbox = requireFake("sandbox", system.prefix + "/lib/sandbox.js");
+
+// bootstrap file module
+var fs = {};
+requireFake("sandbox", system.prefix + "/lib/file-bootstrap.js", { "file" : fs });
+for (var name in system.fs) {
+ if (Object.prototype.hasOwnProperty.call(system.fs, name)) {
+ fs[name] = system.fs[name];
+ }
+}
+system.fs = fs;
// construct the initial paths
var paths = [];
@@ -122,8 +137,8 @@ if (system.args.length && !options.interactive && !options.main) {
}
// user package prefixes
-if (system.env.SEA)
- system.packagePrefixes.unshift(system.env.SEA);
+if (system.env.PACKAGE_HOME)
+ system.packagePrefixes.unshift(system.env.PACKAGE_HOME);
system.packagePrefixes.unshift.apply(system.packagePrefixes, options.packagePrefixes);
// load packages
diff --git a/utils/platforms/default/lib/date.js b/utils/platforms/default/lib/date.js
index 8452795..4136d11 100755
--- a/utils/platforms/default/lib/date.js
+++ b/utils/platforms/default/lib/date.js
@@ -3,6 +3,6 @@
if (!Date.prototype.toISOString) {
Date.prototype.toISOString = function() {
return (this.getFullYear() + "-" + this.getMonth() + "-" + this.getDate() + "T" + this.getHours() + ":" + this.getMinutes() + ":" + this.getSeconds() + "Z");
- };
+ }
}
diff --git a/utils/platforms/default/lib/file-platform.js b/utils/platforms/default/lib/file-platform.js
index ddef889..04a6387 100755
--- a/utils/platforms/default/lib/file-platform.js
+++ b/utils/platforms/default/lib/file-platform.js
@@ -1,32 +1,119 @@
-// File: default
-var IO = require("./io").IO;
+// HACK: use "fs.read" and "fs.isFile" until properly implemented.
+// save "fs" here since it will be replaced in "system" later.
+var fs = system.fs;
-var File = exports.File = function(path) {
- this.path = path;
-}
-File.prototype = new IO();
-
-File.prototype.read = function() {
- var result = narwhalReadFile(this.path);
- if (!result)
- throw new Error("Couldn't read file " + path);
- return result;
-}
+var exports = require('./file');
exports.SEPARATOR = '/';
+exports.ALT_SEPARATOR = undefined;
+exports.ROOT = '/';
+
+exports.cwd = function () {
+ return system.env['PWD'] || '.';
+};
+
+// TODO necessary for package loading
+exports.list = function (path) {
+ throw Error("list not yet implemented.");
+};
+
+// TODO necessary for package loading
+exports.canonical = function (path) {
+ // does not resolve symlinks
+ return exports.normal(exports.join(exports.cwd(), path));
+};
+
+exports.exists = function (path) {
+ throw Error("exists not yet implemented.");
+};
+
+// TODO necessary for lazy module reloading in sandboxes
+exports.mtime = function (path) {
+ return Date();
+};
+
+exports.size = function (path) {
+ throw Error("size not yet implemented.");
+};
+
+exports.stat = function (path) {
+ return {
+ mtime: exports.mtime(path),
+ size: exports.size(path)
+ }
+};
+
+// TODO necessary for package loading
+exports.isDirectory = function (path) {
+ //throw Error("isDirectory not yet implemented.");
+ system.log.warn("isDirectory not yet implemented. ("+path+")");
+ return false;
+};
+
+// TODO necessary for module loading
+exports.isFile = function (path) {
+ return fs.isFile(path);
+};
+
+exports.isLink = function (path) {
+ throw Error("isLink not yet implemented.");
+};
+
+exports.isReadable = function (path) {
+ throw Error("isReadable not yet implemented.");
+};
+
+exports.isWritable = function (path) {
+ throw Error("isWritable not yet implemented.");
+};
+
+exports.rename = function (source, target) {
+ throw Error("rename not yet implemented.");
+};
+
+exports.move = function (source, target) {
+ throw Error("move not yet implemented.");
+};
+
+exports.remove = function (path) {
+ throw Error("remove not yet implemented.");
+};
+
+exports.mkdir = function (path) {
+ throw Error("mkdir not yet implemented.");
+};
+
+exports.rmdir = function(path) {
+ throw Error("rmdir not yet implemented.");
+};
+
+exports.touch = function (path, mtime) {
+ throw Error("touch not yet implemented.");
+};
+
+exports.FileIO = function (path, mode, permissions) {
+ mode = exports.mode(mode);
+ var read = mode.read,
+ write = mode.write,
+ append = mode.append,
+ update = mode.update;
+
+ if (update) {
+ throw new Error("Updating IO not yet implemented.");
+ } else if (write || append) {
+ throw new Error("Writing IO not yet implemented.");
+ } else if (read) {
+ // FIXME temporary hack
+ return {
+ 'read': function () {
+ return fs.read(path);
+ },
+ 'close': function () {
+ }
+ };
+ } else {
+ throw new Error("Files must be opened either for read, write, or update mode.");
+ }
+};
-exports.canonical = function(path) {
- var original;
-
- do {
- original = path;
- path = path
- .replace(/[^\/]+\/\.\.\//g, "")
- .replace(/([^\.])\.\//g, "$1")
- .replace(/^\.\//g, "")
- .replace(/\/\/+/g, "/");
- } while (path !== original);
-
- return path;
-}
diff --git a/utils/platforms/default/lib/io-platform.js b/utils/platforms/default/lib/io-platform.js
index 46a7103..4c9c65c 100755
--- a/utils/platforms/default/lib/io-platform.js
+++ b/utils/platforms/default/lib/io-platform.js
@@ -11,10 +11,16 @@ IO.prototype.read = function(length) {
IO.prototype.write = function(object) {
this.outputStream(object);
+ return this;
}
IO.prototype.flush = function() {
+ return this;
}
IO.prototype.close = function() {
}
+
+exports.TextIOWrapper = function (raw, mode, lineBuffering, buffering, charset, options) {
+ return raw;
+}
diff --git a/utils/platforms/default/lib/object.js b/utils/platforms/default/lib/object.js
index a7f812f..4e30ca8 100755
--- a/utils/platforms/default/lib/object.js
+++ b/utils/platforms/default/lib/object.js
@@ -19,3 +19,9 @@ if (!Object.create) {
};
}
+if (!Object.freeze) {
+ Object.freeze = function (object) {
+ return object;
+ };
+}
+
diff --git a/utils/platforms/rhino/bin/narwhal-rhino b/utils/platforms/rhino/bin/narwhal-rhino
index c1e8809..488362a 100755
--- a/utils/platforms/rhino/bin/narwhal-rhino
+++ b/utils/platforms/rhino/bin/narwhal-rhino
@@ -7,32 +7,35 @@ SELF_PATH=$(cd -P -- "$(dirname -- "$0")" && pwd -P) && SELF_PATH="$SELF_PATH/$(
while [ -h "$SELF_PATH" ]; do
DIR=$(dirname -- "$SELF_PATH")
SYM=$(readlink -- "$SELF_PATH")
- SELF_PATH=$(cd "$DIR" && cd $"(dirname -- "$SYM")" && pwd)/$(basename -- "$SYM")
+ SELF_PATH=$(cd -- "$DIR" && cd -- $(dirname -- "$SYM") && pwd)/$(basename -- "$SYM")
done
-NARWHAL_PLATFORM_HOME=$(dirname "$(dirname -- "$SELF_PATH")")
+# NARWHAL_PLATFORM_HOME is the 2nd ancestor directory of this shell script
+export NARWHAL_PLATFORM_HOME=$(dirname -- "$(dirname -- "$SELF_PATH")")
+
BOOTSTRAP=$NARWHAL_PLATFORM_HOME/bootstrap.js
-if [ ! "$NARWHAL_HOME" ]; then
+if [ -z "$NARWHAL_HOME" ]; then
NARWHAL_HOME=$(dirname -- "$(dirname -- "$NARWHAL_PLATFORM_HOME")")
fi
-export NARWHAL_PLATFORM_HOME
-
-CLASSPATH=$NARWHAL_PLATFORM_HOME/jars/js.jar:$NARWHAL_PLATFORM_HOME/jars/jline.jar:$CLASSPATH
+CLASSPATH=$NARWHAL_PLATFORM_HOME/jars/js.jar:$NARWHAL_PLATFORM_HOME/jars/jline.jar
+if [ -z "$NARWHAL_CLASSPATH" ]; then
+ CLASSPATH=$NARWHAL_CLASSPATH:$CLASSPATH
+fi
if [ "$(which cygpath 2>/dev/null)" ]; then
CLASSPATH=$(cygpath -wp -- "$CLASSPATH")
BOOTSTRAP=$(cygpath -wa -- "$BOOTSTRAP")
+ export NARWHAL_HOME=$(cygpath -wa -- "$NARWHAL_HOME")
+ export NARWHAL_PLATFORM_HOME=$(cygpath -wa -- "$NARWHAL_PLATFORM_HOME")
fi
JAVA_MAIN=org.mozilla.javascript.tools.shell.Main
# drop into shell if there are no additional arguments
if [ $# -lt 1 ]; then
- # uses rlwrap (readline wrapper) if present
- RLWRAP=$(which rlwrap 2>/dev/null)
- $RLWRAP java -cp "$CLASSPATH" "$JAVA_MAIN" -f "$BOOTSTRAP" -f -
+ java -cp "$CLASSPATH" "$JAVA_MAIN" -f "$BOOTSTRAP" -f -
else
java -cp "$CLASSPATH" "$JAVA_MAIN" "$BOOTSTRAP" "$0" "$@"
fi
diff --git a/utils/platforms/rhino/bootstrap.js b/utils/platforms/rhino/bootstrap.js
index d993810..4c19cb6 100755
--- a/utils/platforms/rhino/bootstrap.js
+++ b/utils/platforms/rhino/bootstrap.js
@@ -34,61 +34,12 @@
};
var read = function (path) {
- var path = new java.io.File(path);
-
- if (!path.isFile())
- throw new Error(path + ' does not exist.');
-
- var stream = new java.io.FileInputStream(path);
+ var path = new java.io.File(path),
+ stream = new java.io.FileInputStream(path);
try {
-
- var length = 1025;
- var index = 0;
- var total = 0;
- var buffer;
- var buffers = [];
-
- do {
- if (buffer === undefined)
- buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, length);
- var read = stream.read(buffer, index, buffer.length - index);
- if (read < 0)
- break;
- index += read;
- total += read;
- if (index >= buffer.length) {
- buffers.push(buffer);
- buffer = undefined;
- index = 0;
- length *= 2;
- }
- //print("read="+read+" index="+index+" total="+total+" length="+length+" buffers.length="+buffers.length);
- } while (read > 0);
-
- var resultBuffer, resultLength;
- if (buffers.length === 1 && index === 0) {
- resultBuffer = buffers[0];
- resultLength = resultBuffer.length;
- } else {
- resultBuffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, total),
- resultLength = 0;
- for (var i = 0; i < buffers.length; i++) {
- var buf = buffers[i];
- java.lang.System.arraycopy(buf, 0, resultBuffer, resultLength, buf.length);
- resultLength += buf.length;
- }
- if (index > 0) {
- java.lang.System.arraycopy(buffer, 0, resultBuffer, resultLength, index);
- resultLength += index;
- }
- }
-
- if (total != resultLength || total !== resultBuffer.length)
- throw new Error("IO.read sanity check failed: total="+total+" resultLength="+resultLength+" resultBuffer.length="+resultBuffer.length);
-
- var result = String(new java.lang.String(resultBuffer, 'UTF-8'));
- return result;
-
+ var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, path.length());
+ stream.read(buffer);
+ return String(new java.lang.String(buffer, "UTF-8"));
} finally {
stream.close();
}
@@ -129,12 +80,14 @@
var debug = +String(Packages.java.lang.System.getenv("NARWHAL_DEBUG"));
var verbose = +String(Packages.java.lang.System.getenv("NARWHAL_VERBOSE"));
+ var os = String(Packages.java.lang.System.getProperty("os.name"));
narwhal({
global: global,
evalGlobal: evalGlobal,
platform: 'rhino',
platforms: ['rhino', 'default'],
+ os: os,
print: print,
fs: {
read: read,
diff --git a/utils/platforms/rhino/lib/file-platform.js b/utils/platforms/rhino/lib/file-platform.js
index b72704f..99819b1 100755
--- a/utils/platforms/rhino/lib/file-platform.js
+++ b/utils/platforms/rhino/lib/file-platform.js
@@ -1,7 +1,10 @@
+
+// use the "file" module as the exports object.
+var exports = require('./file');
+
// File: Rhino
var IO = require("./io").IO;
-var file = require('./file');
var os = require('./os');
var javaRuntime = function () {
@@ -22,7 +25,7 @@ exports.FileIO = function (path, mode, permissions) {
write: write,
append: append,
update: update
- } = file.mode(mode);
+ } = exports.mode(mode);
if (update) {
throw new Error("Updating IO not yet implemented.");
@@ -37,10 +40,6 @@ exports.FileIO = function (path, mode, permissions) {
/* paths */
-exports.SEPARATOR = '/';
-exports.ALT_SEPARATOR = undefined;
-exports.ROOT = '/';
-
exports.cwd = function () {
return String(Packages.java.lang.System.getProperty("user.dir"));
};
@@ -91,13 +90,18 @@ exports.isFile = function (path) {
return false;
};
+// XXX not standard
+exports.isAbsolute = function (path) {
+ return new java.io.File(path).isAbsolute();
+};
+
/* java doesn't provide isLink, but File.getCanonical leaks
information about whether a file is a link, so we use the canonical
file name of a path and the canonical file name of the
containing directory to infer whether the file is a link.
*/
exports.isLink = function (path) {
- path = file.path(path);
+ path = exports.path(path);
var canonical = path.canonical().toString();
var container = path.resolve('.').canonical();
if (path.isDirectory()) {
@@ -145,11 +149,17 @@ exports.link = function (source, target) {
};
exports.symlink = function (source, target) {
+ // XXX this behavior of resolving the source
+ // path from the target path when the source
+ // path is relative ought to be discussed
+ // on ServerJS
+ if (exports.isRelative(source))
+ source = exports.relative(target, source);
os.command(['ln', '-s', source, target]);
};
exports.rename = function (source, target) {
- source = file.path(source);
+ source = exports.path(source);
target = source.resolve(target);
source = JavaPath(source);
target = JavaPath(target);
@@ -158,8 +168,8 @@ exports.rename = function (source, target) {
};
exports.move = function (source, target) {
- source = file.path(source);
- target = file.path(target);
+ source = exports.path(source);
+ target = exports.path(target);
source = JavaPath(source);
target = JavaPath(target);
if (!source.renameTo(target))
diff --git a/utils/platforms/rhino/lib/packages-platform.js b/utils/platforms/rhino/lib/packages-platform.js
index db6443d..3ed74ac 100755
--- a/utils/platforms/rhino/lib/packages-platform.js
+++ b/utils/platforms/rhino/lib/packages-platform.js
@@ -37,13 +37,17 @@ exports.synthesize = function (analysis) {
var loader = Packages.java.lang.ClassLoader.getSystemClassLoader();
// so that replacing Packages does not implicitly dispose of the
// only means of creating new Packages objects.
-var PackageType = Packages;
/*** addJavaPaths
*/
exports.addJavaPaths = function addJavaPaths(javaPaths) {
if (!javaPaths || javaPaths.length === 0)
return;
+ // after reinstalling Packages once, the Packages object
+ // is no longer a Packages constructor function.
+ // If that's the case, abandone hope.
+ if (typeof Packages == "object")
+ return;
/* set up jar loader */
var urls = Packages.java.lang.reflect.Array.newInstance(java.net.URL, javaPaths.length);
@@ -58,7 +62,8 @@ exports.addJavaPaths = function addJavaPaths(javaPaths) {
var context = Packages.org.mozilla.javascript.Context.getCurrentContext();
context.setApplicationClassLoader(loader);
// must explicitly be made global when each module has it's own scope
- global.Packages = new PackageType(loader);
+ global.Packages = new Packages(loader);
+ installed = true;
} catch (e) {
print("warning: couldn't install jar loader: " + e);
}
diff --git a/utils/platforms/template/bootstrap.js b/utils/platforms/template/bootstrap.js
index 867d6d4..df03512 100755
--- a/utils/platforms/template/bootstrap.js
+++ b/utils/platforms/template/bootstrap.js
@@ -5,12 +5,13 @@
var isFile = /*TODO*/; // function(path:string):boolean
var prefix = "/path/to/narwhal"; /*TODO*/
-
+
eval(read(prefix + "/narwhal.js"))({
global: this,
evalGlobal: evalGlobal,
platform: '<<<name>>>', /*TODO*/
platforms: ['<<<name>>>', 'default'], /*TODO*/
+ os: "", /* TODO /\bwindows\b/i for Windows FS support */
// XXX platforms may include any number of
// prioritized generic platforms like:
// rhino, java, c, v8, default
diff --git a/utils/platforms/template/lib/file-platform.js b/utils/platforms/template/lib/file-platform.js
index db06b33..5249fb3 100755
--- a/utils/platforms/template/lib/file-platform.js
+++ b/utils/platforms/template/lib/file-platform.js
@@ -1,5 +1,5 @@
-var file = require('./file');
+var exports = require('./file');
exports.SEPARATOR = '/';
@@ -92,7 +92,7 @@ exports.touch = function (path, mtime) {
var read = system.fs.read; // from bootstrap system object
exports.FileIO = function (path, mode, permissions) {
- mode = file.mode(mode);
+ mode = exports.mode(mode);
var read = mode.read,
write = mode.write,
append = mode.append,
diff --git a/utils/platforms/xulrunner/lib/file-platform.js b/utils/platforms/xulrunner/lib/file-platform.js
index 0c89e92..2e554f3 100755
--- a/utils/platforms/xulrunner/lib/file-platform.js
+++ b/utils/platforms/xulrunner/lib/file-platform.js
@@ -1,4 +1,4 @@
-var FILE = require('./file');
+var exports = require('./file');
var IO = require("./io").IO;
const Cc = Components.classes;
@@ -129,6 +129,10 @@ exports.touch = function (path, mtime) {
else file.lastModifiedTime = new Date().getTime().toString();
};
+exports.symlink = function (path) {
+ throw "NYI";
+};
+
exports.FileIO = function (path, mode, permissions) {
file = MozFile(path);
@@ -137,7 +141,7 @@ exports.FileIO = function (path, mode, permissions) {
write: write,
append: append,
update: update
- } = FILE.mode(mode);
+ } = exports.mode(mode);
if (update) {
throw new Error("Updating IO not yet implemented.");
diff --git a/utils/platforms/xulrunner/lib/io-platform.js b/utils/platforms/xulrunner/lib/io-platform.js
index 5c2ce62..60103e4 100755
--- a/utils/platforms/xulrunner/lib/io-platform.js
+++ b/utils/platforms/xulrunner/lib/io-platform.js
@@ -4,25 +4,25 @@ const Ci = Components.interfaces;
var IO = exports.IO = function(inputStream, outputStream) {
this.inputStream = inputStream;
this.outputStream = outputStream;
-}
+};
IO.prototype.read = function(length) {
return this.inputStream(length);
-}
+};
IO.prototype.write = function(object) {
this.outputStream(object);
-}
+};
IO.prototype.flush = function() {
-}
+};
IO.prototype.close = function() {
-}
+};
IO.prototype.isatty = function () {
return false;
-}
+};
@@ -94,3 +94,108 @@ exports.TextIOWrapper = function (raw, mode, lineBuffering, buffering, charset,
throw new Error("file must be opened for read, write, or append mode.");
}
};
+
+
+
+var StringIO = exports.StringIO = function (initial) {
+ var buffer = [];
+ if (initial) {
+ buffer = buffer.concat(initial.join(""));
+ }
+
+ function length() {
+ return buffer.length;
+ }
+
+ function read(length) {
+ var result;
+
+ if (arguments.length == 0) {
+ result = buffer.join("");
+ buffer = [];
+ return result;
+ } else {
+ if (!length || length < 1)
+ length = 1024;
+ length = Math.min(buffer.length, length);
+ result = buffer.slice(0, length).join("");
+ buffer = [];
+ return result;
+ }
+ }
+
+ function write(text) {
+ buffer = buffer.concat(text.split(""));
+ return self;
+ }
+
+ function copy(output) {
+ output.write(read()).flush();
+ return self;
+ }
+
+ function next() {
+ var pos, result;
+ if (buffer.length === 0) { throw StopIteration; }
+ pos = buffer.indexOf("\n");
+ if (pos === -1) { pos = buffer.length; }
+ result = read(pos);
+ read(1);
+ return result;
+ }
+
+ var self = {
+ get length() {
+ return length();
+ },
+ read: read,
+ write: write,
+ copy: copy,
+ close: function () {
+ return self;
+ },
+ flush: function () {
+ return self;
+ },
+ iterator: function () {
+ return self;
+ },
+ forEach: function (block) {
+ while (true) {
+ try {
+ block.call(this, next());
+ } catch (exception) {
+ if (exception instanceof StopIteration)
+ break;
+ throw exception;
+ }
+ }
+ },
+ readLine: function () {
+ var pos = buffer.indexOf("\n");
+ if (pos === -1) { pos = buffer.length; }
+ return read(pos + 1);
+ },
+ next: next,
+ print: function (line) {
+ return write(line + "\n").flush();
+ },
+ toString: function() {
+ return buffer.join("");
+ },
+ substring: function () {
+ var string = buffer.join("");
+ return string.substring.apply(string, arguments);
+ },
+ slice: function () {
+ var string = buffer.join("");
+ return string.slice.apply(string, arguments);
+ },
+ substr: function () {
+ var string = buffer.join("");
+ return string.substr.apply(string, arguments);
+ }
+ };
+ return self;
+};
+
diff --git a/utils/platforms/xulrunner/lib/os-platform.js b/utils/platforms/xulrunner/lib/os-platform.js
index e173def..174e76e 100755
--- a/utils/platforms/xulrunner/lib/os-platform.js
+++ b/utils/platforms/xulrunner/lib/os-platform.js
@@ -2,35 +2,43 @@
var io = require('io');
exports.exit = function (status) {
- // TODO
+ throw "NYI";
};
exports.sleep = function (seconds) {
- // TODO
+ throw "NYI";
};
exports.fork = function () {
+ throw "NYI";
};
exports.exec = function () {
+ throw "NYI";
};
exports.dup = function () {
+ throw "NYI";
};
exports.dup2 = function () {
+ throw "NYI";
};
exports.setsid = function () {
+ throw "NYI";
};
exports.getpid = function () {
+ throw "NYI";
};
exports.popen = function (command, options) {
+ throw "NYI";
};
exports.system = function (command) {
+ throw "NYI";
};
diff --git a/utils/sources.json b/utils/sources.json
index d4518d2..993d045 100755
--- a/utils/sources.json
+++ b/utils/sources.json
@@ -45,18 +45,18 @@
"type": "github",
"user": "tlrobinson"
},
- "gae": {
+ "appengine-java-sdk": {
"type": "inline",
"package.json": {
"name": "gae",
"title": "Google App Engine Java SDK",
- "description": "Java components necessary for depolying applications on Google's App Engine.",
+ "description": "Java components necessary for deploying applications on Google's App Engine.",
"author": "Google",
- "version": "1.2.1",
+ "version": "1.2.2",
"dependencies": ["jack-servlet", "jack", "narwhal"],
"lib": [],
"type": "zip",
- "location": "http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.1.zip"
+ "location": "http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.2.zip"
}
},
"env": {
diff --git a/utils/tests/all-tests.js b/utils/tests/all-tests.js
index 0ec0c3e..2486f64 100755
--- a/utils/tests/all-tests.js
+++ b/utils/tests/all-tests.js
@@ -1,8 +1,10 @@
+exports.testSandbox = require("./iojs/program");
exports.testString = require("./string-tests");
exports.testURI = require("./uri-tests");
exports.testCodecs = require("./codecs");
exports.testOS = require("./os/all-tests");
exports.testFile = require("./file/all-tests");
+exports.testUtil = require("./util/all-tests");
exports.testServerJS = require("./serverjs/all-tests");
diff --git a/utils/tests/file/all-tests.js b/utils/tests/file/all-tests.js
index 30aeae1..4730ec7 100755
--- a/utils/tests/file/all-tests.js
+++ b/utils/tests/file/all-tests.js
@@ -7,7 +7,7 @@ exports.testRmtreeDoesNotFollowSymlinks = function () {
here.join('foo').rmtree();
try {
here.join('foo', 'bar').mkdirs();
- here.join('foo', 'baz').symlink('../bar');
+ here.join('foo', 'bar').symlink(here.join('foo', 'baz'));
here.join('foo', 'baz').rmtree();
assert.isTrue(here.join('foo', 'bar').exists());
} finally {
diff --git a/utils/tests/iojs/program.js b/utils/tests/iojs/program.js
index 99e01ce..7e64b91 100755
--- a/utils/tests/iojs/program.js
+++ b/utils/tests/iojs/program.js
@@ -1,5 +1,6 @@
#!/usr/bin/env narwhal
+var assert = require('test/assert');
var sandbox = require('sandbox').sandbox;
var fs = require('file');
@@ -16,23 +17,31 @@ var fs = require('file');
'transitive',
'determinism'
].forEach(function (testName) {
- print('BEGIN: ' + testName);
- try {
+ exports['test ' + testName] = function () {
var prefix = fs.path(module.id).resolve(testName).join('');
+ var done;
+
+ var print = function (message) {
+ assert.isFalse(/^FAIL/.test(message));
+ if (/^ERROR/.test(message))
+ throw new Error(message);
+ if (/^DONE/.test(message))
+ done = true;
+ };
+
sandbox(
'program',
system,
{
prefix: prefix,
loader: require.loader,
- print: print,
- debug: true
+ print: print
}
);
- } catch (exception) {
- print('ERROR ' + (exception.message || exception));
- }
- print('END: ' + testName);
- print('');
+ assert.isTrue(done, 'done');
+ };
});
+if (module.id == require.main)
+ require('os').exit(require('test/runner').run(exports));
+
diff --git a/utils/tests/serverjs/all-tests.js b/utils/tests/serverjs/all-tests.js
index 7c7476c..789f47e 100755
--- a/utils/tests/serverjs/all-tests.js
+++ b/utils/tests/serverjs/all-tests.js
@@ -2,6 +2,8 @@ exports.testFile = require("./file-tests");
exports.testModules = require("./module-tests");
exports.testByteArray = require("./bytearray-tests");
exports.testByteString = require("./bytestring-tests");
+exports.testByteArrayEncodings = require("./bytearray-encodings-tests");
+exports.testByteStringEncodings = require("./bytestring-encodings-tests");
if (require.main === module.id)
require("os").exit(require("test/runner").run(exports));
diff --git a/utils/tests/serverjs/bytearray-tests.js b/utils/tests/serverjs/bytearray-tests.js
index a91a4b3..6d165d0 100755
--- a/utils/tests/serverjs/bytearray-tests.js
+++ b/utils/tests/serverjs/bytearray-tests.js
@@ -5,25 +5,269 @@ var Binary = require("binary").Binary,
ByteArray = require("binary").ByteArray;
exports.testByteArrayConstructor = function() {
-}
+ var testArray = [1,2,3,4],
+ b;
+
+ // ByteArray()
+ // New, empty ByteArray.
+ b = new ByteArray();
+ //assert.isTrue(b instanceof Binary, "not instanceof Binary");
+ assert.isTrue(b instanceof ByteArray, "not instanceof ByteArray");
+ assert.isEqual(0, b.length);
+ b.length = 123;
+ assert.isEqual(123, b.length);
+ assert.isEqual(0, b.get(4));
+
+ // ByteArray(length)
+ // New ByteArray filled with length zero bytes.
+ b = new ByteArray(10);
+ assert.isEqual(10, b.length);
+ for (var i = 0; i < 10; i++)
+ assert.isEqual(0, b.get(i));
+ assert.isNaN(b.get(10));
+ b.length = 234;
+ assert.isEqual(234, b.length);
+ assert.isEqual(0, b.get(10));
+ assert.isEqual(0, b.get(233));
+ assert.isNaN(b.get(234));
+
+ // ByteArray(byteString)
+ // Copy contents of byteString.
+ b = new ByteArray(new ByteString(testArray));
+ assert.isEqual(testArray.length, b.length);
+ b.length = 345;
+ assert.isEqual(345, b.length);
+ assert.isEqual(1, b.get(0));
+ assert.isEqual(4, b.get(3));
+ assert.isEqual(0, b.get(4));
+
+ // ByteArray(byteArray)
+ // Copy byteArray.
+ b = new ByteArray(new ByteArray(testArray));
+ assert.isEqual(testArray.length, b.length);
+ b.length = 456;
+ assert.isEqual(456, b.length);
+ assert.isEqual(1, b.get(0));
+ assert.isEqual(4, b.get(3));
+ assert.isEqual(0, b.get(4));
+
+ // ByteArray(arrayOfBytes)
+ // Use numbers in arrayOfBytes as contents.
+ // Throws an exception if any element is outside the range 0...255 (TODO).
+ b = new ByteArray(testArray);
+ assert.isEqual(testArray.length, b.length);
+ b.length = 567;
+ assert.isEqual(567, b.length);
+ assert.isEqual(1, b.get(0));
+ assert.isEqual(4, b.get(3));
+ assert.isEqual(0, b.get(4));
+};
exports.testByteArrayResizing = function() {
var b1 = new ByteArray([0,1,2,3,4,5,6]);
assert.isEqual(7, b1.length);
- assert.isTrue(isNaN(b1.byteAt(7)));
+ assert.isNaN(b1.get(7));
b1.length = 10;
- assert.isEqual(10, b1.length);
- assert.isEqual(5, b1.byteAt(5));
- assert.isEqual(0, b1.byteAt(7));
+ assert.isEqual(10, b1.length, "Length should change to 10");
+ assert.isEqual(5, b1.get(5));
+ assert.isEqual(0, b1.get(7));
b1.length = 3;
- assert.isEqual(3, b1.length);
- assert.isEqual(0, b1.byteAt(0));
- assert.isTrue(isNaN(b1.byteAt(4)));
+ assert.isEqual(3, b1.length, "Length should change to 10");
+ assert.isEqual(0, b1.get(0));
+ assert.isNaN(b1.get(4));
- b1.length = 10;
- assert.isEqual(10, b1.length);
- assert.isEqual(0, b1.byteAt(0));
- assert.isEqual(0, b1.byteAt(4));
-}
+ b1.length = 9;
+ assert.isEqual(9, b1.length, "Length should change to 9");
+ assert.isEqual(0, b1.get(0));
+ assert.isEqual(0, b1.get(4));
+};
+
+exports.testToByteArray = function() {
+ var b1 = new ByteArray([1,2,3]),
+ b2 = b1.toByteArray();
+
+ assert.isTrue(b2 instanceof ByteArray, "not instanceof ByteArray");
+ assert.isEqual(b1.length, b2.length);
+ assert.isEqual(b1.get(0), b2.get(0));
+ assert.isEqual(b1.get(2), b2.get(2));
+
+ assert.isEqual(1, b1.get(0));
+ assert.isEqual(1, b2.get(0));
+
+ b1.set(0, 10);
+
+ assert.isEqual(10, b1.get(0));
+ assert.isEqual(1, b2.get(0));
+};
+
+exports.testToByteString = function() {
+ var b1 = new ByteArray([1,2,3]),
+ b2 = b1.toByteString();
+
+ assert.isEqual(b1.length, b2.length);
+ assert.isEqual(b1.get(0), b2.get(0));
+ assert.isEqual(b1.get(2), b2.get(2));
+
+ assert.isEqual(1, b1.get(0));
+ assert.isEqual(1, b2.get(0));
+
+ b1.set(0, 10);
+
+ assert.isEqual(10, b1.get(0));
+ assert.isEqual(1, b2.get(0));
+};
+
+exports.testToArray = function() {
+ var testArray = [0,1,254,255],
+ b1 = new ByteArray(testArray),
+ a1 = b1.toArray();
+
+ assert.isEqual(testArray.length, a1.length);
+ for (var i = 0; i < testArray.length; i++)
+ assert.isEqual(testArray[i], a1[i]);
+};
+
+exports.testToString = function() {
+ // the format of the resulting string isn't specified, but it shouldn't be the decoded string
+ // TODO: is this an ok test?
+
+ var testString = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+ testArray = [];
+ for (var i = 0; i < 128; i++) testArray.push(65);
+
+ var resultString = new ByteArray(testArray).toString();
+
+ assert.isTrue(resultString.length < 100);
+ assert.isTrue(resultString !== testString);
+};
+
+exports.testIndexOf = function() {
+ var b1 = new ByteArray([0,1,2,3,4,5,0,1,2,3,4,5]);
+
+ assert.isEqual(-1, b1.indexOf(-1));
+
+ assert.isEqual(0, b1.indexOf(0));
+ assert.isEqual(5, b1.indexOf(5));
+ assert.isEqual(-1, b1.indexOf(12));
+
+ assert.isEqual(6, b1.indexOf(0, 6));
+ assert.isEqual(11, b1.indexOf(5, 6));
+ assert.isEqual(-1, b1.indexOf(12, 6));
+
+ assert.isEqual(0, b1.indexOf(0, 0, 3));
+ assert.isEqual(-1, b1.indexOf(5, 0, 3));
+ assert.isEqual(-1, b1.indexOf(12, 0, 3));
+};
+
+exports.testLastIndexOf = function() {
+ var b1 = new ByteArray([0,1,2,3,4,5,0,1,2,3,4,5]);
+
+ assert.isEqual(-1, b1.lastIndexOf(-1));
+
+ assert.isEqual(6, b1.lastIndexOf(0));
+ assert.isEqual(11, b1.lastIndexOf(5));
+ assert.isEqual(-1, b1.lastIndexOf(12));
+
+ assert.isEqual(0, b1.lastIndexOf(0, 0, 6));
+ assert.isEqual(5, b1.lastIndexOf(5, 0, 6));
+ assert.isEqual(-1, b1.lastIndexOf(12, 0, 6));
+
+ assert.isEqual(6, b1.lastIndexOf(0, 6, 9));
+ assert.isEqual(-1, b1.lastIndexOf(5, 6, 9));
+ assert.isEqual(-1, b1.lastIndexOf(12, 6, 9));
+};
+
+exports.testByteArrayReverse = function() {
+ var testArray = [0,1,2,3,4,5,6];
+
+ var b1 = new ByteArray(testArray),
+ b2 = b1.reverse();
+
+ assert.isEqual(b1, b2);
+ assert.isEqual(b1.length, b2.length);
+ for (var i = 0; i < testArray.length; i++)
+ assert.isEqual(testArray[i], b2.get(testArray.length-i-1));
+
+ testArray = [0,1,2,3,4,5,6,7];
+
+ b1 = new ByteArray(testArray);
+ b2 = b1.reverse();
+
+ assert.isEqual(b1, b2);
+ assert.isEqual(b1.length, b2.length);
+ for (var i = 0; i < testArray.length; i++)
+ assert.isEqual(testArray[i], b2.get(testArray.length-i-1));
+};
+
+exports.testByteArraySort = function() {
+ var testArray = [];
+ for (var i = 0; i < 1000; i++)
+ testArray.push(Math.floor(Math.random()*256));
+
+ var a = new ByteArray(testArray);
+ a.sort();
+
+ for (var i = 1; i < a.length; i++)
+ assert.isTrue(a.get(i-1) <= a.get(i), "index="+i+"("+a.get(i-1)+","+a.get(i)+")");
+};
+
+exports.testByteArraySortCustom = function() {
+ var testArray = [];
+ for (var i = 0; i < 1000; i++)
+ testArray.push(Math.floor(Math.random()*256));
+
+ var a = new ByteArray(testArray);
+ a.sort(function(o1, o2) { return o2-o1; });
+
+ for (var i = 1; i < a.length; i++)
+ assert.isTrue(a.get(i-1) >= a.get(i), "index="+i+"("+a.get(i-1)+","+a.get(i)+")");
+};
+
+exports.testSplit = function() {
+ var b1 = new ByteArray([0,1,2,3,4,5]), a1;
+
+ a1 = b1.split([]);
+ assert.isEqual(1, a1.length);
+ assert.isTrue(a1[0] instanceof ByteArray);
+ assert.isEqual(6, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(5, a1[0].get(5));
+
+ a1 = b1.split([2]);
+ assert.isEqual(2, a1.length);
+ assert.isTrue(a1[0] instanceof ByteArray);
+ assert.isEqual(2, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(1, a1[0].get(1));
+ assert.isEqual(3, a1[1].length);
+ assert.isEqual(3, a1[1].get(0));
+ assert.isEqual(5, a1[1].get(2));
+
+ a1 = b1.split([2], { includeDelimiter : true });
+ assert.isEqual(3, a1.length);
+ assert.isTrue(a1[0] instanceof ByteArray);
+ assert.isEqual(2, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(1, a1[0].get(1));
+ assert.isEqual(1, a1[1].length);
+ assert.isEqual(2, a1[1].get(0));
+ assert.isEqual(3, a1[2].length);
+ assert.isEqual(3, a1[2].get(0));
+ assert.isEqual(5, a1[2].get(2));
+
+ a1 = b1.split(new ByteString([2,3]));
+ assert.isEqual(2, a1.length);
+ assert.isTrue(a1[0] instanceof ByteArray);
+ assert.isEqual(2, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(1, a1[0].get(1));
+ assert.isEqual(2, a1[1].length);
+ assert.isEqual(4, a1[1].get(0));
+ assert.isEqual(5, a1[1].get(1));
+};
+
+if (require.main === module.id)
+ require("os").exit(require("test/runner").run(exports));
diff --git a/utils/tests/serverjs/bytestring-tests.js b/utils/tests/serverjs/bytestring-tests.js
index 5234a94..b62db2c 100755
--- a/utils/tests/serverjs/bytestring-tests.js
+++ b/utils/tests/serverjs/bytestring-tests.js
@@ -13,113 +13,84 @@ exports.testByteStringConstructor = function() {
//assert.isTrue(b1 instanceof Binary, "not instanceof Binary");
assert.isTrue(b1 instanceof ByteString, "not instanceof ByteString");
assert.isEqual(0, b1.length);
- b1.length = 1234;
+ b1.length = 123;
assert.isEqual(0, b1.length);
// ByteString(byteString)
// Copies byteString.
- var b2 = new ByteString(testArray);
+ var b2 = new ByteString(new ByteString(testArray));
assert.isEqual(testArray.length, b2.length);
- b2.length = 2345;
+ b2.length = 123;
assert.isEqual(testArray.length, b2.length);
- assert.isEqual(1, b2.byteAt(0));
- assert.isEqual(4, b2.byteAt(3));
+ assert.isEqual(1, b2.get(0));
+ assert.isEqual(4, b2.get(3));
// ByteString(byteArray)
// Use the contents of byteArray.
var b2 = new ByteString(new ByteArray(testArray));
assert.isEqual(testArray.length, b2.length);
- b2.length = 1234;
+ b2.length = 123;
assert.isEqual(testArray.length, b2.length);
- assert.isEqual(1, b2.byteAt(0));
- assert.isEqual(4, b2.byteAt(3));
+ assert.isEqual(1, b2.get(0));
+ assert.isEqual(4, b2.get(3));
// ByteString(arrayOfNumbers)
// Use the numbers in arrayOfNumbers as the bytes.
// If any element is outside the range 0...255, an exception (TODO) is thrown.
- var b3 = new ByteString(b2);
- assert.isEqual(b2.length, b3.length);
- b3.length = 3456;
- assert.isEqual(b2.length, b3.length);
- assert.isEqual(1, b3.byteAt(0));
- assert.isEqual(4, b3.byteAt(3));
-
- // ByteString(string, charset)
- // Convert a string. The ByteString will contain string encoded with charset.
- var testString = "hello world";
- var b4 = new ByteString(testString, "US-ASCII");
- assert.isEqual(testString.length, b4.length);
- b4.length = 4567;
- assert.isEqual(testString.length, b4.length);
- assert.isEqual(testString.charCodeAt(0), b4.byteAt(0));
- assert.isEqual(testString.charCodeAt(testString.length-1), b4.byteAt(testString.length-1));
-
-}
+ var b3 = new ByteString(testArray);
+ assert.isEqual(testArray.length, b3.length);
+ b3.length = 123;
+ assert.isEqual(testArray.length, b3.length);
+ assert.isEqual(1, b3.get(0));
+ assert.isEqual(4, b3.get(3));
+};
+
+//exports.testByteStringJoin = function() {
+//}
exports.testToByteArray = function() {
-}
+ var b1 = new ByteString([1,2,3]),
+ b2 = b1.toByteArray();
+
+ assert.isTrue(b2 instanceof ByteArray, "not instanceof ByteArray");
+ assert.isEqual(b1.length, b2.length);
+ assert.isEqual(b1.get(0), b2.get(0));
+ assert.isEqual(b1.get(2), b2.get(2));
+};
exports.testToByteString = function() {
var b1 = new ByteString([1,2,3]),
b2 = b1.toByteString();
assert.isEqual(b1.length, b2.length);
- assert.isEqual(b1.byteAt(0), b2.byteAt(0));
- assert.isEqual(b1.byteAt(2), b2.byteAt(2));
-
- var testString = "I ♥ JS";
- assert.isEqual(testString, new ByteString(testString, "UTF-8").toByteString("UTF-8", "UTF-16").decodeToString("UTF-16"));
-}
+ assert.isEqual(b1.get(0), b2.get(0));
+ assert.isEqual(b1.get(2), b2.get(2));
+};
exports.testToArray = function() {
var testArray = [0,1,254,255],
b1 = new ByteString(testArray),
a1 = b1.toArray();
-
- assert.isEqual(testArray[0], a1[0]);
- assert.isEqual(testArray[1], a1[1]);
- assert.isEqual(testArray[2], a1[2]);
- assert.isEqual(testArray[3], a1[3]);
-
- a1 = new ByteString("\u0024\u00A2\u20AC", "UTF-8").toArray("UTF-8");
- assert.isEqual(3, a1.length);
- assert.isEqual(0x24, a1[0]);
- assert.isEqual(0xA2, a1[1]);
- assert.isEqual(0x20AC, a1[2]);
-
- a1 = new ByteString("\u0024\u00A2\u20AC", "UTF-16").toArray("UTF-16");
- assert.isEqual(3, a1.length);
- assert.isEqual(0x24, a1[0]);
- assert.isEqual(0xA2, a1[1]);
- assert.isEqual(0x20AC, a1[2]);
-}
+
+ assert.isEqual(testArray.length, a1.length);
+ for (var i = 0; i < testArray.length; i++)
+ assert.isEqual(testArray[i], a1[i]);
+};
exports.testToString = function() {
- assert.isEqual("[ByteString 0]", new ByteString().toString());
- assert.isEqual("[ByteString 3]", new ByteString([1,2,3]).toString());
-}
-
-exports.testDecodeToString = function() {
- assert.isEqual("hello world", new ByteString("hello world", "US-ASCII").decodeToString("US-ASCII"));
+ // the format of the resulting string isn't specified, but it shouldn't be the decoded string
+ // TODO: is this an ok test?
- assert.isEqual("I ♥ JS", new ByteString("I ♥ JS", "UTF-8").decodeToString("UTF-8"));
+ var testString = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+ testArray = [];
+ for (var i = 0; i < 128; i++) testArray.push(65);
- assert.isEqual("\u0024", new ByteString([0x24]).decodeToString("UTF-8"));
- assert.isEqual("\u00A2", new ByteString([0xC2,0xA2]).decodeToString("UTF-8"));
- assert.isEqual("\u20AC", new ByteString([0xE2,0x82,0xAC]).decodeToString("UTF-8"));
- // FIXME:
- //assert.isEqual("\u10ABCD", (new ByteString([0xF4,0x8A,0xAF,0x8D])).decodeToString("UTF-8"));
+ var resultString = new ByteString(testArray).toString();
- assert.isEqual("\u0024", new ByteString("\u0024", "UTF-8").decodeToString("UTF-8"));
- assert.isEqual("\u00A2", new ByteString("\u00A2", "UTF-8").decodeToString("UTF-8"));
- assert.isEqual("\u20AC", new ByteString("\u20AC", "UTF-8").decodeToString("UTF-8"));
- assert.isEqual("\u10ABCD", new ByteString("\u10ABCD", "UTF-8").decodeToString("UTF-8"));
-
- assert.isEqual("\u0024", new ByteString("\u0024", "UTF-16").decodeToString("UTF-16"));
- assert.isEqual("\u00A2", new ByteString("\u00A2", "UTF-16").decodeToString("UTF-16"));
- assert.isEqual("\u20AC", new ByteString("\u20AC", "UTF-16").decodeToString("UTF-16"));
- assert.isEqual("\u10ABCD", new ByteString("\u10ABCD", "UTF-16").decodeToString("UTF-16"));
-}
+ assert.isTrue(resultString.length < 100);
+ assert.isTrue(resultString !== testString);
+};
exports.testIndexOf = function() {
var b1 = new ByteString([0,1,2,3,4,5,0,1,2,3,4,5]);
@@ -137,7 +108,7 @@ exports.testIndexOf = function() {
assert.isEqual(0, b1.indexOf(0, 0, 3));
assert.isEqual(-1, b1.indexOf(5, 0, 3));
assert.isEqual(-1, b1.indexOf(12, 0, 3));
-}
+};
exports.testLastIndexOf = function() {
var b1 = new ByteString([0,1,2,3,4,5,0,1,2,3,4,5]);
@@ -155,77 +126,131 @@ exports.testLastIndexOf = function() {
assert.isEqual(6, b1.lastIndexOf(0, 6, 9));
assert.isEqual(-1, b1.lastIndexOf(5, 6, 9));
assert.isEqual(-1, b1.lastIndexOf(12, 6, 9));
-}
-
-exports.testByteAt = function() {
- var b1 = new ByteString([0,1,2,3,4,5]);
-
- assert.isTrue(isNaN(b1.byteAt(-1)));
- assert.isEqual(0, b1.byteAt(0));
- assert.isEqual(5, b1.byteAt(5));
- assert.isTrue(isNaN(b1.byteAt(6)));
-}
+};
-// identical to byteAt, test anyway?
exports.testCharCodeAt = function() {
- var b1 = new ByteString([0,1,2,3,4,5]);
+ var b1 = new ByteString([0,1,2,3,4,255]);
assert.isTrue(isNaN(b1.charCodeAt(-1)));
assert.isEqual(0, b1.charCodeAt(0));
- assert.isEqual(5, b1.charCodeAt(5));
+ assert.isEqual(255, b1.charCodeAt(5));
assert.isTrue(isNaN(b1.charCodeAt(6)));
-}
+};
-exports.testCharCodeAt = function() {
- var b1 = new ByteString([0,1,2,3,4,5]), b2;
+// identical to charCodeAt, test anyway?
+exports.testGet = function() {
+ var b1 = new ByteString([0,1,2,3,4,255]);
+
+ assert.isTrue(isNaN(b1.get(-1)));
+ assert.isEqual(0, b1.get(0));
+ assert.isEqual(255, b1.get(5));
+ assert.isTrue(isNaN(b1.get(6)));
+};
+
+exports.testByteAt = function() {
+ var b1 = new ByteString([0,1,2,3,4,255]), b2;
+
+ b2 = b1.byteAt(-1);
+ assert.isEqual(0, b2.length);
+ b2 = b1.byteAt(0);
+ assert.isEqual(1, b2.length);
+ assert.isEqual(0, b2.get(0));
+ b2 = b1.byteAt(5);
+ assert.isEqual(1, b2.length);
+ assert.isEqual(255, b2.get(0));
+ b2 = b1.byteAt(6);
+ assert.isEqual(0, b2.length);
+};
+
+// identical to byteAt, test anyway?
+exports.testCharAt = function() {
+ var b1 = new ByteString([0,1,2,3,4,255]), b2;
b2 = b1.charAt(-1);
assert.isEqual(0, b2.length);
b2 = b1.charAt(0);
assert.isEqual(1, b2.length);
- assert.isEqual(0, b2.byteAt(0));
+ assert.isEqual(0, b2.get(0));
b2 = b1.charAt(5);
assert.isEqual(1, b2.length);
- assert.isEqual(5, b2.byteAt(0));
+ assert.isEqual(255, b2.get(0));
b2 = b1.charAt(6);
assert.isEqual(0, b2.length);
-}
+};
+
+exports.testSplit = function() {
+ var b1 = new ByteString([0,1,2,3,4,5]), a1;
+
+ a1 = b1.split([]);
+ assert.isEqual(1, a1.length);
+ assert.isTrue(a1[0] instanceof ByteString);
+ assert.isEqual(6, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(5, a1[0].get(5));
+
+ a1 = b1.split([2]);
+ assert.isEqual(2, a1.length);
+ assert.isTrue(a1[0] instanceof ByteString);
+ assert.isEqual(2, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(1, a1[0].get(1));
+ assert.isEqual(3, a1[1].length);
+ assert.isEqual(3, a1[1].get(0));
+ assert.isEqual(5, a1[1].get(2));
+
+ a1 = b1.split([2], { includeDelimiter : true });
+ assert.isEqual(3, a1.length);
+ assert.isTrue(a1[0] instanceof ByteString);
+ assert.isEqual(2, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(1, a1[0].get(1));
+ assert.isEqual(1, a1[1].length);
+ assert.isEqual(2, a1[1].get(0));
+ assert.isEqual(3, a1[2].length);
+ assert.isEqual(3, a1[2].get(0));
+ assert.isEqual(5, a1[2].get(2));
+
+ a1 = b1.split(new ByteString([2,3]));
+ assert.isEqual(2, a1.length);
+ assert.isTrue(a1[0] instanceof ByteString);
+ assert.isEqual(2, a1[0].length);
+ assert.isEqual(0, a1[0].get(0));
+ assert.isEqual(1, a1[0].get(1));
+ assert.isEqual(2, a1[1].length);
+ assert.isEqual(4, a1[1].get(0));
+ assert.isEqual(5, a1[1].get(1));
+};
exports.testSlice = function() {
var b1 = new ByteString([0,1,2,3,4,5]), b2;
b2 = b1.slice();
assert.isEqual(6, b2.length);
- assert.isEqual(0, b2.byteAt(0));
- assert.isEqual(5, b2.byteAt(5));
+ assert.isEqual(0, b2.get(0));
+ assert.isEqual(5, b2.get(5));
b2 = b1.slice(0);
assert.isEqual(6, b2.length);
- assert.isEqual(0, b2.byteAt(0));
- assert.isEqual(5, b2.byteAt(5));
+ assert.isEqual(0, b2.get(0));
+ assert.isEqual(5, b2.get(5));
b2 = b1.slice(1, 4);
assert.isEqual(3, b2.length);
- assert.isEqual(1, b2.byteAt(0));
- assert.isEqual(3, b2.byteAt(2));
+ assert.isEqual(1, b2.get(0));
+ assert.isEqual(3, b2.get(2));
b2 = b1.slice(0, -1);
assert.isEqual(5, b2.length);
- assert.isEqual(0, b2.byteAt(0));
- assert.isEqual(4, b2.byteAt(4));
+ assert.isEqual(0, b2.get(0));
+ assert.isEqual(4, b2.get(4));
b2 = b1.slice(-3, -1);
assert.isEqual(2, b2.length);
- assert.isEqual(3, b2.byteAt(0));
- assert.isEqual(4, b2.byteAt(1));
+ assert.isEqual(3, b2.get(0));
+ assert.isEqual(4, b2.get(1));
b2 = b1.slice(9, 10);
assert.isEqual(0, b2.length);
-}
-
-exports.testStringToByteString = function() {
- assert.isEqual("hello world", "hello world".toByteString("US-ASCII").decodeToString("US-ASCII"));
- assert.isEqual("I ♥ JS", "I ♥ JS".toByteString("UTF-8").decodeToString("UTF-8"));
};
exports.testByteStringNewless = function () {
diff --git a/utils/tests/serverjs/file-tests.js b/utils/tests/serverjs/file-tests.js
index eab0bda..0db6ac2 100755
--- a/utils/tests/serverjs/file-tests.js
+++ b/utils/tests/serverjs/file-tests.js
@@ -229,6 +229,8 @@ exports.testIterator = require('./file/iterator');
exports.testExtension = require('./file/extension');
exports.testResolve = require('./file/resolve');
exports.testNormal = require('./file/normal');
+exports.testDirname = require('./file/dirname');
+exports.testIsAbsolute = require('./file/is-absolute');
if (require.main === module.id)
require("os").exit(require("test/runner").run(exports));
diff --git a/utils/tests/serverjs/file/resolve.js b/utils/tests/serverjs/file/resolve.js
index ce6736a..dbd33f0 100755
--- a/utils/tests/serverjs/file/resolve.js
+++ b/utils/tests/serverjs/file/resolve.js
@@ -40,3 +40,5 @@ util.forEachApply([
};
});
+if (require.main === module.id)
+ require("os").exit(require("test/runner").run(exports));