From e44a7e37b6c7b5961adaffc62b9042b8d442938e Mon Sep 17 00:00:00 2001 From: mensonge Date: Thu, 13 Nov 2008 09:49:11 +0000 Subject: New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f --- includes/js/dojox/grid/Grid.js | 363 ++++++++ includes/js/dojox/grid/README | 39 + includes/js/dojox/grid/VirtualGrid.js | 779 +++++++++++++++++ includes/js/dojox/grid/_data/dijitEditors.js | 170 ++++ includes/js/dojox/grid/_data/editors.js | 239 ++++++ includes/js/dojox/grid/_data/fields.js | 104 +++ includes/js/dojox/grid/_data/model.js | 762 +++++++++++++++++ includes/js/dojox/grid/_grid/Grid.css | 201 +++++ .../js/dojox/grid/_grid/Grid.css.commented.css | 258 ++++++ includes/js/dojox/grid/_grid/Grid_rtl.css | 8 + .../js/dojox/grid/_grid/Grid_rtl.css.commented.css | 10 + includes/js/dojox/grid/_grid/builder.js | 522 ++++++++++++ includes/js/dojox/grid/_grid/cell.js | 66 ++ includes/js/dojox/grid/_grid/drag.js | 113 +++ includes/js/dojox/grid/_grid/edit.js | 238 ++++++ includes/js/dojox/grid/_grid/focus.js | 207 +++++ .../dojox/grid/_grid/images/grid_dx_gradient.gif | Bin 0 -> 267 bytes .../js/dojox/grid/_grid/images/grid_sort_down.gif | Bin 0 -> 49 bytes .../js/dojox/grid/_grid/images/grid_sort_up.gif | Bin 0 -> 48 bytes .../dojox/grid/_grid/images/tabEnabled_rotated.png | Bin 0 -> 94 bytes .../dojox/grid/_grid/images/tabHover_rotated.png | Bin 0 -> 106 bytes includes/js/dojox/grid/_grid/layout.js | 75 ++ includes/js/dojox/grid/_grid/lib.js | 254 ++++++ includes/js/dojox/grid/_grid/nihiloGrid.css | 211 +++++ .../dojox/grid/_grid/nihiloGrid.css.commented.css | 275 ++++++ includes/js/dojox/grid/_grid/publicEvents.js | 451 ++++++++++ includes/js/dojox/grid/_grid/rowbar.js | 53 ++ includes/js/dojox/grid/_grid/rows.js | 66 ++ includes/js/dojox/grid/_grid/scroller.js | 489 +++++++++++ includes/js/dojox/grid/_grid/selection.js | 215 +++++ includes/js/dojox/grid/_grid/soriaGrid.css | 212 +++++ .../dojox/grid/_grid/soriaGrid.css.commented.css | 276 ++++++ includes/js/dojox/grid/_grid/tundraGrid.css | 215 +++++ .../dojox/grid/_grid/tundraGrid.css.commented.css | 281 ++++++ includes/js/dojox/grid/_grid/view.js | 336 ++++++++ includes/js/dojox/grid/_grid/views.js | 277 ++++++ includes/js/dojox/grid/resources/GridView.html | 12 + includes/js/dojox/grid/resources/VirtualGrid.html | 5 + includes/js/dojox/grid/tests/databaseModel.js | 337 ++++++++ includes/js/dojox/grid/tests/images/closed.gif | Bin 0 -> 907 bytes includes/js/dojox/grid/tests/images/flatScreen.gif | Bin 0 -> 824 bytes includes/js/dojox/grid/tests/images/open.gif | Bin 0 -> 907 bytes includes/js/dojox/grid/tests/support/books.xml | 103 +++ includes/js/dojox/grid/tests/support/data.php | 379 +++++++++ includes/js/dojox/grid/tests/support/geography.xml | 51 ++ includes/js/dojox/grid/tests/support/json.php | 794 +++++++++++++++++ includes/js/dojox/grid/tests/support/movies.csv | 9 + includes/js/dojox/grid/tests/support/test_data.js | 30 + .../dojox/grid/tests/support/test_data_objects.js | 31 + includes/js/dojox/grid/tests/support/testtbl.sql | 944 +++++++++++++++++++++ .../js/dojox/grid/tests/support/yahoo_search.js | 131 +++ .../js/dojox/grid/tests/test_change_structure.html | 124 +++ includes/js/dojox/grid/tests/test_custom_sort.html | 86 ++ .../js/dojox/grid/tests/test_dojo_data_edit.html | 124 +++ .../js/dojox/grid/tests/test_dojo_data_empty.html | 63 ++ .../js/dojox/grid/tests/test_dojo_data_model.html | 84 ++ .../tests/test_dojo_data_model_EmptyResultSet.html | 57 ++ .../tests/test_dojo_data_model_multiStores.html | 291 +++++++ .../tests/test_dojo_data_model_processError.html | 65 ++ .../grid/tests/test_dojo_data_notification.html | 114 +++ includes/js/dojox/grid/tests/test_edit.html | 149 ++++ .../js/dojox/grid/tests/test_edit_canEdit.html | 156 ++++ includes/js/dojox/grid/tests/test_edit_dijit.html | 137 +++ includes/js/dojox/grid/tests/test_events.html | 174 ++++ includes/js/dojox/grid/tests/test_expand.html | 107 +++ includes/js/dojox/grid/tests/test_grid.html | 69 ++ includes/js/dojox/grid/tests/test_grid_dlg.html | 88 ++ .../dojox/grid/tests/test_grid_headerHeight.html | 84 ++ includes/js/dojox/grid/tests/test_grid_layout.html | 112 +++ .../tests/test_grid_layout_LayoutContainer.html | 87 ++ .../tests/test_grid_layout_borderContainer.html | 98 +++ .../grid/tests/test_grid_object_model_change.html | 86 ++ .../dojox/grid/tests/test_grid_programmatic.html | 65 ++ .../grid/tests/test_grid_programmatic_layout.html | 74 ++ includes/js/dojox/grid/tests/test_grid_rtl.html | 71 ++ includes/js/dojox/grid/tests/test_grid_themes.html | 118 +++ .../dojox/grid/tests/test_grid_tooltip_menu.html | 161 ++++ includes/js/dojox/grid/tests/test_keyboard.html | 90 ++ includes/js/dojox/grid/tests/test_markup.html | 112 +++ includes/js/dojox/grid/tests/test_mysql_edit.html | 155 ++++ includes/js/dojox/grid/tests/test_sizing.html | 175 ++++ .../js/dojox/grid/tests/test_sizing_100rows.html | 168 ++++ .../dojox/grid/tests/test_sizing_ResizeHandle.html | 113 +++ includes/js/dojox/grid/tests/test_styling.html | 131 +++ includes/js/dojox/grid/tests/test_subgrid.html | 179 ++++ includes/js/dojox/grid/tests/test_tundra_edit.html | 139 +++ .../js/dojox/grid/tests/test_yahoo_images.html | 148 ++++ .../js/dojox/grid/tests/test_yahoo_search.html | 141 +++ includes/js/dojox/grid/tests/yahooSearch.js | 137 +++ 89 files changed, 15123 insertions(+) create mode 100644 includes/js/dojox/grid/Grid.js create mode 100644 includes/js/dojox/grid/README create mode 100644 includes/js/dojox/grid/VirtualGrid.js create mode 100644 includes/js/dojox/grid/_data/dijitEditors.js create mode 100644 includes/js/dojox/grid/_data/editors.js create mode 100644 includes/js/dojox/grid/_data/fields.js create mode 100644 includes/js/dojox/grid/_data/model.js create mode 100644 includes/js/dojox/grid/_grid/Grid.css create mode 100644 includes/js/dojox/grid/_grid/Grid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/Grid_rtl.css create mode 100644 includes/js/dojox/grid/_grid/Grid_rtl.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/builder.js create mode 100644 includes/js/dojox/grid/_grid/cell.js create mode 100644 includes/js/dojox/grid/_grid/drag.js create mode 100644 includes/js/dojox/grid/_grid/edit.js create mode 100644 includes/js/dojox/grid/_grid/focus.js create mode 100644 includes/js/dojox/grid/_grid/images/grid_dx_gradient.gif create mode 100644 includes/js/dojox/grid/_grid/images/grid_sort_down.gif create mode 100644 includes/js/dojox/grid/_grid/images/grid_sort_up.gif create mode 100644 includes/js/dojox/grid/_grid/images/tabEnabled_rotated.png create mode 100644 includes/js/dojox/grid/_grid/images/tabHover_rotated.png create mode 100644 includes/js/dojox/grid/_grid/layout.js create mode 100644 includes/js/dojox/grid/_grid/lib.js create mode 100644 includes/js/dojox/grid/_grid/nihiloGrid.css create mode 100644 includes/js/dojox/grid/_grid/nihiloGrid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/publicEvents.js create mode 100644 includes/js/dojox/grid/_grid/rowbar.js create mode 100644 includes/js/dojox/grid/_grid/rows.js create mode 100644 includes/js/dojox/grid/_grid/scroller.js create mode 100644 includes/js/dojox/grid/_grid/selection.js create mode 100644 includes/js/dojox/grid/_grid/soriaGrid.css create mode 100644 includes/js/dojox/grid/_grid/soriaGrid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/tundraGrid.css create mode 100644 includes/js/dojox/grid/_grid/tundraGrid.css.commented.css create mode 100644 includes/js/dojox/grid/_grid/view.js create mode 100644 includes/js/dojox/grid/_grid/views.js create mode 100644 includes/js/dojox/grid/resources/GridView.html create mode 100644 includes/js/dojox/grid/resources/VirtualGrid.html create mode 100644 includes/js/dojox/grid/tests/databaseModel.js create mode 100644 includes/js/dojox/grid/tests/images/closed.gif create mode 100644 includes/js/dojox/grid/tests/images/flatScreen.gif create mode 100644 includes/js/dojox/grid/tests/images/open.gif create mode 100644 includes/js/dojox/grid/tests/support/books.xml create mode 100644 includes/js/dojox/grid/tests/support/data.php create mode 100644 includes/js/dojox/grid/tests/support/geography.xml create mode 100644 includes/js/dojox/grid/tests/support/json.php create mode 100644 includes/js/dojox/grid/tests/support/movies.csv create mode 100644 includes/js/dojox/grid/tests/support/test_data.js create mode 100644 includes/js/dojox/grid/tests/support/test_data_objects.js create mode 100644 includes/js/dojox/grid/tests/support/testtbl.sql create mode 100644 includes/js/dojox/grid/tests/support/yahoo_search.js create mode 100644 includes/js/dojox/grid/tests/test_change_structure.html create mode 100644 includes/js/dojox/grid/tests/test_custom_sort.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_edit.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_empty.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model_EmptyResultSet.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model_multiStores.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_model_processError.html create mode 100644 includes/js/dojox/grid/tests/test_dojo_data_notification.html create mode 100644 includes/js/dojox/grid/tests/test_edit.html create mode 100644 includes/js/dojox/grid/tests/test_edit_canEdit.html create mode 100644 includes/js/dojox/grid/tests/test_edit_dijit.html create mode 100644 includes/js/dojox/grid/tests/test_events.html create mode 100644 includes/js/dojox/grid/tests/test_expand.html create mode 100644 includes/js/dojox/grid/tests/test_grid.html create mode 100644 includes/js/dojox/grid/tests/test_grid_dlg.html create mode 100644 includes/js/dojox/grid/tests/test_grid_headerHeight.html create mode 100644 includes/js/dojox/grid/tests/test_grid_layout.html create mode 100644 includes/js/dojox/grid/tests/test_grid_layout_LayoutContainer.html create mode 100644 includes/js/dojox/grid/tests/test_grid_layout_borderContainer.html create mode 100644 includes/js/dojox/grid/tests/test_grid_object_model_change.html create mode 100644 includes/js/dojox/grid/tests/test_grid_programmatic.html create mode 100644 includes/js/dojox/grid/tests/test_grid_programmatic_layout.html create mode 100644 includes/js/dojox/grid/tests/test_grid_rtl.html create mode 100644 includes/js/dojox/grid/tests/test_grid_themes.html create mode 100644 includes/js/dojox/grid/tests/test_grid_tooltip_menu.html create mode 100644 includes/js/dojox/grid/tests/test_keyboard.html create mode 100644 includes/js/dojox/grid/tests/test_markup.html create mode 100644 includes/js/dojox/grid/tests/test_mysql_edit.html create mode 100644 includes/js/dojox/grid/tests/test_sizing.html create mode 100644 includes/js/dojox/grid/tests/test_sizing_100rows.html create mode 100644 includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html create mode 100644 includes/js/dojox/grid/tests/test_styling.html create mode 100644 includes/js/dojox/grid/tests/test_subgrid.html create mode 100644 includes/js/dojox/grid/tests/test_tundra_edit.html create mode 100644 includes/js/dojox/grid/tests/test_yahoo_images.html create mode 100644 includes/js/dojox/grid/tests/test_yahoo_search.html create mode 100644 includes/js/dojox/grid/tests/yahooSearch.js (limited to 'includes/js/dojox/grid') diff --git a/includes/js/dojox/grid/Grid.js b/includes/js/dojox/grid/Grid.js new file mode 100644 index 0000000..309bb25 --- /dev/null +++ b/includes/js/dojox/grid/Grid.js @@ -0,0 +1,363 @@ +if(!dojo._hasResource["dojox.grid.Grid"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.grid.Grid"] = true; +dojo.provide("dojox.grid.Grid"); +dojo.require("dojox.grid.VirtualGrid"); +dojo.require("dojox.grid._data.model"); +dojo.require("dojox.grid._data.editors"); +dojo.require("dojox.grid._data.dijitEditors"); + +// FIXME: +// we are at the wrong location! + +dojo.declare('dojox.Grid', dojox.VirtualGrid, { + // summary: + // A grid widget with virtual scrolling, cell editing, complex rows, + // sorting, fixed columns, sizeable columns, etc. + // description: + // Grid is a subclass of VirtualGrid, providing binding to a data + // store. + // example: + // define the grid structure: + // | var structure = [ // array of view objects + // | { cells: [// array of rows, a row is an array of cells + // | [ { name: "Alpha", width: 6 }, + // | { name: "Beta" }, + // | { name: "Gamma", get: formatFunction } + // | ] + // | ]} + // | ]; + // + // define a grid data model + // | var model = new dojox.grid.data.table(null, data); + // | + // |
+ // + + // model: + // string or object grid data model + model: 'dojox.grid.data.Table', + + // life cycle + postCreate: function(){ + if(this.model){ + var m = this.model; + if(dojo.isString(m)){ + m = dojo.getObject(m); + } + this.model = (dojo.isFunction(m)) ? new m() : m; + this._setModel(this.model); + } + this.inherited(arguments); + }, + + destroy: function(){ + this.setModel(null); + this.inherited(arguments); + }, + + // structure + _structureChanged: function() { + this.indexCellFields(); + this.inherited(arguments); + }, + + // model + _setModel: function(inModel){ + // if(!inModel){ return; } + this.model = inModel; + if(this.model){ + this.model.observer(this); + this.model.measure(); + this.indexCellFields(); + } + }, + + setModel: function(inModel){ + // summary: + // Set the grid's data model + // inModel: Object + // Model object, usually an instance of a dojox.grid.data.Model + // subclass + if(this.model){ + this.model.notObserver(this); + } + this._setModel(inModel); + }, + + + get: function(inRowIndex){ + // summary: data socket (called in cell's context) + return this.grid.model.getDatum(inRowIndex, this.fieldIndex); + }, + + // model modifications + modelAllChange: function(){ + this.rowCount = (this.model ? this.model.getRowCount() : 0); + this.updateRowCount(this.rowCount); + }, + + modelRowChange: function(inData, inRowIndex){ + this.updateRow(inRowIndex); + }, + + modelDatumChange: function(inDatum, inRowIndex, inFieldIndex){ + this.updateRow(inRowIndex); + }, + + modelFieldsChange: function() { + this.indexCellFields(); + this.render(); + }, + + // model insertion + modelInsertion: function(inRowIndex){ + this.updateRowCount(this.model.getRowCount()); + }, + + // model removal + modelRemoval: function(inKeys){ + this.updateRowCount(this.model.getRowCount()); + }, + + // cells + getCellName: function(inCell){ + var v = this.model.fields.values, i = inCell.fieldIndex; + return i>=0 && i| '); + // result[4] => td postfix + result.push(html.join('')); + // SLOT: result[5] => content + result.push(''); + // result[6] => td closes + result.push(''); + return result; // Array + }, + + // cell finding + isCellNode: function(inNode){ + return Boolean(inNode && inNode.getAttribute && inNode.getAttribute("idx")); + }, + + getCellNodeIndex: function(inCellNode){ + return inCellNode ? Number(inCellNode.getAttribute("idx")) : -1; + }, + + getCellNode: function(inRowNode, inCellIndex){ + for(var i=0, row; row=dojox.grid.getTr(inRowNode.firstChild, i); i++){ + for(var j=0, cell; cell=row.cells[j]; j++){ + if(this.getCellNodeIndex(cell) == inCellIndex){ + return cell; + } + } + } + }, + + findCellTarget: function(inSourceNode, inTopNode){ + var n = inSourceNode; + while(n && (!this.isCellNode(n) || (dojox.grid.gridViewTag in n.offsetParent.parentNode && n.offsetParent.parentNode[dojox.grid.gridViewTag] != this.view.id)) && (n!=inTopNode)){ + n = n.parentNode; + } + return n!=inTopNode ? n : null + }, + + // event decoration + baseDecorateEvent: function(e){ + e.dispatch = 'do' + e.type; + e.grid = this.grid; + e.sourceView = this.view; + e.cellNode = this.findCellTarget(e.target, e.rowNode); + e.cellIndex = this.getCellNodeIndex(e.cellNode); + e.cell = (e.cellIndex >= 0 ? this.grid.getCell(e.cellIndex) : null); + }, + + // event dispatch + findTarget: function(inSource, inTag){ + var n = inSource; + while(n && (n!=this.domNode) && (!(inTag in n) || (dojox.grid.gridViewTag in n && n[dojox.grid.gridViewTag] != this.view.id))){ + n = n.parentNode; + } + return (n != this.domNode) ? n : null; + }, + + findRowTarget: function(inSource){ + return this.findTarget(inSource, dojox.grid.rowIndexTag); + }, + + isIntraNodeEvent: function(e){ + try{ + return (e.cellNode && e.relatedTarget && dojo.isDescendant(e.relatedTarget, e.cellNode)); + }catch(x){ + // e.relatedTarget has permission problem in FF if it's an input: https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + return false; + } + }, + + isIntraRowEvent: function(e){ + try{ + var row = e.relatedTarget && this.findRowTarget(e.relatedTarget); + return !row && (e.rowIndex==-1) || row && (e.rowIndex==row.gridRowIndex); + }catch(x){ + // e.relatedTarget on INPUT has permission problem in FF: https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + return false; + } + }, + + dispatchEvent: function(e){ + if(e.dispatch in this){ + return this[e.dispatch](e); + } + }, + + // dispatched event handlers + domouseover: function(e){ + if(e.cellNode && (e.cellNode!=this.lastOverCellNode)){ + this.lastOverCellNode = e.cellNode; + this.grid.onMouseOver(e); + } + this.grid.onMouseOverRow(e); + }, + + domouseout: function(e){ + if(e.cellNode && (e.cellNode==this.lastOverCellNode) && !this.isIntraNodeEvent(e, this.lastOverCellNode)){ + this.lastOverCellNode = null; + this.grid.onMouseOut(e); + if(!this.isIntraRowEvent(e)){ + this.grid.onMouseOutRow(e); + } + } + }, + + domousedown: function(e){ + if (e.cellNode) + this.grid.onMouseDown(e); + this.grid.onMouseDownRow(e) + } + +}); + +dojo.declare("dojox.grid.contentBuilder", + dojox.grid.Builder, + { + // summary: + // Produces html for grid data content. Owned by grid and used internally + // for rendering data. Override to implement custom rendering. + update: function(){ + this.prepareHtml(); + }, + + // cache html for rendering data rows + prepareHtml: function(){ + var defaultGet=this.grid.get, rows=this.view.structure.rows; + for(var j=0, row; (row=rows[j]); j++){ + for(var i=0, cell; (cell=row[i]); i++){ + cell.get = cell.get || (cell.value == undefined) && defaultGet; + cell.markup = this.generateCellMarkup(cell, cell.cellStyles, cell.cellClasses, false); + } + } + }, + + // time critical: generate html using cache and data source + generateHtml: function(inDataIndex, inRowIndex){ + var + html = [ this._table ], + v = this.view, + obr = v.onBeforeRow, + rows = v.structure.rows; + + obr && obr(inRowIndex, rows); + for(var j=0, row; (row=rows[j]); j++){ + if(row.hidden || row.header){ + continue; + } + html.push(!row.invisible ? ' |
|---|
+* // create a new instance of Services_JSON
+* $json = new Services_JSON();
+*
+* // convert a complexe value to JSON notation, and send it to the browser
+* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
+* $output = $json->encode($value);
+*
+* print($output);
+* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
+*
+* // accept incoming POST data, assumed to be in JSON notation
+* $input = file_get_contents('php://input', 1000000);
+* $value = $json->decode($input);
+*
+*/
+class Services_JSON
+{
+ /**
+ * constructs a new JSON instance
+ *
+ //>> SJM2005
+ * @param string $encoding Strings are input/output in this encoding
+ * @param int $encode Encode input is expected in this character encoding
+ //<< SJM2005
+ *
+ * @param int $use object behavior: when encoding or decoding,
+ * be loose or strict about object/array usage
+ *
+ * possible values:
+ * - SERVICES_JSON_STRICT_TYPE: strict typing, default.
+ * "{...}" syntax creates objects in decode().
+ * - SERVICES_JSON_LOOSE_TYPE: loose typing.
+ * "{...}" syntax creates associative arrays in decode().
+ */
+ function Services_JSON($encoding = SERVICES_JSON_UTF_8, $use = SERVICES_JSON_STRICT_TYPE)
+ {
+ //>> SJM2005
+ $this->encoding = $encoding;
+ //<< SJM2005
+
+ $this->use = $use;
+ }
+
+ /**
+ * convert a string from one UTF-16 char to one UTF-8 char
+ *
+ * Normally should be handled by mb_convert_encoding, but
+ * provides a slower PHP-only method for installations
+ * that lack the multibye string extension.
+ *
+ * @param string $utf16 UTF-16 character
+ * @return string UTF-8 character
+ * @access private
+ */
+ function utf162utf8($utf16)
+ {
+ // oh please oh please oh please oh please oh please
+ if(function_exists('mb_convert_encoding'))
+ return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
+
+ $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
+
+ switch(true) {
+ case ((0x7F & $bytes) == $bytes):
+ // this case should never be reached, because we are in ASCII range
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr(0x7F & $bytes);
+
+ case (0x07FF & $bytes) == $bytes:
+ // return a 2-byte UTF-8 character
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr(0xC0 | (($bytes >> 6) & 0x1F))
+ . chr(0x80 | ($bytes & 0x3F));
+
+ case (0xFFFF & $bytes) == $bytes:
+ // return a 3-byte UTF-8 character
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr(0xE0 | (($bytes >> 12) & 0x0F))
+ . chr(0x80 | (($bytes >> 6) & 0x3F))
+ . chr(0x80 | ($bytes & 0x3F));
+ }
+
+ // ignoring UTF-32 for now, sorry
+ return '';
+ }
+
+ /**
+ * convert a string from one UTF-8 char to one UTF-16 char
+ *
+ * Normally should be handled by mb_convert_encoding, but
+ * provides a slower PHP-only method for installations
+ * that lack the multibye string extension.
+ *
+ * @param string $utf8 UTF-8 character
+ * @return string UTF-16 character
+ * @access private
+ */
+ function utf82utf16($utf8)
+ {
+ // oh please oh please oh please oh please oh please
+ if(function_exists('mb_convert_encoding'))
+ return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
+
+ switch(strlen($utf8)) {
+ case 1:
+ // this case should never be reached, because we are in ASCII range
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return $utf8;
+
+ case 2:
+ // return a UTF-16 character from a 2-byte UTF-8 char
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr(0x07 & (ord($utf8{0}) >> 2))
+ . chr((0xC0 & (ord($utf8{0}) << 6))
+ | (0x3F & ord($utf8{1})));
+
+ case 3:
+ // return a UTF-16 character from a 3-byte UTF-8 char
+ // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ return chr((0xF0 & (ord($utf8{0}) << 4))
+ | (0x0F & (ord($utf8{1}) >> 2)))
+ . chr((0xC0 & (ord($utf8{1}) << 6))
+ | (0x7F & ord($utf8{2})));
+ }
+
+ // ignoring UTF-32 for now, sorry
+ return '';
+ }
+
+ /**
+ * encodes an arbitrary variable into JSON format
+ *
+ * @param mixed $var any number, boolean, string, array, or object to be encoded.
+ * see argument 1 to Services_JSON() above for array-parsing behavior.
+ * if var is a strng, note that encode() always expects it
+ * to be in ASCII or UTF-8 format!
+ *
+ * @return string JSON string representation of input var
+ * @access public
+ */
+ function encode($var)
+ {
+ switch (gettype($var)) {
+ case 'boolean':
+ return $var ? 'true' : 'false';
+
+ case 'NULL':
+ return 'null';
+
+ case 'integer':
+ return (int) $var;
+
+ case 'double':
+ case 'float':
+ return (float) $var;
+
+ case 'string':
+ //>> SJM2005
+ if ($this->encoding == SERVICES_JSON_UTF_8)
+ ;
+ else if ($this->encoding == SERVICES_JSON_ISO_8859_1)
+ $var = utf8_encode($var);
+ else if (!function_exists('mb_convert_encoding'))
+ die('Requested encoding requires mb_strings extension.');
+ else
+ $var = mb_convert_encoding($var, "utf-8", $this->encoding);
+ //<< SJM2005
+
+ // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
+ $ascii = '';
+ $strlen_var = strlen($var);
+
+ /*
+ * Iterate over every character in the string,
+ * escaping with a slash or encoding to UTF-8 where necessary
+ */
+ for ($c = 0; $c < $strlen_var; ++$c) {
+
+ $ord_var_c = ord($var{$c});
+
+ switch (true) {
+ case $ord_var_c == 0x08:
+ $ascii .= '\b';
+ break;
+ case $ord_var_c == 0x09:
+ $ascii .= '\t';
+ break;
+ case $ord_var_c == 0x0A:
+ $ascii .= '\n';
+ break;
+ case $ord_var_c == 0x0C:
+ $ascii .= '\f';
+ break;
+ case $ord_var_c == 0x0D:
+ $ascii .= '\r';
+ break;
+
+ case $ord_var_c == 0x22:
+ case $ord_var_c == 0x2F:
+ case $ord_var_c == 0x5C:
+ // double quote, slash, slosh
+ $ascii .= '\\'.$var{$c};
+ break;
+
+ case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
+ // characters U-00000000 - U-0000007F (same as ASCII)
+ $ascii .= $var{$c};
+ break;
+
+ case (($ord_var_c & 0xE0) == 0xC0):
+ // characters U-00000080 - U-000007FF, mask 110XXXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
+ $c += 1;
+ $utf16 = $this->utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xF0) == 0xE0):
+ // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}));
+ $c += 2;
+ $utf16 = $this->utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xF8) == 0xF0):
+ // characters U-00010000 - U-001FFFFF, mask 11110XXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}),
+ ord($var{$c + 3}));
+ $c += 3;
+ $utf16 = $this->utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xFC) == 0xF8):
+ // characters U-00200000 - U-03FFFFFF, mask 111110XX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}),
+ ord($var{$c + 3}),
+ ord($var{$c + 4}));
+ $c += 4;
+ $utf16 = $this->utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+
+ case (($ord_var_c & 0xFE) == 0xFC):
+ // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $char = pack('C*', $ord_var_c,
+ ord($var{$c + 1}),
+ ord($var{$c + 2}),
+ ord($var{$c + 3}),
+ ord($var{$c + 4}),
+ ord($var{$c + 5}));
+ $c += 5;
+ $utf16 = $this->utf82utf16($char);
+ $ascii .= sprintf('\u%04s', bin2hex($utf16));
+ break;
+ }
+ }
+
+ return '"'.$ascii.'"';
+
+ case 'array':
+ /*
+ * As per JSON spec if any array key is not an integer
+ * we must treat the the whole array as an object. We
+ * also try to catch a sparsely populated associative
+ * array with numeric keys here because some JS engines
+ * will create an array with empty indexes up to
+ * max_index which can cause memory issues and because
+ * the keys, which may be relevant, will be remapped
+ * otherwise.
+ *
+ * As per the ECMA and JSON specification an object may
+ * have any string as a property. Unfortunately due to
+ * a hole in the ECMA specification if the key is a
+ * ECMA reserved word or starts with a digit the
+ * parameter is only accessible using ECMAScript's
+ * bracket notation.
+ */
+
+ // treat as a JSON object
+ if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
+ return '{' .
+ join(',', array_map(array($this, 'name_value'),
+ array_keys($var),
+ array_values($var)))
+ . '}';
+ }
+
+ // treat it like a regular array
+ return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']';
+
+ case 'object':
+ $vars = get_object_vars($var);
+ return '{' .
+ join(',', array_map(array($this, 'name_value'),
+ array_keys($vars),
+ array_values($vars)))
+ . '}';
+
+ default:
+ return '';
+ }
+ }
+
+ /**
+ * array-walking function for use in generating JSON-formatted name-value pairs
+ *
+ * @param string $name name of key to use
+ * @param mixed $value reference to an array element to be encoded
+ *
+ * @return string JSON-formatted name-value pair, like '"name":value'
+ * @access private
+ */
+ function name_value($name, $value)
+ {
+ return $this->encode(strval($name)) . ':' . $this->encode($value);
+ }
+
+ /**
+ * reduce a string by removing leading and trailing comments and whitespace
+ *
+ * @param $str string string value to strip of comments and whitespace
+ *
+ * @return string string value stripped of comments and whitespace
+ * @access private
+ */
+ function reduce_string($str)
+ {
+ $str = preg_replace(array(
+
+ // eliminate single line comments in '// ...' form
+ '#^\s*//(.+)$#m',
+
+ // eliminate multi-line comments in '/* ... */' form, at start of string
+ '#^\s*/\*(.+)\*/#Us',
+
+ // eliminate multi-line comments in '/* ... */' form, at end of string
+ '#/\*(.+)\*/\s*$#Us'
+
+ ), '', $str);
+
+ // eliminate extraneous space
+ return trim($str);
+ }
+
+ /**
+ * decodes a JSON string into appropriate variable
+ *
+ * @param string $str JSON-formatted string
+ *
+ * @return mixed number, boolean, string, array, or object
+ * corresponding to given JSON input string.
+ * See argument 1 to Services_JSON() above for object-output behavior.
+ * Note that decode() always returns strings
+ * in ASCII or UTF-8 format!
+ * @access public
+ */
+ function decode($str)
+ {
+ $str = $this->reduce_string($str);
+
+ switch (strtolower($str)) {
+ case 'true':
+ return true;
+
+ case 'false':
+ return false;
+
+ case 'null':
+ return null;
+
+ default:
+ if (is_numeric($str)) {
+ // Lookie-loo, it's a number
+
+ // This would work on its own, but I'm trying to be
+ // good about returning integers where appropriate:
+ // return (float)$str;
+
+ // Return float or int, as appropriate
+ return ((float)$str == (integer)$str)
+ ? (integer)$str
+ : (float)$str;
+
+ } elseif (preg_match('/^("|\').+(\1)$/s', $str, $m) && $m[1] == $m[2]) {
+ // STRINGS RETURNED IN UTF-8 FORMAT
+ $delim = substr($str, 0, 1);
+ $chrs = substr($str, 1, -1);
+ $utf8 = '';
+ $strlen_chrs = strlen($chrs);
+
+ for ($c = 0; $c < $strlen_chrs; ++$c) {
+
+ $substr_chrs_c_2 = substr($chrs, $c, 2);
+ $ord_chrs_c = ord($chrs{$c});
+
+ switch (true) {
+ case $substr_chrs_c_2 == '\b':
+ $utf8 .= chr(0x08);
+ ++$c;
+ break;
+ case $substr_chrs_c_2 == '\t':
+ $utf8 .= chr(0x09);
+ ++$c;
+ break;
+ case $substr_chrs_c_2 == '\n':
+ $utf8 .= chr(0x0A);
+ ++$c;
+ break;
+ case $substr_chrs_c_2 == '\f':
+ $utf8 .= chr(0x0C);
+ ++$c;
+ break;
+ case $substr_chrs_c_2 == '\r':
+ $utf8 .= chr(0x0D);
+ ++$c;
+ break;
+
+ case $substr_chrs_c_2 == '\\"':
+ case $substr_chrs_c_2 == '\\\'':
+ case $substr_chrs_c_2 == '\\\\':
+ case $substr_chrs_c_2 == '\\/':
+ if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
+ ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
+ $utf8 .= $chrs{++$c};
+ }
+ break;
+
+ case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
+ //echo ' matching single escaped unicode character from ' . substr($chrs, $c, 6);
+ // single, escaped unicode character
+ $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
+ . chr(hexdec(substr($chrs, ($c + 4), 2)));
+ $utf8 .= $this->utf162utf8($utf16);
+ $c += 5;
+ break;
+
+ case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
+ $utf8 .= $chrs{$c};
+ break;
+
+ case ($ord_chrs_c & 0xE0) == 0xC0:
+ // characters U-00000080 - U-000007FF, mask 110XXXXX
+ //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 2);
+ ++$c;
+ break;
+
+ case ($ord_chrs_c & 0xF0) == 0xE0:
+ // characters U-00000800 - U-0000FFFF, mask 1110XXXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 3);
+ $c += 2;
+ break;
+
+ case ($ord_chrs_c & 0xF8) == 0xF0:
+ // characters U-00010000 - U-001FFFFF, mask 11110XXX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 4);
+ $c += 3;
+ break;
+
+ case ($ord_chrs_c & 0xFC) == 0xF8:
+ // characters U-00200000 - U-03FFFFFF, mask 111110XX
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 5);
+ $c += 4;
+ break;
+
+ case ($ord_chrs_c & 0xFE) == 0xFC:
+ // characters U-04000000 - U-7FFFFFFF, mask 1111110X
+ // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
+ $utf8 .= substr($chrs, $c, 6);
+ $c += 5;
+ break;
+
+ }
+
+ }
+
+ //>> SJM2005
+ if ($this->encoding == SERVICES_JSON_UTF_8)
+ return $utf8;
+ if ($this->encoding == SERVICES_JSON_ISO_8859_1)
+ return utf8_decode($utf8);
+ else if (!function_exists('mb_convert_encoding'))
+ die('Requested encoding requires mb_strings extension.');
+ else
+ return mb_convert_encoding($utf8, $this->encoding, SERVICES_JSON_UTF_8);
+ //<< SJM2005
+
+ return $utf8;
+
+ } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
+ // array, or object notation
+ if ($str{0} == '[') {
+ $stk = array(SERVICES_JSON_IN_ARR);
+ $arr = array();
+ } else {
+ if ($this->use == SERVICES_JSON_LOOSE_TYPE) {
+ $stk = array(SERVICES_JSON_IN_OBJ);
+ $obj = array();
+ } else {
+ $stk = array(SERVICES_JSON_IN_OBJ);
+ $obj = new stdClass();
+ }
+ }
+
+ array_push($stk, array('what' => SERVICES_JSON_SLICE,
+ 'where' => 0,
+ 'delim' => false));
+
+ $chrs = substr($str, 1, -1);
+ $chrs = $this->reduce_string($chrs);
+
+ if ($chrs == '') {
+ if (reset($stk) == SERVICES_JSON_IN_ARR) {
+ return $arr;
+
+ } else {
+ return $obj;
+
+ }
+ }
+
+ //print("\nparsing {$chrs}\n");
+
+ $strlen_chrs = strlen($chrs);
+ for ($c = 0; $c <= $strlen_chrs; ++$c) {
+
+ $top = end($stk);
+ $substr_chrs_c_2 = substr($chrs, $c, 2);
+
+ if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
+ // found a comma that is not inside a string, array, etc.,
+ // OR we've reached the end of the character list
+ $slice = substr($chrs, $top['where'], ($c - $top['where']));
+ array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
+ //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ if (reset($stk) == SERVICES_JSON_IN_ARR) {
+ // we are in an array, so just push an element onto the stack
+ array_push($arr, $this->decode($slice));
+
+ } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
+ // we are in an object, so figure
+ // out the property name and set an
+ // element in an associative array,
+ // for now
+ if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+ // "name":value pair
+ $key = $this->decode($parts[1]);
+ $val = $this->decode($parts[2]);
+
+ if ($this->use == SERVICES_JSON_LOOSE_TYPE) {
+ $obj[$key] = $val;
+ } else {
+ $obj->$key = $val;
+ }
+ } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
+ // name:value pair, where name is unquoted
+ $key = $parts[1];
+ $val = $this->decode($parts[2]);
+
+ if ($this->use == SERVICES_JSON_LOOSE_TYPE) {
+ $obj[$key] = $val;
+ } else {
+ $obj->$key = $val;
+ }
+ }
+
+ }
+
+ } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
+ // found a quote, and we are not inside a string
+ array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
+ //print("Found start of string at {$c}\n");
+
+ //>> SAO2006
+ /*} elseif (($chrs{$c} == $top['delim']) &&
+ ($top['what'] == SERVICES_JSON_IN_STR) &&
+ (($chrs{$c - 1} != '\\') ||
+ ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) {*/
+ } elseif ($chrs{$c} == $top['delim'] &&
+ $top['what'] == SERVICES_JSON_IN_STR) {
+ //print("Found potential end of string at {$c}\n");
+ // verify quote is not escaped: it has no or an even number of \\ before it.
+ for ($i=0; ($chrs{$c - ($i+1)} == '\\'); $i++);
+ /*$i = 0;
+ while ( $chrs{$c - ($i+1)} == '\\')
+ $i++;*/
+ //print("Found {$i} \ before delim\n");
+ if ($i % 2 != 0)
+ {
+ //print("delim escaped, not end of string\n");
+ continue;
+ }
+ //>> SAO2006
+ // found a quote, we're in a string, and it's not escaped
+ array_pop($stk);
+ //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
+
+ } elseif (($chrs{$c} == '[') &&
+ in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
+ // found a left-bracket, and we are in an array, object, or slice
+ array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
+ //print("Found start of array at {$c}\n");
+
+ } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
+ // found a right-bracket, and we're in an array
+ array_pop($stk);
+ //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ } elseif (($chrs{$c} == '{') &&
+ in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
+ // found a left-brace, and we are in an array, object, or slice
+ array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
+ //print("Found start of object at {$c}\n");
+
+ } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
+ // found a right-brace, and we're in an object
+ array_pop($stk);
+ //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ } elseif (($substr_chrs_c_2 == '/*') &&
+ in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
+ // found a comment start, and we are in an array, object, or slice
+ array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
+ $c++;
+ //print("Found start of comment at {$c}\n");
+
+ } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
+ // found a comment end, and we're in one now
+ array_pop($stk);
+ $c++;
+
+ for ($i = $top['where']; $i <= $c; ++$i)
+ $chrs = substr_replace($chrs, ' ', $i, 1);
+
+ //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
+
+ }
+
+ }
+
+ if (reset($stk) == SERVICES_JSON_IN_ARR) {
+ return $arr;
+
+ } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
+ return $obj;
+
+ }
+
+ }
+ }
+ }
+
+}
+
+ /*function hex($s)
+ {
+ $l = strlen($s);
+ for ($i=0; $i < $l; $i++)
+ //echo '['.(ord($s{$i})).']';
+ echo '['.bin2hex($s{$i}).']';
+ }
+
+ //$d = '["hello world\\""]';
+ $d = '["\\\\\\"hello world,\\\\\\""]';
+ //$d = '["\\\\", "\\\\"]';
+ hex($d);
+ $test = new Services_JSON();
+ echo('');
+ print_r($d . "\n");
+ print_r($test->decode($d));
+ echo('');
+ */
+?>
\ No newline at end of file
diff --git a/includes/js/dojox/grid/tests/support/movies.csv b/includes/js/dojox/grid/tests/support/movies.csv
new file mode 100644
index 0000000..baf71eb
--- /dev/null
+++ b/includes/js/dojox/grid/tests/support/movies.csv
@@ -0,0 +1,9 @@
+Title, Year, Producer
+City of God, 2002, Katia Lund
+Rain,, Christine Jeffs
+2001: A Space Odyssey, , Stanley Kubrick
+"This is a ""fake"" movie title", 1957, Sidney Lumet
+Alien, 1979 , Ridley Scott
+"The Sequel to ""Dances With Wolves.""", 1982, Ridley Scott
+"Caine Mutiny, The", 1954, "Dymtryk ""the King"", Edward"
+
diff --git a/includes/js/dojox/grid/tests/support/test_data.js b/includes/js/dojox/grid/tests/support/test_data.js
new file mode 100644
index 0000000..4707380
--- /dev/null
+++ b/includes/js/dojox/grid/tests/support/test_data.js
@@ -0,0 +1,30 @@
+// example sample data and code
+(function(){
+ // some sample data
+ // global var "data"
+ data = [
+ [ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
+ [ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
+ [ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
+ [ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
+ [ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
+ [ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
+ [ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
+ ];
+ var rows = 100;
+ for(var i=0, l=data.length; i+ +
+ + + + diff --git a/includes/js/dojox/grid/tests/test_custom_sort.html b/includes/js/dojox/grid/tests/test_custom_sort.html new file mode 100644 index 0000000..51b0cf3 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_custom_sort.html @@ -0,0 +1,86 @@ + + + ++ This page demonstrates the Grid can display data accessed by dojo.data implementing Datastores. + Each of the datastores used stores data in a different format, and as this test and demonstration + page shows, the logic for rendering the data is virtually identical. You define your source store, + you define the model for accessing the data, which is ij this case the dojox.grid.data.DojoData model + and then you define the layout, which maps the data attribute names to columns in the grid. You can + even perform cusomization of what is displayed, as demonstrated in the dojox.data.FlickrStore layout. + The image url is displayed as a clickable link that opens a new page. +
++ The choice of stores used were ones that did not require back end services to function for sake of + simplicity. There is no reason that dojox.data.QueryReadStore could not be used with grid as well, + it just requires a back end service to send it the query results. +
+Stores used:
+| Title of Movie | + +Year | +
|---|---|
| Producer | +|
| Country/Continent Name | +Population | +Land Mass | +Time Zone | +Type | + +
|---|
+
+
+ Note: when the grid menu is disabled, the document's dijit context menu should be shown over the grid.
+
| Title of Movie | +Year | +
|---|---|
| Producer | +|
| Country/Continent Name | +Population | +Land Mass | +Time Zone | +Type | +
|---|
Note: This test requires MySql and PHP and works with the database table available in support/testtbl.sql.
+ + diff --git a/includes/js/dojox/grid/tests/test_sizing.html b/includes/js/dojox/grid/tests/test_sizing.html new file mode 100644 index 0000000..fdd0897 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_sizing.html @@ -0,0 +1,175 @@ + + + +Grid fits to a sized container by default:
+Grid is essentially hidden (height of zero) when parent container is unsized + (nothing, including the header, should be displayed):
+Grid is autoHeight and autoWidth via markup
+ + + diff --git a/includes/js/dojox/grid/tests/test_sizing_100rows.html b/includes/js/dojox/grid/tests/test_sizing_100rows.html new file mode 100644 index 0000000..4ea1aa3 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_sizing_100rows.html @@ -0,0 +1,168 @@ + + + +Grid fits to a sized container by default:
+Grid is essentially hidden (height of zero) when parent container is unsized + (nothing, including the header, should be displayed):
+Grid is autoHeight and autoWidth via markup
+ + + diff --git a/includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html b/includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html new file mode 100644 index 0000000..d6809df --- /dev/null +++ b/includes/js/dojox/grid/tests/test_sizing_ResizeHandle.html @@ -0,0 +1,113 @@ + + + +While this test should work, dojox.layout.ResizeHandle is experimental.
+ +Grid fits to a sized container by default:
+I am here to take up
+ +space
+ +as much as needed.
+ + + diff --git a/includes/js/dojox/grid/tests/test_styling.html b/includes/js/dojox/grid/tests/test_styling.html new file mode 100644 index 0000000..5671f50 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_styling.html @@ -0,0 +1,131 @@ + + + +Note: requires PHP for proxy.
+ + diff --git a/includes/js/dojox/grid/tests/test_yahoo_search.html b/includes/js/dojox/grid/tests/test_yahoo_search.html new file mode 100644 index 0000000..063c289 --- /dev/null +++ b/includes/js/dojox/grid/tests/test_yahoo_search.html @@ -0,0 +1,141 @@ + + + +Note: requires PHP for proxy.
+ + diff --git a/includes/js/dojox/grid/tests/yahooSearch.js b/includes/js/dojox/grid/tests/yahooSearch.js new file mode 100644 index 0000000..1d57a8e --- /dev/null +++ b/includes/js/dojox/grid/tests/yahooSearch.js @@ -0,0 +1,137 @@ +dojo.require("dojo.io.script") +dojo.require("dojox.rpc.Service"); + +// model that works with Yahoo Search API +dojo.declare("dojox.grid.data.yahooSearch", dojox.grid.data.Dynamic, { + constructor: function(inFields, inData, inSearchNode){ + this.rowsPerPage = 20; + this.searchNode = inSearchNode; + this.fieldNames = dojo.map(inFields, "return item.name;"); + this.yahoo = new dojox.rpc.Service( + dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd") + ); + }, + // server send / receive + send: function(inAsync, inParams, inOnReceive, inOnError){ + var d = this.yahoo.imageSearch( + dojo.mixin({ + results: this.rowsPerPage, + query: this.getQuery() + }, inParams) + ); + d.addCallbacks( + dojo.hitch(this, "receive", inOnReceive, inOnError), + dojo.hitch(this, "error", inOnError) + ); + this.onSend(inParams); + return d; + }, + receive: function(inOnReceive, inOnError, inData){ + try{ + inData = inData.ResultSet; + inOnReceive(inData); + this.onReceive(inData); + }catch(e){ + if(inOnError){ + inOnError(inData); + } + } + }, + error: function(inOnError, inErr) { + var m = 'io error: ' + inErr.message; + alert(m); + if (inOnError) + inOnError(m); + }, + encodeParam: function(inName, inValue) { + return dojo.string.substitute('&${0}=${1}', [inName, inValue]); + }, + getQuery: function(){ + return dojo.byId(this.searchNode).value.replace(/ /g, '+'); + }, + fetchRowCount: function(inCallback){ + this.send(true, inCallback); + }, + // request data + requestRows: function(inRowIndex, inCount){ + inRowIndex = (inRowIndex == undefined ? 0 : inRowIndex); + var params = { + start: inRowIndex + 1 + } + this.send(true, params, dojo.hitch(this, this.processRows)); + }, + // server callbacks + processRows: function(inData){ + for(var i=0, l=inData.totalResultsReturned, s=inData.firstResultPosition; i