You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/09/23 01:22:51 UTC
svn commit: r449122 [20/40] - in
/tapestry/tapestry4/trunk/tapestry-framework/src: java/org/apache/tapestry/
java/org/apache/tapestry/dojo/ java/org/apache/tapestry/dojo/form/
java/org/apache/tapestry/dojo/html/ java/org/apache/tapestry/form/
java/org/...
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/matrix.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/matrix.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/matrix.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/matrix.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,377 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.math.matrix");
+
+// some of this code is based on
+// http://www.mkaz.com/math/MatrixCalculator.java
+// (published under a BSD Open Source License)
+//
+// the rest is from my vague memory of matricies in school [cal]
+//
+// the copying of arguments is a little excessive, and could be trimmed back in
+// the case where a function doesn't modify them at all (but some do!)
+//
+// 2006-06-25: Some enhancements submitted by Erel Segal:
+// * addition: a tolerance constant for determinant calculations.
+// * performance fix: removed unnecessary argument copying.
+// * addition: function "product" for multiplying more than 2 matrices
+// * addition: function "sum" for adding any number of matrices
+// * bug fix: inversion of a 1x1 matrix without using the adjoint
+// * performance fixes: upperTriangle
+// * addition: argument "value" to function create, to initialize the matrix with a custom val
+// * addition: functions "ones" and "zeros" - like Matlab[TM] functions with the same name.
+// * addition: function "identity" for creating an identity matrix of a given size.
+// * addition: argument "decimal_points" to function format
+// * bug fix: adjoint of a 0-size matrix
+// * performance fixes: adjoint
+//
+
+dojo.math.matrix.iDF = 0;
+
+// Erel: values lower than this value are considered zero (in detereminant calculations).
+// It is analogous to Maltab[TM]'s "eps".
+dojo.math.matrix.ALMOST_ZERO = 1e-10;
+dojo.math.matrix.multiply = function(a, b){
+ var ay = a.length;
+ var ax = a[0].length;
+ var by = b.length;
+ var bx = b[0].length;
+
+ if (ax != by){
+ dojo.debug("Can't multiply matricies of sizes "+ax+','+ay+' and '+bx+','+by);
+ return [[0]];
+ }
+
+ var c = [];
+ for(var k=0; k<ay; k++){
+ c[k] = [];
+ for(var i=0; i<bx; i++){
+ c[k][i] = 0;
+ for(var m=0; m<ax; m++){
+ c[k][i] += a[k][m]*b[m][i];
+ }
+ }
+ }
+ return c;
+}
+
+// Erel: added a "product" function to calculate product of more than 2 matrices:
+dojo.math.matrix.product = function() {
+ if (arguments.length==0) {
+ dojo.debug ("can't multiply 0 matrices!");
+ return 1;
+ }
+ var result = arguments[0];
+ for (var i=1; i<arguments.length; i++){
+ result = matrix.multiply(result,arguments[i]);
+ }
+ return result;
+}
+
+// Erel: added a "sum" function to calculate sum of more than 2 matrices:
+dojo.math.matrix.sum = function() {
+ if (arguments.length==0) {
+ dojo.debug ("can't sum 0 matrices!");
+ return 0;
+ }
+ var result = matrix.copy(arguments[0]);
+ var rows = result.length;
+ if (rows==0) {
+ dojo.debug ("can't deal with matrices of 0 rows!");
+ return 0;
+ }
+ var cols = result[0].length;
+ if (cols==0) {
+ dojo.debug ("can't deal with matrices of 0 cols!");
+ return 0;
+ }
+ for (var i=1; i<arguments.length; ++i) {
+ var arg = arguments[i];
+ if (arg.length!=rows || arg[0].length!=cols) {
+ dojo.debug ("can't add matrices of different dimensions: first dimensions were " + rows + "x" + cols + ", current dimensions are "+arg.length + "x" + arg[0].length);
+ return 0;
+ }
+
+ // The actual addition:
+ for (var r=0; r<rows; r++){
+ for (var c=0; c<cols; c++){
+ result[r][c] += arg[r][c];
+ }
+ }
+ }
+ return result;
+}
+
+
+dojo.math.matrix.inverse = function(a){
+ // Erel: added special case: inverse of a 1x1 matrix can't be calculated by adjoint
+ if (a.length==1 && a[0].length==1){
+ return [[ 1 / a[0][0] ]];
+ }
+
+ // Formula used to Calculate Inverse:
+ // inv(A) = 1/det(A) * adj(A)
+
+ var tms = a.length;
+ var m = dojo.math.matrix.create(tms, tms);
+ var mm = dojo.math.matrix.adjoint(a);
+ var det = dojo.math.matrix.determinant(a);
+ var dd = 0;
+
+ if(det == 0){
+ dojo.debug("Determinant Equals 0, Not Invertible.");
+ return [[0]];
+ }else{
+ dd = 1 / det;
+ }
+
+ for (var i = 0; i < tms; i++){
+ for (var j = 0; j < tms; j++) {
+ m[i][j] = dd * mm[i][j];
+ }
+ }
+ return m;
+}
+
+dojo.math.matrix.determinant = function(a){
+ if (a.length != a[0].length){
+ dojo.debug("Can't calculate the determiant of a non-squre matrix!");
+ return 0;
+ }
+
+ var tms = a.length;
+ var det = 1;
+ var b = dojo.math.matrix.upperTriangle(a);
+
+ for (var i=0; i < tms; i++){
+ var bii = b[i][i];
+ if (Math.abs(bii) < dojo.math.matrix.ALMOST_ZERO){
+ return 0;
+ }
+ det *= bii;
+ }
+ det = det * dojo.math.matrix.iDF;
+ return det;
+}
+
+dojo.math.matrix.upperTriangle = function(m){
+ m = dojo.math.matrix.copy(m); // Copy m, because m is changed!
+ var f1 = 0;
+ var temp = 0;
+ var tms = m.length;
+ var v = 1;
+
+ //Erel: why use a global variable and not a local variable?
+ dojo.math.matrix.iDF = 1;
+
+ for (var col = 0; col < tms - 1; col++) {
+ if (typeof m[col][col] != 'number'){
+ dojo.debug("non-numeric entry found in a numeric matrix: m["+col+"]["+col+"]="+m[col][col]);
+ }
+ v = 1;
+ var stop_loop = 0;
+
+ // check if there is a 0 in diagonal
+ while ((m[col][col] == 0) && !stop_loop) {
+ // if so, switch rows until there is no 0 in diagonal:
+ if (col + v >= tms){
+ // check if switched all rows
+ dojo.math.matrix.iDF = 0;
+ stop_loop = 1;
+ }else{
+ for (var r = 0; r < tms; r++) {
+ temp = m[col][r];
+ m[col][r] = m[col + v][r]; // switch rows
+ m[col + v][r] = temp;
+ }
+ v++; // count row switchs
+ dojo.math.matrix.iDF *= -1; // each switch changes determinant factor
+ }
+ }
+
+ // loop over lower-right triangle (where row>col):
+ // for each row, make m[row][col] = 0 by linear operations that don't change the determinant:
+ for (var row = col + 1; row < tms; row++) {
+ if (typeof m[row][col] != 'number'){
+ dojo.debug("non-numeric entry found in a numeric matrix: m["+row+"]["+col+"]="+m[row][col]);
+ }
+ if (typeof m[col][row] != 'number'){
+ dojo.debug("non-numeric entry found in a numeric matrix: m["+col+"]["+row+"]="+m[col][row]);
+ }
+ if (m[col][col] != 0) {
+ var f1 = (-1) * m[row][col] / m[col][col];
+ // this should make m[row][col] zero:
+ // m[row] += f1 * m[col];
+ for (var i = col; i < tms; i++) {
+ m[row][i] = f1 * m[col][i] + m[row][i];
+ }
+ }
+ }
+ }
+ return m;
+}
+
+// Erel: added parameter "value" - a custom default value to fill the matrix with.
+dojo.math.matrix.create = function(a, b, value){
+ if(!value){
+ value = 0;
+ }
+ var m = [];
+ for(var i=0; i<b; i++){
+ m[i] = [];
+ for(var j=0; j<a; j++){
+ m[i][j] = value;
+ }
+ }
+ return m;
+}
+
+// Erel implement Matlab[TM] functions "ones" and "zeros"
+dojo.math.matrix.ones = function(a,b) {
+ return dojo.math.matrix.create(a,b,1);
+}
+dojo.math.matrix.zeros = function(a,b) {
+ return dojo.math.matrix.create(a,b,0);
+}
+
+// Erel: added function that returns identity matrix.
+// size = number of rows and cols in the matrix.
+// scale = an optional value to multiply the matrix by (default is 1).
+dojo.math.matrix.identity = function(size, scale){
+ if (!scale){
+ scale = 1;
+ }
+ var m = [];
+ for(var i=0; i<n; i++){
+ m[i] = [];
+ for(var j=0; j<n; j++){
+ m[i][j] = (i==j? scale: 0);
+ }
+ }
+ return m;
+}
+
+dojo.math.matrix.adjoint = function(a){
+ var tms = a.length;
+
+ // Erel: added "<=" to catch zero-size matrix
+ if (tms <= 1){
+ dojo.debug("Can't find the adjoint of a matrix with a dimension less than 2");
+ return [[0]];
+ }
+
+ if (a.length != a[0].length){
+ dojo.debug("Can't find the adjoint of a non-square matrix");
+ return [[0]];
+ }
+
+ var m = dojo.math.matrix.create(tms, tms);
+
+ var ii = 0;
+ var jj = 0;
+ var ia = 0;
+ var ja = 0;
+ var det = 0;
+ var ap = dojo.math.matrix.create(tms-1, tms-1);
+
+ for (var i = 0; i < tms; i++){
+ for (var j = 0; j < tms; j++){
+ ia = 0;
+ for (ii = 0; ii < tms; ii++) { // create a temporary matrix for determinant calc
+ if (ii==i){
+ continue; // skip current row
+ }
+ ja = 0;
+ for (jj = 0; jj < tms; jj++) {
+ if (jj==j){
+ continue; // skip current col
+ }
+ ap[ia][ja] = a[ii][jj];
+ ja++;
+ }
+ ia++;
+ }
+
+ det = dojo.math.matrix.determinant(ap);
+ m[i][j] = Math.pow(-1 , (i + j)) * det;
+ }
+ }
+ m = dojo.math.matrix.transpose(m);
+ return m;
+}
+
+dojo.math.matrix.transpose = function(a){
+ var m = dojo.math.matrix.create(a.length, a[0].length);
+ for (var i = 0; i < a.length; i++){
+ for (var j = 0; j < a[i].length; j++){
+ m[j][i] = a[i][j];
+ }
+ }
+ return m;
+}
+
+// Erel: added decimal_points argument
+dojo.math.matrix.format = function(a, decimal_points){
+ if (arguments.length<=1){
+ decimal_points = 5;
+ }
+
+ function format_int(x, dp){
+ var fac = Math.pow(10 , dp);
+ var a = Math.round(x*fac)/fac;
+ var b = a.toString();
+ if (b.charAt(0) != '-'){ b = ' ' + b;}
+ var has_dp = 0;
+ for(var i=1; i<b.length; i++){
+ if (b.charAt(i) == '.'){ has_dp = 1; }
+ }
+ if (!has_dp){ b += '.'; }
+ while(b.length < dp+3){ b += '0'; }
+ return b;
+ }
+
+ var ya = a.length;
+ var xa = ya>0? a[0].length: 0;
+ var buffer = '';
+ for (var y=0; y<ya; y++){
+ buffer += '| ';
+ for (var x=0; x<xa; x++){
+ buffer += format_int(a[y][x], decimal_points) + ' ';
+ }
+ buffer += '|\n';
+ }
+ return buffer;
+}
+
+dojo.math.matrix.copy = function(a){
+ var ya = a.length;
+ var xa = a[0].length;
+ var m = dojo.math.matrix.create(xa, ya);
+ for (var y=0; y<ya; y++){
+ for (var x=0; x<xa; x++){
+ m[y][x] = a[y][x];
+ }
+ }
+ return m;
+}
+
+dojo.math.matrix.scale = function(k, a){
+ a = dojo.math.matrix.copy(a); // Copy a because a is changed!
+ var ya = a.length;
+ var xa = a[0].length;
+
+ for (var y=0; y<ya; y++){
+ for (var x=0; x<xa; x++){
+ a[y][x] *= k;
+ }
+ }
+ return a;
+}
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/matrix.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/points.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/points.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/points.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/points.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,54 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.math.points");
+dojo.require("dojo.math");
+
+dojo.math.points = {
+ translate: function(/* array */a, /* array */b) {
+ // summary
+ // translate a by b, and return the result.
+ if( a.length != b.length ) {
+ dojo.raise("dojo.math.translate: points not same size (a:[" + a + "], b:[" + b + "])");
+ }
+ var c = new Array(a.length);
+ for(var i = 0; i < a.length; i++) {
+ c[i] = a[i] + b[i];
+ }
+ return c; // array
+ },
+
+ midpoint: function(/* array */a, /* array */b) {
+ // summary
+ // Find the point midway between a and b
+ if( a.length != b.length ) {
+ dojo.raise("dojo.math.midpoint: points not same size (a:[" + a + "], b:[" + b + "])");
+ }
+ var c = new Array(a.length);
+ for(var i = 0; i < a.length; i++) {
+ c[i] = (a[i] + b[i]) / 2;
+ }
+ return c; // array
+ },
+
+ invert: function(/* array */a) {
+ // summary
+ // invert the values in a and return it.
+ var b = new Array(a.length);
+ for(var i = 0; i < a.length; i++) { b[i] = -a[i]; }
+ return b; // array
+ },
+
+ distance: function(/* array */a, /* array */b) {
+ // summary
+ // Calculate the distance between point a and point b
+ return Math.sqrt(Math.pow(b[0]-a[0], 2) + Math.pow(b[1]-a[1], 2)); // float
+ }
+};
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/math/points.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespace.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespace.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespace.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespace.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,130 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.namespace");
+
+dojo["namespace"] = {
+ dojo: "dojo",
+ namespaces: {},
+ failed: {},
+ loading: {},
+ loaded: {},
+ register: function(name, module, resolver /*optional*/, noOverride) {
+ if((!noOverride)&&(!this.namespaces[name])){
+ this.namespaces[name] = new dojo["namespace"].Namespace(name, module, resolver);
+ }
+ },
+ allow: function(name) {
+ // summary: Return false if 'name' is filtered by configuration or has failed to load, true otherwise
+ if(this.failed[name]){return false;} // if this namespace is known unloadable
+ // if the user has specified that this namespace be disallowed, return false.
+ var excl = djConfig.excludeNamespace;
+ if((excl)&&(dojo.lang.inArray(excl, name))){return false;}
+ // If the namespace is "dojo", or the user has not specified allowed namespaces return true.
+ // Otherwise, if the user has specifically allowed this namespace, return true, otherwise false.
+ var incl = djConfig.includeNamespace;
+ return((name==this.dojo)||(!incl)||(dojo.lang.inArray(incl, name)));
+ },
+ get: function(name){
+ // summary
+ // Return Namespace object registered to 'name', if any
+ return this.namespaces[name];
+ },
+ require: function(name){
+ // summary
+ // Try to ensure that 'name' is registered by loading a namespace manifest
+ var ns = this.namespaces[name];
+ if((ns)&&(this.loaded[name])){return ns;}
+ if(!this.allow(name)){return false;}
+ if(this.loading[name]){
+ // FIXME: do we really ever have re-entrancy situation? this would appear to be really bad
+ // original code did not throw an exception, although that seems the only course
+ // adding debug output here to track if this occurs.
+ dojo.debug('dojo.namespace.require: re-entrant request to load namespace "' + name + '" must fail.');
+ return false;
+ }
+ // workaround so we don't break the build system
+ var req = dojo.require;
+ this.loading[name] = true;
+ try {
+ //dojo namespace file is always in the Dojo namespace folder, not a custom namespace folder
+ if(name==this.dojo){
+ req("dojo.namespaces.dojo");
+ }else{
+ // if no registered module prefix, use ../<name> by convention
+ if(!dojo.hostenv.moduleHasPrefix(name)){
+ dojo.registerModulePath(name, "../" + name);
+ }
+ req([name, 'manifest'].join('.'), false, true);
+ }
+ if(!this.namespaces[name]){
+ this.failed[name] = true; //only look for a namespace once
+ }
+ }finally{
+ this.loading[name]=false;
+ }
+ return this.namespaces[name];
+ }
+}
+
+dojo.registerNamespace = function(name, module, resolver /*optional*/){
+ dojo["namespace"].register.apply(dojo["namespace"], arguments);
+}
+
+dojo.registerNamespaceResolver = function(name, resolver){
+ var n = dojo["namespace"].namespaces[name];
+ if(n){
+ n.resolver = resolver;
+ }
+}
+
+dojo.registerNamespaceManifest = function(module, path, name, widgetModule, resolver /*optional*/){
+ dojo.registerModulePath(name, path);
+ dojo.registerNamespace(name, widgetModule, resolver);
+}
+
+dojo.defineNamespace = function(objRoot, location, nsPrefix, resolver /*optional*/, widgetPackage /*optional*/){
+ dojo.deprecated("dojo.defineNamespace", " is replaced by other systems. See the Dojo Wiki [http://dojo.jot.com/WikiHome/Modules & Namespaces].", "0.5");
+ dojo.registerNamespaceManifest(objRoot, location, nsPrefix, widgetPackage, resolver);
+}
+
+// namespace bookkeeping object
+
+dojo["namespace"].Namespace = function(name, module, resolver){
+ this.name = name;
+ this.module = module;
+ this.resolver = resolver;
+}
+
+dojo["namespace"].Namespace.prototype._loaded = {};
+dojo["namespace"].Namespace.prototype._failed = {};
+
+// map component with 'name' and 'domain' to a module via
+// namespace resolver, if specified
+dojo["namespace"].Namespace.prototype.resolve = function(name, domain, omit_module_check){
+ if(!this.resolver){return false;}
+ var fullName = this.resolver(name,domain);
+ //only load a widget once. This is a quicker check than dojo.require does
+ if((fullName)&&(!this._loaded[fullName])&&(!this._failed[fullName])){
+ //workaround so we don't break the build system
+ var req = dojo.require;
+ req(fullName, false, true); //omit the module check, we'll do it ourselves.
+ if(dojo.hostenv.findModule(fullName, false)){
+ this._loaded[fullName] = true;
+ }else{
+ if(!omit_module_check){dojo.raise("dojo.namespace.Namespace.resolve: module '" + fullName + "' not found after loading via namespace '" + this.name + "'");}
+ this._failed[fullName] = true;
+ }
+ }
+ return Boolean(this._loaded[fullName]);
+}
+
+// NOTE: rather put this in dojo.widget.Widget, but that fubars debugAtAllCosts
+dojo.registerNamespace("dojo", "dojo.widget");
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespace.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespaces/dojo.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespaces/dojo.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespaces/dojo.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespaces/dojo.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,121 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.namespaces.dojo");
+dojo.require("dojo.namespace");
+
+(function(){
+ //mapping of all widget short names to their full package names
+ // This is used for widget autoloading - no dojo.require() is necessary.
+ // If you use a widget in markup or create one dynamically, then this
+ // mapping is used to find and load any dependencies not already loaded.
+ // You should use your own namespace for any custom widgets.
+ // For extra widgets you use, dojo.declare() may be used to explicitly load them.
+ var map = {
+ html: {
+ "accordioncontainer": "dojo.widget.AccordionContainer",
+ "treerpccontroller": "dojo.widget.TreeRPCController",
+ "accordionpane": "dojo.widget.AccordionPane",
+ "button": "dojo.widget.Button",
+ "chart": "dojo.widget.Chart",
+ "checkbox": "dojo.widget.Checkbox",
+ "colorpalette": "dojo.widget.ColorPalette",
+ "combobox": "dojo.widget.ComboBox",
+ "combobutton": "dojo.widget.Button",
+ "contentpane": "dojo.widget.ContentPane",
+ "contextmenu": "dojo.widget.ContextMenu",
+ "datepicker": "dojo.widget.DatePicker",
+ "debugconsole": "dojo.widget.DebugConsole",
+ "dialog": "dojo.widget.Dialog",
+ "docpane": "dojo.widget.DocPane",
+ "dropdownbutton": "dojo.widget.Button",
+ "dropdowndatepicker": "dojo.widget.DropdownDatePicker",
+ "dropdowntimepicker": "dojo.widget.DropdownTimePicker",
+ "editor2": "dojo.widget.Editor2",
+ "editor2toolbar": "dojo.widget.Editor2Toolbar",
+ "editor": "dojo.widget.Editor",
+ "editortree": "dojo.widget.EditorTree",
+ "editortreecontextmenu": "dojo.widget.EditorTreeContextMenu",
+ "editortreenode": "dojo.widget.EditorTreeNode",
+ "fisheyelist": "dojo.widget.FisheyeList",
+ "editortreecontroller": "dojo.widget.EditorTreeController",
+ "googlemap": "dojo.widget.GoogleMap",
+ "editortreeselector": "dojo.widget.EditorTreeSelector",
+ "floatingpane": "dojo.widget.FloatingPane",
+ "hslcolorpicker": "dojo.widget.HslColorPicker",
+ "inlineeditbox": "dojo.widget.InlineEditBox",
+ "layoutcontainer": "dojo.widget.LayoutContainer",
+ "linkpane": "dojo.widget.LinkPane",
+ "pagecontainer": "dojo.widget.PageContainer",
+ "popupcontainer": "dojo.widget.Menu2",
+ "popupmenu2": "dojo.widget.Menu2",
+ "menuitem2": "dojo.widget.Menu2",
+ "menuseparator2": "dojo.widget.Menu2",
+ "menubar2": "dojo.widget.Menu2",
+ "menubaritem2": "dojo.widget.Menu2",
+ "monthlyCalendar": "dojo.widget.MonthlyCalendar",
+ "radiogroup": "dojo.widget.RadioGroup",
+ "richtext": "dojo.widget.RichText",
+ "remotetabcontroller": "dojo.widget.RemoteTabController",
+ "resizehandle": "dojo.widget.ResizeHandle",
+ "resizabletextarea": "dojo.widget.ResizableTextarea",
+ "select": "dojo.widget.Select",
+ "slideshow": "dojo.widget.SlideShow",
+ "sortabletable": "dojo.widget.SortableTable",
+ "splitcontainer": "dojo.widget.SplitContainer",
+ "svgbutton": "dojo.widget.SvgButton",
+ "tabcontainer": "dojo.widget.TabContainer",
+ "taskbar": "dojo.widget.TaskBar",
+ "timepicker": "dojo.widget.TimePicker",
+ "titlepane": "dojo.widget.TitlePane",
+ "toaster": "dojo.widget.Toaster",
+ "toggler": "dojo.widget.Toggler",
+ "toolbar": "dojo.widget.Toolbar",
+ "tooltip": "dojo.widget.Tooltip",
+ "tree": "dojo.widget.Tree",
+ "treebasiccontroller": "dojo.widget.TreeBasicController",
+ "treecontextmenu": "dojo.widget.TreeContextMenu",
+ "treeselector": "dojo.widget.TreeSelector",
+ "treecontrollerextension": "dojo.widget.TreeControllerExtension",
+ "treenode": "dojo.widget.TreeNode",
+ "validate": "dojo.widget.validate",
+ "treeloadingcontroller": "dojo.widget.TreeLoadingController",
+ "widget": "dojo.widget.Widget",
+ "wizard": "dojo.widget.Wizard",
+ "yahoomap": "dojo.widget.YahooMap"
+ },
+ svg: {
+ "chart": "dojo.widget.svg.Chart",
+ "hslcolorpicker": "dojo.widget.svg.HslColorPicker"
+ },
+ vml: {
+ "chart": "dojo.widget.vml.Chart"
+ }
+ };
+
+ dojo.addDojoNamespaceMapping = function(/*String*/shortName, /*String*/packageName){
+ // summary:
+ // Add an entry to the mapping table for the dojo: namespace
+ //
+ // shortName: the name to be used as the widget's tag name in the dojo: namespace
+ // packageName: the path to the Javascript module in dotted package notation
+ map[shortName]=packageName;
+ };
+
+ function dojoNamespaceResolver(name, domain){
+ if(!domain){ domain="html"; }
+ if(!map[domain]){ return null; }
+ return map[domain][name];
+ }
+
+ dojo.registerNamespaceResolver("dojo", dojoNamespaceResolver);
+ //dojo.defineNamespace("dojo", "src", "dojo", dojoNamespaceResolver);
+
+})();
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/namespaces/dojo.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/profile.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/profile.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/profile.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/profile.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,120 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.profile");
+
+
+
+
+dojo.profile = new function(){
+ var profiles = {};
+ var pns = [];
+
+ this.start = function(name){
+ if(!profiles[name]){
+ profiles[name] = {iters: 0, total: 0};
+ pns[pns.length] = name;
+ }else{
+ if(profiles[name]["start"]){
+ this.end(name);
+ }
+ }
+ profiles[name].end = null;
+ profiles[name].start = new Date();
+ }
+
+ this.end = function(name){
+ var ed = new Date();
+ if((profiles[name])&&(profiles[name]["start"])){
+ with(profiles[name]){
+ end = ed;
+ total += (end - start);
+ start = null;
+ iters++;
+ }
+ }else{
+ // oops! bad call to end(), what should we do here?
+ return true;
+ }
+ }
+
+ this.stop = this.end;
+
+ this.dump = function(appendToDoc){
+ var tbl = document.createElement("table");
+ with(tbl.style){
+ border = "1px solid black";
+ borderCollapse = "collapse";
+ }
+ var hdr = tbl.createTHead();
+ var hdrtr = hdr.insertRow(0);
+ // document.createElement("tr");
+ var cols = ["Identifier","Calls","Total","Avg"];
+ for(var x=0; x<cols.length; x++){
+ var ntd = hdrtr.insertCell(x);
+ with(ntd.style){
+ backgroundColor = "#225d94";
+ color = "white";
+ borderBottom = "1px solid black";
+ borderRight = "1px solid black";
+ fontFamily = "tahoma";
+ fontWeight = "bolder";
+ paddingLeft = paddingRight = "5px";
+ }
+ ntd.appendChild(document.createTextNode(cols[x]));
+ }
+
+ for(var x=0; x < pns.length; x++){
+ var prf = profiles[pns[x]];
+ this.end(pns[x]);
+ if(prf.iters>0){
+ var bdytr = tbl.insertRow(true);
+ var vals = [pns[x], prf.iters, prf.total, parseInt(prf.total/prf.iters)];
+ for(var y=0; y<vals.length; y++){
+ var cc = bdytr.insertCell(y);
+ cc.appendChild(document.createTextNode(vals[y]));
+ with(cc.style){
+ borderBottom = "1px solid gray";
+ paddingLeft = paddingRight = "5px";
+ if(x%2){
+ backgroundColor = "#e1f1ff";
+ }
+ if(y>0){
+ textAlign = "right";
+ borderRight = "1px solid gray";
+ }else{
+ borderRight = "1px solid black";
+ }
+ }
+ }
+ }
+ }
+
+ if(appendToDoc){
+ var ne = document.createElement("div");
+ ne.id = "profileOutputTable";
+ with(ne.style){
+ fontFamily = "Courier New, monospace";
+ fontSize = "12px";
+ lineHeight = "16px";
+ borderTop = "1px solid black";
+ padding = "10px";
+ }
+ if(document.getElementById("profileOutputTable")){
+ dojo.body().replaceChild(ne, document.getElementById("profileOutputTable"));
+ }else{
+ dojo.body().appendChild(ne);
+ }
+ ne.appendChild(tbl);
+ }
+
+ return tbl;
+ }
+}
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/profile.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/regexp.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/regexp.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/regexp.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/regexp.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,606 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.regexp");
+dojo.provide("dojo.regexp.us");
+
+// *** Regular Expression Generators ***
+
+/**
+ Builds a RE that matches a top-level domain.
+
+ @param flags An object.
+ flags.allowCC Include 2 letter country code domains. Default is true.
+ flags.allowGeneric Include the generic domains. Default is true.
+ flags.allowInfra Include infrastructure domains. Default is true.
+
+ @return A string for a regular expression for a top-level domain.
+*/
+dojo.regexp.tld = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.allowCC != "boolean") { flags.allowCC = true; }
+ if (typeof flags.allowInfra != "boolean") { flags.allowInfra = true; }
+ if (typeof flags.allowGeneric != "boolean") { flags.allowGeneric = true; }
+
+ // Infrastructure top-level domain - only one at present
+ var infraRE = "arpa";
+
+ // Generic top-level domains RE.
+ var genericRE =
+ "aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|xxx|jobs|mobi|post";
+
+ // Country Code top-level domains RE
+ var ccRE =
+ "ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|" +
+ "bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|" +
+ "ec|ee|eg|er|es|et|fi|fj|fk|fm|fo|fr|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|" +
+ "hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|" +
+ "lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|" +
+ "mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|" +
+ "ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|" +
+ "to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw";
+
+ // Build top-level domain RE
+ var a = [];
+ if (flags.allowInfra) { a.push(infraRE); }
+ if (flags.allowGeneric) { a.push(genericRE); }
+ if (flags.allowCC) { a.push(ccRE); }
+
+ var tldRE = "";
+ if (a.length > 0) {
+ tldRE = "(" + a.join("|") + ")";
+ }
+
+ return tldRE;
+}
+
+/**
+ Builds a RE that matches an IP Address.
+ Supports 5 formats for IPv4: dotted decimal, dotted hex, dotted octal, decimal and hexadecimal.
+ Supports 2 formats for Ipv6.
+
+ @param flags An object. All flags are boolean with default = true.
+ flags.allowDottedDecimal Example, 207.142.131.235. No zero padding.
+ flags.allowDottedHex Example, 0x18.0x11.0x9b.0x28. Case insensitive. Zero padding allowed.
+ flags.allowDottedOctal Example, 0030.0021.0233.0050. Zero padding allowed.
+ flags.allowDecimal Example, 3482223595. A decimal number between 0-4294967295.
+ flags.allowHex Example, 0xCF8E83EB. Hexadecimal number between 0x0-0xFFFFFFFF.
+ Case insensitive. Zero padding allowed.
+ flags.allowIPv6 IPv6 address written as eight groups of four hexadecimal digits.
+ flags.allowHybrid IPv6 address written as six groups of four hexadecimal digits
+ followed by the usual 4 dotted decimal digit notation of IPv4. x:x:x:x:x:x:d.d.d.d
+
+ @return A string for a regular expression for an IP address.
+*/
+dojo.regexp.ipAddress = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.allowDottedDecimal != "boolean") { flags.allowDottedDecimal = true; }
+ if (typeof flags.allowDottedHex != "boolean") { flags.allowDottedHex = true; }
+ if (typeof flags.allowDottedOctal != "boolean") { flags.allowDottedOctal = true; }
+ if (typeof flags.allowDecimal != "boolean") { flags.allowDecimal = true; }
+ if (typeof flags.allowHex != "boolean") { flags.allowHex = true; }
+ if (typeof flags.allowIPv6 != "boolean") { flags.allowIPv6 = true; }
+ if (typeof flags.allowHybrid != "boolean") { flags.allowHybrid = true; }
+
+ // decimal-dotted IP address RE.
+ var dottedDecimalRE =
+ // Each number is between 0-255. Zero padding is not allowed.
+ "((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
+
+ // dotted hex IP address RE. Each number is between 0x0-0xff. Zero padding is allowed, e.g. 0x00.
+ var dottedHexRE = "(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]";
+
+ // dotted octal IP address RE. Each number is between 0000-0377.
+ // Zero padding is allowed, but each number must have at least 4 characters.
+ var dottedOctalRE = "(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]";
+
+ // decimal IP address RE. A decimal number between 0-4294967295.
+ var decimalRE = "(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|" +
+ "4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])";
+
+ // hexadecimal IP address RE.
+ // A hexadecimal number between 0x0-0xFFFFFFFF. Case insensitive. Zero padding is allowed.
+ var hexRE = "0[xX]0*[\\da-fA-F]{1,8}";
+
+ // IPv6 address RE.
+ // The format is written as eight groups of four hexadecimal digits, x:x:x:x:x:x:x:x,
+ // where x is between 0000-ffff. Zero padding is optional. Case insensitive.
+ var ipv6RE = "([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}";
+
+ // IPv6/IPv4 Hybrid address RE.
+ // The format is written as six groups of four hexadecimal digits,
+ // followed by the 4 dotted decimal IPv4 format. x:x:x:x:x:x:d.d.d.d
+ var hybridRE = "([\\da-fA-F]{1,4}\\:){6}" +
+ "((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])";
+
+ // Build IP Address RE
+ var a = [];
+ if (flags.allowDottedDecimal) { a.push(dottedDecimalRE); }
+ if (flags.allowDottedHex) { a.push(dottedHexRE); }
+ if (flags.allowDottedOctal) { a.push(dottedOctalRE); }
+ if (flags.allowDecimal) { a.push(decimalRE); }
+ if (flags.allowHex) { a.push(hexRE); }
+ if (flags.allowIPv6) { a.push(ipv6RE); }
+ if (flags.allowHybrid) { a.push(hybridRE); }
+
+ var ipAddressRE = "";
+ if (a.length > 0) {
+ ipAddressRE = "(" + a.join("|") + ")";
+ }
+
+ return ipAddressRE;
+}
+
+/**
+ Builds a RE that matches a host.
+ A host is a domain name or an IP address, possibly followed by a port number.
+
+ @param flags An object.
+ flags.allowIP Allow an IP address for hostname. Default is true.
+ flags.allowLocal Allow the host to be "localhost". Default is false.
+ flags.allowPort Allow a port number to be present. Default is true.
+ flags in regexp.ipAddress can be applied.
+ flags in regexp.tld can be applied.
+
+ @return A string for a regular expression for a host.
+*/
+dojo.regexp.host = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.allowIP != "boolean") { flags.allowIP = true; }
+ if (typeof flags.allowLocal != "boolean") { flags.allowLocal = false; }
+ if (typeof flags.allowPort != "boolean") { flags.allowPort = true; }
+
+ // Domain names can not end with a dash.
+ var domainNameRE = "([0-9a-zA-Z]([-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?\\.)+" + dojo.regexp.tld(flags);
+
+ // port number RE
+ var portRE = ( flags.allowPort ) ? "(\\:" + dojo.regexp.integer({signed: false}) + ")?" : "";
+
+ // build host RE
+ var hostNameRE = domainNameRE;
+ if (flags.allowIP) { hostNameRE += "|" + dojo.regexp.ipAddress(flags); }
+ if (flags.allowLocal) { hostNameRE += "|localhost"; }
+
+ return "(" + hostNameRE + ")" + portRE;
+}
+
+/**
+ Builds a regular expression that matches a URL.
+
+ @param flags An object.
+ flags.scheme Can be true, false, or [true, false].
+ This means: required, not allowed, or match either one.
+ flags in regexp.host can be applied.
+ flags in regexp.ipAddress can be applied.
+ flags in regexp.tld can be applied.
+
+ @return A string for a regular expression for a URL.
+*/
+dojo.regexp.url = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.scheme == "undefined") { flags.scheme = [true, false]; }
+
+ // Scheme RE
+ var protocalRE = dojo.regexp.buildGroupRE(flags.scheme,
+ function(q) { if (q) { return "(https?|ftps?)\\://"; } return ""; }
+ );
+
+ // Path and query and anchor RE
+ var pathRE = "(/([^?#\\s/]+/)*)?([^?#\\s/]+(\\?[^?#\\s/]*)?(#[A-Za-z][\\w.:-]*)?)?";
+
+ return (protocalRE + dojo.regexp.host(flags) + pathRE);
+}
+
+/**
+ Builds a regular expression that matches an email address.
+
+ @param flags An object.
+ flags.allowCruft Allow address like <ma...@yahoo.com>. Default is false.
+ flags in regexp.host can be applied.
+ flags in regexp.ipAddress can be applied.
+ flags in regexp.tld can be applied.
+
+ @return A string for a regular expression for an email address.
+*/
+dojo.regexp.emailAddress = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.allowCruft != "boolean") { flags.allowCruft = false; }
+ flags.allowPort = false; // invalid in email addresses
+
+ // user name RE - apostrophes are valid if there's not 2 in a row
+ var usernameRE = "([\\da-z]+[-._+&'])*[\\da-z]+";
+
+ // build emailAddress RE
+ var emailAddressRE = usernameRE + "@" + dojo.regexp.host(flags);
+
+ // Allow email addresses with cruft
+ if ( flags.allowCruft ) {
+ emailAddressRE = "<?(mailto\\:)?" + emailAddressRE + ">?";
+ }
+
+ return emailAddressRE;
+}
+
+/**
+ Builds a regular expression that matches a list of email addresses.
+
+ @param flags An object.
+ flags.listSeparator The character used to separate email addresses. Default is ";", ",", "\n" or " ".
+ flags in regexp.emailAddress can be applied.
+ flags in regexp.host can be applied.
+ flags in regexp.ipAddress can be applied.
+ flags in regexp.tld can be applied.
+
+ @return A string for a regular expression for an email address list.
+*/
+dojo.regexp.emailAddressList = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.listSeparator != "string") { flags.listSeparator = "\\s;,"; }
+
+ // build a RE for an Email Address List
+ var emailAddressRE = dojo.regexp.emailAddress(flags);
+ var emailAddressListRE = "(" + emailAddressRE + "\\s*[" + flags.listSeparator + "]\\s*)*" +
+ emailAddressRE + "\\s*[" + flags.listSeparator + "]?\\s*";
+
+ return emailAddressListRE;
+}
+
+/**
+ Builds a regular expression that matches an integer.
+
+ @param flags An object.
+ flags.signed The leading plus-or-minus sign. Can be true, false, or [true, false].
+ Default is [true, false], (i.e. will match if it is signed or unsigned).
+ flags.separator The character used as the thousands separator. Default is no separator.
+ For more than one symbol use an array, e.g. [",", ""], makes ',' optional.
+ flags.groupSize group size between separators
+ flags.groupSize2 second grouping (for India)
+
+ @return A string for a regular expression for an integer.
+*/
+dojo.regexp.integer = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.signed == "undefined") { flags.signed = [true, false]; }
+ if (typeof flags.separator == "undefined") {
+ flags.separator = "";
+ } else if (typeof flags.groupSize == "undefined") {
+ flags.groupSize = 3;
+ }
+ // build sign RE
+ var signRE = dojo.regexp.buildGroupRE(flags.signed,
+ function(q) { return q ? "[-+]" : ""; }
+ );
+
+ // number RE
+ var numberRE = dojo.regexp.buildGroupRE(flags.separator,
+ function(sep) {
+ if ( sep == "" ) {
+ return "(0|[1-9]\\d*)";
+ }
+ var grp = flags.groupSize, grp2 = flags.groupSize2;
+ if ( typeof grp2 != "undefined" ) {
+ var grp2RE = "(0|[1-9]\\d{0," + (grp2-1) + "}([" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})";
+ return ((grp-grp2) > 0) ? "(" + grp2RE + "|(0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE;
+ }
+ return "(0|[1-9]\\d{0," + (grp-1) + "}([" + sep + "]\\d{" + grp + "})*)";
+ }
+ );
+
+ // integer RE
+ return (signRE + numberRE);
+}
+
+/**
+ Builds a regular expression to match a real number in exponential notation.
+
+ @param flags An object.
+ flags.places The integer number of decimal places.
+ If not given, the decimal part is optional and the number of places is unlimited.
+ flags.decimal A string for the character used as the decimal point. Default is ".".
+ flags.fractional Whether decimal places are allowed.
+ Can be true, false, or [true, false]. Default is [true, false]
+ flags.exponent Express in exponential notation. Can be true, false, or [true, false].
+ Default is [true, false], (i.e. will match if the exponential part is present are not).
+ flags.eSigned The leading plus-or-minus sign on the exponent. Can be true, false,
+ or [true, false]. Default is [true, false], (i.e. will match if it is signed or unsigned).
+ flags in regexp.integer can be applied.
+
+ @return A string for a regular expression for a real number.
+*/
+dojo.regexp.realNumber = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.places != "number") { flags.places = Infinity; }
+ if (typeof flags.decimal != "string") { flags.decimal = "."; }
+ if (typeof flags.fractional == "undefined") { flags.fractional = [true, false]; }
+ if (typeof flags.exponent == "undefined") { flags.exponent = [true, false]; }
+ if (typeof flags.eSigned == "undefined") { flags.eSigned = [true, false]; }
+
+ // integer RE
+ var integerRE = dojo.regexp.integer(flags);
+
+ // decimal RE
+ var decimalRE = dojo.regexp.buildGroupRE(flags.fractional,
+ function(q) {
+ var re = "";
+ if (q && (flags.places > 0)) {
+ re = "\\" + flags.decimal;
+ if ( flags.places == Infinity) {
+ re = "(" + re + "\\d+)?";
+ }
+ else {
+ re = re + "\\d{" + flags.places + "}";
+ }
+ }
+
+ return re;
+ }
+ );
+
+
+ // exponent RE
+ var exponentRE = dojo.regexp.buildGroupRE(flags.exponent,
+ function(q) {
+ if (q) { return "([eE]" + dojo.regexp.integer({ signed: flags.eSigned}) + ")"; }
+ return "";
+ }
+ );
+
+ // real number RE
+ return (integerRE + decimalRE + exponentRE);
+}
+
+/**
+ Builds a regular expression to match a monetary value.
+
+ @param flags An object.
+ flags.symbol A currency symbol such as Yen "�", Pound "�", or the Euro sign "�".
+ Default is "$". For more than one symbol use an array, e.g. ["$", ""], makes $ optional.
+ flags.placement The symbol can come "before" the number or "after" the number. Default is "before".
+ flags.signPlacement The sign can come "before" the number or "after" the sign,
+ "around" to put parentheses around negative values, or "end" for the final char. Default is "before".
+ flags.cents deprecated, in favor of flags.fractional
+ flags in regexp.realNumber can be applied except exponent, eSigned.
+
+ @return A string for a regular expression for a monetary value.
+*/
+dojo.regexp.currency = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.signed == "undefined") { flags.signed = [true, false]; }
+ if (typeof flags.symbol == "undefined") { flags.symbol = "$"; }
+ if (typeof flags.placement != "string") { flags.placement = "before"; }
+ if (typeof flags.signPlacement != "string") { flags.signPlacement = "before"; }
+ if (typeof flags.separator == "undefined") { flags.separator = ","; }
+ if (typeof flags.fractional == "undefined" && typeof flags.cents != "undefined") {
+ dojo.deprecated("dojo.regexp.currency: flags.cents", "use flags.fractional instead", "0.5");
+ flags.fractional = flags.cents;
+ }
+ if (typeof flags.decimal != "string") { flags.decimal = "."; }
+
+ // build sign RE
+ var signRE = dojo.regexp.buildGroupRE(flags.signed,
+ function(q) { if (q) { return "[-+]"; } return ""; }
+ );
+
+ // build symbol RE
+ var symbolRE = dojo.regexp.buildGroupRE(flags.symbol,
+ function(symbol) {
+ // escape all special characters
+ return "\\s?" + symbol.replace( /([.$?*!=:|\\\/^])/g, "\\$1") + "\\s?";
+ }
+ );
+
+ switch (flags.signPlacement){
+ case "before":
+ symbolRE = signRE + symbolRE;
+ break;
+ case "after":
+ symbolRE = symbolRE + signRE;
+ break;
+ }
+
+ // number RE
+ var flagsCopy = flags; //TODO: copy by value?
+ flagsCopy.signed = false; flagsCopy.exponent = false;
+ var numberRE = dojo.regexp.realNumber(flagsCopy);
+
+ // build currency RE
+ var currencyRE;
+ switch (flags.placement){
+ case "before":
+ currencyRE = symbolRE + numberRE;
+ break;
+ case "after":
+ currencyRE = numberRE + symbolRE;
+ break;
+ }
+
+ switch (flags.signPlacement){
+ case "around":
+ currencyRE = "(" + currencyRE + "|" + "\\(" + currencyRE + "\\)" + ")";
+ break;
+ case "end":
+ currencyRE = currencyRE + signRE;
+ break;
+ }
+ return currencyRE;
+}
+
+/**
+ A regular expression to match US state and territory abbreviations.
+
+ @param flags An object.
+ flags.allowTerritories Allow Guam, Puerto Rico, etc. Default is true.
+ flags.allowMilitary Allow military 'states', e.g. Armed Forces Europe (AE). Default is true.
+
+ @return A string for a regular expression for a US state.
+*/
+dojo.regexp.us.state = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.allowTerritories != "boolean") { flags.allowTerritories = true; }
+ if (typeof flags.allowMilitary != "boolean") { flags.allowMilitary = true; }
+
+ // state RE
+ var statesRE =
+ "AL|AK|AZ|AR|CA|CO|CT|DE|DC|FL|GA|HI|ID|IL|IN|IA|KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|" +
+ "NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY";
+
+ // territories RE
+ var territoriesRE = "AS|FM|GU|MH|MP|PW|PR|VI";
+
+ // military states RE
+ var militaryRE = "AA|AE|AP";
+
+ // Build states and territories RE
+ if (flags.allowTerritories) { statesRE += "|" + territoriesRE; }
+ if (flags.allowMilitary) { statesRE += "|" + militaryRE; }
+
+ return "(" + statesRE + ")";
+}
+
+/**
+ Builds a regular expression to match any International format for time.
+ The RE can match one format or one of multiple formats.
+
+ Format
+ h 12 hour, no zero padding.
+ hh 12 hour, has leading zero.
+ H 24 hour, no zero padding.
+ HH 24 hour, has leading zero.
+ m minutes, no zero padding.
+ mm minutes, has leading zero.
+ s seconds, no zero padding.
+ ss seconds, has leading zero.
+ t am or pm, case insensitive.
+ All other characters must appear literally in the expression.
+
+ Example
+ "h:m:s t" -> 2:5:33 PM
+ "HH:mm:ss" -> 14:05:33
+
+ @param flags An object.
+ flags.format A string or an array of strings. Default is "h:mm:ss t".
+ flags.amSymbol The symbol used for AM. Default is "AM".
+ flags.pmSymbol The symbol used for PM. Default is "PM".
+
+ @return A string for a regular expression for a time value.
+*/
+dojo.regexp.time = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.format == "undefined") { flags.format = "h:mm:ss t"; }
+ if (typeof flags.amSymbol != "string") { flags.amSymbol = "AM"; }
+ if (typeof flags.pmSymbol != "string") { flags.pmSymbol = "PM"; }
+
+ // Converts a time format to a RE
+ var timeRE = function(format) {
+ // escape all special characters
+ format = format.replace( /([.$?*!=:|{}\(\)\[\]\\\/^])/g, "\\$1");
+ var amRE = flags.amSymbol.replace( /([.$?*!=:|{}\(\)\[\]\\\/^])/g, "\\$1");
+ var pmRE = flags.pmSymbol.replace( /([.$?*!=:|{}\(\)\[\]\\\/^])/g, "\\$1");
+
+ // replace tokens with Regular Expressions
+ format = format.replace("hh", "(0[1-9]|1[0-2])");
+ format = format.replace("h", "([1-9]|1[0-2])");
+ format = format.replace("HH", "([01][0-9]|2[0-3])");
+ format = format.replace("H", "([0-9]|1[0-9]|2[0-3])");
+ format = format.replace("mm", "([0-5][0-9])");
+ format = format.replace("m", "([1-5][0-9]|[0-9])");
+ format = format.replace("ss", "([0-5][0-9])");
+ format = format.replace("s", "([1-5][0-9]|[0-9])");
+ format = format.replace("t", "\\s?(" + amRE + "|" + pmRE + ")\\s?" );
+
+ return format;
+ };
+
+ // build RE for multiple time formats
+ return dojo.regexp.buildGroupRE(flags.format, timeRE);
+}
+
+/**
+ Builds a regular expression to match any sort of number based format.
+ Use it for phone numbers, social security numbers, zip-codes, etc.
+ The RE can match one format or one of multiple formats.
+
+ Format
+ # Stands for a digit, 0-9.
+ ? Stands for an optional digit, 0-9 or nothing.
+ All other characters must appear literally in the expression.
+
+ Example
+ "(###) ###-####" -> (510) 542-9742
+ "(###) ###-#### x#???" -> (510) 542-9742 x153
+ "###-##-####" -> 506-82-1089 i.e. social security number
+ "#####-####" -> 98225-1649 i.e. zip code
+
+ @param flags An object.
+ flags.format A string or an Array of strings for multiple formats.
+ @return A string for a regular expression for the number format(s).
+*/
+dojo.regexp.numberFormat = function(flags) {
+ // assign default values to missing paramters
+ flags = (typeof flags == "object") ? flags : {};
+ if (typeof flags.format == "undefined") { flags.format = "###-###-####"; }
+
+ // Converts a number format to RE.
+ var digitRE = function(format) {
+ // escape all special characters, except '?'
+ format = format.replace( /([.$*!=:|{}\(\)\[\]\\\/^])/g, "\\$1");
+
+ // Now replace '?' with Regular Expression
+ format = format.replace(/\?/g, "\\d?");
+
+ // replace # with Regular Expression
+ format = format.replace(/#/g, "\\d");
+
+ return format;
+ };
+
+ // build RE for multiple number formats
+ return dojo.regexp.buildGroupRE(flags.format, digitRE);
+}
+
+
+/**
+ This is basically a utility function used by some of the RE generators.
+ Builds a regular expression that groups subexpressions.
+ The subexpressions are constructed by the function, re, in the second parameter.
+ re builds one subexpression for each elem in the array a, in the first parameter.
+
+ @param a A single value or an array of values.
+ @param re A function. Takes one parameter and converts it to a regular expression.
+ @return A string for a regular expression that groups all the subexpressions.
+*/
+dojo.regexp.buildGroupRE = function(a, re) {
+
+ // case 1: a is a single value.
+ if ( !( a instanceof Array ) ) {
+ return re(a);
+ }
+
+ // case 2: a is an array
+ var b = [];
+ for (var i = 0; i < a.length; i++) {
+ // convert each elem to a RE
+ b.push(re(a[i]));
+ }
+
+ // join the REs as alternatives in a RE group.
+ return "(" + b.join("|") + ")";
+}
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/regexp.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/Deferred.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/Deferred.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/Deferred.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/Deferred.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.rpc.Deferred");
+dojo.require("dojo.Deferred");
+
+dojo.rpc.Deferred = dojo.Deferred;
+dojo.rpc.Deferred.prototype = dojo.Deferred.prototype;
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/Deferred.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JotService.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JotService.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JotService.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JotService.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,41 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.rpc.JotService");
+dojo.require("dojo.rpc.RpcService");
+dojo.require("dojo.rpc.JsonService");
+dojo.require("dojo.json");
+
+dojo.rpc.JotService = function(){
+ this.serviceUrl = "/_/jsonrpc";
+}
+
+dojo.inherits(dojo.rpc.JotService, dojo.rpc.JsonService);
+
+dojo.lang.extend(dojo.rpc.JotService, {
+ bind: function(method, parameters, deferredRequestHandler, url){
+ dojo.io.bind({
+ url: url||this.serviceUrl,
+ content: {
+ json: this.createRequest(method, parameters)
+ },
+ method: "POST",
+ mimetype: "text/json",
+ load: this.resultCallback(deferredRequestHandler),
+ error: this.errorCallback(deferredRequestHandler),
+ preventCache: true
+ });
+ },
+
+ createRequest: function(method, params){
+ var req = { "params": params, "method": method, "id": this.lastSubmissionId++ };
+ return dojo.json.serialize(req);
+ }
+});
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JotService.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JsonService.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JsonService.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JsonService.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JsonService.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,105 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.rpc.JsonService");
+dojo.require("dojo.rpc.RpcService");
+dojo.require("dojo.io.*");
+dojo.require("dojo.json");
+dojo.require("dojo.lang.common");
+
+dojo.rpc.JsonService = function(args){
+ // passing just the URL isn't terribly useful. It's expected that at
+ // various times folks will want to specify:
+ // - just the serviceUrl (for use w/ remoteCall())
+ // - the text of the SMD to evaluate
+ // - a raw SMD object
+ // - the SMD URL
+ if(args){
+ if(dojo.lang.isString(args)){
+ // we assume it's an SMD file to be processed, since this was the
+ // earlier function signature
+
+ // FIXME: also accept dojo.uri.Uri objects?
+ this.connect(args);
+ }else{
+ // otherwise we assume it's an arguments object with the following
+ // (optional) properties:
+ // - serviceUrl
+ // - strictArgChecks
+ // - smdUrl
+ // - smdStr
+ // - smdObj
+ if(args["smdUrl"]){
+ this.connect(args.smdUrl);
+ }
+ if(args["smdStr"]){
+ this.processSmd(dj_eval("("+args.smdStr+")"));
+ }
+ if(args["smdObj"]){
+ this.processSmd(args.smdObj);
+ }
+ if(args["serviceUrl"]){
+ this.serviceUrl = args.serviceUrl;
+ }
+ if(typeof args["strictArgChecks"] != "undefined"){
+ this.strictArgChecks = args.strictArgChecks;
+ }
+ }
+ }
+}
+
+dojo.inherits(dojo.rpc.JsonService, dojo.rpc.RpcService);
+
+dojo.extend(dojo.rpc.JsonService, {
+
+ bustCache: false,
+
+ contentType: "application/json-rpc",
+
+ lastSubmissionId: 0,
+
+ callRemote: function(method, params){
+ var deferred = new dojo.rpc.Deferred();
+ this.bind(method, params, deferred);
+ return deferred;
+ },
+
+ bind: function(method, parameters, deferredRequestHandler, url){
+ dojo.io.bind({
+ url: url||this.serviceUrl,
+ postContent: this.createRequest(method, parameters),
+ method: "POST",
+ contentType: this.contentType,
+ mimetype: "text/json",
+ load: this.resultCallback(deferredRequestHandler),
+ preventCache:this.bustCache
+ });
+ },
+
+ createRequest: function(method, params){
+ var req = { "params": params, "method": method, "id": ++this.lastSubmissionId };
+ var data = dojo.json.serialize(req);
+ dojo.debug("JsonService: JSON-RPC Request: " + data);
+ return data;
+ },
+
+ parseResults: function(obj){
+ if(!obj){ return; }
+ if (obj["Result"]!=null){
+ return obj["Result"];
+ }else if(obj["result"]!=null){
+ return obj["result"];
+ }else if(obj["ResultSet"]){
+ return obj["ResultSet"];
+ }else{
+ return obj;
+ }
+ }
+});
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/JsonService.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/RpcService.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/RpcService.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/RpcService.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/RpcService.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,116 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.rpc.RpcService");
+dojo.require("dojo.io.*");
+dojo.require("dojo.json");
+dojo.require("dojo.lang.func");
+dojo.require("dojo.rpc.Deferred");
+
+dojo.rpc.RpcService = function(url){
+ // summary
+ // constructor for rpc base class
+ if(url){
+ this.connect(url);
+ }
+}
+
+dojo.lang.extend(dojo.rpc.RpcService, {
+
+ strictArgChecks: true,
+ serviceUrl: "",
+
+ parseResults: function(obj){
+ // summary
+ // parse the results coming back from an rpc request.
+ // this base implementation, just returns the full object
+ // subclasses should parse and only return the actual results
+ return obj;
+ },
+
+ errorCallback: function(/* dojo.rpc.Deferred */ deferredRequestHandler){
+ // summary
+ // create callback that calls the Deferres errback method
+ return function(type, obj, e){
+ deferredRequestHandler.errback(e);
+ }
+ },
+
+ resultCallback: function(/* dojo.rpc.Deferred */ deferredRequestHandler){
+ // summary
+ // create callback that calls the Deferred's callback method
+ var tf = dojo.lang.hitch(this,
+ function(type, obj, e){
+ var results = this.parseResults(obj||e);
+ deferredRequestHandler.callback(results);
+ }
+ );
+ return tf;
+ },
+
+
+ generateMethod: function(/*string*/ method, /*array*/ parameters, /*string*/ url){
+ // summary
+ // generate the local bind methods for the remote object
+ return dojo.lang.hitch(this, function(){
+ var deferredRequestHandler = new dojo.rpc.Deferred();
+
+ // if params weren't specified, then we can assume it's varargs
+ if( (this.strictArgChecks) &&
+ (parameters != null) &&
+ (arguments.length != parameters.length)
+ ){
+ // put error stuff here, no enough params
+ dojo.raise("Invalid number of parameters for remote method.");
+ } else {
+ this.bind(method, arguments, deferredRequestHandler, url);
+ }
+
+ return deferredRequestHandler;
+ });
+ },
+
+ processSmd: function(/*json*/ object){
+ // summary
+ // callback method for reciept of a smd object. Parse the smd and
+ // generate functions based on the description
+ dojo.debug("RpcService: Processing returned SMD.");
+ if(object.methods){
+ dojo.lang.forEach(object.methods, function(m){
+ if(m && m["name"]){
+ dojo.debug("RpcService: Creating Method: this.", m.name, "()");
+ this[m.name] = this.generateMethod( m.name,
+ m.parameters,
+ m["url"]||m["serviceUrl"]||m["serviceURL"]);
+ if(dojo.lang.isFunction(this[m.name])){
+ dojo.debug("RpcService: Successfully created", m.name, "()");
+ }else{
+ dojo.debug("RpcService: Failed to create", m.name, "()");
+ }
+ }
+ }, this);
+ }
+
+ this.serviceUrl = object.serviceUrl||object.serviceURL;
+ dojo.debug("RpcService: Dojo RpcService is ready for use.");
+ },
+
+ connect: function(/*String*/ smdUrl){
+ // summary
+ // connect to a remote url and retrieve a smd object
+ dojo.debug("RpcService: Attempting to load SMD document from:", smdUrl);
+ dojo.io.bind({
+ url: smdUrl,
+ mimetype: "text/json",
+ load: dojo.lang.hitch(this, function(type, object, e){ return this.processSmd(object); }),
+ sync: true
+ });
+ }
+});
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/RpcService.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/YahooService.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/YahooService.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/YahooService.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/YahooService.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,55 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.rpc.YahooService");
+dojo.require("dojo.rpc.RpcService");
+dojo.require("dojo.rpc.JsonService");
+dojo.require("dojo.json");
+dojo.require("dojo.uri.*");
+dojo.require("dojo.io.ScriptSrcIO");
+
+dojo.rpc.YahooService = function(appId){
+ this.appId = appId;
+ if(!appId){
+ this.appId = "dojotoolkit";
+ dojo.debug( "please initialize the YahooService class with your own",
+ "application ID. Using the default may cause problems during",
+ "deployment of your application");
+ }
+ this.connect(dojo.uri.dojoUri("src/rpc/yahoo.smd"));
+ this.strictArgChecks = false;
+}
+
+dojo.inherits(dojo.rpc.YahooService, dojo.rpc.JsonService);
+
+dojo.lang.extend(dojo.rpc.YahooService, {
+ strictArgChecks: false,
+
+ bind: function(method, parameters, deferredRequestHandler, url){
+ var params = parameters;
+ if( (dojo.lang.isArrayLike(parameters))&&
+ (parameters.length == 1)){
+ params = parameters[0];
+ }
+ params.output = "json";
+ params.appid= this.appId;
+ dojo.io.bind({
+ url: url||this.serviceUrl,
+ transport: "ScriptSrcTransport",
+ // FIXME: need to get content interpolation fixed
+ content: params,
+ jsonParamName: "callback",
+ mimetype: "text/json",
+ load: this.resultCallback(deferredRequestHandler),
+ error: this.errorCallback(deferredRequestHandler),
+ preventCache: true
+ });
+ }
+});
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/YahooService.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/__package__.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/__package__.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/__package__.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/__package__.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.kwCompoundRequire({
+ common: [["dojo.rpc.JsonService", false, false]]
+});
+dojo.provide("dojo.rpc.*");
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/__package__.js
------------------------------------------------------------------------------
svn:eol-style = native
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/yahoo.smd
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/yahoo.smd?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/yahoo.smd (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/rpc/yahoo.smd Fri Sep 22 16:22:30 2006
@@ -0,0 +1,263 @@
+{
+ "SMDVersion":".1",
+ "objectName":"yahoo",
+ "serviceType":"JSON-P",
+ "methods":[
+ //
+ // MAPS
+ //
+ {
+ // http://developer.yahoo.com/maps/rest/V1/mapImage.html
+ "name":"mapImage",
+ "serviceURL": "http://api.local.yahoo.com/MapsService/V1/mapImage",
+ "parameters":[
+ { "name":"street", "type":"STRING" },
+ { "name":"city", "type":"STRING" },
+ { "name":"zip", "type":"INTEGER" },
+ { "name":"location", "type":"STRING" },
+ { "name":"longitude", "type":"FLOAT" },
+ { "name":"latitude", "type":"FLOAT" },
+ { "name":"image_type", "type":"STRING" },
+ { "name":"image_width", "type":"INTEGER" },
+ { "name":"image_height", "type":"INTEGER" },
+ { "name":"zoom", "type":"INTEGER" },
+ { "name":"radius", "type":"INTEGER" }
+ ]
+ },
+ {
+ // http://developer.yahoo.com/traffic/rest/V1/index.html
+ "name":"trafficData",
+ "serviceURL": "http://api.local.yahoo.com/MapsService/V1/trafficData",
+ "parameters":[
+ { "name":"street", "type":"STRING" },
+ { "name":"city", "type":"STRING" },
+ { "name":"zip", "type":"INTEGER" },
+ { "name":"location", "type":"STRING" },
+ { "name":"longitude", "type":"FLOAT" },
+ { "name":"latitude", "type":"FLOAT" },
+ { "name":"severity", "type":"INTEGER" },
+ { "name":"include_map", "type":"INTEGER" },
+ { "name":"image_type", "type":"STRING" },
+ { "name":"image_width", "type":"INTEGER" },
+ { "name":"image_height", "type":"INTEGER" },
+ { "name":"zoom", "type":"INTEGER" },
+ { "name":"radius", "type":"INTEGER" }
+ ]
+ },
+ /*
+ // Yahoo's geocoding service is f'd for JSON and Y! advises that it
+ // may not be returning
+ {
+ // http://developer.yahoo.com/maps/rest/V1/geocode.html
+ "name":"geocode",
+ "serviceURL": "http://api.local.yahoo.com/MapsService/V1/geocode",
+ "parameters":[
+ { "name":"street", "type":"STRING" },
+ { "name":"city", "type":"STRING" },
+ { "name":"zip", "type":"INTEGER" },
+ { "name":"location", "type":"STRING" }
+ ]
+ },
+ */
+ //
+ // LOCAL SEARCH
+ //
+ {
+ // http://developer.yahoo.com/search/local/V3/localSearch.html
+ "name":"localSearch",
+ "serviceURL": "http://api.local.yahoo.com/LocalSearchService/V3/localSearch",
+ "parameters":[
+ { "name":"street", "type":"STRING" },
+ { "name":"city", "type":"STRING" },
+ { "name":"zip", "type":"INTEGER" },
+ { "name":"location", "type":"STRING" },
+ { "name":"listing_id", "type":"STRING" },
+ { "name":"sort", "type":"STRING" }, // "relevence", "title", "distance", or "rating"
+ { "name":"start", "type":"INTEGER" },
+ { "name":"radius", "type":"FLOAT" },
+ { "name":"results", "type":"INTEGER" }, // 1-50, defaults to 10
+ { "name":"longitude", "type":"FLOAT" },
+ { "name":"latitude", "type":"FLOAT" },
+ { "name":"category", "type":"INTEGER" },
+ { "name":"omit_category", "type":"INTEGER" },
+ { "name":"minimum_rating", "type":"INTEGER" }
+ ]
+ },
+ //
+ // WEB SEARCH
+ //
+
+ // NOTE: contextual search and term extraction are not stubbed out
+ // becaues I'm not sure if we can POST via script src inclusion method
+ {
+ // http://developer.yahoo.com/search/web/V1/webSearch.html
+ "name":"webSearch",
+ "serviceURL": "http://api.search.yahoo.com/WebSearchService/V1/webSearch",
+ "parameters":[
+ { "name":"query", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // defaults to "all"
+ { "name":"region", "type":"STRING" }, // defaults to "us"
+ { "name":"results", "type":"INTEGER" }, // defaults to 10
+ { "name":"start", "type":"INTEGER" }, // defaults to 1
+ { "name":"format", "type":"STRING" }, // defaults to "any", can be "html", "msword", "pdf", "ppt", "rst", "txt", or "xls"
+ { "name":"adult_ok", "type":"INTEGER" }, // defaults to null
+ { "name":"similar_ok", "type":"INTEGER" }, // defaults to null
+ { "name":"language", "type":"STRING" }, // defaults to null
+ { "name":"country", "type":"STRING" }, // defaults to null
+ { "name":"site", "type":"STRING" }, // defaults to null
+ { "name":"subscription", "type":"STRING" }, // defaults to null
+ { "name":"license", "type":"STRING" } // defaults to "any"
+ ]
+ },
+ {
+ // http://developer.yahoo.com/search/web/V1/spellingSuggestion.html
+ "name":"spellingSuggestion",
+ "serviceURL": "http://api.search.yahoo.com/WebSearchService/V1/spellingSuggestion",
+ "parameters":[ { "name":"query", "type":"STRING" } ]
+ },
+ {
+ // http://developer.yahoo.com/search/web/V1/relatedSuggestion.html
+ "name":"spellingSuggestion",
+ "serviceURL": "http://api.search.yahoo.com/WebSearchService/V1/relatedSuggestion",
+ "parameters":[
+ { "name":"query", "type":"STRING" },
+ { "name":"results", "type":"INTEGER" } // 1-50, defaults to 10
+ ]
+ },
+ //
+ // IMAGE SEARCH
+ //
+ {
+ // http://developer.yahoo.com/search/image/V1/imageSearch.html
+ "name":"imageSearch",
+ "serviceURL": "http://api.search.yahoo.com/ImageSearchService/V1/imageSearch",
+ "parameters":[
+ { "name":"query", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // defaults to "all", can by "any" or "phrase"
+ { "name":"results", "type":"INTEGER" }, // defaults to 10
+ { "name":"start", "type":"INTEGER" }, // defaults to 1
+ { "name":"format", "type":"STRING" }, // defaults to "any", can be "bmp", "gif", "jpeg", or "png"
+ { "name":"adult_ok", "type":"INTEGER" }, // defaults to null
+ { "name":"coloration", "type":"STRING" }, // "any", "color", or "bw"
+ { "name":"site", "type":"STRING" } // defaults to null
+ ]
+ },
+ //
+ // SITE EXPLORER
+ //
+ {
+ // http://developer.yahoo.com/search/siteexplorer/V1/inlinkData.html
+ "name":"inlinkData",
+ "serviceURL": "http://api.search.yahoo.com/SiteExplorerService/V1/inlinkData",
+ "parameters":[
+ { "name":"query", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // defaults to "all", can by "any" or "phrase"
+ { "name":"entire_site", "type":"INTEGER" }, // defaults to null
+ { "name":"omit_inlinks", "type":"STRING" }, // "domain" or "subdomain", defaults to null
+ { "name":"results", "type":"INTEGER" }, // defaults to 50
+ { "name":"start", "type":"INTEGER" }, // defaults to 1
+ { "name":"site", "type":"STRING" } // defaults to null
+ ]
+ },
+ {
+ // http://developer.yahoo.com/search/siteexplorer/V1/pageData.html
+ "name":"pageData",
+ "serviceURL": "http://api.search.yahoo.com/SiteExplorerService/V1/pageData",
+ "parameters":[
+ { "name":"query", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // defaults to "all", can by "any" or "phrase"
+ { "name":"domain_only", "type":"INTEGER" }, // defaults to null
+ { "name":"results", "type":"INTEGER" }, // defaults to 50
+ { "name":"start", "type":"INTEGER" }, // defaults to 1
+ { "name":"site", "type":"STRING" } // defaults to null
+ ]
+ },
+ //
+ // MUSIC SEARCH
+ //
+ {
+ // http://developer.yahoo.com/search/audio/V1/artistSearch.html
+ "name":"artistSearch",
+ "serviceURL": "http://api.search.yahoo.com/AudioSearchService/V1/artistSearch",
+ "parameters":[
+ { "name":"artist", "type":"STRING" },
+ { "name":"artistid", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // "all", "any", or "phrase"
+ { "name":"results", "type":"INTEGER" }, // 1-50, defaults to 10
+ { "name":"start", "type":"INTEGER" } // defaults to 1
+ ]
+ },
+ {
+ // http://developer.yahoo.com/search/audio/V1/albumSearch.html
+ "name":"albumSearch",
+ "serviceURL": "http://api.search.yahoo.com/AudioSearchService/V1/albumSearch",
+ "parameters":[
+ { "name":"artist", "type":"STRING" },
+ { "name":"artistid", "type":"STRING" },
+ { "name":"album", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // "all", "any", or "phrase"
+ { "name":"results", "type":"INTEGER" }, // 1-50, defaults to 10
+ { "name":"start", "type":"INTEGER" } // defaults to 1
+ ]
+ },
+ {
+ // http://developer.yahoo.com/search/audio/V1/songSearch.html
+ "name":"songSearch",
+ "serviceURL": "http://api.search.yahoo.com/AudioSearchService/V1/songSearch",
+ "parameters":[
+ { "name":"artist", "type":"STRING" },
+ { "name":"artistid", "type":"STRING" },
+ { "name":"album", "type":"STRING" },
+ { "name":"albumid", "type":"STRING" },
+ { "name":"song", "type":"STRING" },
+ { "name":"songid", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // "all", "any", or "phrase"
+ { "name":"results", "type":"INTEGER" }, // 1-50, defaults to 10
+ { "name":"start", "type":"INTEGER" } // defaults to 1
+ ]
+ },
+ {
+ // http://developer.yahoo.com/search/audio/V1/songDownloadLocation.html
+ "name":"songDownloadLocation",
+ "serviceURL": "http://api.search.yahoo.com/AudioSearchService/V1/songDownloadLocation",
+ "parameters":[
+ { "name":"songid", "type":"STRING" },
+ // "source" can contain:
+ // audiolunchbox artistdirect buymusic dmusic
+ // emusic epitonic garageband itunes yahoo
+ // livedownloads mp34u msn musicmatch mapster passalong
+ // rhapsody soundclick theweb
+ { "name":"source", "type":"STRING" },
+ { "name":"results", "type":"INTEGER" }, // 1-50, defaults to 10
+ { "name":"start", "type":"INTEGER" } // defaults to 1
+ ]
+ },
+ //
+ // NEWS SEARCH
+ //
+ {
+ // http://developer.yahoo.com/search/news/V1/newsSearch.html
+ "name":"newsSearch",
+ "serviceURL": "http://api.search.yahoo.com/NewsSearchService/V1/newsSearch",
+ "parameters":[
+ { "name":"query", "type":"STRING" },
+ { "name":"type", "type":"STRING" }, // defaults to "all"
+ { "name":"results", "type":"INTEGER" }, // defaults to 10
+ { "name":"start", "type":"INTEGER" }, // defaults to 1
+ { "name":"sort", "type":"STRING" }, // "rank" or "date"
+ { "name":"language", "type":"STRING" }, // defaults to null
+ { "name":"site", "type":"STRING" } // defaults to null
+ ]
+ }
+ /*
+ {
+ //
+ "name":"",
+ "serviceURL": "",
+ "parameters":[
+ { "name":"street", "type":"STRING" },
+ ]
+ }
+ */
+ ]
+}
Added: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/selection/Selection.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/selection/Selection.js?view=auto&rev=449122
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/selection/Selection.js (added)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/selection/Selection.js Fri Sep 22 16:22:30 2006
@@ -0,0 +1,425 @@
+/*
+ Copyright (c) 2004-2006, The Dojo Foundation
+ All Rights Reserved.
+
+ Licensed under the Academic Free License version 2.1 or above OR the
+ modified BSD license. For more information on Dojo licensing, see:
+
+ http://dojotoolkit.org/community/licensing.shtml
+*/
+
+dojo.provide("dojo.selection.Selection");
+dojo.require("dojo.lang.array");
+dojo.require("dojo.lang.func");
+dojo.require("dojo.math");
+
+dojo.selection.Selection = function(items, isCollection) {
+ this.items = [];
+ this.selection = [];
+ this._pivotItems = [];
+ this.clearItems();
+
+ if(items) {
+ if(isCollection) {
+ this.setItemsCollection(items);
+ } else {
+ this.setItems(items);
+ }
+ }
+}
+dojo.lang.extend(dojo.selection.Selection, {
+ items: null, // items to select from, order matters for growable selections
+
+ selection: null, // items selected, aren't stored in order (see sorted())
+ lastSelected: null, // last item selected
+
+ allowImplicit: true, // if true, grow selection will start from 0th item when nothing is selected
+ length: 0, // number of *selected* items
+
+ // if true, the selection is treated as an in-order and can grow by ranges, not just by single item
+ isGrowable: true,
+
+ _pivotItems: null, // stack of pivot items
+ _pivotItem: null, // item we grow selections from, top of stack
+
+ // event handlers
+ onSelect: function(item) {},
+ onDeselect: function(item) {},
+ onSelectChange: function(item, selected) {},
+
+ _find: function(item, inSelection) {
+ if(inSelection) {
+ return dojo.lang.find(this.selection, item);
+ } else {
+ return dojo.lang.find(this.items, item);
+ }
+ },
+
+ isSelectable: function(item) {
+ // user-customizable, will filter items through this
+ return true;
+ },
+
+ setItems: function(/* ... */) {
+ this.clearItems();
+ this.addItems.call(this, arguments);
+ },
+
+ // this is in case you have an active collection array-like object
+ // (i.e. getElementsByTagName collection) that manages its own order
+ // and item list
+ setItemsCollection: function(collection) {
+ this.items = collection;
+ },
+
+ addItems: function(/* ... */) {
+ var args = dojo.lang.unnest(arguments);
+ for(var i = 0; i < args.length; i++) {
+ this.items.push(args[i]);
+ }
+ },
+
+ addItemsAt: function(item, before /* ... */) {
+ if(this.items.length == 0) { // work for empy case
+ return this.addItems(dojo.lang.toArray(arguments, 2));
+ }
+
+ if(!this.isItem(item)) {
+ item = this.items[item];
+ }
+ if(!item) { throw new Error("addItemsAt: item doesn't exist"); }
+ var idx = this._find(item);
+ if(idx > 0 && before) { idx--; }
+ for(var i = 2; i < arguments.length; i++) {
+ if(!this.isItem(arguments[i])) {
+ this.items.splice(idx++, 0, arguments[i]);
+ }
+ }
+ },
+
+ removeItem: function(item) {
+ // remove item
+ var idx = this._find(item);
+ if(idx > -1) {
+ this.items.splice(idx, 1);
+ }
+ // remove from selection
+ // FIXME: do we call deselect? I don't think so because this isn't how
+ // you usually want to deselect an item. For example, if you deleted an
+ // item, you don't really want to deselect it -- you want it gone. -DS
+ idx = this._find(item, true);
+ if(idx > -1) {
+ this.selection.splice(idx, 1);
+ }
+ },
+
+ clearItems: function() {
+ this.items = [];
+ this.deselectAll();
+ },
+
+ isItem: function(item) {
+ return this._find(item) > -1;
+ },
+
+ isSelected: function(item) {
+ return this._find(item, true) > -1;
+ },
+
+ /**
+ * allows you to filter item in or out of the selection
+ * depending on the current selection and action to be taken
+ **/
+ selectFilter: function(item, selection, add, grow) {
+ return true;
+ },
+
+ /**
+ * update -- manages selections, most selecting should be done here
+ * item => item which may be added/grown to/only selected/deselected
+ * add => behaves like ctrl in windows selection world
+ * grow => behaves like shift
+ * noToggle => if true, don't toggle selection on item
+ **/
+ update: function(item, add, grow, noToggle) {
+ if(!this.isItem(item)) { return false; }
+
+ if(this.isGrowable && grow) {
+ if(!this.isSelected(item)
+ && this.selectFilter(item, this.selection, false, true)) {
+ this.grow(item);
+ this.lastSelected = item;
+ }
+ } else if(add) {
+ if(this.selectFilter(item, this.selection, true, false)) {
+ if(noToggle) {
+ if(this.select(item)) {
+ this.lastSelected = item;
+ }
+ } else if(this.toggleSelected(item)) {
+ this.lastSelected = item;
+ }
+ }
+ } else {
+ this.deselectAll();
+ this.select(item);
+ }
+
+ this.length = this.selection.length;
+ },
+
+ /**
+ * Grow a selection.
+ * toItem => which item to grow selection to
+ * fromItem => which item to start the growth from (it won't be selected)
+ *
+ * Any items in (fromItem, lastSelected] that aren't part of
+ * (fromItem, toItem] will be deselected
+ **/
+ grow: function(toItem, fromItem) {
+ if(!this.isGrowable) { return; }
+
+ if(arguments.length == 1) {
+ fromItem = this._pivotItem;
+ if(!fromItem && this.allowImplicit) {
+ fromItem = this.items[0];
+ }
+ }
+ if(!toItem || !fromItem) { return false; }
+
+ var fromIdx = this._find(fromItem);
+
+ // get items to deselect (fromItem, lastSelected]
+ var toDeselect = {};
+ var lastIdx = -1;
+ if(this.lastSelected) {
+ lastIdx = this._find(this.lastSelected);
+ var step = fromIdx < lastIdx ? -1 : 1;
+ var range = dojo.math.range(lastIdx, fromIdx, step);
+ for(var i = 0; i < range.length; i++) {
+ toDeselect[range[i]] = true;
+ }
+ }
+
+ // add selection (fromItem, toItem]
+ var toIdx = this._find(toItem);
+ var step = fromIdx < toIdx ? -1 : 1;
+ var shrink = lastIdx >= 0 && step == 1 ? lastIdx < toIdx : lastIdx > toIdx;
+ var range = dojo.math.range(toIdx, fromIdx, step);
+ if(range.length) {
+ for(var i = range.length-1; i >= 0; i--) {
+ var item = this.items[range[i]];
+ if(this.selectFilter(item, this.selection, false, true)) {
+ if(this.select(item, true) || shrink) {
+ this.lastSelected = item;
+ }
+ if(range[i] in toDeselect) {
+ delete toDeselect[range[i]];
+ }
+ }
+ }
+ } else {
+ this.lastSelected = fromItem;
+ }
+
+ // now deselect...
+ for(var i in toDeselect) {
+ if(this.items[i] == this.lastSelected) {
+ //dojo.debug("oops!");
+ }
+ this.deselect(this.items[i]);
+ }
+
+ // make sure everything is all kosher after selections+deselections
+ this._updatePivot();
+ },
+
+ /**
+ * Grow selection upwards one item from lastSelected
+ **/
+ growUp: function() {
+ if(!this.isGrowable) { return; }
+
+ var idx = this._find(this.lastSelected) - 1;
+ while(idx >= 0) {
+ if(this.selectFilter(this.items[idx], this.selection, false, true)) {
+ this.grow(this.items[idx]);
+ break;
+ }
+ idx--;
+ }
+ },
+
+ /**
+ * Grow selection downwards one item from lastSelected
+ **/
+ growDown: function() {
+ if(!this.isGrowable) { return; }
+
+ var idx = this._find(this.lastSelected);
+ if(idx < 0 && this.allowImplicit) {
+ this.select(this.items[0]);
+ idx = 0;
+ }
+ idx++;
+ while(idx > 0 && idx < this.items.length) {
+ if(this.selectFilter(this.items[idx], this.selection, false, true)) {
+ this.grow(this.items[idx]);
+ break;
+ }
+ idx++;
+ }
+ },
+
+ toggleSelected: function(item, noPivot) {
+ if(this.isItem(item)) {
+ if(this.select(item, noPivot)) { return 1; }
+ if(this.deselect(item)) { return -1; }
+ }
+ return 0;
+ },
+
+ select: function(item, noPivot) {
+ if(this.isItem(item) && !this.isSelected(item)
+ && this.isSelectable(item)) {
+ this.selection.push(item);
+ this.lastSelected = item;
+ this.onSelect(item);
+ this.onSelectChange(item, true);
+ if(!noPivot) {
+ this._addPivot(item);
+ }
+ this.length = this.selection.length;
+ return true;
+ }
+ return false;
+ },
+
+ deselect: function(item) {
+ var idx = this._find(item, true);
+ if(idx > -1) {
+ this.selection.splice(idx, 1);
+ this.onDeselect(item);
+ this.onSelectChange(item, false);
+ if(item == this.lastSelected) {
+ this.lastSelected = null;
+ }
+ this._removePivot(item);
+ this.length = this.selection.length;
+ return true;
+ }
+ return false;
+ },
+
+ selectAll: function() {
+ for(var i = 0; i < this.items.length; i++) {
+ this.select(this.items[i]);
+ }
+ },
+
+ deselectAll: function() {
+ while(this.selection && this.selection.length) {
+ this.deselect(this.selection[0]);
+ }
+ },
+
+ selectNext: function() {
+ var idx = this._find(this.lastSelected);
+ while(idx > -1 && ++idx < this.items.length) {
+ if(this.isSelectable(this.items[idx])) {
+ this.deselectAll();
+ this.select(this.items[idx]);
+ return true;
+ }
+ }
+ return false;
+ },
+
+ selectPrevious: function() {
+ //debugger;
+ var idx = this._find(this.lastSelected);
+ while(idx-- > 0) {
+ if(this.isSelectable(this.items[idx])) {
+ this.deselectAll();
+ this.select(this.items[idx]);
+ return true;
+ }
+ }
+ return false;
+ },
+
+ // select first selectable item
+ selectFirst: function() {
+ this.deselectAll();
+ var idx = 0;
+ while(this.items[idx] && !this.select(this.items[idx])) {
+ idx++;
+ }
+ return this.items[idx] ? true : false;
+ },
+
+ // select last selectable item
+ selectLast: function() {
+ this.deselectAll();
+ var idx = this.items.length-1;
+ while(this.items[idx] && !this.select(this.items[idx])) {
+ idx--;
+ }
+ return this.items[idx] ? true : false;
+ },
+
+ _addPivot: function(item, andClear) {
+ this._pivotItem = item;
+ if(andClear) {
+ this._pivotItems = [item];
+ } else {
+ this._pivotItems.push(item);
+ }
+ },
+
+ _removePivot: function(item) {
+ var i = dojo.lang.find(this._pivotItems, item);
+ if(i > -1) {
+ this._pivotItems.splice(i, 1);
+ this._pivotItem = this._pivotItems[this._pivotItems.length-1];
+ }
+
+ this._updatePivot();
+ },
+
+ _updatePivot: function() {
+ if(this._pivotItems.length == 0) {
+ if(this.lastSelected) {
+ this._addPivot(this.lastSelected);
+ }
+ }
+ },
+
+ sorted: function() {
+ return dojo.lang.toArray(this.selection).sort(
+ dojo.lang.hitch(this, function(a, b) {
+ var A = this._find(a), B = this._find(b);
+ if(A > B) {
+ return 1;
+ } else if(A < B) {
+ return -1;
+ } else {
+ return 0;
+ }
+ })
+ );
+ },
+
+ // remove any items from the selection that are no longer in this.items
+ updateSelected: function() {
+ for(var i = 0; i < this.selection.length; i++) {
+ if(this._find(this.selection[i]) < 0) {
+ var removed = this.selection.splice(i, 1);
+
+ this._removePivot(removed[0]);
+ }
+ }
+
+ this.length = this.selection.length;
+ }
+});
Propchange: tapestry/tapestry4/trunk/tapestry-framework/src/js/dojo/src/selection/Selection.js
------------------------------------------------------------------------------
svn:eol-style = native